地狱全部,我在计算二进制矩阵的秩时只有1或0时遇到一些问题。二进制矩阵的秩将基于使用布尔运算XOR的行减少。让我们看看XOR操作:
1 xor 1 =0
1 xor 0= 1
0 xor 0= 0
0 xor 1= 1
给出二进制矩阵
A =
1 1 0 0 0 0
1 0 0 0 0 1
0 1 0 0 0 1
我们可以看到第三行等于第一行xor和第二行。因此,矩阵A的秩只有2,而不是3级的matlab函数。 我有一种方法可以使用此代码计算二进制矩阵的提取等级
B=gf(A)
rank(B)
它将返回2.但是,当我使用大尺寸的矩阵计算时,例如400乘400.它不返回等级(永不停止)。你能告诉我找到大尺寸二进制矩阵的好方法吗?谢谢大家 更新:这是使用tic toc的计算时间
N=50; Elapsed time is=0.646823 seconds
N=100;Elapsed time is 3.123573 seconds.
N=150;Elapsed time is 7.438541 seconds.
N=200;Elapsed time is 11.349964 seconds.
N=400;Elapsed time is 66.815286 seconds.
请注意,检查等级只是我算法中的条件。但是,它需要很长时间,然后它会影响我的方法 根据R的建议,我将使用高斯消元法来找到等级。这是我的代码。但是,它调用秩函数(花费一些计算时间)。你可以修改帮助我而不使用等级函数吗?
function rankA=GaussEliRank(A)
mat = A;
[m n] = size(A); % read the size of the original matrix A
for i = 1 : n
j = find(mat(i:m, i), 1); % finds the FIRST 1 in i-th column starting at i
if isempty(j)
mat = mat( sum(mat,2)>0 ,:);
rankA=rank(mat); %%Here
return;
else
j = j + i - 1; % we need to add i-1 since j starts at i
temp = mat(j, :); % swap rows
mat(j, :) = mat(i, :);
mat(i, :) = temp;
% add i-th row to all rows that contain 1 in i-th column
% starting at j+1 - remember up to j are zeros
for k = find(mat( (j+1):m, i ))'
mat(j + k, :) = bitxor(mat(j + k, :), mat(i, :));
end
end
end
%remove all-zero rows if there are some
mat = mat( sum(mat,2)>0 ,:);
if any(sum( mat(:,1:n) ,2)==0) % no solution because matrix A contains
error('No solution.'); % all-zero row, but with nonzero RHS
end
rankA=rank(mat); %%Here
end
让我们检查here处的矩阵A.对于A级,正确的答案是393。
答案 0 :(得分:0)
一旦你将矩阵变成具有高斯消元的行梯形形式,等级就是非零行的数量。您应该能够在循环之后用rankA=sum(sum(mat,2)>0);
。