2017-06-20 10 views
0

PDL(タイプdouble)の混合値(正と負の両方)を持っています。私はゼロに向かって各エントリを丸めたい。 だから、+1.2、私はint()を使用するのではと思ったが、それはPDLタイプでは動作しません+1.7-1.2-1なり、+1なり、-1.7-1なり、PDLで0に丸めます

+1になります。

また、round(abs($x) - 0.5) * ($x <=> 0)を使用することもできますが、このロジックをPDLでどのように使用するかはわかりません。

ポインタ?

答えて

4

PDL::Mathrint機能のドキュメントは言う:

あなたがゼロから離れて半整数を丸めるしたい場合は、floor(abs($x)+0.5)*($x<=>0)を試してみてください。

はちょうどそれはあなたが望むように動作させるために、わずかにそれを変更:

#!/usr/bin/perl 
use warnings; 
use strict; 

use PDL; 

my $pdl = 'PDL'->new(
    [ 1, 1.3, 1.9, 2, 2.1, 2.7 ], 
    [ -1, -1.3, -1.9, -2, -2.1, -2.7 ] 
); 
$pdl = floor(abs($pdl)) * ($pdl <=> 0); 
print $pdl; 

出力:

[ 
[ 1 1 1 2 2 2] 
[-1 -1 -1 -2 -2 -2] 
] 
+0

@ KoshVery:コードの古いバージョンに関連する、更新されました。 – choroba

1

PDL::Mathは、floor,ceilおよびである。これらの機能はすべて機能します。

したがって、次のようなものが動作するはずです:

#!/usr/bin/env perl 
use warnings; 
use strict; 

use PDL; 

my $pdl = 'PDL'->new(
    [ 1, 1.3, 1.9, 2, 2.1, 2.7 ], 
    [ -1, -1.3, -1.9, -2, -2.1, -2.7 ] 
); 

print $pdl; 

floor(inplace $pdl->where($pdl >= 0)); 
ceil (inplace $pdl->where($pdl < 0)); 

print $pdl; 

が出力:

[ 
[ 1 1.3 1.9 2 2.1 2.7] 
[ -1 -1.3 -1.9 -2 -2.1 -2.7] 
] 

[ 
[ 1 1 1 2 2 2] 
[-1 -1 -1 -2 -2 -2] 
] 

PS:chorobaの答え@は、非スレッドperlと、次のベンチマークで約20%高速に実行するようです5.24 on an ancient MacBook Pro

+0

私はないそれから離れて、ゼロに向かって値を丸めるために探しています。また、私のpdl変数が '$ myPDL'の場合、' abs() 'と' <=> 'はどのように使用しますか? '$ x'は代わりに' $ myPdl'になりますが、この関数はPDLの各エントリに自動的に適用されますか? – CinCout

+0

'($ x> = 0)'の条件では、 '$ x'は個々の変数です。どのようにPDLの各エントリについてこのチェックを行い、 'floor()'か 'ceil()'のどちらかに行くのですか? – CinCout

+0

ステートメントは '($ myPdl> = 0)ですか? floor($ myPdl):ceil($ myPdl); 'これはすべてのエントリに対して行いますか? – CinCout