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

4

我有一个大小为NxNxPxQ的四维矩阵A。如何以向量化的方式轻松地将每个NxN的二维子矩阵的对角线值更改为1?

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.

1
你实际上可以通过创建逻辑矩阵的身份矩阵,然后进行逻辑索引来避免使用 FIND:diagIndex = repmat(logical(eye(dim1)),[1 1 dim3 dim4]); - gnovice

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 × N 矩阵的 N 个对角线索引(1:(N+1):N^2)。每个后续的 N × N 矩阵(共 P×Q-1 个)与上一个矩阵相比,偏移了 N^2 个元素,因此将只包含值为 N^2 的大小为 PQ-1 × N 的矩阵附加到第一个矩阵的对角线线性索引中。当使用 CUMSUM 函数对每列执行累积和时,得到的矩阵包含 4-D 矩阵所有对角线元素的线性索引。

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;

网页内容由stack overflow 提供, 点击上面的
可以查看英文原文,
原文链接