回 帖 发 新 帖 刷新版面

主题:怎样开辟一个二维数组能让其每行长度可任意缩放呢?

要开辟一个二维数组,但是在计算过程中需要不断改变其每行的长度,该如何实现呢?

回复列表 (共29个回复)

沙发

用自定义数据结构

type row_data
integer,pointer,dimension(:)::column
endtype row_data

type(row_data),pointer,dimension(:)::row

allocate(row(nrow))

do irow=1,nrow
  allocate(row(irow)%column(ncolumn))
enddo

其中ncolumn对每一行可以取不同值

上面的做法只是能保证每一行的列数不相同,但一般需要事先定义好。如果需要动态的改变每一行的列数,在上面的自定义数据结构中用串行结构代替数组就可以了。

板凳

1 楼网友停留在 Fortran 95 标准层次,若是用 Fortran 2003 语法,则更佳。

3 楼

[quote]用自定义数据结构

type row_data
integer,pointer,dimension(:)::column
endtype row_data

type(row_data),pointer,dimension(:)::row

allocate(row(nrow))

do irow=1,nrow
  allocate(row(irow)%column(ncolumn))
enddo

其中ncolumn对每一行可以取不同值

上面的做法只是能保证每一行的列数不相同,但一般需要事先定义好。如果需要动态的改变每一行的列数,在上面的自定义数据结构中用串行结构代替数组就可以了。
[/quote]
谢谢您!
这样开辟有一个问题:如果nrow很大的话,会导致allocate的次数很多,这样光动态数组的头就会浪费很大的空间,似乎行不通呀。

4 楼

[quote]1 楼网友停留在 Fortran 95 标准层次,若是用 Fortran 2003 语法,则更佳。[/quote]
Fortran 2003 语法该怎样实现呢?能举个简单的例子吗?

5 楼

同问?请指教!

6 楼

Type parameter

type:: matrix(m, n, IP, WP)
  integer, kind:: IP = kind(0), WP = kind(0.0)
  integer(kind = IP), len:; m, n
  real(kind = WP):: mat(m, n)
end type

7 楼


8 楼

[quote]Type parameter

type:: matrix(m, n, IP, WP)
  integer, kind:: IP = kind(0), WP = kind(0.0)
  integer(kind = IP), len:; m, n
  real(kind = WP):: mat(m, n)
end type[/quote]
非常感谢!

9 楼

[quote]Type parameter

type:: matrix(m, n, IP, WP)
  integer, kind:: IP = kind(0), WP = kind(0.0)
  integer(kind = IP), len:; m, n
  real(kind = WP):: mat(m, n)
end type[/quote]


受教了!看来是落伍了啊,得继续学习了!

10 楼

[quote]Type parameter

type:: matrix(m, n, IP, WP)
  integer, kind:: IP = kind(0), WP = kind(0.0)
  integer(kind = IP), len:; m, n
  real(kind = WP):: mat(m, n)
end type[/quote]
谢谢!
我怎么看不懂啊,mat(m, n)开辟之后能改变其中一维的大小吗?
应该怎么使用这个自定义类型的数据呢?

我来回复

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