我是fortran的新手,我想编写一个包含Matrix元素的双复矩阵派生TYPE。我需要做的是定义类型并初始化矩阵,定义一个以可读形式写入Matrix TYPE文件的例程,然后在我的屏幕上打印这个矩阵。我试过这个程序,它应该将值1d0分配给矩阵的每个元素我不知道什么是错的,但它不起作用。有人能帮助我吗?
这是我的程序
module matrices
type matrix
double complex, dimension(:,:), allocatable :: aa
end type
contains
function assign(var)
type(matrix) :: var
integer*4 ii, jj
do ii = 1, 2
print *, ii
do jj = 1, 3
var%aa(ii, jj) = var%aa
end do
end do
end function
end module matrices
program test
use matrices
type(matrix) :: AA
AA = matrix(2d0)
integer :: kk, ll
do kk = 1, 2
do ll = 1, 3
write (*, *) AA(kk, ll)
end do
end do
end program test
答案 0 :(得分:2)
如果你有一个最新的编译器,你可以简单地写
type(matrix) :: AA
AA = matrix(arr)
前提是arr
在处理使用它的语句时,是复数值的rank-2数组。在显示的代码中2d0
不是复数值的rank-2数组,因此毫无疑问编译器barfs表达式。最新的编译器是必需的,因为这种自动分配是该语言的最新功能。
当然,由于编译器永远不会在那里使用barf,它拒绝编译模块matrices
。我怀疑它找到了这个陈述
var%aa(ii, jj) = var%aa
最令人反感的是,将一个数组(在rhs上)分配给同一个数组的一个元素(在lhs上)。这可能永远不会奏效。我无法弄清楚该函数的用途,我将其删除并使其余代码正常工作。有一件事当然没有必要,也没有做好,就是分配复杂的数组并为它设置值。我发现代码中没有使用它。
返回AA
的复杂数组组件的自动分配,此语句
AA = matrix(arr)
确实要求arr
是(双)复数值的rank-2数组。为了简洁和密集,您可以简单地写
AA = matrix(reshape([((2d0,1d0),ix=1,6)],[2,3]))
如果我的语法正确,则将复数值(2d0,1d0)
分配给2x3
数组的每个元素。
哦,在我写作的时候,一句无端的评论:double complex
就是上个世纪。不要学习糟糕的旧方法,更好的方法是
use iso_fortran_env
complex(real64), dimension(:,:), allocatable :: aa
标准模块iso_fortran_env
定义了等,用于声明64位实数的标准常量,或者,这里是包含64位实部和虚部的复数。