2

第3軸に沿ってmatlabで784x784マトリックスを複製しようとしています。次のコードは機能しているようです。

mat = reshape(repmat(mat, 1,10000),784,784,10000);

残念ながら、実行に時間がかかりすぎて意味がありません (10,000 を 1000 に変更すると数分かかり、10,000 を使用するとマシン全体が実質的にフリーズします)。これを行うより速い方法はありますか?

参考までに、それぞれの長さが 784 の 10,000 個のベクトルで mvnpdf を使用し、それぞれに同じ共分散行列を使用しようとしています。だから私の最終的な呼び出しは次のようになります

mvnpdf(X,mu,mat)  

%size(X) = (10000,784), size(mu) = (10000,784), size(mat) = 784,784,10000

共分散行列を 10,000 回繰り返さない方法があれば、それも役に立ちます。ありがとう!

4

2 に答える 2

7

2 つ以上の次元でレプリケーションを行うには、レプリケーション カウントを配列として指定する必要があります。

out = repmat(mat,[1,1,10000])
于 2013-02-25T22:47:23.970 に答える
3

784x784 の行列を 10,000 回作成しても、MATLAB のベクトル化を利用することはできません。これは、小さな配列の場合により便利です。次の場合、 for ループを回避してもあまり役に立ちません。

ここで得られる主な高速化は、共分散行列の逆行列を 1 回計算してから、pdf を自分で計算することです。シグマの逆数は O(n^3) かかり、不必要に 10,000 回実行しています。(また、平方根の行列式を事前に計算できます。)参考までに、多変量正規分布の PDF は次のように計算されます。

http://en.wikipedia.org/wiki/Multivariate_normal_distribution#Properties

逆数を 1 回だけ計算してから、z = x - mu値ごとに計算し、z'Szpdf 値ごとに計算して、単純な関数と定数を適用することをお勧めします。ちょっと待って!それもベクトル化できます。

目の前に MATLAB はありませんが、これは基本的に必要なことであり、すぐに実行されます。

s = inv(sigma);
c = -0.5*log(det(s)) - (k/2)*log(2*pi);
z = x - mu;                   % 10000 x 784 matrix
ans = exp( c - 0.5 .* dot(z*s, z, 2) ); % 10000 x 1 vector
于 2013-02-25T23:30:25.027 に答える