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

它们是 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 时才有效。

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

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