的我有一个数组:阵列实为二进制(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
有多种方式。 –