performance - 通过更少的操作提高代码的性能

标签 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 函数,必须用 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)。

这可以推广到 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 也可用于以这种方式复制值(索引)。

如果您有神经网络工具箱,也可以看看 combvec , 作为 demonstrated here .

关于performance - 通过更少的操作提高代码的性能,我们在Stack Overflow上找到一个类似的问题: https://stackoverflow.com/questions/22054375/

相关文章:

matlab - 如何在 Matlab 中规范化音频文件

matlab - 如何在 MATLAB 或 Octave 中在 x 轴上绘制日期时间

c - 为什么有些算术运算比平时花费更多的时间?

c# - 我可以阻止用户修改C#中的参数吗

performance - 将 64 位加法拆分为两个 32 位加法

postgresql - 30 行很少的表 - TRUNCATE 清空它们并重置附加序列的最快方法?

c# - 一个函数会打印多少次到控制台?

MATLAB 矢量化以创建矩阵

matlab - 试图找到/理解哈里斯角的正确实现

matlab - ROC曲线和libsvm