簡體   English   中英

在 Matlab 中計算矩陣冪(矩陣多項式)的加權求和

[英]Compute weighted summation of matrix power (matrix polynomial) in Matlab

給定一個 nxn 矩陣 A_k 和一個 nx1 向量 x,有沒有什么聰明的方法來計算

在此處輸入圖片說明

使用MATLAB? x_i 是向量 x 的元素,因此 J 是矩陣的總和。 到目前為止,我已經使用了 for 循環,但我想知道是否有更聰明的方法。

簡短回答:您可以使用內置的 matlab 函數polyvalm進行矩陣多項式評估,如下所示:

x = x(end:-1:1); % flip the order of the elements
x(end+1) = 0; % append 0
J = polyvalm(x, A);

長答案:Matlab 在內部使用循環。 因此,如果您優化自己的實現,您並沒有獲得那么多,或者您的表現甚至更糟(請參閱我的calcJ_loopOptimised函數):

% construct random input
n = 100;
A = rand(n);
x = rand(n, 1);

% calculate the result using different methods
Jbuiltin = calcJ_builtin(A, x);
Jloop = calcJ_loop(A, x);
JloopOptimised = calcJ_loopOptimised(A, x);

% check if the functions are mathematically equivalent (should be in the order of `eps`)
relativeError1 = max(max(abs(Jbuiltin - Jloop)))/max(max(Jbuiltin))
relativeError2 = max(max(abs(Jloop - JloopOptimised)))/max(max(Jloop))

% measure the execution time
t_loopOptimised = timeit(@() calcJ_loopOptimised(A, x))
t_builtin = timeit(@() calcJ_builtin(A, x))
t_loop = timeit(@() calcJ_loop(A, x))

% check if builtin function is faster
builtinFaster = t_builtin < t_loopOptimised

% calculate J using Matlab builtin function
function J = calcJ_builtin(A, x)
  x = x(end:-1:1);
  x(end+1) = 0;
  J = polyvalm(x, A);
end

% naive loop implementation
function J = calcJ_loop(A, x)
  n = size(A, 1);
  J = zeros(n,n);
  for i=1:n
    J = J + A^i * x(i);
  end
end

% optimised loop implementation (cache result of matrix power)
function J = calcJ_loopOptimised(A, x)
  n = size(A, 1);
  J = zeros(n,n);
  A_ = eye(n);
  for i=1:n
    A_ = A_*A;
    J = J + A_ * x(i);
  end
end

對於n=100 ,我得到以下信息:

t_loopOptimised = 0.0077
t_builtin       = 0.0084
t_loop          = 0.0295

對於n=5 ,我得到以下信息:

t_loopOptimised = 7.4425e-06
t_builtin       = 4.7399e-05
t_loop          = 1.0496e-04 

請注意,我的時間在不同的運行之間有些波動,但優化的循環幾乎總是比內置函數更快(對於小n高達 6 倍)。

暫無
暫無

聲明:本站的技術帖子網頁,遵循CC BY-SA 4.0協議,如果您需要轉載,請注明本站網址或者原文地址。任何問題請咨詢:yoyou2525@163.com.

 
粵ICP備18138465號  © 2020-2024 STACKOOM.COM