我正在使用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)?谢谢。
答案 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