【问题标题】:All combinations out of a two-column-matrix in matlabmatlab中两列矩阵的所有组合
【发布时间】:2014-03-29 07:07:24
【问题描述】:

我有一个关于 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-command 会创建一个休矩阵,该矩阵会被最后一个命令行缩短。实际上,我只能将此解决方案用于长度为 15 位的输入向量,因为 nchoosek-command 无法处理更多。

我现在正在搜索的是一种无需 nchoosek-command 即可创建这些组合的方法。有人知道怎么做吗?

感谢和问候

乔纳斯

【问题讨论】:

标签: matlab optimization matrix combinations


【解决方案1】:

您的解释不清楚,但我假设:

  1. M 中的所有行都是唯一的。
  2. 寻找没有数字出现两次的行组合M
  3. 每个组合的长度为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 中的行数。

【讨论】:

  • 谢谢,代码很好。我只需要删除 "if k==0"... 部分即可获得所有必需的组合。但不幸的是,它并没有太大变化。当我使用例如 M=nchoosek(1:16,2) 启动程序时,我的 matlab 崩溃或需要数小时才能计算。似乎不可能生成这个长度(M)> 15的矩阵
猜你喜欢
  • 2012-11-25
  • 1970-01-01
  • 1970-01-01
  • 2016-04-07
  • 1970-01-01
  • 2017-09-25
  • 2011-01-21
  • 1970-01-01
  • 1970-01-01
相关资源
最近更新 更多