所有组合都来自matlab中的双列矩阵

时间:2014-03-29 07:07:25

标签: matlab optimization matrix combinations

我对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命令的情况下创建这些组合的方法。有人知道怎么做?

非常感谢

纳斯

1 个答案:

答案 0 :(得分:0)

您的解释并不清楚,但我认为:

  1. M中的所有行都是唯一的。
  2. 寻找行M的组合,其中没有数字出现两次。
  3. 每个组合的长度为floor(max(M(:))/2)*2
  4. 然后使用递归,这应该有效。

    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中的行数。