Matlab 构造由基矩阵的不同幂组成的分块矩阵

Matlab 构造由基矩阵的不同幂组成的分块矩阵,matlab,matrix,octave,Matlab,Matrix,Octave,假设我们有一个基矩阵a >> A = [1,2;-1,3] A = 1 2 -1 3 我想知道是否有一个简单的命令可以构造一个由a,a^2,a^3组成的块矩阵A^n和任何给定的正整数n,如 B = [A; A^2; A^3; ...; A^n] 显然,如果A是一个标量,我们可以像A.^(1:n)那样做。我想知道矩阵a是否有类似的操作或命令。这就是我的动机 我可以使用循环(for循环或arrayfun)来实现它,但我正在为它寻找一些简单而优雅的命令。一行完成它的

假设我们有一个基矩阵
a

>> A = [1,2;-1,3]
A =

   1   2
  -1   3
我想知道是否有一个简单的命令可以构造一个由
a
a^2
a^3
组成的块矩阵
A^n
和任何给定的正整数
n
,如

B = [A; A^2; A^3; ...; A^n]
显然,如果
A
是一个标量,我们可以像
A.^(1:n)
那样做。我想知道矩阵
a
是否有类似的操作或命令。这就是我的动机


我可以使用循环(
for
循环或
arrayfun
)来实现它,但我正在为它寻找一些简单而优雅的命令。

一行完成它的超级详细方式:

B= cell2mat(cellfun(@mpower,mat2cell(repmat(A,n,1),[ones(n,1)*size(A,1)],size(A,2)),mat2cell([1:n]',ones(n,1),1),'UniformOutput',false))
然而,我认为for循环(带有预分配)可能更快、更清晰。如果for循环是清晰的,则它不是“不合法的”。清晰应该是你的目标,除非它的速度是超临界的(同样,这一个班轮仍然在引擎盖下循环)

我相信有人会想出一个更清晰的一行,但我的评论仍然适用

PD:魔术师@LuisMendo建议:
B=cell2mat(arrayfun(@(k){A^k},1:n)。
作为一个更干净的选择。(仍在内部循环)

可能会有帮助:

A = [1,2;-1,3];
n = 3;
B = eval(['[A' sprintf(';A^%d',2:n) ']']);
然而,使用循环将矩阵自身相乘是有效的,特别是当矩阵较大时

C = cell (n,1);
D = 1;
for k = 1:n
    D *= A; % In MATLAB use D = D * A;
    C{k} = D;
end
B = vertcat(C{:});
及其八度语法的
eval
版本(为了好玩,不推荐):


在矩阵A可对角化的情况下,您可以得到一个简单的解决方案(不是一条直线,但仍然是!):


摘自《圣经》。除了在特定情况下的这个解决方案之外,我认为涉及Jordan形式的一般形式不容易在Matlab中实现。

也不一定是答案,因为它也依赖于cellfun,在精神上与这里的其他答案类似,但我认为这稍微优雅一些,并且使用内置函数而不是匿名函数(如果这对您来说很重要的话,保证会更快)

此外,此版本还适用于任何形状的指数矩阵,产生适当的“块”输出


如果您不介意使用递归方法,那么下面可能是一个选项

function y = f(A,n)
  if n==1 
    y = A;
    return;
  end 
  y = [A;f(A,n-1)*kron(eye(n-1),A)];
end
然后


你想要矩阵指数还是元素指数?@AnderBiguri矩阵指数相关问答:。对于2x2这样的小矩阵,可能会为任何
n
的每个条目得出一个方程式。math.se上的另一篇相关文章:@Wolfie Nope,
a
可能是任何大小的正方形矩阵。这并不容易,也不优雅,而且可能由于使用了单元格而变慢。否则的话,找到一条一条的航线就太好了!谢谢你的回答。实际上,我使用了
arrayfun
来构造矩阵,但我猜这是一种隐藏循环。“你还有别的想法吗?”托马斯说,“我认为,你提出要求的前提是无效的。”。没有真正的理由避免循环,除非它们不那么清晰。(例如,代替求和)如果
A
是一个标量,我们可以像
A.^(1:n)
。我想知道矩阵
a
@ThomasIsCoding no是否有类似的操作或命令,因为
^
^
是完全不同的MATLAB函数。你可以做你建议的事情,只是因为它是一个元素级的操作符,而不是因为它是一个“power”。嗯,你可能想对
eval
的陷阱提出一个大的警告。即使是它的文档页面也在最上面显著地显示了这一警告。另外,我怀疑这会更快,因为在使用
eval
@Adriaan时禁用了JIT,我非常抱歉!这个问题迫使我使用eval,否则我就不会这样做。我希望循环版本+1,这可能比OP的原始循环(分别计算每个幂)更有效。但是
eval
解决方案。。。如果你发布了两个不同的答案,我可能会对其中一个投赞成票,对另一个投反对票@谢谢你。eval有其缺点,但在这个答案中,它显示了不同的思维方式,可能有资格投票。我能看到一些奇怪的东西。这个问题需要一个无循环的答案,但大多数答案都包含循环!!如果你有疑问,我想我已经说服你投票了。提前谢谢。!
[V,D] = eig(A);
k = size(A,1);
B = kron(eye(n),V)*(reshape(D.^reshape(1:n,[1 1 n]),[k k*n]).')*inv(V);
A = [ 1,2
     -1,3 ];

N = [ 1,2,3
      2,3,4
      3,4,5 ];

expblk = @(A,N) cell2mat(
             cellfun( @mpower, {A}, num2cell(N), 'UniformOutput', false )
         );

expblk(A,N)

% ans =
%     1    2   -1    8   -9   22
%    -1    3   -4    7  -11   13
%    -1    8   -9   22  -31   48
%    -4    7  -11   13  -24   17
%    -9   22  -31   48  -79   82
%   -11   13  -24   17  -41    3
function y = f(A,n)
  if n==1 
    y = A;
    return;
  end 
  y = [A;f(A,n-1)*kron(eye(n-1),A)];
end
B =

    1    2
   -1    3
   -1    8
   -4    7
   -9   22
  -11   13
  -31   48
  -24   17
  -79   82
  -41    3