Matrix 如何在每次迭代时用FORTRAN将一维数组转换为二维数组的列?

Matrix 如何在每次迭代时用FORTRAN将一维数组转换为二维数组的列?,matrix,vector,fortran,Matrix,Vector,Fortran,我已经花了整整一周的时间在这上面了。但我无法解决它 我想在一个循环中将一个一维数组转换成二维数组的列。在第一次迭代时,该二维阵列的大小与1D阵列的大小相同。所以投下它应该没有问题。在第二次迭代中,1D数组将有不同的元素。我想把它转换到2D数组的第二列。这将继续进行,并且算法是这样的:在开始计算之前,您无法猜测要分配给它的2D数组的列数 在Matlab中,可以使用如下do循环: do iter=1:m p(:,iter) = r end 但是FORTRAN呢? 以下测试代码旨在说明我的意思: 代

我已经花了整整一周的时间在这上面了。但我无法解决它

我想在一个循环中将一个一维数组转换成二维数组的列。在第一次迭代时,该二维阵列的大小与1D阵列的大小相同。所以投下它应该没有问题。在第二次迭代中,1D数组将有不同的元素。我想把它转换到2D数组的第二列。这将继续进行,并且算法是这样的:在开始计算之前,您无法猜测要分配给它的2D数组的列数

在Matlab中,可以使用如下do循环:

do iter=1:m
p(:,iter) = r
end
但是FORTRAN呢? 以下测试代码旨在说明我的意思:

代码1:(使用指针)

错误:

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:(使用一个简单的循环)

错误:

 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 r/1.1, 2, 3, 4/
但是如果您想立即初始化
r
,通常最好将其写入变量声明中:

REAL*8, DIMENSION(4) :: r = (/1.1, 2, 3, 4/)
在实际的代码块中,根本不需要使用
数据
(我甚至不确定是否允许)。只需继续并指定值:

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/)


您应该可以走了。

谢谢您的及时回复。我已经更新了我的代码并包含了错误。在你回复后,我无法解决这个问题。在我的原始代码中,我在代码中得到了“r”向量的大小。我无法在开始时指定大小。这就是我使用冒号的原因…所以当您知道大小时,您需要
分配
r,然后分配值。
ALLOCATE(p(1:4, 1:4))
DATA r(/1.1, 2, 3, 4/)
ALLOCATE(r(4))
r = (/1.1, 2, 3, 4/)