在Matlab/Octave中在每2个矩阵元素之间添加零

3
我很感兴趣了解如何在矩阵中添加行和列的零,使其看起来像这样:
              1 0 2 0 3
1 2 3         0 0 0 0 0
2 3 4  =>     2 0 3 0 4
5 4 3         0 0 0 0 0
              5 0 4 0 3

实际上,我对如何高效地完成这个任务很感兴趣,因为如果您处理的是一个大矩阵,遍历矩阵并添加零会花费很长时间。

更新:

非常感谢。

现在我正在尝试用相邻元素的和替换零:

              1 0 2 0 3     1 3 2 5 3
1 2 3         0 0 0 0 0     3 8 5 12... and so on
2 3 4  =>     2 0 3 0 4 =>
5 4 3         0 0 0 0 0
              5 0 4 0 3

正如您所看到的,我正在考虑元素的所有8个相邻点,但是使用for循环遍历矩阵会使我的速度变慢,是否有更快的方法?

2个回答

3

让你的小矩阵称为m1。然后:

m2 = zeros(5)

m2(1:2:end,1:2:end) = m1(:,:)

显然这是针对您的示例进行硬编码的,我将把通用的部分留给您自己思考。

0

这里有两种方法来完成问题的第二部分。第一种方法明确地进行移位,而第二种方法使用conv2。第二种方法应该更快。

M=[1 2 3; 2 3 4 ; 5 4 3];

% this matrix (M expanded) has zeros inserted, but also an extra row and column of zeros
Mex = kron(M,[1 0 ; 0 0 ]); 

% The sum matrix is built from shifts of the original matrix
Msum = Mex + circshift(Mex,[1 0]) + ...
             circshift(Mex,[-1 0]) +...
             circshift(Mex,[0 -1]) + ...
             circshift(Mex,[0 1]) + ...
             circshift(Mex,[1 1]) + ...
             circshift(Mex,[-1 1]) + ...
             circshift(Mex,[1 -1]) + ...
             circshift(Mex,[-1 -1]);

% trim the extra line
Msum = Msum(1:end-1,1:end-1)


% another version, a bit more fancy:
MexTrimmed = Mex(1:end-1,1:end-1);
MsumV2 = conv2(MexTrimmed,ones(3),'same')

输出:

Msum =

1    3    2    5    3
3    8    5   12    7
2    5    3    7    4
7   14    7   14    7
5    9    4    7    3

MsumV2 =

1    3    2    5    3
3    8    5   12    7
2    5    3    7    4
7   14    7   14    7
5    9    4    7    3

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