现代 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)。如果 ab 是向量,则结果是点积。 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 的情况下进行编译,并且编译器展开循环以允许更有效的内存访问。