LAPACK:具有多个右手侧的三角方程组

时间:2017-11-03 14:43:14

标签: matrix linear-algebra lapack

我有我的美丽的三角形n x n矩阵,比如L(对于下三角形),我想解决像

这样的系统
LX=B

其中BXn x k矩阵(即:我想解决具有多个右手边的三角形线性系统)。另外,我的三角矩阵以PACKED FORMAT格式存储;即我只存储下三角形部分。我正在使用BLAS和LAPACK,但我意识到没有解决问题的具体方法。虽然有许多功能可以解决类似的问题:

stpsv():采用打包格式的三角矩阵,并解决单个右侧。

strsm():采用密集格式的三角矩阵,并解决多个右手边。

我真正需要的是两者的结合。我希望有一个接受打包三角形格式的函数,如 stpsv(),并且还接受多个右侧,如 strsm()。但似乎没有这样的功能可供随时使用。

所以我的问题是:

  1. 是否有任何函数可以接受填充的三角矩阵并解决多个右手边的问题?

  2. 如果答案是否定的,哪个更有效率?我可以在for循环中为B中的每个列调用 stpsv(),或者我从L创建一个密集矩阵,以便我拥有所有这些那里没用的零,然后我叫 strsm()。什么会更好?此外,也许我错过了一种更聪明的方式来做这一切。

2 个答案:

答案 0 :(得分:3)

打包存储意味着BLAS2例程。否则,BLAS3函数在求解线性系统方面更有效,但它们在最佳阻塞算法中工作。如果你调用BLAS2函数,那么你基本上会回到矢量版本,因此它没有太多意义。

请注意,BLAS2版本也不执行条件检查。因此,它们直接针对BLAS2性能进行了优化,因为具有单个RHS的三角矩阵是直接后向替换。

对于多个RHS,您可以转换矩阵,比如stpttr,然后使用strtrs

答案 1 :(得分:2)

是的,有一个函数可以解决Ax = B,对于压缩三角矩阵A和多个右手大小B.它是来自LAPACK的stptrs()。此外,还有其他三角形包装矩阵的例程,根据naming conventions of LAPACK,其名称中都有S1 (out '1'): '1' > S1 '0' > S2 S2 (out '1'): '1' > S1 '0' > S4 S3 (out '0'): '1' > S1 '0' > S4 S4 (out '0'): '1' > S3 '0' > S4

然而,查看source显示此函数在循环中从BLAS调用stpsv(),每个右侧一次。这正是你的建议!