有两个向量:
a = 1:5;
b = 1:2;
为了找到这两个向量的所有组合,我使用了以下代码:
[A,B] = meshgrid(a,b);
C = cat(2,A',B');
D = reshape(C,[],2);
结果包括所有组合:
D =
1 1
2 1
3 1
4 1
5 1
1 2
2 2
3 2
4 2
5 2
现在是问题:
1- 我想减少运算次数以提高较大向量的性能。 MATLAB 中是否有任何单个函数正在执行此操作?
2- 如果向量的数量超过 2,则不能使用 meshgrid 函数,必须用 for 循环代替。什么是更好的解决方案?
最佳答案
对于大于 2 的维度,使用 ndgrid
:
>> a = 1:2; b = 1:3; c = 1:2;
>> [A,B,C] = ndgrid(a,b,c);
>> D = [A(:) B(:) C(:)]
D =
1 1 1
2 1 1
1 2 1
2 2 1
1 3 1
2 3 1
1 1 2
2 1 2
1 2 2
2 2 2
1 3 2
2 3 2
请注意 ndgrid
期望的是 (rows,cols,...) 而不是 (x,y)。
params = {a,b,c};
vecs = cell(numel(params),1);
[vecs{:}] = ndgrid(params{:});
D = reshape(cat(numel(vecs)+1,vecs{:}),[],numel(vecs));
此外,如 Robert P. 的回答和 here too 中所述, kron
也可用于以这种方式复制值(索引)。
如果您有神经网络工具箱,也可以看看 combvec
, 作为 demonstrated here .
关于performance - 通过更少的操作提高代码的性能,我们在Stack Overflow上找到一个类似的问题: https://stackoverflow.com/questions/22054375/