gpt4 book ai didi

arrays - Fortran 中的深数组复制

转载 作者:行者123 更新时间:2023-12-04 09:32:08 25 4
gpt4 key购买 nike

我需要 Fortran (90) 中(真实)数组的深拷贝,但我不确定如何获得一个,因为我不完全了解引用是如何工作的。直觉上,我希望这能让我得到我想要的:

do i=1,n
b(i) = a(i)
end do

然而,最近有人向我指出 b(1:n) = a(1:n)相当于上面的代码。直觉上,我希望 b(1:n) = a(1:n)仅引起 b(1:n)的引用指向 a(1:n)的位置在内存中。

b(1:n) = a(1:n)深拷贝?为什么?与 b = a 相比,底层引用发生了什么?

最佳答案

您提到的三种复制数组的方法,do循环,b(1:n) = a(1:n)b = a , 都是等价的;他们复制数组的内容 a进入数组 b . ab只是数组,而不是花哨的指针或任何东西,因此赋值 a = b与数学表达式基本相同。引用并没有什么魔力(用户需要知道),这就是为什么 Fortran 是一种非常简单易学的语言。您可以在 Fortran 中使用指针数组,但这是另一个问题。
M Metcalf 和 J Reid 的 Fortran 90/95 解释始终是有关 Fortran 语言功能咨询的很好引用。从第 48 页:

3.11 Array assignment

By intrinsic assignment, an array expression may be assigned to an array variable of the same shape, which is interpreted as if each element of the expression were assigned to the corresponding element of the variable. For example, with the declarations

real, dimension(10, 20) :: a

The assignment

a = a  + 1.0

replaces a(i,j) by a(i,j) + 1.0 for i=1,2..,10 and j=1,2,..,20.


另请注意,标量表达式可以分配给数组,在这种情况下,将向所有数组元素广播 saclar 值。
就这一切的实际实现方式而言,我认为您正在解决您的问题,Fortran 标准对此完全没有指定。这类事情未指定,以允许编译器编写者进行任何他们想做的优化。例如,在作业 a = b 中, b的元素的顺序被复制到 a标准未指定,因此不同的编译器可以以不同的方式执行此操作。对于这个问题,您只需要知道,提供 ab不是指针,则 ab是不同的数组,改变一个的元素不会改变另一个的相应元素。所以这是一种感觉, a=b是“深拷贝”,您可以将其视为复制 b 中的所有项目。到 a的内存位置.

关于arrays - Fortran 中的深数组复制,我们在Stack Overflow上找到一个类似的问题: https://stackoverflow.com/questions/11799854/

25 4 0
Copyright 2021 - 2024 cfsdn All Rights Reserved 蜀ICP备2022000587号
广告合作:1813099741@qq.com 6ren.com