列表包含否定时返回零

时间:2011-11-18 19:52:09

标签: wolfram-mathematica

如何创建列表函数,如果列表中的任何成员为负数,则为零,否则它遵循递归关系。

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

感谢。

编辑:为了完全准确,我试图在本文的第6页(方程式18)实现递归关系: http://arxiv.org/PS_cache/nlin/pdf/0003/0003069v1.pdf

然而,它非常复杂,需要相当多的阅读才能理解,所以我不想把它带入问题!

3 个答案:

答案 0 :(得分:3)

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

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

这里的第二个参数是conditional pattern

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

答案 1 :(得分:3)

这是另一种方法:

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

答案 2 :(得分:2)

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

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

然后,更一般的情况仅适用于并非所有元素都是非负的,即有些是负数或零。

 f[l_List] := 0

使用模式匹配的更简单的方法

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

 fff[l_List]:= 0

修改

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

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

我的第二个提案的一个变体,专注于找到否定词,而不是找不到它们,如果这有意义的话。

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}

果然,如果有很多负数,这个版本很快,而且不需要检查整个列表。

jj[testfg1] // Timing

{0.0005, False}

但如果由于模式的扩张性而没有负数,则效率非常低

jj[testfg2] // Timing

{0.678945, True}