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