我有一个矩阵,但我试图不在矩阵中打印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
它仍会打印出所有零和所有值。 有人可以帮忙吗?
答案 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)
的整个列,即使它可能包含零的元素。相反,这一行应该写i
,j
和单个矩阵元素massmat(i,j)
,这样只会编写刚刚测试过的元素。