从t到t+的向量与a矩阵对角线的乘法;1在Matlab中

从t到t+的向量与a矩阵对角线的乘法;1在Matlab中,matlab,vector,matrix,multiplication,diagonal,Matlab,Vector,Matrix,Multiplication,Diagonal,还是很新的编程 在时间t,t+1,t+2等处有9x1个向量 [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

还是很新的编程

在时间t,t+1,t+2等处有9x1个向量

[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
它们是3d矩阵,我想在将来把它们做成4d

我想将向量(:,:,t)乘以时间t处矩阵的对角线和输出向量(:,:,t+1)

总之

向量t乘以对角矩阵t=向量t+1

向量t+1乘以对角矩阵t+1=向量t+2

向量t+2乘以对角矩阵t+2=向量t+3。。。等等

对角线数字在每个时间步都会发生变化,但为了简单起见,让我们暂时将它们都保持在1

我尝试过使用diag,但它说明我必须使用2D输入,所以只有在忽略t时才有效

为你们的帮助干杯-它帮助我学到了很多。任何提示或解决方案都将不胜感激。我知道你们知道最简单、最有效的解决方案。

给你们:

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。

因为每个步骤的结果都取决于上一次迭代,所以不能对其进行矢量化。因此,我会同意他的解决方案

值得一提的是,以下是一个示例,说明如何以矢量化方式提取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)
结果的每列对应于每个切片的对角线元素(不必是方阵):


顺便说一句,t不需要额外的尺寸。您可以将它们作为二维矩阵中的列。非常感谢!这很有道理。哇,这是一个非常优雅的解决方案。我将查找bsxfun。非常感谢。
>> 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