用于沿大矩阵对角线插入 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
我正在尝试沿大矩阵(例如 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