如何在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];
如何在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];
虽然效率不如预想的那样有效,
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
非常感谢! –
如何
[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);
+1(为简洁吗?) –
@Shai你是否运行过这段代码?它调用错误。例如,'A'是一个矩阵,'g(..)'是一个单元格,并且你试图将它们相乘。 –
@EitanT - 修正了这个错误。 – Shai
BTW,命名阵列伽玛是一个有点坏主意,因为虽然它不应该,因为大写字母的功能伽马直接冲突,它仍然可能是危险的。 (当你正在调试代码,或者之后阅读它等)我建议尽量避免与现有/有用函数的名称冲突。 – 2013-04-14 13:24:48