【问题标题】:MATLAB: efficient way to run a vector input function with an array inputMATLAB:使用数组输入运行向量输入函数的有效方法
【发布时间】:2014-11-05 12:44:20
【问题描述】:

我有一个函数HermitePCECoefficients,它接受多个参数作为输入,包括一个列向量y,并输出一个列向量Coefficients,长度与y相同:

Coefficients=HermitePCECoefficients(grid,weights,indices,y,mu,sigma,normalized)

现在假设y 不是一个列向量,而是一个二维数组(矩阵),我想在它的每一列上运行HermitePCECoefficients,将相应的输出存储在一个数组中。使用for 循环执行此操作简单明了,但需要很长时间:

Coefficients=zeros(size(y));
for i=1:size(y,2)
    Coefficients(:,i)=HermitePCECoefficients(grid,weights,indices,y(:,i),mu,sigma,normalized);
end
    

因此,我将bsxfun 投入工作。由于bsxfun 仅适用于二进制函数,因此我创建了一个“虚拟”二进制函数 f,它实际上只是一个单参数函数:

f=@(a,b) HermitePCECoefficients(grid,weights,indices,a,mu,sigma,normalized); 

然后这样使用bsxfun

Coefficients=bsxfun(f,y,omega_f);

这很好用,而且比for 循环快得多(不用担心omega_f,它只是一个长度与y 中的列数相对应的向量)。

问题 1:您认为在这种情况下使用 bsxfun 是否正确?

问题2:也许更好的解决方案是直接修改HermitePCECoefficients,这样它就可以将通用数组y作为输入。在函数内部,这是唯一需要 y 为列向量的行:

Coefficients(i)=dot(weights,y.*Psi)/norm;

weightsPsi 是两个列向量,所以如果我传递一个数组 y,MATLAB 会报错。有什么修改建议吗?

【问题讨论】:

    标签: arrays matlab vector bsxfun


    【解决方案1】:

    选项 2 似乎更好(但只有测试才能证明)。直接替换

    dot(weights,y.*Psi)/norm
    

    通过

    sum(bsxfun(@times, weights.*Psi, y)/norm)
    

    或(可能更快)

    (weights.*Psi).'*y / norm
    

    以上任何一个都等效于为y 的任意数量的列计算向量[ dot(weights,y(:,1).*Psi)/norm, dot(weights,y(:,2).*Psi)/norm, ... ]。此向量的每个条目都是y 列的结果。

    【讨论】:

    • 谢谢! dot(weights,y.*Psi)/norm 是数值积分,其中weights 是正交规则的权重,y.*Psi 是在正交横坐标处求得的被积函数。因此,出于纯粹的审美原因,我更愿意在之前执行yPsi 之间的乘法,然后是weights 的点积。但我知道这只是吹毛求疵,所以我选择了你的答案。
    • Ps 为什么在你的第二个解决方案中不需要sum,即为什么你没有写sum((weights.*Psi).'*y)/norm之类的东西,是(weights.*Psi)y之间的产品是矩阵产品,而不是元素产品,对吗?所以已经隐含了一个总和。
    • @DeltaIV 是的,第二个选项是矩阵乘法,其中包括一个和
    【解决方案2】:

    您可以在 weightsPsi 上使用 repmat 在 y 的列之间复制向量:

    nc = size(y,2);
    Coefficients = dot(repmat(weights,1,nc), y.*repmat(Psi,1,nc))/norm;
    

    【讨论】:

      猜你喜欢
      • 1970-01-01
      • 1970-01-01
      • 1970-01-01
      • 1970-01-01
      • 1970-01-01
      • 2018-11-03
      • 2019-09-05
      • 2016-04-06
      • 1970-01-01
      相关资源
      最近更新 更多