在matlab / octave中,在矩阵的每2个元素之间添加零

时间:2012-04-19 08:51:07

标签: matrix octave

我感兴趣的是如何在矩阵中添加零行和列,以便它看起来像这样:

              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和walk矩阵让我慢慢减速,是否有更快的方法?

2 个答案:

答案 0 :(得分:3)

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

m2 = zeros(5)

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

显然这与你的例子有关,我会留给你概括。

答案 1 :(得分:0)

以下两种方法可以解决问题的第2部分。第一个显式移位,第二个使用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