我有一个大小为600 * 1200的二进制稀疏矩阵 H ,它是通过连接大小为200的平方置换矩阵构造的,因此稀疏矩阵在每列中有3个,每行有6个。现在我正试图将矩阵转换为减少的梯队形式。 这是我的代码:
[m,n]=size(H);
for i=1:m
ind=find(H(:,i),1,'last');
if ind<=i
continue;
end
if ind~=i
temp=H(ind,:);
H(ind,:)=H(i,:);
H(i,:)=temp;
end
I=find(H(:,i));
% Guassian elimination
for j=1:length(I)
if I(j)~=i
H(I(j),:)=mod(H(I(j),:)+H(i,:),2);
end
end
end
但无论生成 H 矩阵,我都无法在第400列删除其他条目,
我该如何解决这个问题,帮助
答案 0 :(得分:1)
由于高斯消元不涉及列的重新排列,如果原始矩阵的前600列是线性无关的,则得到的矩阵的前600列将仅形成单位矩阵。否则,你将有&#34;短&#34;其中包含其他条目的列,如the Wikipedia article所示。
矩阵的结构方式,前400列保证与线性相关。实际上,前200列的总和是全1矢量,列201-400的总和也是如此。这就是您在第400列中看到这些条目的原因。
要在左侧创建单位矩阵,您需要重新排列列。一种看起来有点多余但很容易编码的方法是
以下是执行步骤2-3的代码。
for i = 1:m
j = find(H(i,:),1,'first');
[H(:,i), H(:,j)] = deal(H(:,j), H(:,i));
end
H = rref(H)
输入到rref的样本:
1 0 1 0 1
0 1 0 0 1
1 0 1 1 0
0 0 0 0 1
输出您的代码:
1 0 1 1 0
0 1 0 0 1
0 0 0 1 1
0 0 0 0 1
列交换后和第二个rref:
1 0 0 0 1
0 1 0 0 0
0 0 1 0 0
0 0 0 1 0