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