1

我使用 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];

如果可能的话,我宁愿在没有循环的情况下这样做

4

3 回答 3

2

这是对yuk 答案的改编find

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

这应该比使用kronand快得多repmat

基准

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.
于 2013-07-18T11:08:17.867 回答
1

将 Kronecker 产品用于a和:repmatb

[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
于 2013-07-18T09:28:24.267 回答
-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。

于 2013-07-18T09:08:55.763 回答