5

イプシロン未満の絶対値を 0 に切り捨てたい。たとえば、

Truncate[{-3, -2, -1, 0, 1, 2, 3}, 1.5] -> {-3, -2, 0, 0, 0, 2, 3}

Scan[] と If[] を使用して関数を記述できると思いますが、Mathematica でそれを行うより慣用的な「ワンライナー」の方法はありますか?

4

3 に答える 3

8

すべてが機能する多くのオプション:

Map[If[Abs[#] < 1.5, 0, #] &, {-3, -2, -1, 0, 1, 2, 3}]

または同等のもの:

If[Abs[#] < 1.5, 0, #] & /@ {-3, -2, -1, 0, 1, 2, 3}

または、必要に応じて:

ReplaceAll[{-3, -2, -1, 0, 1, 2, 3}, (x_ /; Abs[x] < 1.5) -> 0]

これは次と同等です:

{-3, -2, -1, 0, 1, 2, 3} /. (x_ /; Abs[x] < 1.5) -> 0

また

ReplaceAll[{-3, -2, -1, 0, 1, 2, 3}, (x_?(Abs[#] < 1.5 &)) -> 0]

これは次と同等です:

{-3, -2, -1, 0, 1, 2, 3} /. (x_?(Abs[#] < 1.5 &)) -> 0
于 2010-02-11T02:49:52.713 に答える
5

組み込み関数Chopは、探しているものとほぼ同じです(例のように、リストで機能します)。潜在的な驚きの 1 つは、浮動小数点数のみを切り捨て (切り捨て) 整数を切り捨てないことです。したがって、例が期待どおりに機能するようにするには、まずN関数を使用してリストを浮動小数点に変換します。

Chop[N@{-3, -2, -1, 0, 1, 2, 3}, 1.5] -> {-3., -2., 0, 0, 0, 2., 3.}

ラマシャランカが示すように、この種のことをより一般的に行うには、次のことをお勧めします。

If[Abs[#]<1.5&, 0, #]& /@ {-3, -2, -1, 0, 1, 2, 3}

つまり、リストにマップされたラムダ関数です。

于 2010-02-11T14:43:02.863 に答える
2

f3これは、ほぼ桁違いに高速なメソッド ( ) です。

Fred Simons によるコードから改作されています。


f1 = If[Abs[#] < 1.5, 0, #] & /@ # &;

f2 = # /. (x_ /; Abs[x] < 1.5) -> 0 &;

f3 = # (1 - Unitize@Clip[#, {-1.5, 1.5}, {0, 0}]) &;

lst = RandomInteger[{-100, 100}, 5000];

SameQ @@ (#@lst & /@ {f1, f2, f3})

First@Timing@Do[#@lst, {500}] & /@ {f1, f2, f3}

(* Out=  True                  *)

(* Out=  {0.406, 2.282, 0.047} *)
于 2011-03-29T20:47:20.153 に答える