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

时间:2014-02-26 22:02:44

标签: performance matlab

有两个向量:

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 函数不能使用,必须用替换为循环。什么是更好的解决方案?

2 个答案:

答案 0 :(得分: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个维度(请参阅herehere):

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对于以这种方式复制值(索引)也很有用。

如果您有神经网络工具箱,请同时查看combvecdemonstrated here

答案 1 :(得分: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秒)并重复的张量积(在这种情况下不存在第四个,所以不重复。