私は可能な限り効率的に実装する必要がある非常に大きな乗算とサム演算を持っています。 L
は、実際には大きくなるだろうということMATLABのbsxfunは最適ですか? Pythonのnumpy.einsum?
L = 10000;
x = rand(4,1,L+1);
A_k = rand(4,4,L);
tic
for k = 2:L
i = 2:k;
x(:,1,k+1) = x(:,1,k+1)+sum(sum(bsxfun(@times,A_k(:,:,2:k),x(:,1,k+1-i)),2),3);
end
toc
注:私は今のところ見つけた最善の方法は、私のように問題を定式化MATLABでbsxfun
です。より速い方法がありますか?まず、シングルトンディメンションをx
に追加してからsum
に追加する必要があるのは奇妙ですが、それ以外は機能しません。
私が試した他の方法よりもずっと高速ですが、アプリケーションにとっては十分ではありません。私は、Python関数numpy.einsum
が効率的かもしれないという噂を聞いたことがありますが、コードを移植する前に、ここで最初に質問したかったのです。
私はMATLAB R2017bを使用しています。あなたは、MATLABの新しいバージョンを使っているので
多くの場合、forループはbsxfunよりも高速です。しかし、あなたはすでにそれを試しているようだ...? – Adiel
行列の乗算は 'bsxfun'よりも高速ですが、これは簡単にはできません。 –
@LuisMendo問題を疎行列の乗算に変換することを検討しましたが、少し難しいです...もっと早く? – Alex