如何在fortran的do循环中替换二维数组元素的所有出现

问题描述 投票:0回答:1

我有这样的标准输入(元素总是> 10)

 75 33 44 51
 51 87 33 77
 77 51 91 45

让它是数组c(i,j)。整数,维(:,:),可分配的:: c

我想用1代替每行中的一个元素(随机地-根据随机数1 = 结尾

0  0  0  1
1  0  0  0
0  1  0  0

c(4,2)= c(1,3)不会变成1而是变成0,因为c(1,2)已经等于1。而且c(3,3)也没有变成1因为c(2,3)已经等于1。

我尝试如下操作

do j = 1, nrow
call random_number(u)
n = 1 + FLOOR(4*u)
do i = 1, ncol
do l = j+1,nrow
do k = 1,ncol
if ((i == n) .and. ((c(i,j) /= 0) .or. (c(i,j) /= 1)) .and. (c(i,j) == c(k,l))) then 
    c(i,j)=c(k,l)=1
end if
if ( (i /= n) .and. ((c(i,j) /= 0) .or. (c(i,j) /= 1)) .and. (c(i,j) == c(k,l))) then
    c(i,j)=c(k,l)=0
end if
if ((i == n) .and. ((c(i,j) /= 0) .or. (c(i,j) /= 1))) then 
    c(i,j)=1
end if
if ( (i /= n) .and. ((c(i,j) /= 0) .or. (c(i,j) /= 1))) then
    c(i,j)=0
end if
end do
end do
1 end do
end do

但我知道

c(i,j)=c(k,l)=1
1
Error: Unclassifiable statement at (1)

0相同。

我真正想要的是根据整个元素的值来更改所有出现的相等元素。例如,替换51-> 1应将c(4,1)更改为1,将c(4,1),c(1,2)和c(2,3)更改为1,类似于Mathematica的“全部替换”声明,它声明数组元素(51)的值而不是它们的名称(c(4,1),c(1,2),c(2,3))。但是,名称c(4,1),c(1,2),c(2,3)在调用时应以其新值响应。

下面的Evets程序未提供正确的结果。例如,>

75 33 44 51
51 87 33 77
77 51 91 45

n = 1
1 0 0 0
51 87 33 77
77 51 91 45

n = 1
1 0 0 0
1 0 0 0
77 1 91 45

n = 4
1 0 0 0
1 0 0 0
0 0 0 1

c(4,1)(51)应该用c(1,2)(51)标识,但不是。当c(4,1)更改为0时,c(1,2)也应更改为0,但不会更改为0。数组中所有相等元素的更改是问题的症结所在。

我具有这样的标准输入(元素总是> 10)75 33 44 51 51 87 33 77 77 51 91 45使其为数组c(i,j)。整数,Dimension(:, :),可分配的:: c我想用1代替一个...

arrays replace fortran simultaneous
1个回答
0
投票

您需要阅读WHERE结构。如果我了解您的描述,此玩具程序将为您工作。

© www.soinside.com 2019 - 2024. All rights reserved.