0

x、y、z の 3 つのベクトルがあります。a(i,j,k) = [x(i),y(j),z(k)] となるように配列 a を作成するにはどうすればよいですか?

私は試した

a(:,:,1) = [[1,2];[3,4]]

しかし得た

Subscripted assignment dimension mismatch.

コメント後に編集

基本的に、最初に x、y、z から配列 a を作成したかったのですが、ここに私の元の問題があります (したがって、ベクトルを作成する方がよいと思います): x、y、z という 3 つのベクトルがあります。x = [1 とします。 2 3]、y = [4,3,2] z = [1,3,2]

配列を使用して考えていた各 [x_i、y_j、z_k] のガウス確率関数を計算したい。だから私は最初に配列 a で mvnpdf を使ってみました:

a = rand(3,3,3) < 0.1

mvnpdf(a,[1,2,3],eye(3))

しかし、matlab は次のエラーを返しました。

Error using mvnpdf (line 46)
X must be a matrix.

どうやら、彼は私が配列を使用することに満足していないようです。

必要なものを計算する方法を知っていますか (実際のベクトル x、y、z のサイズに対して非常に時間がかかる for ループを使用することは別として)。

4

1 に答える 1

2

次のようなことができます。

x = [10 20 30 40 50]; % example x
y = [100 200 300 400]; % example y
z = [1000 2000 3000]; % example z.    

[ii jj kk] = ndgrid(1:length(x), 1:length(y), 1:length(z));
a = cat(4, x(ii), y(jj), z(kk));

結果は、サイズx x xaの 4 次元配列です。4 番目の次元は、目的のベクトルの 3 つの要素を表します。したがって、目的の結果は、またはむしろ で与えられます。例えば、length(x)length(y)length(z)3[x(i),y(j),z(k)]a(i,j,k,:)squeeze(a(i,j,k,:)).'

>> squeeze(a(1,2,3,:)).'
ans =
          10         200        3000

コメントに従って、@chappjc に感謝します。これらすべてのベクトルを 3 列の行列の行として辞書順に積み上げたい場合は、次のようにします。

[kk jj ii] = ndgrid(1:length(z), 1:length(y), 1:length(x));
b = [x(ii(:)).' y(jj(:)).' z(kk(:)).'];

結果:

>> b(1,:)
ans =
          10         100        1000

>> b(2,:)
ans =
          10         100        2000

于 2013-10-28T22:35:59.477 に答える