x = rand(10,100,3);
及び機能セルアレイを有する:擬似コードは
funcca = {...
@(v)(v(1)+v(2)), @(v)(v(1)-v(2)), ......, @(v)(v(1)+v(2)+v(3)^2);
⋮
⋮
@(v)(v(1)^6+sqrt(v(3))), @(v)(sin(v(1))-cos(v(2))),......,@(v)(v(1))
};
size(funcca) = [10, 100]
あります。 funcca
の各機能が異なることを意味します。
今私はy
を計算するには、次のコードを使用します。
y = nan(10,100);
for i = 1 :10
for j = 1:100
y(i,j) = funcca{i,j}(squeeze(x(i,j,:)));
end
end
は、私はこの2つのfor
ループを避けるためか、このプロセスをベクトル化する可能性が方法はありますか?
緩やかに話すベクトル化は、配列入力の各要素の関数の複数の呼び出しを、配列全体の関数の単一呼び出しに変換することです。ここでは、forループではなく1000個の異なる関数を呼び出すため、ベクトル化のための場所がありません。 – rahnema1
関数を呼び出す方法ではなく、ベクトル化する必要があります。 –
私はあなたの主なパフォーマンスの問題は、ループ内の 'squeeze 'だと思います。これはMATLABに組み込まれていないので、JITでコンパイルできず、ひどいパフォーマンスが得られます。ループの前に 'permute'を実行して、ループ内の抽出インデックスを調整すれば、かなり改善されるはずです。 –