【问题标题】:Matlab function for cumulative power用于累积功率的 Matlab 函数
【发布时间】:2020-03-24 21:55:31
【问题描述】:

MATLAB 中是否有一个函数可以为给定的标量 r 生成以下矩阵:

1 r r^2 r^3 ... r^n 
0 1 r   r^2 ... r^(n-1)
0 0 1   r   ... r^(n-2)
...
0 0 0   0   ... 1

每一行的行为有点像 CUMSUM 函数的幂模拟?

【问题讨论】:

    标签: matlab


    【解决方案1】:

    您可以直接使用implicit expansion和element-wise power计算每个术语,然后应用triu:

    n = 5; % size
    r = 2; % base
    result = triu(r.^max((1:n)-(1:n).',0));
    

    或者,可能会快一点,因为它不会计算不需要的幂:

    n = 5; % size
    r = 2; % base
    t = (1:n)-(1:n).';
    u = find(t>=0);
    t = t(u);
    result = zeros(n);
    result(u) = r.^t;
    

    【讨论】:

    • 好样的! (只需要将下三角部分归零)
    【解决方案2】:

    使用cumprod 和triu:

    % parameters
    n = 5;
    r = 2;
    
    % Create a square matrix filled with 1:
    A = ones(n);
    % Assign the upper triangular part shifted by one with r
    A(triu(A,1)==1)=r;
    % cumprod along the second dimension and get only the upper triangular part
    A = triu(cumprod(A,2))
    

    【讨论】:

      【解决方案3】:

      好吧,cumsum 会累加一个向量的总和,但您要求的是一个特殊设计的矩阵,所以比较有点问题...... 无论如何,如果这是一个常见的特殊情况三角矩阵,它可能有一个函数(我的数学知识在这里有限,抱歉),但我们也可以很容易(并且有效地=)构建它):

      N = 10;
      r = 2;
      % allocate arry
      ary = ones(1,N);
      % initialize array
      ary(2) = r;
      for i = 3:N
          ary(i) = ary(i-1)*r;
      end
      % build matrix i.e. copy the array
      M = eye(N);
      for i = 1:N
          M(i,i:end) = ary(1:end-i+1);
      end
      

      这假设您想要一个大小为NxN 的矩阵,r 是您要计算其幂的值。

      FIX:之前的版本在第 13 行 M(i,i:end) = ary(i:end); 中说明,但分配需要始终从 ary 的第一个位置开始

      【讨论】:

      • 有一个小修复:M(i,i:end) = ary(1:end-i+1);
      猜你喜欢
      • 1970-01-01
      • 2012-06-08
      • 1970-01-01
      • 1970-01-01
      • 2018-05-13
      • 2013-05-24
      • 1970-01-01
      • 2014-09-15
      • 1970-01-01
      相关资源
      最近更新 更多