Умножение векторов с диагональю матриц от t до t + 1 в Matlab

Все еще очень новичок в программировании ...

У меня есть векторы 9x1 в момент времени t, t + 1, t + 2 и т. Д.

[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д.

Я хочу умножить вектор (:,:, t) на диагональ матрицы в момент времени t и выходной вектор (:,:, 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.

Приветствую вас за помощь, ребята - это помогает мне многому научиться. Будем очень признательны за любые подсказки или решения. Я знаю, что вы, ребята, знаете самые простые и эффективные решения.


person Tetra    schedule 21.10.2011    source источник
comment
Кстати, вам не нужно это дополнительное измерение для t. Вы можете просто иметь их как столбцы в 2D-матрице.   -  person John Colby    schedule 21.10.2011


Ответы (2)


Ну вот:

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.

person John Colby    schedule 21.10.2011
comment
Большое тебе спасибо! В этом есть большой смысл. - person Tetra; 22.10.2011

Поскольку результат каждого шага зависит от предыдущей итерации, его нельзя векторизовать. Поэтому я бы выбрал решение @ 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
person Amro    schedule 22.10.2011
comment
Вау, это очень элегантное решение. Я поищу bsxfun. Спасибо. - person Tetra; 22.10.2011