如何只打印矩阵的非零?

时间:2014-11-11 02:55:00

标签: 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

它仍会打印出所有零和所有值。 有人可以帮忙吗?

3 个答案:

答案 0 :(得分:1)

你可以写

do i = 1, 42
   write(20,*) i, pack(massmat(i,:), massmat(i,:)/=0)
end do

这将循环遍历massmat行,并打印每个行中的所有非0元素。我将让您查阅Fortran文档,了解pack函数的详细信息。

答案 1 :(得分:1)

write (20,*) pack(massmat,massmat /= 0) 

打印非零元素。

答案 2 :(得分:0)

让我们通读主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)的整个列,即使它可能包含零的元素。相反,这一行应该写ij和单个矩阵元素massmat(i,j),这样只会编写刚刚测试过的元素。