1

プログラミングはまだまだ初心者...

時間 t、t+1、t+2 などに 9x1 ベクトルがあります。

[10 10 10 10 10 10 10 10 10]'

および行列。各行列は 9x9 で、時間 1、t+1、t+2 などでも =

 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

それらは 3 次元の行列であり、将来的には 4 次元にしたいと考えています。

vector(:,:,t) に時刻 t の行列の対角を乗算し、vector(:,:,t+1) を出力したいと考えています。

要するに...

ベクトル t に diag 行列 t を掛けたもの = ベクトル t+1

ベクトル t+1 に diag 行列 t+1 を乗算 = ベクトル t+2

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

対角線の数値はタイム ステップごとに変化しますが、簡単にするために、ここではすべて 1 のままにします。

diag を使用してみましたが、2D 入力を使用する必要があると記載されているため、t を無視した場合にのみ機能します。

あなたの助けに乾杯 - それは私が多くのことを学ぶのを助けています. ヒントや解決策は大歓迎です。皆さんが最も簡単で最も効率的なソリューションを知っていることは知っています。

4

2 に答える 2

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)

結果の各列は、各スライスの対角要素に対応します (正方行列である必要はありません)。

>> 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
于 2011-10-22T05:19:18.867 に答える
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になるはずです。

于 2011-10-21T18:25:34.547 に答える