我使用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];
如果可能的话,我宁愿没有循环
答案 0 :(得分:2)
以下是yuk's answer使用find
的改编:
[ib, ia] = find(true(size(b, 1), size(a, 1)));
needed = [a(ia(:), :), b(ib(:), :)];
这比使用kron
和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.
答案 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。