Arrays FORTRAN中使用内部和函数的数组跟踪

Arrays FORTRAN中使用内部和函数的数组跟踪,arrays,sum,fortran,Arrays,Sum,Fortran,是否可以使用内在和函数来计算数组(秩>1)的轨迹 目前,我正在使用do循环来计算跟踪 trace = 0.0d0 do i = 1, 10 trace = trace + a(i,i) end do TL/DR:您的方法很好,请使用它 稍长: 您可以使用掩码,但其可读性较差、速度较慢且更容易出错: sum(a, mask = & reshape((/ (mod(i, size(a, 1)+1) == 1, i=1, size(a)) /), & shape(a)

是否可以使用内在和函数来计算数组(秩>1)的轨迹

目前,我正在使用do循环来计算跟踪

trace = 0.0d0
do i = 1, 10
  trace = trace + a(i,i)
end do

TL/DR:您的方法很好,请使用它

稍长:

  • 您可以使用掩码,但其可读性较差、速度较慢且更容易出错:

    sum(a, mask = &
       reshape((/ (mod(i, size(a, 1)+1) == 1, i=1, size(a)) /), &
       shape(a) ))
    
  • 您可以使用隐含的do循环来创建仅包含对角线元素的新临时数组:

    sum( (/ (a(i,i), i=1, size(a, 1)) /) )
    
    同样,这是效率较低的,因为程序必须创建一个新的数组,我不认为它比您的版本更可读


  • 我想您可以使用
    MASK
    参数,这将要求您生成一个仅在对角线上为
    .TRUE.
    的掩码。这就是说,创建掩码本身可能也需要一个
    DO
    循环。您甚至可以使用中的方法。如果您重复执行该操作,可能会很有用。你可以只制作一次面具。即使是预先制作的面具也会很慢。矩阵越大,情况就越糟。我想我们都同意OPs方法是计算轨迹最简单、最快、最容易理解的方法,他们应该继续使用它。