【问题标题】:how to get an incremental power matrix in matlab如何在matlab中获得增量功率矩阵
【发布时间】:2015-05-12 17:49:16
【问题描述】:

我想在 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中,BI中的元素个数必须相同。
s_x_calcu_v1 中的错误(第 5 行)
s(n)=A.^n;

【问题讨论】:

  • 你在你的问题中混合了两个操作:A^N 不是 A.^n - 你想计算矩阵乘积还是元素乘积?
  • 我想在这里做 A 的 N 次方,其中 n 从 1 到 50,每次递增 1。
  • 所以你想要矩阵幂而不是而不是元素幂?

标签: matlab matrix


【解决方案1】:

问题是您试图将矩阵分配给单个元素。在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);

【讨论】:

  • cumprod 节省计算!
【解决方案2】:

您的 s 数组是一个 2×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

最好的,

【讨论】:

  • 我想在这里做 A 的 N 次方,其中 n 从 1 到 50,每次递增 1。
【解决方案3】:

当您从 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{:} );

顺便说一句,如果您想计算 ma​​trix 幂(而不是元素幂),同样适用,您只需更改为 s{ii+1} = s{ii}*A;

【讨论】:

    猜你喜欢
    • 1970-01-01
    • 1970-01-01
    • 2016-05-03
    • 1970-01-01
    • 1970-01-01
    • 1970-01-01
    • 1970-01-01
    • 2019-05-08
    • 1970-01-01
    相关资源
    最近更新 更多