我想在Matlab中计算以下矩阵:
g=[I
A
.
.
.
A^N]
我在Matlab中使用了以下程序:
A=[2 3;4 1];
s=A;
for n=1:1:50
s(n)=A.^n;
end
g=[eye(1,1),s];
我收到以下错误:
在作业
A(I) = B
中,B
和I
中的元素数量必须相同。
s_x_calcu_v1
中的错误(第5行)
s(n)=A.^n;
答案 0 :(得分:4)
问题是您正在尝试将矩阵分配给单个元素。在matlab中调用s(n)
意味着你得到s
的第n个元素,而不管s的维数。您可以使用三维矩阵
N = 50;
A=[2 3;4 1];
[nx,ny] = size(A);
s(nx,ny,N) = 0; %makes s a nx x ny x N matrix
for n=1:1:N
s(:,:,n)=A.^n; %Colon to select all elements of that dimension
end
g=cat(3, eye(size(A)) ,s); %Add the I matrix of same size as A
或矢量化版本
s = bsxfun(@power, A(:), 1:N);
s = reshape(s,2,2,N);
g = cat(3, eye(size(A)) ,s);
使用cumprod
s = repmat(A(:), [1 N]);
s = cumprod(s,2);
s = reshape(s,2,2,N);
g = cat(3, eye(size(A)) ,s);
答案 1 :(得分:3)
您的s
数组是一个2 x 2的数组,您不能将其编入索引以在循环的每一步存储计算结果。
为此,更简单的可能是将s
定义为单元格:
% --- Definitions
A = [2 3;4 1];
N = 50;
% --- Preparation
s = cell(N,1);
% --- Computation
for n=1:N
s{n} = A.^n;
end
最佳,
答案 2 :(得分:2)
当您从1
循环到N
时,每次A.^n
计算您正在执行 LOTS 的冗余计算!注意
A.^n = (A.^(n-1)).*A; %//element-wise power
A^n = (A^n) * A; %// matrix power
因此,
A = [2 3;4 1];
N = 50;
s = cell(N+1,1);
s{1} = eye(size(A,1));
for ii=1:N
s{ii+1} = s{ii}.*A; %// no powers, just product!
end
g = vertcat( s{:} );
顺便说一句,如果你想计算矩阵能力(而不是元素方面的权力),同样成立,你所需要的只是改为s{ii+1} = s{ii}*A;