MATLAB - 将零行和列插入矩阵

时间:2015-10-27 01:56:17

标签: matlab matrix

我编写了一些代码来压缩矩阵以删除零列和行,但我无法解决如何重建原始矩阵的问题。

说我有一个矩阵:

A = [ 0 3 0 2 1 0 6
      3 0 0 4 8 0 5
      0 0 0 0 0 0 0
      2 4 0 0 2 0 1
      1 8 0 2 0 0 7
      0 0 0 0 0 0 0
      6 5 0 1 7 0 0 ]

这里的行/列3和6是空的,所以我的压缩函数将给出输出:

A_dash = [ 0 3 2 1 6
           3 0 4 8 5
           2 4 0 2 1
           1 8 2 0 7
           6 5 1 7 0 ]

A_map = [ 1 2 4 5 7]

其中A_map是将A_dash的行/列的指示映射到A的向量。这意味着,如果A_map(3) = 4,则A的行/列4与A_dash的行/列3相同 - 即。必须在A_dash

中的第2行和第3行之间插入一行/一列零

人们可以建议我使用A中的信息从A_dash重新创建矩阵A_map的最简单方法是什么?

这是我到目前为止所得到的:

% orig_size is original number of columns/rows

c_count = size(A_dash,1);
A = zeros(c_count, orig_size); % c_count rows to avoid dimension mismatch
for ii = 1:c_count
    A(:,A_map(ii)) == A_dash(:,ii);
end

这为我提供了正确的列结果:

A = [ 0 3 0 2 1 0 6
      3 0 0 4 8 0 5
      2 4 0 0 2 0 1
      1 8 0 2 0 0 7
      6 5 0 1 7 0 0 ]

但是,我不确定如何插入行,我想我可以将第一个1:i行复制到一个矩阵中,i:end行复制到第二个矩阵并连接中间有零排的那些,但感觉有点像 笨重的解决方案,对于大型矩阵可能效率不高。

否则,人们可以建议我存储地图信息的更好方法吗?我正在考虑而不是存储列/行索引之间的映射,我只存储零列/行的索引,然后在适当的位置插入零/行的行。这会是一个更好的方法吗?

1 个答案:

答案 0 :(得分:0)

您已获得有效行/列的索引。现在你所要做的就是将它们放在一个与A大小相同的新的零矩阵中:

B=zeros(size(A));
B(A_map,A_map)=A_dash

B =

   0   3   0   2   1   0   6
   3   0   0   4   8   0   5
   0   0   0   0   0   0   0
   2   4   0   0   2   0   1
   1   8   0   2   0   0   7
   0   0   0   0   0   0   0
   6   5   0   1   7   0   0

只是为了检查......

>> A==B
ans =

   1   1   1   1   1   1   1
   1   1   1   1   1   1   1
   1   1   1   1   1   1   1
   1   1   1   1   1   1   1
   1   1   1   1   1   1   1
   1   1   1   1   1   1   1
   1   1   1   1   1   1   1

AB在任何地方都是平等的,因此我们重新构建了A