现代 fortran 中的 sum(sum(A.*B)) (matlab 符号)
sum(sum(A.*B)) (matlab notation) in modern fortran
能否建议我一个有效的实施方法
sum(sum(C))
哪里
C=A.*B
这里我用的是matlab的表示法,意思就是对于A和B方阵,A.*B是一个同维矩阵,其元素i-j是A的元素i-j与元素的乘积b的i-j,即
Cij = Aij*Bij
那么,sum(sum(C))表示矩阵C所有元素的和。
当然,做一个DO循环计算这个很容易,但是这个操作在另一个循环周期内,所以我必须做几次,这就是为什么我认为这可能是一种更有效的方法。
当然,“sum(sum())”部分很简单,我只是找不到有效的方法来做 A.*B
你要的操作就是Fortran中的sum(a*b)
。如果 a
和 b
是向量,则结果是点积。 s = a(1)*b(1)+a(2)*b(2)+..
但如果它们是矩阵,那么我不知道该怎么称呼它。
下面是两种环境中线性代数的快速概述
Operation
Matlab
Fortran
Element Multiplication
c = a .* b
c = a * b
Matrix Product
c = a * b
c = matmul(a,b)
Element Sum
sum(sum(c))
sum(c)
Transpose
a.'
transpose(a)
Inner Product
a.'*b
dot_product(a,b)
Outer Product
a*b.'
matmul(a,transpose(b))
Maximum Value
max(max(a))
maxval(a)
Minimum Value
min(min(a))
minval(a)
顺便说一下,大多数编译器会识别 do 循环并将它们矢量化,从而产生与上述代码一样快的代码。事实上,在我的测试中,do-loop
方法比紧凑方法快大约 3-5%。我通常更喜欢紧凑的表示法,只有当我只需要优化一些特定的代码时,我才会写出循环。请记住在启用 AVX2
的情况下进行编译,并且编译器展开循环以允许更有效的内存访问。
能否建议我一个有效的实施方法
sum(sum(C))
哪里
C=A.*B
这里我用的是matlab的表示法,意思就是对于A和B方阵,A.*B是一个同维矩阵,其元素i-j是A的元素i-j与元素的乘积b的i-j,即
Cij = Aij*Bij
那么,sum(sum(C))表示矩阵C所有元素的和。
当然,做一个DO循环计算这个很容易,但是这个操作在另一个循环周期内,所以我必须做几次,这就是为什么我认为这可能是一种更有效的方法。
当然,“sum(sum())”部分很简单,我只是找不到有效的方法来做 A.*B
你要的操作就是Fortran中的sum(a*b)
。如果 a
和 b
是向量,则结果是点积。 s = a(1)*b(1)+a(2)*b(2)+..
但如果它们是矩阵,那么我不知道该怎么称呼它。
下面是两种环境中线性代数的快速概述
Operation | Matlab | Fortran |
---|---|---|
Element Multiplication | c = a .* b |
c = a * b |
Matrix Product | c = a * b |
c = matmul(a,b) |
Element Sum | sum(sum(c)) |
sum(c) |
Transpose | a.' |
transpose(a) |
Inner Product | a.'*b |
dot_product(a,b) |
Outer Product | a*b.' |
matmul(a,transpose(b)) |
Maximum Value | max(max(a)) |
maxval(a) |
Minimum Value | min(min(a)) |
minval(a) |
顺便说一下,大多数编译器会识别 do 循环并将它们矢量化,从而产生与上述代码一样快的代码。事实上,在我的测试中,do-loop
方法比紧凑方法快大约 3-5%。我通常更喜欢紧凑的表示法,只有当我只需要优化一些特定的代码时,我才会写出循环。请记住在启用 AVX2
的情况下进行编译,并且编译器展开循环以允许更有效的内存访问。