4

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

4

3 回答 3

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.
于 2011-03-15T23:37:48.703 回答
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-的矩阵仅包含该值被附加到第一个矩阵的对角线的线性索引。当使用函数CUMSUM对每一列执行累积求和时,生成的矩阵包含 4-D 矩阵的所有对角元素的线性索引。NN1:(N+1):N^2NNP*Q-1N^2PQ-1NN^2

于 2011-03-16T04:47:55.847 回答
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;
于 2011-03-16T00:00:22.917 回答