Matlab中矩阵幂(矩阵多项式)的加权求和

时间:2017-05-04 07:49:05

标签: matlab matrix-multiplication polynomials

给定nxn矩阵A_k和nx1向量x,是否有任何智能计算方法

enter image description here

使用Matlab? x_i是向量x的元素,因此J是矩阵之和。到目前为止,我已经使用了for循环,但我想知道是否有更聪明的方法。

1 个答案:

答案 0 :(得分:1)

简短回答:您可以使用内置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倍)。