如何在MATLAB中使用线性索引为4-D矩阵的对角线分配值?

时间:2011-03-15 23:12:54

标签: matlab multidimensional-array matrix variable-assignment diagonal

我有一个大小为A的4-D矩阵NxNxPxQ。如何以矢量化方式轻松地将每个NxN 2-D子矩阵的对角线值更改为1?

3 个答案:

答案 0 :(得分:3)

结合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.

答案 1 :(得分:2)

你可以通过直接计算每个对角元素的线性索引,然后将它们设置为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矩阵(N)的1:(N+1):N^2对角线索引。每个后续N - by - N矩阵(P*Q-1矩阵)都会被最后一个N^2元素抵消,因此大小为PQ-1的矩阵 - 由 - 仅包含值N的{​​{1}}被附加到第一矩阵的对角线的线性索引。当使用函数CUMSUM对每列执行累积和时,得到的矩阵包含4-D矩阵的所有对角元素的线性索引。

答案 2 :(得分:0)

你可以使用直接索引,以及一些关于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;