Warning: file_get_contents(/data/phpspider/zhask/data//catemap/0/performance/5.json): failed to open stream: No such file or directory in /data/phpspider/zhask/libs/function.php on line 167

Warning: Invalid argument supplied for foreach() in /data/phpspider/zhask/libs/tag.function.php on line 1116

Notice: Undefined index: in /data/phpspider/zhask/libs/function.php on line 180

Warning: array_chunk() expects parameter 1 to be array, null given in /data/phpspider/zhask/libs/function.php on line 181
Performance 用更少的操作数提高代码的性能_Performance_Matlab - Fatal编程技术网

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

Performance 用更少的操作数提高代码的性能,performance,matlab,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

有两个向量:

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循环。什么是更好的解决方案?

一种方法是组合,如下所示:

[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第二个)的张量积并重复(在这种情况下,没有第四个,因此没有重复。

对于大于2个尺寸,使用:

请注意,
ndgrid
需要(行、列等)而不是(x、y)

这可以概括为N个维度(参见和):

此外,正如Robert p.的回答和所述,
kron
也可以用于以这种方式复制值(索引)


如果你有神经网络工具箱,也可以看看,如。

这些都是很好的
kron
技巧。(p1)我给了你的答案一个提示,因为这是一个很好的快速的二维或三维方法,我也喜欢使用。
>> 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
params = {a,b,c};
vecs = cell(numel(params),1);
[vecs{:}] = ndgrid(params{:});
D = reshape(cat(numel(vecs)+1,vecs{:}),[],numel(vecs));