Умножение векторов с диагональю матрицы от t до t + 1 в Matlab - PullRequest
1 голос
/ 21 октября 2011

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

У меня есть 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

Это трехмерные матрицы, и я хочу сделать их 4d в будущем.

Я хочу умножить вектор (:,:, t) на диагональ матрицы в момент времени t и на выходной вектор (:,:, t + 1).

Короче говоря ...

вектор t, умноженный на матрицу diag t = вектор t + 1

вектор t + 1, умноженный на матрицу diag t + 1 = вектор t + 2

вектор t + 2, умноженный на матрицу diag t+2 = вектор t + 3 ... и т. Д.

диагональные числа меняются на каждом временном шаге, но для простоты давайте пока держим их все в 1.

Iя пробовал использовать diag, но в нем говорится, что я должен использовать 2D-ввод, поэтому он работает только тогда, когда я игнорирую т.

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

Ответы [ 2 ]

2 голосов
/ 22 октября 2011

Поскольку результат каждого шага зависит от предыдущей итерации, его нельзя векторизовать. Поэтому я бы пошел с решением @ JohnColby .

Для чего стоит, вот пример, как вы бы извлекли диагонали трехмерной матрицы в векторизованном виде:

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
1 голос
/ 21 октября 2011

Вот, пожалуйста:

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.

...