3

2D 配列のセット (必要に応じて 3D マトリックス) で 2 つのパラメーター (1 つのセット: t、もう 1 つは配列から取得) の指数演算を実行する必要があります。f(t,x) = exp(tx) そして、3 次元のすべての値の結果を追加する必要があります。bsxfun操作全体を実行するには時間がかかりすぎるため、ルックアップ テーブルの使用を考えていました。

テーブルをマトリックスLUT(2 つのパラメーターにより 2 次元) として作成し、 を使用して値を取得できますLUT(par1,par2)。しかし、ループを使用して 3 次元にアクセスするのもコストがかかります。

私の質問は次のとおりです。そのようなメカニズム(ルックアップテーブル)を実装して定義済みの値を持ち、ループなしでマトリックス要素からアクセスする(インデックスの種類)だけを使用する方法はありますか。または、指数演算を高速化するために MATLAB が自動的に処理するルックアップ テーブルを作成するにはどうすればよいですか?

編集:実際にLUTを作成するために同様の方法を使用しました。さて、私の問題は実際に効率的な方法でアクセスする方法です。

2次元配列があるとしましょうMf(t,M(i,j))これらの値を使用して、固定値の関数を適用しますt。ループを使用して、M のすべての値 (i,j) を調べることができます。ただし、M のセットがあるため、より高速な方法が必要であり、この手順を他のすべての値に適用する必要があります。 .

私の関数は、私が与えた例よりも少し複雑です:

pr = mean(exp(-bsxfun(@rdivide,bsxfun(@minus,color_vals,double(I)).^2,m)./2),3);

ご覧のとおり、これは私の実際の機能であり、私が提示した例よりも複雑です。しかし、考え方は同じです。2 つの配列の差の指数関数の M のセットの 3 番目の次元で平均をとります。

それが役立つことを願っています。

4

2 に答える 2

5

質問があまり明確ではなく、いくつかのコードを示すと役立つことに同意します。とにかくやってみます。

LUT を意味のあるものにするためには、得られる値のセットt-xを整数などに制限する必要があります。

指数が -1000 から 1000 までの任意の整数であると仮定すると、次のような LUT を作成できます。

LUT = exp(-1000:1000);

次に、インデックスを作成します (tが 1D 配列で、x が 2D 配列であると仮定します) 。

indexArray = bsxfun(@minus,reshape(t,[1,1,3]), x) + 1001; %# -1000 turns into 1

最後に、結果を作成します

output = LUT(indexArray);
%# sum along third dimension (i.e. sum over all `t`)
output = sum(output,3);
于 2010-10-15T20:18:16.343 に答える
0

あなたの質問を理解しているかどうかはわかりませんが、これが答えだと思います。

x = 0:3
y = 0:2
z = 0:6

[X,Y,Z] = meshgrid(x,y,z)

LUT = (X+Y).^Z
于 2010-10-15T13:43:19.813 に答える