我编写了一些代码来压缩矩阵以删除零列和行,但我无法解决如何重建原始矩阵的问题。
说我有一个矩阵:
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
人们可以建议我使用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
行复制到第二个矩阵并连接中间有零排的那些,但感觉有点像
笨重的解决方案,对于大型矩阵可能效率不高。
否则,人们可以建议我存储地图信息的更好方法吗?我正在考虑而不是存储列/行索引之间的映射,我只存储零列/行的索引,然后在适当的位置插入零/行的行。这会是一个更好的方法吗?
答案 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
A
和B
在任何地方都是平等的,因此我们重新构建了A
。