计算更大尺寸的二进制矩阵的秩

时间:2014-12-05 09:31:10

标签: algorithm matlab matrix

地狱全部,我在计算二进制矩阵的秩时只有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。

1 个答案:

答案 0 :(得分:0)

一旦你将矩阵变成具有高斯消元的行梯形形式,等级就是非零行的数量。您应该能够在循环之后用rankA=sum(sum(mat,2)>0);

之类的代码替换代码