Warning: file_get_contents(/data/phpspider/zhask/data//catemap/1/amazon-web-services/14.json): failed to open stream: No such file or directory in /data/phpspider/zhask/libs/function.php on line 167

Warning: Invalid argument supplied for foreach() in /data/phpspider/zhask/libs/tag.function.php on line 1116

Notice: Undefined index: in /data/phpspider/zhask/libs/function.php on line 180

Warning: array_chunk() expects parameter 1 to be array, null given in /data/phpspider/zhask/libs/function.php on line 181
Fortran 如何仅打印矩阵的非零?_Fortran_Fortran90_Gfortran - Fatal编程技术网

Fortran 如何仅打印矩阵的非零?

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

我有一个矩阵,但我试图不打印矩阵中的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
此行测试
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
是行索引,而不是列索引。