在矩阵上循环以查看行和列的所有组合

时间:2014-09-11 09:57:00

标签: matlab loops matrix

我有一个任意的n-by-n矩阵。我想查看矩阵的列和行的集合,并对它们进行一些分析,例如通过设置一组特定行和列的所有元素等于零。为此,我需要分析行和列的所有组合。

例如,如果n = 3,则该过程连续选择行1,2和3,12,13,23,123,并为每个行和列创建一个新变量。

我目前是下面针对4号矩阵的技术:

H = [some 4-by-4 matrix] 

for i1 = 1:n
    for i2 = 1:n
        for i3 = 1:n
            for i4 = 1:n

                    % Set all rows and columns of all variables equal to 0

                    H(:,i1) = 0;
                    H(i1,:) = 0;

                    H(:,i2) = 0;
                    H(i2,:) = 0;

                    H(:,i3) = 0;
                    H(i3,:) = 0;

                    H(:,i4) = 0;
                    H(i4,:) = 0;

                    % Some more analysis on i1, i2, i3, i4...

            end
        end
    end
end 

这是一种非常粗糙的方法,但似乎有效。显然,这种技术看的是集合(1,1,1,1),它等于只有(1)首先,然后(1,1,1,2)相当于(1,2),然后(1) ,1,1,3)相当于(1,3)......等等......

这里的问题是,这不是任何大小为n的矩阵的一般过程,这只是一个大小为4的矩阵的粗略过程。

有没有什么方法可以推广这个过程,使它适用于任意n-by-n矩阵?

谢谢!

2 个答案:

答案 0 :(得分:2)

您可以将任意循环次数减少为1:

for k = 1:2^n-1
    ind = dec2bin(k,n)=='1';
    H(ind,:) = 0;
    H(:,ind) = 0;
end

诀窍是只使用一个循环来创建一个逻辑索引(ind),告诉您将选择哪些列。因此,对于n=4,变量ind采用值[0 0 0 1][0 0 1 0][0 0 1 1],... [1 1 1 1]

答案 1 :(得分:0)

这是一个简洁的方法,只有两个for循环,没有魔术功能。它使用整数的二进制表示来决定是否将列和行清零。

我只修复了测试的一些值

n = 3;
Mat = rand(n,n);

然后,我们知道有2 ^ n个组合,所以让它们从0到2 ^ n-1编号:

for tag=0:2^n-1

我们制作副本以保持原始矩阵不受影响

    myMat = Mat;

现在循环行和列

    for (i=1:n)

这是诀窍:如果标记的第i位(二进制)为1,那么我们将列和行清零,否则我们保持不变。

        if ( mod( floor(tag/2^(i-1)), 2) == 1 )
            myMat(:,i) = 0;
            myMat(i,:) = 0;
        end
    end

最后显示以检查我们是否有我们需要的东西。

    myMat
end