【发布时间】: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
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
您可以直接使用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;
【讨论】:
好吧,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);