我有一个函数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;
weights
和Psi
是两个列向量,所以如果我传递数组y
,MATLAB会抱怨。有关如何修改它的任何建议?谢谢,
塞尔吉奥
答案 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
上的weights
和Psi
来复制y列中的向量:
nc = size(y,2);
Coefficients = dot(repmat(weights,1,nc), y.*repmat(Psi,1,nc))/norm;