Fortran转置矩阵不适用于非2D阵列

Sam*_*Tan 2 fortran multidimensional-array matrix-multiplication

假设我有一个3D数组,A(1:3,1:4,1:5)我只想处理它的一部分,例如:

real :: A(1:3,1:4,1:5), B(1:5,1:2)
real, allocatable :: C(:,:)

allocate(C(size(A,1),size(B,2)))
C = matmul(A(1:3,1,1:5),B)
Run Code Online (Sandbox Code Playgroud)

Fortran看起来很好.但是,如果我需要处理转置,那么transposeFortran中的函数会混淆,例如:

real :: A(1:3,1:4,1:5), B(1:3,1:2)
real, allocatable :: C(:,:)

allocate(C(size(A,3),size(B,2)))
C = matmul(transpose(A(1:3,1,1:5)),B)
Run Code Online (Sandbox Code Playgroud)

如何使用Fortran交换数组中的维度?例如,我有A(3,4,5); 有没有一个函数/命令,它给了我A(5,4,3)或A(4,3,5)或我想要的任何安排?当然,没有做类似的事情,比如将A复制到具有所需顺序尺寸的虚拟阵列.我正在寻找简单的一线优雅方式.

谢谢.

mil*_*cic 8

你没有问题TRANSPOSE.它对您提供的示例代码工作得很好.问题是您的数组与矩阵乘法不兼容.来自Fortran 2008标准草案:

情况(i):如果MATRIX A具有形状[n,m]并且MATRIX B具有形状[m,k],则结果具有形状[n,k].

在你的情况下:

C = matmul(transpose(A(1:3,1,1:5)),B)
Run Code Online (Sandbox Code Playgroud)

这里transpose(A(1:3,1,1:5))是5x3矩阵,B是2x5.因此,这两个矩阵是不可兼容的MATMUL.我想知道你怎么没有抓住这个,因为编译器给出了一个明确的错误信息:

gfortran 4.1.2:

In file matrix.f90:13

C = matmul(transpose(A(:,1,:)),B)
          1
Error: different shape on dimension 2 for argument 'matrix_a' and dimension 1 for argument 'matrix_b' at (1) for intrinsic matmul
Run Code Online (Sandbox Code Playgroud)

ifort 12.0.2.137:

matrix.f90(13): error #6241: The shapes of the arguments are inconsistent or nonconformable.   [MATMUL]
C = matmul(transpose(A(:,1,:)),B)
----^
compilation aborted for matrix.f90 (code 1)
Run Code Online (Sandbox Code Playgroud)

pgf90 10.6-0编译但产生运行时错误:

0: MATMUL: nonconforming array shapes
Run Code Online (Sandbox Code Playgroud)

要在Fortran中重塑数组,可以使用内部函数RESHAPE.来自Fortran 2008标准草案:

13.7.140 RESHAPE(SOURCE,SHAPE [,PAD,ORDER])

1描述.构造一个任意形状的数组.

2班.转型功能.

3个论点.SOURCE应该是任何类型的数组.如果PAD不存在或大小为零,则SOURCE的大小应大于或等于PRODUCT(SHAPE).结果的大小是SHAPE元素值的乘积.SHAPE应该是一级整数数组.SIZE(x),其中x是对应于SHAPE的实际参数,应该是一个常量表达式,其值为正且小于16.它不应具有值为负的元素.PAD(可选)应为与SOURCE相同类型和类型参数的数组.ORDER(可选)应为整数类型,其形状应与SHAPE相同,其值应为(1,2,...,n)的置换,其中n为SHAPE的大小.如果不存在,就好像它存在值(1,2,...,n).

4结果特征.结果是一个形状SHAPE数组(即SHAPE(RESHAPE(SOURCE,SHAPE,PAD,ORDER))等于SHAPE),其类型和类型参数与SOURCE相同.

5结果值.结果的元素,采用置换下标顺序ORDER(1),. ..,ORDER(n),是正常数组元素顺序中的SOURCE的那些,如果必要的话,遵循数组元素顺序的PAD的那些,如果必要的话,遵循数组元素顺序的PAD的附加副本.