Функция Matlab для накопленной мощности - PullRequest
1 голос
/ 24 марта 2020

Есть ли в 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?

Ответы [ 3 ]

5 голосов
/ 24 марта 2020

Вы можете вычислить каждый член напрямую, используя неявное расширение и поэлементную степень , а затем применить 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;
4 голосов
/ 24 марта 2020

Использование 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))
1 голос
/ 24 марта 2020

Ну, cumsum накапливает сумму вектора, но вы запрашиваете специально разработанную матрицу, поэтому сравнение немного проблематично c .... В любом случае, возможно, есть функция для этого если это обычная особая матрица tri angular (мои математические знания здесь ограничены, извините), но мы также можем построить ее довольно легко (и эффективно =)):

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

Это предполагает, что вы хотите иметь матрицу размером N x N, а r - это значение, для которого вы хотите рассчитать мощность.

FIX : предыдущая версия указана в строке 13 M(i,i:end) = ary(i:end);, но назначение должно начинаться всегда с первой позиции ary

Добро пожаловать на сайт PullRequest, где вы можете задавать вопросы и получать ответы от других членов сообщества.
...