【问题标题】:MATLAB: Creating a matrix with all possible group combinationsMATLAB:创建具有所有可能组组合的矩阵
【发布时间】:2016-04-03 21:53:46
【问题描述】:

我正在运行一个有很多条件的实验,每个条件下都有特定数量的组。

A. 3组
B. 3组
C. 2组
D. 3组
E. 3组

我计算出有 3×3×2×3×3 = 162 种可能的组组合。

我想创建一个 162 行 5 列的 MATLAB 矩阵。即每个组合用一行,每组用一列表示值。

因此,例如,第一行将是 [1 1 1 1 1],表示此组合是所有条件的第 1 组。第二行是 [1 1 1 1 2],表示除了最后一个是组 2 之外,它是所有条件的组 1。第 162 行也是最后一行是 [3 3 2 3 3]。

M = 1 1 1 1 1
    1 1 1 1 2
    .........
    3 3 2 3 3

实现这一目标的最有效方法是什么?我意识到我可以使用循环,但确信有更好的方法。我想也许perms 函数会起作用,但我不知道如何。

【问题讨论】:

  • 嘿。我认为循环是开始它的好主意。如果有一种快速的方法,我也会感兴趣。到目前为止,您是否尝试过循环方法?
  • 我做到了,因为这只会出现在我的代码中,一旦减速实际上是不可察觉的。我从尝试更好地编写代码的角度提出了更多要求,而不是强烈需要提高速度。
  • 我添加了一个答案。 ;)

标签: matlab


【解决方案1】:

你可以使用combvec(见最后一行,剩下的只是生成测试数据):

% A. 3 groups
% B. 3 groups
% C. 2 groups
% D. 3 groups
% E. 3 groups

ngroups = zeros(5, 1);
ngroups(1) = 3;
ngroups(2) = 3;
ngroups(3) = 2;
ngroups(4) = 3;
ngroups(5) = 3;

v = {};
for i = 1:length(ngroups)
    v{i} = 1:ngroups(i) % generate a vector of valid group indices
end

% get all possible combinations
x = combvec( v{:} )

由于这将返回 5 x 162 double,因此您需要转置结果矩阵 x

x.'

【讨论】:

    猜你喜欢
    • 1970-01-01
    • 1970-01-01
    • 2014-10-27
    • 1970-01-01
    • 2012-11-25
    • 1970-01-01
    • 1970-01-01
    • 1970-01-01
    • 2023-04-08
    相关资源
    最近更新 更多