Matlab 在矩阵上循环以查看所有行和列的组合
我有一个任意的n×n矩阵。我想看看矩阵的列和行的集合,并对它们进行一些分析,例如,将一组特定行和列的所有元素设置为零。为此,我需要分析所有行和列的组合 例如,如果n=3,流程将依次选择行和列1、2、3、12、13、23、123,并为每一行和列创建一个新变量 我目前正在使用以下技术制作尺寸为4的矩阵: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 =
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你还记得关于那件事的问答吗?我一直在找,但找不到