Wolfram mathematica 当列表包含负数时返回零

Wolfram mathematica 当列表包含负数时返回零,wolfram-mathematica,Wolfram Mathematica,我如何创建一个列表的函数,如果列表中的任何成员是负数,它就是零,否则它遵循递归关系 从数学上讲,这是我必须做的,但我不知道如何在数学中做到这一点 谢谢 编辑:准确地说,我试图实现本文第6页的递归关系(等式18): 然而,它相当复杂,需要大量的阅读才能理解,所以我不想把它带到问题中去 测试列表中的任何成员是否满足某些条件可以使用。要测试列表lst是否包含任何小于零的元素 lst = {1, 2, 0, -4}; MemberQ[lst, x_ /; x < 0] lst={1,2,0,-

我如何创建一个列表的函数,如果列表中的任何成员是负数,它就是零,否则它遵循递归关系

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

谢谢

编辑:准确地说,我试图实现本文第6页的递归关系(等式18):


然而,它相当复杂,需要大量的阅读才能理解,所以我不想把它带到问题中去

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

lst = {1, 2, 0, -4};
MemberQ[lst, x_ /; x < 0]
lst={1,2,0,-4};
成员Q[lst,x_/;x<0]
这里的第二个论点是


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

你可以使用条件测试定义函数,这样如果所有元素都是非负的,就可以使用递归关系

 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
布雷特版本

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];
这个应该是真的

testfg2 = RandomInteger[{0, 4}, 10000];
现在要测试:

ff[testfg] // Timing

{0.000016, 0}

ff[testfg1] // Timing

{0.000015, 0}

ff[testfg2] // Timing

{0.000024, 0}
布雷特的版本稍微慢一点,但总体来说是第二快的

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}

以下是另一种方法:

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

什么递归关系?你能把它加到问题上吗?好了。方程式18在给定的论文第6页。我认为这是一个不同于你的问题所暗示的命题,所以我很高兴你发布了它。当然是复杂的;可能是可行的。如果你是对的,很难通过看等式18来理解要做什么。例如,向量mu和θ上有一个和,约束为mu+θ=nu。我假设这意味着\sum{\nu\u1}\sum{\nu\u2}等;但范围是多少?从1到什么?最后一个和中U的下标是什么意思?第I个组件?我认为实现递归关系是另一个question@acl我总是忘记它是可用的(并且从版本1开始就一直可用),即使我一直在使用
?正的
模式。我用第一种方法做,因为我一时忘记了
非负的
会起作用,并且正在尝试使用
备选方案的某种复合
(0 |正)
模式。但是我总是很难让这些类型的模式正常工作。@Verbeia在第7版Brett的方法测试中使用以下数据比第一次测试快20倍:
SeedRandom[1];lst=RandomInteger[{-1,1*^6},{3*^6}]它在您的系统上比较如何?奇怪的是,这个版本比我原始答案中的模式匹配案例快,但不是带有条件的版本。条件模式就是我想要的,谢谢!