2017-05-30 101 views
1

的我有一個數組:陣列實爲二進制(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

有多種方式。 –

回答

2

我對此有太多的樂趣。這一個不需要數字符合整數:

ARRAY = 0.5 * ARRAY/ABS(ARRAY) + 0.5 
+0

這就是'sign',只是比較慢。 –

2

最直接的

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所示。我甚至看到手動,然後切換參數反正...

+0

我是老式的。我使用'.GE.' – Jack

+0

也許應該避免在我的手機上接聽。 –

+0

我的gfortran編譯器不喜歡那樣:「錯誤:(1)內部的'sign'的'b'參數必須與'a'相同的類型和種類」 – Jack

1

這是醜陋的,但如果你想要一個班輪:

ARRAY = CEILING(ARRAY/CEILING(ABS(ARRAY))) 
+0

嗯......發現不起作用的測試用例。你們可能想要「不像」它。 – Jack

+0

可以添加一點巧妙的因素使其工作:'陣列=天花板(陣列/天花板(ABS(陣列-1.0E-9)))'。 – Jack

3

我是where方法的風扇按以下給出Vladimir F,但我也可以建議一個相關的。

merge是本徵要素功能這需要兩個源和掩模:

array = MERGE(0., 1., array.lt.0.) 

作爲輕微修正弗拉基米爾F公司sign

array = SIGN(0.5, array) + 0.5 

注意的順序與其它相比,開關回答。

由於mergesign的基本屬性,可以將標量期望值與陣列和數組掩碼混合。

由於這兩種自然可以被修改以分配值給另一個變量(甚至創建的整數之一),我將展示的完整性的替代where

where (array.lt.0.) 
    another_array=0 
elsewhere 
    another_array=1 
end where 

another_array適當形狀。

1

弗拉基米爾希望快!

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

+0

kind = 8太醜了。你可以更好地保持真實的* 8 ...但是在這裏使用位,這確實是int64和real64的確切位置。但是,這比OP的代碼更好嗎?我想說我需要一些快速的東西,畢竟這不是我的問題。只是通過浮點乘法計算「符號」,當有「符號」作爲內部函數可用時,只是點,更復雜(並且更慢)。 –

+0

但最重要的是我喜歡'sign'版本,正如francescalus所修正的那樣。 –

+0

這不適合我。使用gfortran,'array = SIGN(0.5,array)+ 0.5'給出以下錯誤:'錯誤:'(')內部的'sign'的'b'參數必須與'a'相同的類型和種類 – Jack