用更少的操作来提高代码的性能

4

有两个向量:

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个回答

3

对于大于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)。
这可以推广到N维(参见这里这里):
params = {a,b,c};
vecs = cell(numel(params),1);
[vecs{:}] = ndgrid(params{:});
D = reshape(cat(numel(vecs)+1,vecs{:}),[],numel(vecs));

此外,正如罗伯特P.的回答和这里所描述的那样,kron在复制值(索引)方面也非常有用。
如果您拥有神经网络工具箱,请查看combvec,正如这里所演示的

1
一种方法是将 repmatKronecker tensor product 结合起来,像这样:
[repmat(a,size(b)); kron(b,ones(size(a)))]'
ans =

     1     1
     2     1
     3     1
     4     1
     5     1
     1     2
     2     2
     3     2
     4     2
     5     2

这可以通过以下方式扩展到更多维度:

a = 1:3;
b = 1:3;
c = 1:3;

x = [repmat(a,1,numel(b)*numel(c)); ...
     repmat(kron(b,ones(1,numel(a))),1,numel(c)); ...
     kron(c,ones(1,numel(a)*numel(b)))]'

有一个逻辑!第一步:简单地重复第一个向量。第二步:使用第一个向量的维度进行张量积并重复它。第三步:使用(第一个x第二个)的维度进行张量积并重复(在此情况下没有第四步,因此不需要重复)。


1
这些是不错的 kron 技巧。(p1) 我在我的答案中稍微提了一下你的答案,因为这是一个我也喜欢使用的不错的快速处理二维或三维数据的方法。 - chappjc

网页内容由stack overflow 提供, 点击上面的
可以查看英文原文,
原文链接