精准石油论坛: 关于求解稀疏矩阵方程A*B=C - 精准石油论坛

跳转到内容

第一页
  • 您无法发起一个新主题
  • 您无法回复此主题

关于求解稀疏矩阵方程A*B=C 主题评价: -----

#1 已离线   中科流氓 

  • 一介布衣
  • 点子点子
  • 群组: 注册会员
  • 主题数: 44
  • 注册日期: 06-24-2010

中科流氓 发表于 08-18-2011 - 09:40
精准.石油.论坛 forum.petro-china.com

A*B=C,都是稀疏矩阵,均采用CSR(ia,ja,a)压缩格式存储,求解B
之前有人建议用pardiso,pardiso虽然可以直接解B,但是要求B,C都是采用全矩阵存储
B(n,n),C(n,n),而我希望是采用压缩存储。
也有人建议先转为求解A*x=b,解出B的第一列,保存非零元于一个链表中,再解第二列,

把求解出的非零元按照列优先插入链表中,,,,这样求解到后面几列时链表已经很大
,再遍历插到合适位置是非常占用时间的。

大家有没有遇到过这种A*B=C的稀疏矩阵方程,都是怎么处理的?
补充一下,A,B,C都是25000*25000, 其中A,C稀疏度为1.3%左右,B为19%左右



用一句话概况下我的问题:
A*B=C,都是稀疏矩阵,采用CSR压缩格式,如何求解B。
逐步求出B的每一列再进行转置是非常消耗时间的。
精准.石油.论坛 forum.petro-china.com






----
来源: 精准石油论坛 - 推进信息共享,提升科技水平
0

#2 已离线   cced 

  • 武林名宿
  • 图像
  • 群组: 认证会员
  • 主题数: 1,642
  • 注册日期: 11-15-2005

cced 发表于 08-18-2011 - 11:52
精准.石油.论坛 forum.petro-china.com

"有人"的建议是正确的。你现在用的压缩行存储格式不适用。

可以对矩阵采用压缩列存储格式,这样可以很方便的取出C的一列。这样每次求解完成一个B分量后可以很方便的保存结果。这个完全不用链表。

最终B一般来说是满矩阵,你那个19%的估计意义不大。因为比较大的矩阵都是迭代算法,结果是近似结果,很难保证结出的结果有很多零。如果你简单的将很小的数舍弃是很危险的,大大降低精度。

因为你总是对A进行求解,可以对A进行近似分解作为preconditioner,可以重复用25000遍,再套用一些简单solver,主要就是一些非常稀疏矩阵向量相乘。25000*25000的矩阵很小,求解很快。
精准.石油.论坛 forum.petro-china.com






----
来源: 精准石油论坛 - 推进信息共享,提升科技水平
0

#3 已离线   中科流氓 

  • 一介布衣
  • 点子点子
  • 群组: 注册会员
  • 主题数: 44
  • 注册日期: 06-24-2010

中科流氓 发表于 08-18-2011 - 14:51
精准.石油.论坛 forum.petro-china.com

cced前辈:
多谢您这么详细的回答,您几乎是考虑到了求解过程的每一步,您提出的压缩列存储格式对我启发很大,我目前solver采用的是Intel pardiso,我看看pardiso能不能采用压缩列存储格式,或者其他函数库可以这么做的。您提出的先对A做分解然后重复利用,也是很好的思路。
再次感谢您热心的回复

查看主题引用框(cced @ 08-18-2011 - 11:52)

"有人"的建议是正确的。你现在用的压缩行存储格式不适用。

可以对矩阵采用压缩列存储格式,这样可以很方便的取出C的一列。这样每次求解完成一个B分量后可以很方便的保存结果。这个完全不用链表。

最终B一般来说是满矩阵,你那个19%的估计意义不大。因为比较大的矩阵都是迭代算法,结果是近似结果,很难保证结出的结果有很多零。如果你简单的将很小的数舍弃是很危险的,大大降低精度。

