2011-10-21 29 views
1

还是很新的编程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 

他们是3D矩阵,我想使他们在未来4d的。

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

总之

所以...

向量t乘以DIAG矩阵T =向量t + 1

向量t + 1乘以矩阵DIAG T + 1 =向量t + 2

向量t + 2乘以diag矩阵t + 2 =向量t + 3 ...等等。

对角线数字在每个时间步骤都会改变,但为了简单起见,我们暂时将它们全部保持为1。

我试过使用诊断,但它声明我必须使用2D输入,所以只有当我忽略t时才起作用。

为您的帮助而欢呼的家伙们 - 这帮助我学到了很多东西。任何提示或解决方案将不胜感激。我知道你们知道最简单和最有效的解决方案。

+1

顺便说一句,你不需要额外的维度。您可以将它们作为2D矩阵中的列。 –

回答

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

+0

非常感谢!这很有意义。 – Tetra

+0

太好了。很高兴帮助! –

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

哇,这是一个非常优雅的解决方案。我会查找bsxfun。谢谢。 – Tetra