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

时间:2014-09-11 14:06:38

标签: arrays matlab vector bsxfun

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

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 个答案:

答案 0 :(得分: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列的结果。

答案 1 :(得分:1)

您可以使用repmat上的weightsPsi来复制y列中的向量:

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