我有一个大小为NxNxPxQ
的四维矩阵A
。如何以向量化的方式轻松地将每个NxN
的二维子矩阵的对角线值更改为1?
我有一个大小为NxNxPxQ
的四维矩阵A
。如何以向量化的方式轻松地将每个NxN
的二维子矩阵的对角线值更改为1?
结合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.
[N,N,P,Q] = size(A);
diagIndex = cumsum([1:(N+1):N^2; N^2.*ones(P*Q-1,N)]);
A(diagIndex) = 1;
您可以使用直接索引和一些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;
diagIndex = repmat(logical(eye(dim1)),[1 1 dim3 dim4]);
- gnovice