2

それぞれ1000個の値で構成される3つの時系列配列a、b、cがあります。それらは行列 A を構成します。

ここで、各配列を取得し、それを他のすべての配列に点ごとに乗算して、9 つの新しいベクトル a^2、ab、ac、ba、b^2、bc、ca、cb、cc を取得します。

これが完了したら、これらの 9 つの新しい配列を 81 の新しい配列に結合したいと考えています。

どうすればいいですか?私が言ったように、マトリックスを構築しようとしましたが、思ったように機能しません。A を 1000*1 の配列を含む 1*3 の行列として認識させたい。現在のように、すべてを連結するだけです。A が配列を含む 1*3 の行列である場合、すべての積を含む行列 B = transpose(A) * A を構築できます。

私は次のようなことを試しました

A = [[a] [b] [c]]

A = {a b c}

A = {a; b; c}
defining a, b and c as a = {1, 2, 5, 2 , 1 ...} instead of [1, 2, 5, 2 , 1 ...]

しかし、どれも機能しません。

a、b、c、d がリスト、列配列、行配列、またはセルとして格納されているかどうかは気にしません。また、matlab が苦手で、すべての微妙な違いを知ることができませんが、速度とメモリ パフォーマンスは一種の問題。

4

2 に答える 2

3

この問題は、インデックス ペアの作成にまで縮小されます。

%Simulate random data
X=rand(1000,3); 

%Create index multiplication pairs
[i,j] = meshgrid(1:size(X,2),1:size(X,2))

%Multiply together
X = X(:,i(:)).*X(:,j(:));

この場合、次の列のペアが乗算されます

[i(:)';j(:)'] = 
1     1     1     2     2     2     3     3     3
1     2     3     1     2     3     1     2     3

このプロセスを繰り返して再乗算できます。ただし、注意してください: 行列のサイズは反復回数で指数関数的に大きくなります。

于 2013-09-22T22:41:36.387 に答える
3

次のように実行できます。関数bsxfunpermuteは、Matlab の初心者には明らかではない可能性があるため、必要に応じてドキュメントを参照することをお勧めします (上記のリンクを参照)。

a3 つのデータ ベクトル、b、が与えられた場合c、次のように進みます。

A = [ a(:) b(:) c(:) ]; % matrix from column vectors
P = bsxfun(@times,A,permute(A,[1 3 2])); % desired result

結果Pは、目的の製品を含む 1000x3x3 配列です。の 2 番目と 3 番目のインデックスはP明らかな方法で解釈されます。1 は に a、2 は にb、3 は に対応しcます。たとえば、P(10,1,2)ですa(10)*b(10)P(50,3,3)ですc(50)^2。等々。

反復するには: 単純に新しい行列に入れ、手順を繰り返します:reshape PA2

A2 = reshape(P,[1000,9,1]);
P2 = bsxfun(@times,A2,permute(A2,[1 3 2])); % result

これにより、1000x9x9 配列で結果が得られP2ます。

于 2013-09-23T01:00:30.520 に答える