Tetra
Tetra

Reputation: 747

Multiplication of Vectors with diagonal of a matrices from t to t+1 in Matlab

Still very new to programming...

I have 9x1 Vectors at time t, t+1, t+2 etc.

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

and matrices. Each matrix is 9x9 and also at time 1, t+1, t+2 etc. =

 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

They are 3d matrices and I want to make them 4d in the future.

I want to multiply vector(:,:,t) with the diagonal of matrix at time t and output vector(:,:,t+1).

So in short...

vector t multiplied by diag matrix t = vector t+1

vector t+1 multiplied by diag matrix t+1 = vector t+2

vector t+2 multiplied by diag matrix t+2 = vector t+3 ... and so on.

the diagonal numbers change in each time step but for simplicity sake, let's keep them all at 1 for the moment.

I've tried using diag but it states I have to use a 2D input so only works when I ignore t.

Cheers for your help guys - it's helping me learn a lot. Any hints or solutions will be much appreciated. I know you guys know the simplest and most efficient solutions.

Upvotes: 1

Views: 986

Answers (2)

Amro
Amro

Reputation: 124563

Since the result of each step depends on the previous iteration, it cannot be vectorized. So I would go with @JohnColby's solution.

For what it's worth, here is an example how you would extract the diagonals of a 3D matrix in a vectorized way:

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)

Each column of the result corresponds to the diagonal elements from each slice (doesn't have to be square matrix):

>> 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

Upvotes: 2

John Colby
John Colby

Reputation: 22588

Here you go:

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

Now all of t should be 1.

Upvotes: 1

Related Questions