2013-04-14 89 views
1

如何在MATLAB中轻松创建以下矩阵?其中A(nxn),B(nxp)和N是一个正整数。如何轻松创建这个矩阵?

Gamma = [B   0   0   ... 0 ; 
     A*B  B   0   ... 0 ; 
     A^2*B  A*B  B   ... 0 ; 
     ...  ...  ...  ... ... ; 
     A^(N-1)*B A^(N-2)*B A^(N-3)*B ... B]; 
+1

BTW,命名阵列伽玛是一个有点坏主意,因为虽然它不应该,因为大写字母的功能伽马直接冲突,它仍然可能是危险的。 (当你正在调试代码,或者之后阅读它等)我建议尽量避免与现有/有用函数的名称冲突。 – 2013-04-14 13:24:48

回答

2

虽然效率不如预想的那样有效,

n = size(A,1); 
p = size(B,2); 

N = 3; 
Gamma = zeros(N*n, N*p); 

for ii = 1:N 
    for jj = 1:N 
    if ii >= jj 
     Gamma((ii-1)*n+1:ii*n,(jj-1)*p+1:jj*p) = A^(ii-jj) * B; 
    end 
    end 
end 

编辑:这里有更高效的版本,但这矩阵乘法的最小量。

n = size(A,1); 
p = size(A,2); 

N = 3; 
Gamma = zeros(N*n, N*p); 

# Pre-compute all the matrix multiplications we'll need. 
memo = cell(1, N); 
memo{1} = B; 
for ii = 1:N-1 
    memo{ii+1} = A * memo{ii}; 
end 

for ii = 1:N 
    for jj = 1:N 
    if ii >= jj 
     Gamma((ii-1)*n+1:ii*n,(jj-1)*p+1:jj*p) = memo{ii-jj+1}; 
    end 
    end 
end 
+0

非常感谢! –

3

如何

[g{1:N,1:N}] = deal(zeros(n,p)); 
g{1,1} = B; 
for ii = 2:N 
    g(ii, 2:end) = g(ii-1, 1:end-1); 
    g{ ii, 1 } = A * g{ ii-1, 1 }; 
end 
Gamma = cell2mat(g); 
+0

+1(为简洁吗?) –

+0

@Shai你是否运行过这段代码?它调用错误。例如,'A'是一个矩阵,'g(..)'是一个单元格,并且你试图将它们相乘。 –

+0

@EitanT - 修正了这个错误。 – Shai