【发布时间】:2011-07-16 04:56:56
【问题描述】:
我有一个大小为 NxNxPxQ 的 4 维矩阵 A。如何以矢量化方式轻松地将每个NxN 2-D 子矩阵的对角线值更改为 1?
【问题讨论】:
标签: matlab multidimensional-array matrix variable-assignment diagonal
我有一个大小为 NxNxPxQ 的 4 维矩阵 A。如何以矢量化方式轻松地将每个NxN 2-D 子矩阵的对角线值更改为 1?
【问题讨论】:
标签: matlab multidimensional-array matrix variable-assignment diagonal
结合 gnovice 的建议,索引元素的简单方法是:
[N,~,P,Q]=size(A);%# get dimensions of your matrix
diagIndex=repmat(logical(eye(N)),[1 1 P Q]);%# get logical indices of the diagonals
A(diagIndex)=1;%# now index your matrix and set the diagonals to 1.
【讨论】:
diagIndex = repmat(logical(eye(dim1)),[1 1 dim3 dim4]);
您可以使用直接索引,以及对 repmat 进行一些处理,将单个 50x50 对角线的索引添加到每个 50x50 块的较大矩阵内的偏移量:
下面是一个小问题的例子:
A = NaN(10,10,5,3);
inner = repmat(sub2ind([10 10], [1:10],[1:10]), 5*3, 10); % diagonals
outer = repmat([10*10 * [0:5*3-1]]', 1, 10*10); % offsets to blocks
diags = inner + outer;
A(diags(:)) = 1;
【讨论】:
您实际上可以通过直接计算每个对角元素的线性索引,然后将它们设置为 1 来非常简单地做到这一点:
[N,N,P,Q] = size(A);
diagIndex = cumsum([1:(N+1):N^2; N^2.*ones(P*Q-1,N)]);
A(diagIndex) = 1;
上面的示例为第一个 N-by-N 矩阵 (1:(N+1):N^2) 找到了 N 对角线索引。每个后续的N-by-N 矩阵(其中P*Q-1)都被N^2 元素从最后一个元素偏移,因此大小为PQ-1-by-N 的矩阵仅包含值@987654333 @ 附加到第一个矩阵的对角线的线性索引。当使用函数CUMSUM 对每一列执行累积求和时,生成的矩阵包含 4-D 矩阵的所有对角线元素的线性索引。
【讨论】: