2010-02-11 51 views
4

我想要的埃普西隆下面截斷絕對值爲0,例如,Mathematica:用習慣方式替換列表中符合條件的值?

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

我想我可以使用掃描[]與[]寫一個函數,但有一個更地道「的單行」在Mathematica中使用它的方法?

+1

我想我可能標誌着雙方@dreeves和@ Ramashalanka的回答爲 「接受」。 @dreeves更適合我的確切問題,但@ Ramashalanka's給出了一般模式。 – 2010-02-11 18:09:38

+0

我給你一條魚,Ramashalanka向你展示瞭如何釣魚。 :)(與此同時,我編輯了我的答案,使其更具一般性,也許現在它值得您接受的答案狀態,您慷慨授予!) – dreeves 2010-02-12 16:11:01

+0

拉里,你看到我的回覆嗎?我意識到這是一年多以後,但如果你還在做類似的操作,它可以節省大量的計算時間。 – 2011-04-16 14:48:39

回答

5

內置的功能Chop幾乎正是你要尋找的(它的工作的清單,在你的例子)的東西。一個潛在的驚喜是它不會截斷(截斷)整數,而只是浮點數。因此,對於您的示例工作如你所料,第一個列表轉換爲浮點與N功能:

Chop[[email protected]{-3, -2, -1, 0, 1, 2, 3}, 1.5] -> {-3., -2., 0, 0, 0, 2., 3.} 

由於Ramashalanka表演,更一般做這樣的事情,我建議:

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

即,在列表上映射的lambda函數。

6

很多的選擇,所有的工作:

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 
1

這裏是一個方法(f3),幾乎是一個數量級更快。

它由Fred Simons的代碼改編。


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

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

f3 = # (1 - [email protected][#, {-1.5, 1.5}, {0, 0}]) &; 

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

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

[email protected]@Do[#@lst, {500}] & /@ {f1, f2, f3} 

(* Out= True     *) 

(* Out= {0.406, 2.282, 0.047} *)