回 帖 发 新 帖 刷新版面

主题:大数组中只有离散元素怎么处理?

我在编一个程序,里面要多次调用一个函数 Function pnj(i1,i2,i3,i4,i5,i6,i7)
由于pnj计算起来比较费时,于是想把每次算好了存起来,存到数组 real*16 A(i1,i2,i3,i4,i5,i6,i7) 中。问题是矩阵太大,有100*17*10*10*17*19*19 这么大,内存不够。
我估计这么大矩阵中真正存到的元应该也不到万分之一。请教各位,应当如何构建一个合理的数据结构,来存储pnj的结果,提高运算效率呢?

我想了两个比较笨的办法,一个考虑是定义一个超大的指针的数组,每个指针指向real*16 B(100000),B中储存每一次算的结果。这样可以把16字节的矩阵变成4字节的矩阵,可以稍微小一些,不知道是否可行。
另一个是存在real*16 B(100000)中,并在integer i1b(100000),i2b... 等中存入相应坐标信息。但是如此的话,每一次寻找都要遍历B中的n个元素,或许会更不效率。

各位有何高见?先多谢了。

回复列表 (共7个回复)

沙发

我还未见过需要用这么大数组的算法. 我觉得楼主是不是搞错什么东西? 数组的脚标本身就可以作为坐标信息不需要另外开辟维度来进行记录的哦.
再有就是,如果非零元素是有规律的, 那直接换一种低维度甚至是一维数组来存储, 那样运算也快.

板凳

参考: Sparse Matrix  的数据结构。

3 楼

第一,是否可以改变一下算法?
第二,是否考虑用硬盘储存?腾讯QQ有上亿用户,也没见全部放在内存里
放在硬盘里,用直接读写方式。

4 楼

多谢各位,稀疏矩阵确是我想找的数据结构。
把输出结果储存到一个数组中,但一次次的搜索是一个问题,需要想办法提高搜索效率。或许可以用十字链表来解决。
多谢各位了。

5 楼

网上找了好久,讲数据结构的很多,但程序大都是C语言下的。
不知谁有比较标准的十字链表的Fortran程序?包括增加列表,读取列表等函数?或者有人知道哪边有可以找到吗?谢谢

6 楼

1、变带宽存储
2、索引只存对角线元素
3、十字链表效率低下,还是算了吧。

7 楼

十字链表的缺点我感觉是表头太长,如果是七维矩阵,要做一堆六维的矩阵做表头,实在不效率。我很不理解这么做两列表头的好处。

我借鉴了一下十字链表的思想,改进了一下,做了一个7维链表,效率很不错,对照一下矩阵测试了一下,并不比矩阵慢。思路大约是如下
Head------------------------  按照 I1 排序
                |
                |____________ 按照I3排序 以此类推...
                |
                |
                | 按照I2排序

只是程序写得很傻,不太会用堆栈,于是写了个嵌套了七回的又臭又长的子程序... 不拿出来献丑了

目前来说问题是解决了。多谢各位关心。

我来回复

您尚未登录,请登录后再回复。点此登录或注册