MATLAB:用数组输入运行矢量输入函数的有效方法



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

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

现在假设y不是一个列向量,而是一个2D阵列(矩阵),我想在它的每一列上运行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会抱怨。关于如何修改它,有什么建议吗?

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

dot(weights,y.*Psi)/norm

通过

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

或者(可能更快)

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

以上任一项等效于针对任意数量的列CCD_ 22计算向量CCD_。该向量的每个条目是CCD_ 23的一列的结果。

您可以在weightsPsi上使用repmat来跨y:列复制矢量

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

相关内容

  • 没有找到相关文章

最新更新