我对Matlab中矩阵行的所有组合都有疑问。我目前用双列矩阵创建一个组合矩阵:
输入:
1 2
1 3
1 4
2 3
2 4
3 4
我得到的是以下内容:
1 2 3 4
1 3 2 4
1 4 2 3
当输入矩阵具有1:6的条目时,它看起来像这样:
1 2 3 4 5 6
1 2 3 5 4 6
1 2 3 6 4 5
1 3 2 4 5 6
1 3 2 5 4 6
....
目前我已经实施了以下解决方案,该方案几乎完美无缺(感谢Luis Mendo):
M = [1 2
1 3
1 4
2 3
2 4
3 4]; %// example data
n = floor(max(M(:))/2); %// size of tuples. Compute this way, or set manually
p = nchoosek(1:size(M,1), n).'; %'// generate all n-tuples of row indices
R = reshape(M(p,:).', n*size(M,2), []).'; %// generate result...
R = R(all(diff(sort(R.'))),:); %'//...removing combinations with repeated values
我现在遇到的问题是尺寸。我需要这个矩阵用于优化算法,但是nchoosek命令创建一个休眠矩阵,它使用最后一个命令行得到短路。我实际上只能将此解决方案用于长度为15位的输入向量,因为nchoosek命令无法处理更多。
我现在正在搜索的是一种在没有nchoosek命令的情况下创建这些组合的方法。有人知道怎么做?
非常感谢
纳斯
答案 0 :(得分:0)
您的解释并不清楚,但我认为:
M
中的所有行都是唯一的。M
的组合,其中没有数字出现两次。floor(max(M(:))/2)*2
。然后使用递归,这应该有效。
function [ U ] = searchappend( R,M, d, max_d )
% termination criteria
if d==max_d
U=R;
return;
end
lM = length(M(:,1));
k=0;
U = [];
% seek for the row to append
for i=1:lM
if sum(ismember(M(i,:),R))==0
S = [R,M(i,:)];
T = searchappend(S, M(i+1:end,:), d+1, max_d);
if k==0 && (~isempty(T))
k=k+1;
U = [U;T];
end
end
end
end
_____________
lM = length(M);
n = floor(max(M(:))/2);
A = [];
for i=1:(lM-n+1)
R = M(i,:);
T = searchappend(R,M(i+1:end,:),1,n);
if ~isempty(T)
A = [A;T];
end
end
请注意,我没有对其进行优化,因此可能会很慢。复杂度应为O(n!),其中n是M中的行数。