因为你总是对A进行求解,可以对A进行近似分解作为preconditioner,可以重复用25000遍,再套用一些简单solver,主要就是一些非常稀疏矩阵向量相乘。25000*25000的矩阵很小,求解很快。

精准.石油.论坛 forum.petro-china.com






----
来源: 精准石油论坛 - 推进信息共享,提升科技水平
0

#4 已离线   中科流氓 

  • 一介布衣
  • 点子点子
  • 群组: 注册会员
  • 主题数: 44
  • 注册日期: 06-24-2010

中科流氓 发表于 08-29-2011 - 10:58
精准.石油.论坛 forum.petro-china.com

再次感谢您热心的回答,我采用您的方法已经做好了,效果也还可以。只是我的solver用的是intel mkl的pardiso,它在求解时非常占用内存,即使是out of core模式也非常占用内存。我想问下,linux下面还有其他免费solver吗?我的稀疏矩阵是随机分布的,没有特点。
谢谢




查看主题引用框(cced @ 08-18-2011 - 11:52)

"有人"的建议是正确的。你现在用的压缩行存储格式不适用。

可以对矩阵采用压缩列存储格式,这样可以很方便的取出C的一列。这样每次求解完成一个B分量后可以很方便的保存结果。这个完全不用链表。

最终B一般来说是满矩阵,你那个19%的估计意义不大。因为比较大的矩阵都是迭代算法,结果是近似结果,很难保证结出的结果有很多零。如果你简单的将很小的数舍弃是很危险的,大大降低精度。

因为你总是对A进行求解,可以对A进行近似分解作为preconditioner,可以重复用25000遍,再套用一些简单solver,主要就是一些非常稀疏矩阵向量相乘。25000*25000的矩阵很小,求解很快。

精准.石油.论坛 forum.petro-china.com






----
来源: 精准石油论坛 - 推进信息共享,提升科技水平
0

#5 已离线   中科流氓 

  • 一介布衣
  • 点子点子
  • 群组: 注册会员
  • 主题数: 44
  • 注册日期: 06-24-2010

中科流氓 发表于 08-29-2011 - 11:02
精准.石油.论坛 forum.petro-china.com

lapack,blas都是对矩阵非零元分布有要求的,所以没考虑。
网上看到有sparskit2,只是看到这方面的介绍,没有找到Linux下面安装文件
还有国产的gss,据说10w阶以下免费试用,不知靠谱不?
精准.石油.论坛 forum.petro-china.com






----
来源: 精准石油论坛 - 推进信息共享,提升科技水平
0

#6 已离线   cced 

  • 武林名宿
  • 图像
  • 群组: 认证会员
  • 主题数: 1,642
  • 注册日期: 11-15-2005

cced 发表于 08-31-2011 - 02:07
精准.石油.论坛 forum.petro-china.com

查看主题引用框(中科流氓 @ 08-28-2011 - 20:02)

lapack,blas都是对矩阵非零元分布有要求的,所以没考虑。
网上看到有sparskit2,只是看到这方面的介绍,没有找到Linux下面安装文件
还有国产的gss,据说10w阶以下免费试用,不知靠谱不?


solver: GMRES or BiCTstab
preconditioner: sparselib++ 1.7

Not the best, but all free and reasonably good.
精准.石油.论坛 forum.petro-china.com






----
来源: 精准石油论坛 - 推进信息共享,提升科技水平
0

#7 已离线   中科流氓 

  • 一介布衣
  • 点子点子
  • 群组: 注册会员
  • 主题数: 44
  • 注册日期: 06-24-2010

中科流氓 发表于 09-01-2011 - 10:18
精准.石油.论坛 forum.petro-china.com

thanks for your reply, i will have a try on your suggestion and wish discussing with you again


查看主题引用框(cced @ 08-31-2011 - 02:07)

查看主题引用框(中科流氓 @ 08-28-2011 - 20:02)

