【问题标题】:Calculate rank of binary matrix with larger size计算更大尺寸的二进制矩阵的秩
【发布时间】: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 感兴趣?

标签: algorithm matlab matrix


【解决方案1】:

一旦通过高斯消元将矩阵变为行梯形,秩就是非零行的数量。您应该能够将循环后的代码替换为 rankA=sum(sum(mat,2)>0); 之类的代码。

【讨论】:

  • if isempty(j) 怎么样....我试图用你的代码替换,但与 rank 函数相比是不正确的。您可以在dropbox.com/s/glt4y90mfr6tq06/A.mat?dl=0下载矩阵A
  • @user3051460 什么都不做,继续下一列。 “它不起作用”对调试没有帮助,那么您能否发布一个小示例以及输出有何不同?
  • 让我们检查一下我的代码和我的 A 示例。如果使用 rank(A),它将返回 400。但是,如果使用我的函数,则排名为 393,类似于二进制的排名我解释的矩阵
  • Elsenstat:你检查我的解决方案。请尝试运行它并在不使用排名函数的情况下让我知道改进,然后再返回以获得真实结果
猜你喜欢
  • 2012-02-28
  • 2018-01-21
  • 2014-03-13
  • 2015-01-10
  • 2017-06-15
  • 2013-07-18
  • 1970-01-01
  • 2019-09-08
  • 2018-02-22
相关资源
最近更新 更多