我有我的美丽的三角形n x n
矩阵,比如L
(对于下三角形),我想解决像
LX=B
其中B
和X
是n x k
矩阵(即:我想解决具有多个右手边的三角形线性系统)。另外,我的三角矩阵以PACKED FORMAT格式存储;即我只存储下三角形部分。我正在使用BLAS和LAPACK,但我意识到没有解决问题的具体方法。虽然有许多功能可以解决类似的问题:
stpsv():采用打包格式的三角矩阵,并解决单个右侧。
strsm():采用密集格式的三角矩阵,并解决多个右手边。
我真正需要的是两者的结合。我希望有一个接受打包三角形格式的函数,如 stpsv(),并且还接受多个右侧,如 strsm()。但似乎没有这样的功能可供随时使用。
所以我的问题是:
是否有任何函数可以接受填充的三角矩阵并解决多个右手边的问题?
如果答案是否定的,哪个更有效率?我可以在for
循环中为B
中的每个列调用 stpsv(),或者我从L
创建一个密集矩阵,以便我拥有所有这些那里没用的零,然后我叫 strsm()。什么会更好?此外,也许我错过了一种更聪明的方式来做这一切。
答案 0 :(得分:3)
打包存储意味着BLAS2例程。否则,BLAS3函数在求解线性系统方面更有效,但它们在最佳阻塞算法中工作。如果你调用BLAS2函数,那么你基本上会回到矢量版本,因此它没有太多意义。
请注意,BLAS2版本也不执行条件检查。因此,它们直接针对BLAS2性能进行了优化,因为具有单个RHS的三角矩阵是直接后向替换。
答案 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
。