Установите отрицательные значения в массиве в ноль, используя условное условие if - PullRequest
1 голос
/ 17 мая 2019

У меня есть функция некоторых переменных, которая даст массив, состоящий как из отрицательных, так и из положительных значений (вещественных). Но поскольку для меня физически значимы только положительные значения, я хочу установить все отрицательные значения в массиве равными нулю.

Я предоставил свой код, связанный с этой функцией ниже:

Причина, по которой я объявляю временную переменную 'res', заключается в том, что я пытаюсь встроить IF-ELSE в позицию, которую я пометил в коде следующим образом:

If (res >= 0) Then
   result = res
Else
   result = 0
End If

Но ошибка говорит о скалярном выражении для S_A, если требуется здесь.

Если вместо res мы используем res (il, ir),

If (res(il,ir) >= 0) Then
   result(il,ir) = res(il,ir)
Else
   result = 0
End If

ошибка говорит об ошибке #6351: The number of subscripts is incorrect.

Есть ли способ реализовать эту идею?

 Function somefunction(x,y,il,ir) Result(result)

 !! ---- begin of declaration ---------------------------

 Implicit None

 !! boundary indices
 Integer,            Intent ( in ) :: il,ir
 !! the vars
 Real ( kind = rk ), Intent ( in ), Dimension ( il:ir ) :: x,y
 !! the result
 Real ( kind = rk ), Dimension ( il:ir ) :: result
 !! temp vars
 Real ( kind = rk ), Dimension ( il:ir ) :: res
 !! loop index
 Integer :: i

 !! ---- end of declaration -----------------------------

 res     = x+y
 SA = S_A
 !!IF-ELSE!!
 End Function somefunction

Ответы [ 2 ]

1 голос
/ 17 мая 2019

Если вы хотите, чтобы элемент if содержался в массиве, вы должны использовать оператор where, например:

program min0
    implicit none
    real :: res(5, 5), result(5, 5)
    call random_number(res)
    res=res-0.5

    print '(5(F5.2,X))', res

    where (res>=0)
        result = res
    elsewhere
        result = 0
    end where

    print *, '---------------------------------------'
    print '(5(F5.2,X))', result
end program min0

Я не знаю, почему вы получаете индексошибка, это может помочь, если вы сообщите нам, в какой строке кода происходит ошибка.Но, конечно, во втором коде вы обновляете один элемент result, если res больше 0, но устанавливаете весь массив result в 0, если это не так.Это почти наверняка не то, что вы хотите.

Ура

0 голосов
/ 17 мая 2019

Похоже, что функция принимает X и Y, измеренные из (il: if) ... скажем, из (3: 6), то есть вектора.Однако позже индекс говорит (il, ir), что означает, что это двумерный массив.

ГДЕ кажется хорошим выбором.Другим будет логическая МАСКА, чтобы связать где-позиции.Имеет смысл, когда PACK и unpack - это usd,

Зачем даже говорить, какого размера векторы?

ELEMENTAL Function somefunction(x,y) Result(Res)

!! ---- begin of declaration ---------------------------

Implicit None

Real ( kind = rk ), Intent (IN), Dimension (:) :: x,y
!! the result
Real ( kind = rk ), Dimension ( il:ir ) :: res
!! loop index
Integer :: i

!! ---- end of declaration -----------------------------

res     = x+y
WHERE res <= 0
  Res = 0
ENDWHERE
!!IF-ELSE!!
End Function somefunction

Тогда на вызывающей стороне ... вызывать функцию в диапазоне неопределенныхВы хотите.

Z(1:5) = somefunction(X(1:5),Y(1:5))
...