我感兴趣的是如何在矩阵中添加零行和列,以便它看起来像这样:
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矩阵让我慢慢减速,是否有更快的方法?
答案 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