【发布时间】:2014-12-05 09:31:10
【问题描述】:
见鬼,我在计算二进制矩阵的秩时遇到了一些问题,只有 1 或 0。二进制矩阵的秩将基于使用布尔运算 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
我们可以看到第三行等于第一行与第二行异或。因此,矩阵 A 的秩只有 2,而不是 3 通过秩 matlab 函数。 我有一种方法可以使用此代码计算二进制矩阵的提取秩
B=gf(A)
rank(B)
它将返回 2。但是,当我使用大尺寸矩阵进行计算时,例如 400 x 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 的建议。我将使用高斯消除来找到排名。这是我的代码。但是,它调用 rank 函数(花费一些计算时间)。你能在不使用排名功能的情况下修改帮助我吗?
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。正确答案是 393 的 A 等级。
【问题讨论】:
-
我很惊讶这还没有工作。你的方法似乎非常好。如果您尝试使用 N=50,100,200,300 等。 Matlab的计算需要多长时间?如果你真的需要自己做,那么一个简单的 O(n^3) 方法是使用高斯消除。
-
@PeterdeRivaz:我更新了我的问题,其中包含您需要的一些信息。我的目标只是减少二进制矩阵校验秩的计算时间。如您所知,只有当矩阵 A 为满秩时,才能解决高斯消元法。这就是为什么我必须先检查排名的原因。
-
高斯消元法也可以用来计算秩:见en.wikipedia.org/wiki/…
-
我正在使用高斯消除来找到 Ax=b 的解决方案。但是,矩阵 A 是随机创建的,因此有时它会返回解,有时会返回多个解。这就是为什么我首先检查矩阵的秩。高斯消除可以用于我的二进制矩阵吗?有没有参考matlab代码
-
您是否只对计算排名或获得降低的 A 感兴趣?