回 帖 发 新 帖 刷新版面

主题:这样用指针数组开辟一个上三角矩阵为什么会浪费很多内存?

源代码如下,程序是通的:
要实现的是开辟一个类似上三角矩阵,即每行维数可变。(下面为了比较内存消耗,每行均开辟10)

program main

type :: CC
complex,dimension(:),pointer::C
end type
type(CC),allocatable :: BlockM(:)

complex,allocatable:: BlockR(:,:)
integer i,s

s=1

if(s==0)then      !第一种方式:按照自定义类型数组开辟

    allocate( BlockM(500000) )
    do i=1,500000
        allocate( BlockM(i)%C(1:10) )
    enddo

else              !第二种方式:按照普通二维数组开辟    

       allocate(BlockR(500000,10))

endif

pause

end program

查看任务管理器,这种方式的内存消耗比下面一种方式浪费了一倍。
我分析原因应该在于,上面一种方式中,allocate操作次数太多,这样大量的内存会浪费在动态数组的头上。
但是我又必须这样开辟,因为在后面的计算中数组每行的大小需要变化。
该如何解决这个问题呢?或者有什么其他的方式能实现这个目的又不浪费内存呢?
谢谢!

回复列表 (共8个回复)

沙发

貌似最简单的解决方案是一维变带宽存储,不过你不会喜欢的。

板凳

[quote]貌似最简单的解决方案是一维变带宽存储,不过你不会喜欢的。[/quote]
谢谢!
您说的一维变带宽存储是指类似于存储稀疏矩阵的一种方式的吗?也就是用每行元素个数位置等信息来描述一个矩阵。这样的方式好像用在我这里还是不太合适啊,因为我形成的矩阵每行的长度都在不断变化,所以我必须在程序中间不停的增加每行的开辟空间。

3 楼

将具体数值给出来吧。另外,前期通过cell2mat做成矩阵来做;或者利用cellfun来做;

4 楼

[quote]将具体数值给出来吧。另外,前期通过cell2mat做成矩阵来做;或者利用cellfun来做;[/quote]
上面的源代码基本就是具体数值啊。您说的cellfun是什么呢?不太明白~

5 楼

我在以前的帖子里讲过动态分配空间时动态数组信息头所占空间的计算方法:)
如果只有很少的数,那维数越高越费空间:)

6 楼

[quote][quote]貌似最简单的解决方案是一维变带宽存储,不过你不会喜欢的。[/quote]
谢谢!
您说的一维变带宽存储是指类似于存储稀疏矩阵的一种方式的吗?也就是用每行元素个数位置等信息来描述一个矩阵。这样的方式好像用在我这里还是不太合适啊,因为我形成的矩阵每行的长度都在不断变化,所以我必须在程序中间不停的增加每行的开辟空间。[/quote]
每行的长度还会因计算增加?那是比较麻烦,不过如果已经知道最多变多少那一开始就往多里取也行。

7 楼

[quote]我在以前的帖子里讲过动态分配空间时动态数组信息头所占空间的计算方法:)
如果只有很少的数,那维数越高越费空间:)[/quote]
是的,我读到过您的分析。

8 楼

[quote]每行的长度还会因计算增加?那是比较麻烦,不过如果已经知道最多变多少那一开始就往多里取也行。[/quote]
谢谢!
就是不知道每行变多少啊,每行变到多少得在计算过程中获得。而且上限下限差距很大。

我来回复

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