我有一个函数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;
weights
和Psi
是两列矢量,所以如果我通过一个数组y
,MATLAB会抱怨。关于如何修改它,有什么建议吗?
选项2似乎更好(但只有测试才能证明)。只需更换
dot(weights,y.*Psi)/norm
通过
sum(bsxfun(@times, weights.*Psi, y)/norm)
或者(可能更快)
(weights.*Psi).'*y / norm
以上任一项等效于针对任意数量的列CCD_ 22计算向量CCD_。该向量的每个条目是CCD_ 23的一列的结果。
您可以在weights
和Psi
上使用repmat
来跨y:列复制矢量
nc = size(y,2);
Coefficients = dot(repmat(weights,1,nc), y.*repmat(Psi,1,nc))/norm;