我试图弄清楚是否可以在MATLAB中访问对角块矩阵的多个块。
例如,让我说我有这个(理想上稀疏,但也可能是密集的)块矩阵
|A A 0 0|
|A A 0 0|
M = |0 0 B B|
|0 0 B B|
我知道,例如,可以访问第一个子锁M(1:2,1:2)
,但我找不到访问非顺序单元格的方法。
有没有办法通过单个命令访问子矩阵A和B.最终我有兴趣非常快速地更新一个非常大的稀疏块矩阵。
为了澄清,在我的情况下,块对角线总是相同的大小。我知道我可以在执行M(1:2,1:2) = 1
和M(3:4,3:4) = 2
的两个命令中更新它们,但我可以在一次访问中执行这两项操作吗?此外,我需要将M
保留为2D矩阵,因为之后在矩阵乘法运算中使用。
答案 0 :(得分:1)
一旦你得到了矩阵M
,在对角线块中有非零值,在其他地方都是零(我假设),你可以得到所有非零值(即所有块)的索引使用find
:
index = find(M);
使用该索引,您可以一次访问和更新所有块。例如,如果要为所有块添加1,则执行以下操作:
M(index) = M(index)+1;
如果要将每个块更新为不同的值,并给定每个块的大小,可以使用上面的索引和repelem
一步完成。这是一个例子:
M = [1 1 0 0; 1 1 0 0; 0 0 1 1; 0 0 1 1]; % Sample matrix
index = find(M); % Get the linear indices
blockSizes = [2 2]; % Each block is a 2-by-2
newValues = [2 3]; % New values for each block
M(index) = repelem(newValues, blockSizes.^2)
M =
2 2 0 0
2 2 0 0
0 0 3 3
0 0 3 3