Fortran Coder

查看: 10770|回复: 9
打印 上一主题 下一主题

[求助] 关于动态数组的问题

[复制链接]

6

帖子

1

主题

0

精华

入门

F 币
62 元
贡献
36 点
跳转到指定楼层
楼主
发表于 2015-12-5 01:03:27 | 显示全部楼层 回帖奖励 |倒序浏览 |阅读模式
请教大家一个问题,我有一个很大的稀疏矩阵A(n,n), 我要把所有的非零元素提取出来存入vec,个数未知。
因为尺寸比较大,我想对vec使用动态数组,目前我的方法是。
[Fortran] 纯文本查看 复制代码
ncnt = 0   !计数器,非零元素的个数
do i = 1,n
 do j = 1,n
    if (A(i,j) /=0)  then
        ncnt =ncnt +1
   endif
 enddo
enddo
allocate(vec(ncnt))

ncnt = 0
do i = 1,n
 do j = 1,n
    if (A(i,j) /=0)  then
        ncnt =ncnt +1
        vec(ncnt) = A(i,j)
   endif
 enddo
enddo

我把A读了两遍,一边用来确定vec的大小,一遍用来赋值。A很大的时候很麻烦,,,
大神们会怎么做呢?


分享到:  微信微信
收藏收藏 点赞点赞 点踩点踩

6

帖子

1

主题

0

精华

入门

F 币
62 元
贡献
36 点
沙发
 楼主| 发表于 2015-12-7 20:03:27 | 显示全部楼层
我用的就是稀疏矩阵求解器,pardiso。
我要先把稀疏矩阵 A 计算(组装)出来,然后存储成pardiso需要的形式,就是上面说的非零向量vec。

@fcode
什么样的编译器不需要
allocate( b( count(a/=0) ) )
就直接
b = pack(a,a/=0)            ?

a 可以是二维吗?

6

帖子

1

主题

0

精华

入门

F 币
62 元
贡献
36 点
板凳
 楼主| 发表于 2015-12-7 20:05:04 | 显示全部楼层
pasuka 发表于 2015-12-5 09:17
http://people.sc.fsu.edu/~jburkardt/c_src/csparse/csparse.html
Tim Davis写的基于C的稀疏矩阵计算库, ...

没这么大野心啊,我是搞有限元的,求解只是一个工具。
感谢提供的信息

6

帖子

1

主题

0

精华

入门

F 币
62 元
贡献
36 点
地板
 楼主| 发表于 2015-12-8 17:51:46 | 显示全部楼层
fcode 发表于 2015-12-8 08:30
我并没有安装所有的编译器,所以也不知道哪些需要,哪些不需要。
但这个用法是 Fortran2008 语法,据我所 ...

哦,我以为是特定的编译器支持这样用。
非常感谢你的回答

6

帖子

1

主题

0

精华

入门

F 币
62 元
贡献
36 点
5#
 楼主| 发表于 2015-12-15 21:29:09 | 显示全部楼层
pasuka 发表于 2015-12-10 07:24
可惜了,搞不好总刚还是一维变带宽存储或者二维等带宽存储?
CSR、CSC和COO的说明与转换程序,ivf的帮助 ...

有兴趣我们可有交流一下。

我现在的方法是一行一行地组装总刚,依次将该行的非零元素存入上文提到的 vec 中,目前看效率还不错。也有并行的可能。

遗憾的是要提前猜一下总刚里面非零元素有多少个,可能猜大了 也可能猜小了

你说的CSR CSC 都是指什么?
您需要登录后才可以回帖 登录 | 极速注册

本版积分规则

捐赠本站|Archiver|关于我们 About Us|小黑屋|Fcode ( 京ICP备18005632-2号 )

GMT+8, 2024-5-29 10:06

Powered by Tencent X3.4

© 2013-2024 Tencent

快速回复 返回顶部 返回列表