我有一个任意的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矩阵?
谢谢!
答案 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