为n个数字创建矩阵所有可能的组合

时间:2017-03-31 09:16:20

标签: matlab matrix

所以这是我发布的第一个问题。 我在Matlab中创建矩阵时遇到了一些问题。 我想创建一个矩阵,其中包含所有可能的数字[1,2,3]的唯一组合(因此没有任何重复的组合)。

这意味着它将创建一个如下所示的矩阵:

1 2

1 3

1 2 3

2 3

提前致谢!

2 个答案:

答案 0 :(得分:0)

我还没有发表评论,没有足够的声誉...... 如前所述,您不能使用非矩形矩阵。

例如,您可以以单元格数组的形式获得解决方案,此代码可以执行此操作(尽管可能不是最有效的):

function [ all_subsets ] = find_subsets( tab )
%UNTITLED2 Summary of this function goes here
%   Detailed explanation goes here
    if (isempty(tab))
        all_subsets = {[]};
    else
        subsets_1 = find_subsets(tab(2:end));

        Y = num2cell(ones(1, length(subsets_1)) * tab(1));
        subsets_2 = arrayfun(@(L, X) add_elem(L, X), subsets_1, Y, 'UniformOutput', false);
        all_subsets = [subsets_1 subsets_2];
    end

end

function [L2] = add_elem(L, X)
    L2 = L{1};
    L2(end+1)=X{1};
end

然后你打电话:

find_subsets(1:3)

修改

这实际上是在扭转元素,您可以通过后期处理或使用:

来纠正这些元素
        subsets_1 = find_subsets(tab(1:end-1));

        Y = num2cell(ones(1, length(subsets_1)) * tab(end));

答案 1 :(得分:-1)

你不能有这样的矩阵。你只能:

1 2 NaN
1 3 NaN
1 2 3
2 3 NaN

您可以拥有A = cell(4,1); A{1} = [1, 2]; A{2} = ...

等单元格数组

如果您希望获得能够产生所有可能性的代码(我相信您真正想要的那些),那么请更改您的问题并展示您已经尝试过的内容。

现在让我们假设这是你真正想要的。你应该做递归。伪代码解决方案就像:

generatelist(numbers)
if numbers is empty, return [];
else return cell array length numbers+1, where first element is empty and the remaining ones have that numberX + output of generatelist(numbers > numberX). 

要摆脱单个元素的答案,最后将它们解析出来,它会略微简化递归部分。 要获取矩阵,找到最长的单元格和组合编号,使用nans创建矩阵并填充值。