用于沿大矩阵对角线插入 2x2 矩阵的代码向量化

Vectorisation of code for insertion of 2x2 matrix along the diagonal of a large matrix

我正在尝试沿大矩阵(例如 10x10)的对角线插入一个小矩阵(2x2)。添加重叠值,并且仅将小矩阵插入到可以完全放入大矩阵的位置。

我已经使用 for 循环实现了这个,但我很好奇这个过程是否可以矢量化。

function M = TestDiagonal()

N     = 10;
miniM = [1, -1; -1, 1];
M     = zeros(N);

for i = 1:N-1
    M(i:i+1,i:i+1) = M(i:i+1,i:i+1) + miniM;
end

end

给出所需的矩阵

 1    -1     0     0     0     0     0     0     0     0
-1     2    -1     0     0     0     0     0     0     0
 0    -1     2    -1     0     0     0     0     0     0
 0     0    -1     2    -1     0     0     0     0     0
 0     0     0    -1     2    -1     0     0     0     0
 0     0     0     0    -1     2    -1     0     0     0
 0     0     0     0     0    -1     2    -1     0     0
 0     0     0     0     0     0    -1     2    -1     0
 0     0     0     0     0     0     0    -1     2    -1
 0     0     0     0     0     0     0     0    -1     1

在一般情况下,输入始终是方形的,但可以采用任何尺寸。步长维度将始终等于 1。

只需使用 2D 卷积(参见 conv2)。

2×2 案例,每个维度的第 1 步

M = conv2(eye(N-1), miniM);

m×m案例,每个维度的第1步

M = conv2(eye(N-size(miniM-1)+1), miniM);

m×n情况,沿每个维度任意步

在这种情况下,需要定义步骤:

step = [2 1]; % desired step along each dimension

并且定义所需的重复次数 R 比最终大小 (N) 更有意义,因为后者可能无法完全重复 [=23] =]:

R = 4; % desired number of repetitions

然后:

M = conv2(full(sparse(1:step(1):step(1)*R, 1:step(2):step(2)*R, 1)), miniM);

示例:

>> miniM = [10 20 30; 40 50 60];
>> R = 4;
>> step = [1 2];
>> M = conv2(full(sparse(1:step(1):step(1)*R, 1:step(2):step(2)*R, 1)), miniM)
M =
    10    20    30     0     0     0     0     0     0
    40    50    70    20    30     0     0     0     0
     0     0    40    50    70    20    30     0     0
     0     0     0     0    40    50    70    20    30
     0     0     0     0     0     0    40    50    60