的我有一個數組:陣列實爲二進制(0/1)
0.3 0.4 0.65 1.45
-1.2 6.0 -3.49 3.9
我想有0,如果值爲負,並且如果1陽性:
1 1 1 1
0 1 0 1
是否有一個辦法做到這一點不象一個循環:
DO X=1,Xmax
Do Y=1,Ymax
IF(Array(X,Y)>0)THEN
Array(X,Y)=1
END IF
END DO
END DO
的我有一個數組:陣列實爲二進制(0/1)
0.3 0.4 0.65 1.45
-1.2 6.0 -3.49 3.9
我想有0,如果值爲負,並且如果1陽性:
1 1 1 1
0 1 0 1
是否有一個辦法做到這一點不象一個循環:
DO X=1,Xmax
Do Y=1,Ymax
IF(Array(X,Y)>0)THEN
Array(X,Y)=1
END IF
END DO
END DO
我對此有太多的樂趣。這一個不需要數字符合整數:
ARRAY = 0.5 * ARRAY/ABS(ARRAY) + 0.5
這就是'sign',只是比較慢。 –
最直接的
where (array>=0)
array = 1
else where
array = 0
end where
不是很方便的,該符號函數需要另一個陣列的大小,因爲
array = sign(array, halfs) + 0.5
需要與0.5的相同的形狀
array
的陣列。
實際上它應該是array = sign(0.5, array) + 0.5
,如francescalus所示。我甚至看到手動,然後切換參數反正...
我是where
方法的風扇按以下給出Vladimir F,但我也可以建議一個相關的。
merge
是本徵要素功能這需要兩個源和掩模:
array = MERGE(0., 1., array.lt.0.)
作爲輕微修正弗拉基米爾F公司sign
:
array = SIGN(0.5, array) + 0.5
注意的順序與其它相比,開關回答。
由於merge
和sign
的基本屬性,可以將標量期望值與陣列和數組掩碼混合。
由於這兩種自然可以被修改以分配值給另一個變量(甚至創建的整數之一),我將展示的完整性的替代where
:
where (array.lt.0.)
another_array=0
elsewhere
another_array=1
end where
爲another_array
適當形狀。
弗拉基米爾希望快!
REAL(KIND=8) :: ARRAY(4,2) = RESHAPE (&
(/ 0.3, 0.4, 0.65, 1.45, -1.2, 6.0, -3.49, 3.9 /), (/4,2/))
INTEGER(KIND=8) :: IARRAY(4,2)
EQUIVALENCE (ARRAY, IARRAY)
ARRAY = 1 - IBITS(IARRAY,63,1)
:d
kind = 8太醜了。你可以更好地保持真實的* 8 ...但是在這裏使用位,這確實是int64和real64的確切位置。但是,這比OP的代碼更好嗎?我想說我需要一些快速的東西,畢竟這不是我的問題。只是通過浮點乘法計算「符號」,當有「符號」作爲內部函數可用時,只是點,更復雜(並且更慢)。 –
但最重要的是我喜歡'sign'版本,正如francescalus所修正的那樣。 –
這不適合我。使用gfortran,'array = SIGN(0.5,array)+ 0.5'給出以下錯誤:'錯誤:'(')內部的'sign'的'b'參數必須與'a'相同的類型和種類 – Jack
有多種方式。 –