连接矩阵行的所有组合

时间:2013-07-18 08:56:43

标签: matlab matrix combinations

我使用matlab并且需要组合两个二维矩阵,以便生成的行是连接在一起的输入矩阵的行的组合。

我尝试过ndgrid,但这会创建所有可能的组合。我需要输入行保持在一起以创建输出。

以下是一个例子:

我得到了:

  a= [1 2 3
      4 5 6];

  b= [7 8
      9 10];

我需要:

needed = [1 2 3 7 8
          1 2 3 9 10
          4 5 6 7 8
          4 5 6 9 10];

如果可能的话,我宁愿没有循环

3 个答案:

答案 0 :(得分:2)

以下是yuk's answer使用find的改编:

[ib, ia] = find(true(size(b, 1), size(a, 1)));
needed = [a(ia(:), :), b(ib(:), :)];

这比使用kronrepmat要快得多。

基准

a = [1 2 3; 4 5 6];
b = [7 8; 9 10];

tic
for k = 1:1e3
    [ib, ia] = find(true(size(b, 1), size(a, 1)));
    needed = [a(ia(:), :), b(ib(:), :)];
end
toc

tic
for k = 1:1e3
    needed = [kron(a, ones(size(b,1),1)), repmat(b, [size(a, 1), 1])];
end
toc

结果:

Elapsed time is 0.030021 seconds.
Elapsed time is 0.17028 seconds.

答案 1 :(得分:1)

a使用Kronecker产品,repmat使用b

[kron(a, ones(size(b,1),1)), repmat(b, [size(a, 1), 1])]

ans =

     1     2     3     7     8
     1     2     3     9    10
     4     5     6     7     8
     4     5     6     9    10

答案 2 :(得分:-1)

它提供了所需的结果,但如果您有重复的项目,则可能需要其他东西,然后是array_merge。

$a = array(array(1, 2, 3), array(4, 5, 6));
$b = array(array(7, 8), array(9, 10));

$acc = array_reduce($a, function ($acc, $r) use ($b) {
  foreach ($b as $br) {
    $acc []= array_merge($r, $br);
  }

  return $acc;
}, array());

var_dump($acc);

编辑:对不起我刚注意到“没有循环”部分。您可以将foreach更改为array_reduce。