3

我有一个函数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 会抱怨。关于如何修改它的任何建议?

4

2 回答 2

2

选项 2 似乎更好(但只有测试会告诉我们)。只需更换

dot(weights,y.*Psi)/norm

经过

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

或(可能更快)

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

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

于 2014-09-11T14:10:49.543 回答
1

您可以使用repmatonweightsPsi在 y 的列中复制向量:

nc = size(y,2);
Coefficients = dot(repmat(weights,1,nc), y.*repmat(Psi,1,nc))/norm;
于 2014-09-11T14:28:15.660 回答