lapack,blas都是对矩阵非零元分布有要求的,所以没考虑。
网上看到有sparskit2,只是看到这方面的介绍,没有找到Linux下面安装文件
还有国产的gss,据说10w阶以下免费试用,不知靠谱不?


solver: GMRES or BiCTstab
preconditioner: sparselib++ 1.7

Not the best, but all free and reasonably good.

精准.石油.论坛 forum.petro-china.com






----
来源: 精准石油论坛 - 推进信息共享,提升科技水平
0

#8 已离线   中科流氓 

  • 一介布衣
  • 点子点子
  • 群组: 注册会员
  • 主题数: 44
  • 注册日期: 06-24-2010

中科流氓 发表于 09-01-2011 - 10:18
精准.石油.论坛 forum.petro-china.com

thanks for your reply, i will have a try on your suggestion and wish discussing with you again


查看主题引用框(cced @ 08-31-2011 - 02:07)

查看主题引用框(中科流氓 @ 08-28-2011 - 20:02)

lapack,blas都是对矩阵非零元分布有要求的,所以没考虑。
网上看到有sparskit2,只是看到这方面的介绍,没有找到Linux下面安装文件
还有国产的gss,据说10w阶以下免费试用,不知靠谱不?


solver: GMRES or BiCTstab
preconditioner: sparselib++ 1.7

Not the best, but all free and reasonably good.

精准.石油.论坛 forum.petro-china.com






----
来源: 精准石油论坛 - 推进信息共享,提升科技水平
0

#9 已离线   cced 

  • 武林名宿
  • 图像
  • 群组: 认证会员
  • 主题数: 1,642
  • 注册日期: 11-15-2005

cced 发表于 09-01-2011 - 10:50
精准.石油.论坛 forum.petro-china.com

BiCGstab,不是BiCTstab,笔误。
精准.石油.论坛 forum.petro-china.com






----
来源: 精准石油论坛 - 推进信息共享,提升科技水平
0

#10 已离线   shaopizi 

  • 职业侠客
  • 图像
  • 群组: 认证会员
  • 主题数: 240
  • 注册日期: 05-26-2009

shaopizi 发表于 10-01-2011 - 01:56
精准.石油.论坛 forum.petro-china.com

由于INTEL FORTRAN 的数学库包含了PARDISO求解器,所以我一直用它来解计算流体力学的系数矩阵方程。PARDISO 可实现自动并行,可惜SCALLING 效果相当一般。另外由于采用了不同的算法,PARDISO相对ITERATIVE SOLVER 对内存消耗非常之大。cced 前面提到的开源BICGstab程序,是否有并行版本的?
精准.石油.论坛 forum.petro-china.com






----
来源: 精准石油论坛 - 推进信息共享,提升科技水平
0

#11 已离线   中科流氓 

  • 一介布衣
  • 点子点子
  • 群组: 注册会员
  • 主题数: 44
  • 注册日期: 06-24-2010

中科流氓 发表于 01-04-2012 - 21:09
精准.石油.论坛 forum.petro-china.com

View Postshaopizi, on 10-01-2011 - 01:56, said:

由于INTEL FORTRAN 的数学库包含了PARDISO求解器,所以我一直用它来解计算流体力学的系数矩阵方程。PARDISO 可实现自动并行,可惜SCALLING 效果相当一般。另外由于采用了不同的算法,PARDISO相对ITERATIVE SOLVER 对内存消耗非常之大。cced 前面提到的开源BICGstab程序,是否有并行版本的?

很抱歉直到今天才看到您的回帖。
我现在还在用pardiso求解,内存消耗非常巨大,不知道其他求解器怎么样,自己写的有时候很难达到所需要的精度。
精准.石油.论坛 forum.petro-china.com






----
来源: 精准石油论坛 - 推进信息共享,提升科技水平
0

第一页
  • 您无法发起一个新主题
  • 您无法回复此主题