我已经花了整整一个星期的时间。但是我解决不了。
我想在循环中将1D数组转换为2D数组的列。第一次迭代时,此2D数组的大小与1D数组相同。所以。投射它应该没有问题。在第二次迭代中,一维数组将具有不同的元素。我想将其转换为2D数组的第二列。这将继续,并且算法是如此,您无法在开始计算之前猜测2D数组的列数来分配它。
在Matlab中,可以使用如下所示的do循环:
do iter=1:m
p(:,iter) = r
end
但是FORTRAN呢?以下测试代码旨在显示我的意思:
代码1 :(使用指针)
program ptrtest
real, pointer, CONTIGUOUS :: Mr(:)
real, pointer, CONTIGUOUS :: Mp(:,:)
real, DIMENSION(9) ::abc
integer :: n = 2
iter=3
Do i=1,iter
alpha2 = 2
allocate(Mr(n**2))
abc= 42
Mr(1:n**2) = 0.5 * abc(1:n**2)
write(*,*) 'Mr='
write(*,555) Mr
Mr(1:n**2) => Mp(1:n**2,1:1)
WRITE(*,*) 'Mp='
WRITE(*,555) Mp
end do
555 FORMAT(F12.4,1X)
end program ptrtest
错误 :
gfortran -Wall -o "1234" "1234.f95" (in directory: /home/vahid/Desktop)
1234.f95:26.15:
Mr(1:n**2) => Mp(1:n**2,1:1)
1
Error: Rank remapping target must be rank 1 or simply contiguous at (1)
Compilation failed.
代码2 :(使用简单循环)
program ptrtest
real, pointer, CONTIGUOUS :: Mr(:)
real, pointer, CONTIGUOUS :: Mp(:,:)
real, DIMENSION(9) ::abc
integer :: n = 2
iter=3
Do i=1,iter
alpha2 = 2
allocate(Mr(n**2))
abc= 42
Mr(1:n**2) = 0.5 * abc(1:n**2)
write(*,*) 'Mr='
write(*,555) Mr
do j = 1, iter
Mp(:, j) = Mr
end do
WRITE(*,*) 'Mp='
WRITE(*,555) Mp
end do
555 FORMAT(F12.4,1X)
end program ptrtest
错误:
Mr=
21.0000
21.0000
21.0000
21.0000
Program received signal SIGSEGV: Segmentation fault - invalid memory reference.
Backtrace for this error:
#0 0x7F1F888E4777
#1 0x7F1F888E4D7E
#2 0x7F1F8853CD3F
#3 0x400D67 in MAIN__ at 1234.f95:?
Segmentation fault (core dumped)
不明白你的意思。我按照您设想的方式进行了尝试:
program vec2mat
implicit none
integer :: r(3), m(3, 3), i
r = (/ 1, 2, 3/)
do i = 1, 3
m(:, i) = r
end do
write(*, '(3I4)') m
end program vec2mat
它完美地工作:
$ ./vec2mat
1 2 3
1 2 3
1 2 3
(当然,多维数组中的第一个索引变化最快)。
好的,自从我发布此信息以来,您已经添加了更多信息:
DATA
已折旧。它仍然有效,但是没有括号:
DATA r/1.1, 2, 3, 4/
但是,如果要r
立即初始化,通常最好将其写入变量声明中:
REAL*8, DIMENSION(4) :: r = (/1.1, 2, 3, 4/)
在实际的代码块中,根本不需要使用DATA
(我什至不确定它是否允许使用)。只需继续并分配值即可:
ALLOCATE r(4)
r = (/1.1, 2, 3, 4/)
(必须先分配一个可分配的数组,然后才能向其中写入内容。)
最后,ALLOCATE
错误似乎很奇怪:
ALLOCATE(p)
无法工作,因为程序不知道要分配多少空间p
。但
ALLOCATE(p(1:4, 1:4))
应该工作正常。
通常,编译器将输出导致错误的整个行,而不是将其缩写为其他内容。因此,假设ALLOCATE
行没有改变,我唯一能想到的就是后期DATA
(据我所知,DATA
应该是声明块的ALLOCATE
一部分,并且是指令块的一部分,所以ALLOCATE
永远不能在它之前DATA
)搞砸了
代替
DATA r(/1.1, 2, 3, 4/)
和
ALLOCATE(r(4))
r = (/1.1, 2, 3, 4/)
而且你应该很好走。
本文收集自互联网,转载请注明来源。
如有侵权,请联系[email protected] 删除。
我来说两句