实数到二进制数组(0/1)

时间:2017-05-30 14:36:52

标签: fortran

我有一个数组:

PutObjectRequest putRequest = new PutObjectRequest("my.bucket.name", "dir/dir/file.txt", file);

如果值为负数,我希望为0;如果为正数,我想为0;

 0.3  0.4  0.65  1.45
-1.2  6.0 -3.49  3.9

有没有办法在没有循环的情况下执行此操作:

1  1  1  1
0  1  0  1

5 个答案:

答案 0 :(得分:3)

我是Vladimir F给出的where方法的粉丝,但我也可以建议相关的方法。

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 :(得分:2)

最直接的

u

标志函数需要另一个数组来表示幅度不是很方便,因为

<-inputfile s3://xxx/data/aa.txt -outputdir s3://xxxx/res >

需要一个与where (array>=0) array = 1 else where array = 0 end where 形状相同的0.5的数组。

实际上它应该是array = sign(array, halfs) + 0.5 ,如francescalus所示。我甚至查看了手册,然后切换了论据......

答案 2 :(得分:2)

我对此感到非常有趣。这个不要求数字符合整数:

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

答案 3 :(得分:1)

这很难看,但如果你想要一个单行:

{{1}}

答案 4 :(得分: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