我有一个数组:
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
答案 0 :(得分:3)
我是Vladimir F给出的where
方法的粉丝,但我也可以建议相关的方法。
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
适当塑造。
答案 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