Fortran 如何仅打印矩阵的非零?
我有一个矩阵,但我试图不打印矩阵中的0值。 我写的逻辑,但它不工作Fortran 如何仅打印矩阵的非零?,fortran,fortran90,gfortran,Fortran,Fortran90,Gfortran,我有一个矩阵,但我试图不打印矩阵中的0值。 我写的逻辑,但它不工作 do i=1,42 if (massmat(i,j).ne.0) then write(20,*)i,(massmat(i,j),j=1,42) end if end do 它仍然打印出所有的零和值。 有人能帮忙吗?让我们通读主do循环,看看出了什么问题: do i=1,42 这将循环遍历矩阵的所有列,正如您在上面的注释中所建议的那样 if (massmat(i,j).ne.0) then 此行测试massm
do i=1,42
if (massmat(i,j).ne.0) then
write(20,*)i,(massmat(i,j),j=1,42)
end if
end do
它仍然打印出所有的零和值。
有人能帮忙吗?让我们通读主
do
循环,看看出了什么问题:
do i=1,42
这将循环遍历矩阵的所有列,正如您在上面的注释中所建议的那样
if (massmat(i,j).ne.0) then
此行测试massmat(i,j)
是否严格等于0。但是j
的值尚未设置。为了测试矩阵的所有元素,上面应该有另一个do
语句,它循环遍历j
的所有值
write(20,*)i,(massmat(i,j),j=1,42)
此行写入一个索引i
和一个数组,该数组是矩阵的一列。因此,如果元素massmat(i,j)
不是0,则写入包含massmat(i,j)
的整个列,即使它可能包含零元素。相反,此行可能应该写入i
,j
,以及单个矩阵元素massmat(i,j)
,以便只写入刚刚测试过的元素 你可以写
do i = 1, 42
write(20,*) i, pack(massmat(i,:), massmat(i,:)/=0)
end do
这将在massmat
的行上循环,并打印每个行中的所有非0元素。关于pack
函数的详细信息,请参阅Fortran文档
write (20,*) pack(massmat,massmat /= 0)
打印非零元素。想想当遇到if语句时,j的值是多少。我编程非常糟糕。请原谅我的错误理解。j是列的计数器,对吗?准确地说,在OP的代码中,这个答案
i
是行索引,而不是列索引。