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

Matlab 在矩阵上循环以查看所有行和列的组合,matlab,loops,matrix,Matlab,Loops,Matrix,我有一个任意的n×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 =

我有一个任意的n×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×n矩阵


谢谢

这里有一个简单的方法,只有两个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

可以将任意数量的循环减少为一个:

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]

这似乎是Louis Mendo问答的一个特例应用。你应该尝试将他的解决方案应用于你的问题,如果你陷入困境,再问一次。感谢@TheMinion,我现在来看看:)。那么所有这些组合中的行和列索引都是相同的吗?是的@Divakar,这是正确的。例如,如果我选择集合(1,1,1,3)或(1,3),那么我希望选择元素H(1,1)和H(3,3)所在的行和列。@Divakar您的意思是
~=0
逻辑
快,对吗?是的,我想是这样。是的,我的意思是
~=0
,也就是说,任何比较都可能比使用
logical
not()
预先附加~
@Divakar要好,谢谢。多亏了你@LuisMendo和Divakar,这也让你可以删除减法。这真的使这个过程更有效率。太棒了@Divakar你还记得关于那件事的问答吗?我一直在找,但找不到