如何计算fortran中矩阵中数字的出现?

时间:2014-11-05 16:16:22

标签: matrix count fortran

我正在使用fortran 90,我希望在数组中出现两个数字时计算出现次数。

    flag=0
    q=0
    do k=1,ncolumns
      if (conn(m,k)==i .and. conn(m,k)==l) flag=1
    enddo
    if (flag==1) q=q+1 
    write (*,*) q

这里,conn(m,k)是矩阵,由m行和k列组成。我想读取conn(m,k),并计算当数字i和l都包含在conn(m,k)中时的出现次数。我知道上面的代码不起作用,因为它打印出来只有0,因为if循环有问题。但我不能使用'。或。'因为当i和l都包含在conn(m,k)中时我想要计数。如何检查数字i和l是否包含在conn中?

我修改了上面的代码,如

    ncolumns=2
    flag=0
    q=0
    do k=1,ncolumns
      !!!if (conn(m,k)==i .and. conn(m,k)==l) flag=1
      if (((conn(m,1)==i).and.(conn(m,2)==l)).or.((conn(m,1)==l).and.(conn(m,2)==i))) flag=1
    enddo
    if (flag==1) q=q+1 
    write (*,*) q

这很好用,但正如你所看到的,这段代码很荒谬,因为我需要手动定义k,特别是当' ncolumns'数量巨大。我怎么能用索引做到这一点?

同样,如何检查矩阵中包含2个或更多特定数字,如fortran中的conn(m,k)?谢谢。

3 个答案:

答案 0 :(得分:2)

这样的事情应该做你想做的事情:

  nums = [2,12,-4,99]  ! an array of the numbers you're looking for
  q = 0                ! the count of rows containing all the numbers in nums

  DO ix = 1, SIZE(conn,1)       ! the number of rows in conn
     nmatches = 0               ! the number of elements of nums found in conn(ix,:)
     DO jx = 1, SIZE(nums)
        IF(ANY(conn(ix,:)==nums(jx))) nmatches = nmatches+1    ! figure this out yourself
     END DO
     ! if there are as many matches in this row as there are elements in nums, add 1 to q
     IF(nmatches==SIZE(nums)) q = q+1    
  END DO

答案 1 :(得分:2)

您还可以使用虚拟矩阵(dummy_mat)填充要查找的矩阵中的值所在的值(value_mat),然后对虚拟矩阵求和以得到计数(num_entries):

    nums = [2,12,-4,99]
    do i=1,size(nums)     ! loop over the values you are looking for  
      dummy_mat = 0 ! zero out dummy matrix that is the same size as your value matrix           
      where (value_mat(:,:) == nums(i))    
        dummy_mat(:,:) = 1
      end where
      num_entries(i) = SUM(dummy_mat)
    end do

答案 2 :(得分:1)

从注释“如果conn中有3行有两个元素(如3和12),则打印的q应为3”。 如果你有Fortran95(我忘记它是在90规范中)或更高版本,你可以用一个循环完成。 这是一个例子:

Program Test_Count

  Implicit None

  Real(Kind=8), Dimension(3)   :: nums = (/-2.0_8 , -3.0_8 , -4.0_8/)
  Real(Kind=8), Dimension(4,4) :: test
  Logical, Dimension(4) :: Mask
  Integer :: i,j,NumberOfLines

  ! Fill test
  Do i = 1,4
    Do j = 1,4
      test(i,j) = -4.0_8 + (j -1)
    End Do
  End Do

  ! Count the row that have all the nums in them
  Mask = any(test == nums(1),2)
  Do i = 2,3
    Mask = Mask .and. any(test == num2(i),2)
  End Do
  NumberOfLines = count(Mask)

  Write(*,*) NumberOfLines ! Prints out 4.

End Program Test_Count