删除大矩阵内的子矩阵

时间:2015-03-26 10:31:22

标签: matlab matrix

我正在生成一个包含零和一的所有可能组合的大矩阵,如下所示:

X = dec2base(0:power(2,M*K)-1,2) - '0'; 
combinations = reshape(permute(X,[3 2 1]),M,K,[]);

combinations中的每个矩阵中,我需要删除在其一个或多个列中具有多个“1”的那些矩阵。 例如: 如果j的任何值为combinations(:,:,j)  combinations(:,:,j)=[1 0 0 0;1 0 0 1],即它在第1列中有两个“1”值,我需要使用combinations(:,:,j)=[]删除它,所以,我的问题是如何测试我的状况?

2 个答案:

答案 0 :(得分:1)

要对其进行改写:找到anysum>1并删除它们的矩阵

在代码中:

logical_index=any(sum(combinations,1)>1,2)
combinations(:,:,logical_index)=[]

答案 1 :(得分:0)

正如您所解释的那样,您希望生成一个矩阵,该矩阵包含在所有可能的二元元素矩阵中,该矩阵不超过一个' 1'在任何一列中,精确构建矩阵可能比生成一个更大的矩阵要快得多,然后进行一些修剪操作。 (是的,即使涉及for - 循环!)

第1版 - 循环dim=3,向量化dim=[1,2]

%// Input
M = 7;
K = 3;
%// Computation
Vs = [zeros(M,1), eye(M)];
[numGrid{1:K}] = ndgrid(1:M+1);
Nums = reshape(cat(3, numGrid{:}), [], K);

combinations = zeros(M, K, size(Nums,1));
for i = 1:size(Nums,1)
    combinations(:,:,i) = Vs(:,Nums(i,:));
end

或者如果你想要更快的方法:

第2版 - 循环dim=[1,2],向量化dim=3

%// Input
M = 7;
K = 3;
%// Computation
Vs = [zeros(M,1), eye(M)];
[numGrid{1:K}] = ndgrid(1:M+1);
Nums = reshape(cat(3, numGrid{:}), [], K);

combinations = zeros(M, K, size(Nums,1));
for i = 1:M
    for j = 1:K
        combinations(i,j,:) = Vs(i,Nums(:,j));
    end
end

第3版 - 使用bsxfun

完全向量化
%// Input
M = 7;
K = 3;
%// Computation
[numGrid{1:K}] = ndgrid(0:M);
Nums = reshape(cat(3, numGrid{:}), [], K);
combinations = bsxfun(@eq, (1:M).', permute(Nums,[3,2,1]));

对于M = 7K = 3,所有这些都比原始方法快至少1000倍。