2017-05-30 79 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