2011-10-21 15 views
1

に+プログラミングに非常に新しい1をtに...トンから行列の対角を持つベクトルの乗算まだMatlabの

私は時刻tで9x1ベクトルを持っている、T + 1、T + 2など

[10 10 10 10 10 10 10 10]

およびマトリックス。各行列は=

1  0  0  0  0  0  0  0  0 
0  1  0  0  0  0  0  0  0 
0  0  1  0  0  0  0  0  0 
0  0  0  1  0  0  0  0  0 
0  0  0  0  1  0  0  0  0 
0  0  0  0  0  1  0  0  0 
0  0  0  0  0  0  1  0  0 
0  0  0  0  0  0  0  1  0 
0  0  0  0  0  0  0  0  1 

彼らは3D行列であると私は彼らが将来的に4dを作りたい路盤と、時間1で、T + 1、T + 2などです。

ベクトル(:、:、t)に時刻tの行列の対角を掛けて、出力ベクトル(:、:、t + 1)に掛けたいとします。 DIAG行列T + 1 =ベクトルt + 2

DIAG行列Tを乗じ=ベクトルtは、+ 1

ベクトルt + 1を乗じたショート...

ベクトルtでそう

diag行列t + 2 =ベクトルt + 3 ...を掛けたベクトルt + 2など。

各時間ステップで対角線の数字が変わりますが、簡単にするために、すべての時間を1に保ちましょう。

私はdiagを使用しようとしましたが、2D入力を使用する必要があるので、tを無視すると機能します。

あなたの助けを差し上げる人たちに感謝します。ヒントや解決策は非常に高く評価されます。私は皆さんが、最も簡単で効率的なソリューションを知っていることを知っています。

+1

ところで、tの余分な次元は必要ありません。それらを2D行列の列として持つことができます。 –

答えて

1

ここに行く:

n = 10; 

% Make sample data 
t = zeros(9,1,n); 
t(:,1,1) = 1; 
T = repmat(diag(ones(9,1)), [1 1 n]); 

% Loop though to fill in t based on previous t and T 
for i = 2:n 
    t(:,1,i) = t(:,1,i-1) .* diag(T(:,:,i-1)); 
end 

今、すべてのtのは1

+0

ありがとうございました!これは多くの意味があります。 – Tetra

+0

うれしかったよ! –

2

である必要があり、各ステップの結果は、前回の反復に依存しているので、それはベクトル化することはできません。だから私は@JohnColbyの解決策に行くだろう。それは価値がある、ここにあなたがベクトル化された方法で、3Dマトリックスの対角線を抽出する方法を例です何のため

M = reshape(1:3*4*3,[3 4 3]); 
[r,c,p] = size(M); 

ind = bsxfun(@plus, (1:r+1:r*c)', (0:p-1).*r*c); 
M(ind) 

結果の各列は、各スライスからの対角要素に対応(doesnの

>> M 
M(:,:,1) = 
    1  4  7 10 
    2  5  8 11 
    3  6  9 12 
M(:,:,2) = 
    13 16 19 22 
    14 17 20 23 
    15 18 21 24 
M(:,:,3) = 
    25 28 31 34 
    26 29 32 35 
    27 30 33 36 

>> M(ind) 
ans = 
    1 13 25 
    5 17 29 
    9 21 33 
+0

うわー、これはとても優雅な解決策です。私はbsxfunを探します。ありがとうございました。 – Tetra