如何在Matlab中编写这个矩阵

4

我想用Matlab编写这个矩阵:

s=[0  .....        0
   B    0   ....   0
   AB    B   ....  0
   .  .   .
   .     .    .
   .        .    . 0                  ....
   A^(n-1)*B ... AB    B ]

我尝试了以下代码,但出现错误:

N = 50;
A=[2 3;4 1];
B=[3 ;2];
[nx,ny] = size(A);

s(nx,ny,N) = 0;
for n=1:1:N
    s(:,:,n)=A.^n;
end
s_x=cat(3, eye(size(A)) ,s);

for ii=1:1:N-1
    su(:,:,ii)=(A.^ii).*B ;
end

z= zeros(1,60,1);
su1 = [z;su] ;
s_u=repmat(su1,N);

似乎矩阵的连接没有完成。 我是一个初学者,所以遇到了严重的问题,请帮忙。


A^(n-1) 应该是指什么?是 A*A*A... 还是逐元素乘方? - m.s.
每次N增加1,将A的(N-1)次方计算,直到N达到60。 - tina066
1
我认为你的矩阵描述是错误的,你能写出矩阵是什么,并确保操作正确吗?例如,对于操作(A.^ii).*B,Matlab会给出以下错误提示:Error using .*,Matrix dimensions must agree. - anquegi
1
我认为这是正确的,不是吗?如果“0”表示适当大小的零矩阵,那就没问题了。我看不出有什么问题。代码是错误的,因为它使用了逐元素幂运算,但矩阵是好的。 - Rattus Ex Machina
2个回答

1

使用cell数组和你之前问题的答案

A = [2 3; 4 1];
B = [3 ;2 ];
N = 60;
[cs{1:(N+1),1:N}] = deal( zeros(size(B)) ); %// allocate space, setting top triangle to zero
%// work on diagonals
x = B;
for ii=2:(N+1)
    [cs{ii:(N+2):((N+1)*(N+2-ii))}] = deal(x); %//deal to diagonal
    x = A*x;
end 
s = cell2mat(cs); %// convert cells to a single matrix    

更多信息可以阅读关于 dealcell2mat 的内容。


关于矩阵运算和逐元素运算的重要说明

在你的问题(以及你之前的问题)中,你混淆了矩阵乘方:A^2和逐元素操作A.^2

  • 矩阵乘方A^2=[16 9;12 13]A*A的矩阵积
  • 逐元素乘方A.^2将每个元素单独取出并计算其平方:A.^2=[4 9;16 1]

在你的问题中,你询问矩阵乘积A*b,但你写的代码是A.*b,这是一种逐元素乘积。由于Ab的大小不同,因此会导致错误。


1
谢谢您的时间...我正在努力理解这些代码,而不是实现它们,因为我认为我还需要学习很多关于Matlab矩阵操作的知识..这就是为什么我不能用这些想法自己编写任何代码...叹气..感到沮丧。 - tina066
要访问特定对角线的所有元素,我利用了Matlab的线性索引。您可以在此处阅读更多相关信息。@tina066 - Shai
@tina066,使用线性索引访问对角线的方法在此答案的第二个示例中解释得非常清楚。 - Shai
非常感谢 @shai,真的非常感激。 - tina066

0

我经常发现Matlab倾向于采用“按方程式写”的编码方法。这也导致了易于阅读的代码...

A = [2 3; 4 1];
B = [3; 2];
Q = 4;

%// don't need to...
s = [];

%// ...but better to pre-allocate s for performance
s = zeros((Q+1)*2, Q);

X = B;
for m = 2:Q+1
    for n = m:Q+1
        s(n*2+(-1:0), n-m+1) = X;
    end
    X = A * X;
end

当然,你可以将Q设置为60。我选择了Q=4,这样结果更易读。 - Rattus Ex Machina
你正在执行许多冗余计算,为什么不利用对角线都相同的事实呢? - Shai
你的答案是正确的,因此我不会投票删除它。然而,就教学角度而言,在我看来,它并不好,因为它没有预先分配s,涉及嵌套循环和大量冗余计算。如果你想“按照方程式写”,你应该遵循对角线。 - Shai
1
请在每次循环迭代之前预分配变量s - Shai
我的第一版草稿确实预先分配了s(我想我甚至发布了它,是吗...?)。实际上,我故意删除了它,以表明你不需要它。这是一个微小的操作,教授清晰度和性能同样重要,我想。但是,预先分配s也是有道理的,我完全同意。 - Rattus Ex Machina
显示剩余2条评论

网页内容由stack overflow 提供, 点击上面的
可以查看英文原文,
原文链接