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 和遍历矩阵会使我的速度减慢很多,有没有更快的方法?

4

2 回答 2

3

让你的小矩阵被调用m1。然后:

m2 = zeros(5)

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

显然,这与您的示例紧密相关,我将把它留给您进行概括。

于 2012-04-19T08:58:52.087 回答
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
于 2014-10-09T07:54:56.353 回答