我需要找到一种更快捷的方法来使用MKL转置矩阵。我尝试了MKL的mkl_domatcopy,但从来没有做对。
这是测试代码(Fortran):
PROGRAM MAIN
INTEGER, PARAMETER:: NROW = 3 !rows
INTEGER, PARAMETER:: NCOL = 3 !cols
REAL*8, ALLOCATABLE:: M(:,:)
REAL*8, ALLOCATABLE:: MT(:,:)
INTEGER:: i,j
ALLOCATE(M(NROW,NCOL))
ALLOCATE(MT(NROW,NCOL))
DO i = 1, NROW
DO j = 1, NCOL
M(i,j)=i
END DO
END DO
call mkl_domatcopy("c","t",3,3,9,M,3,MT,3)
print *,M
print *,"************************"
print *,MT
END
输出是:
1.00000000000000 2.00000000000000 3.00000000000000
1.00000000000000 2.00000000000000 3.00000000000000
1.00000000000000 2.00000000000000 3.00000000000000
************************
0
为什么MT为0?是否因为我使用它错了什么?
有关此功能的文件: https://software.intel.com/en-us/node/520863
PS:我仍然没有得到'alpha'的含义。
答案 0 :(得分:1)
正如用户roygvib在评论中建议的那样,通过加入mkl.fi
文件会为您提供更多详细信息。
此代码
PROGRAM MAIN
INCLUDE 'mkl.fi'
INTEGER, PARAMETER:: NROW = 3 !rows
INTEGER, PARAMETER:: NCOL = 3 !cols
REAL*8, ALLOCATABLE:: M(:,:)
REAL*8, ALLOCATABLE:: MT(:,:)
INTEGER:: i,j
ALLOCATE(M(NROW,NCOL))
ALLOCATE(MT(NROW,NCOL))
DO i = 1, NROW
DO j = 1, NCOL
M(i,j)=i
END DO
END DO
call mkl_domatcopy("c","t",3,3,9,M,3,MT,3)
print *,M
print *,"************************"
print *,MT
END
引发以下错误
test.f90(23):错误#6633:实际参数的类型不同 从伪参数的类型。 [9] 调用mkl_domatcopy(“c”,“t”,3,3,9,M,3,MT,3) ----------------------------------------------- ^编译中止for test.f90(code 1)
有趣的是,如果将9
转换为双精度值(或变量) - 请注意,我只是将d0
后缀附加到浮点值。
PROGRAM MAIN
INCLUDE 'mkl.fi'
INTEGER, PARAMETER:: NROW = 3 !rows
INTEGER, PARAMETER:: NCOL = 3 !cols
REAL*8, ALLOCATABLE:: M(:,:)
REAL*8, ALLOCATABLE:: MT(:,:)
INTEGER:: i,j
ALLOCATE(M(NROW,NCOL))
ALLOCATE(MT(NROW,NCOL))
DO i = 1, NROW
DO j = 1, NCOL
M(i,j)=i
END DO
END DO
call mkl_domatcopy("c","t",3,3,9d0,M,3,MT,3)
print *,M
print *,"************************"
print *,MT
END
然后您的应用程序返回
$ ./test
1.00000000000000 2.00000000000000 3.00000000000000
1.00000000000000 2.00000000000000 3.00000000000000
1.00000000000000 2.00000000000000 3.00000000000000
************************
9.00000000000000 9.00000000000000 9.00000000000000
18.0000000000000 18.0000000000000 18.0000000000000
27.0000000000000 27.0000000000000 27.0000000000000
最后,关于alpha
的含义,manual说
alpha 此参数按字母缩放输入矩阵。
并注意输出是转置的,每个元素乘以9。
答案 1 :(得分:0)
在fortran90中进行转置的最快方法如下
B = TRANSPOSE(A)
做MATMUL的最快方法是:
C = MATMUL(A,B)
因为它是语言中固有的,我不确定MKL / IMKL在哪里发挥作用?