我正在生成一个包含零和一的所有可能组合的大矩阵,如下所示:
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)=[]
删除它,所以,我的问题是如何测试我的状况?
答案 0 :(得分:1)
要对其进行改写:找到any
列sum
为>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 = 7
和K = 3
,所有这些都比原始方法快至少1000倍。