在Matlab中将一个大的对称正定矩阵提高到幂

计算科学 matlab
2021-12-25 04:41:17

我在 Matlab 中创建了一个大的正定(因此是对称的)矩阵。为简单起见,我们假设矩阵具有以下形式:

K=[k11k1nkn1knn].

现在我想以元素的方式将它提升为一种力量,让我们说λ.

自从K是已知的,而λ是未知的,必须通过优化程序进行估计,我事先保存了矩阵K. 在优化例程中,我必须在每次迭代中计算矩阵的值的幂λ.

我的问题如下:有没有办法通过利用矩阵的属性快速执行此操作K?

到目前为止我所做的:

第一种方法:计算Kλ直截了当,也就是说,在matlab中使用命令“K.^\lambda”。

第二种方法:使用两个 for 循环,其中第一个从 i=1:n 迭代,第二个从 j=i:n 迭代。这将创建一个上对角矩阵,由于对称性,我可以使用 triu 命令取回完整矩阵。

尽管如此,由于矩阵的大尺寸,这两种方法都相当耗时。有人对我如何执行此操作有更好的了解吗?

2个回答

我认为您不会比第二种方法做得更好,但请记住,Matlab 是列主要的(如 fortran):

for j=1:n
    K_lam(1:j,j) = K(1:j,j).^lambda
end
K_lam = K_lam+triu(K_lam,1)'

我看到了三种可能的存储策略:

>> n = 1000;
>> l = 2.34;
>> K = randn(n,n); K = K*K';
>> Ku = triu(K);
>> p = 0; for i = 1:n, kvu(p+(1:i)) = K(1:i,i); p = p + i; end

在哪里

  • K是完整的矩阵
  • Ku是存储为完整矩阵的上三角部分
  • kvu是非零元素的向量化Ku

这些是我的时间:

>> tic, r = K.^l; toc
Elapsed time is 0.033273 seconds.
>> tic, r = Ku.^l; toc
Elapsed time is 0.029381 seconds.
>> tic, r = kvu.^l; toc
Elapsed time is 0.019505 seconds.

Ku方法很有趣,因为对称正定矩阵的许多矩阵函数仅访问上三角部分:例如

>> isequal(chol(K), chol(Ku))

ans =

     1

当然,理想的情况是优化算法可以用kvu代替来重写K