在MATLAB

时间:2017-04-26 13:21:16

标签: matlab matrix access diagonal

我试图弄清楚是否可以在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) = 1M(3:4,3:4) = 2的两个命令中更新它们,但我可以在一次访问中执行这两项操作吗?此外,我需要将M保留为2D矩阵,因为之后在矩阵乘法运算中使用。

1 个答案:

答案 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