2011-11-18 19 views
0

如何创建列表的函数,以便如果列表中的任何成员为负数,则为零,否则按照递归关系。当列表包含底片时返回零

在数学上这是我必须做的,但我不知道如何在Mathematica中做到这一点。

谢谢。

编辑:要完全准确,我想实现这个文件的第6页的递推关系(EQ 18): http://arxiv.org/PS_cache/nlin/pdf/0003/0003069v1.pdf

然而,这是相当复杂的,需要的阅读理解有相当数量,所以我不想把它带入问题!

+0

什么递推关系?你可以把它添加到问题? – rcollyer

+0

你走了。给定论文第6页的公式18。 – VolatileStorm

+0

我认为这是一个不同于你的问题暗示的提议,所以我很高兴你发布它。当然是复杂的;很可能。 – rcollyer

回答

3

测试列表中的任何成员是否满足某些条件可以使用MemberQ来完成。要测试列表lst包含小于零的任何元素,

lst = {1, 2, 0, -4}; 
MemberQ[lst, x_ /; x < 0] 

这里的第二个参数是conditional pattern

但是,是的,知道你想要做什么会有所帮助。

+0

有条件的模式是我一直在寻找的,谢谢! – VolatileStorm

2

您可以使用条件测试来定义函数,以便如果所有元素都是非负数,则使用递归关系。

f[l_List] /; And @@ NonNegative[l] := (* recursion relation *) 

然后,更一般的情况下,只适用于如果不是所有的元素都是非负的,即一些是负的或零。

f[l_List] := 0 

一个更简单方法,使用模式匹配

fff[l:{__?NonNegative}]:= (* recursion relation *) 

fff[l_List]:= 0 

EDIT

事实证明,我首先提出的方法是最有效的。

ff[l_list] /; And @@ NonNegative[l] := True 

ff[l_List] := 0 

Brett的版本

gg[l_List] /; Min[l] > 0 := True 

gg[l_List] := False 

我的第二个建议

hh[l : {__?NonNegative}] := True 

hh[l_List] := False 

在我的第二个提案的变种,在寻找底片,而不是没有找到他们,如果makese感集中。

jj[l : {___, _?Negative, ___}] := False 

jj[l_List] := True 

应该只有在这种情况下

testfg = RandomInteger[{-1, 1000}, 10000]; 

有很多负面的情况下,一些负面:一些模式匹配器不应该需要扫描整个列表

testfg1 = RandomInteger[{-1, 4}, 10000]; 

这一个应该返回True

testfg2 = RandomInteger[{0, 4}, 10000]; 

我们测试:

ff[testfg] // Timing 

{0.000016, 0} 

ff[testfg1] // Timing 

{0.000015, 0} 

ff[testfg2] // Timing 

{0.000024, 0} 

Brett的版本是一个慢一点,但第二快的整体

gg[testfg] // Timing 

{0.000049, True} 

gg[testfg1] // Timing 

{0.000049, True} 

gg[testfg2] // Timing 

{0.00005, True} 

hh[testfg] // Timing 

{0.000271, False} 

hh[testfg1] // Timing 

{0.000234, False} 

hh[testfg2] // Timing 

{0.003809, True} 

jj[testfg] // Timing 

{0.002482, False} 

果然,这个版本是快,如果有大量的负号和它doesn”不得不检查整个列表。

jj[testfg1] // Timing 

{0.0005, False} 

但是,如果有因为该模式

jj[testfg2] // Timing 

{0.678945, True} 
+0

+1对于'fff [l:{__?NonNegative}]' – acl

+0

@acl我总是忘记它可用(并且从版本1开始),即使我始终使用'?Positive'模式。我做了第一种方法,因为我暂时忘记了'NonNegative'会起作用,并正在使用'Alternative'尝试一些复合'(0 | Positive)'模式。但是我总是很难让这些模式起作用。 – Verbeia

+0

时间结果! – Verbeia

3

这里的豪爽之无负数它是非常低效的另一种方法:

g[l_List /; Min[g] >= 0] := (* recursion relation *) 
g[l_List] := 0 
+0

奇怪的是,这个版本比我原来的答案中的模式匹配情况要快,但是不是带有条件的版本。 – Verbeia

相关问题