![](https://iknow-base.cdn.bcebos.com/lxb/notice.png)
mathematica编程的循环问题
如数组s1={1,2,3,4,5,6,7,8,9,10,11,12,13,14,15,16,17,18,19,20},现要删除2的倍数的数,删除3的倍数的数,,删除5t+...
如数组s1={1,2,3,4,5,6,7,8,9,10,11,12,13,14,15,16,17,18,19,20},现要删除2的倍数的数,删除3的倍数的数,,删除5t+2的数,最后得到s2=={1,5,11,13,19},,怎么编程?象这种分步问题怎么使用"循环"编程?谢谢老师解答!!
展开
3个回答
展开全部
这样:
s1 = {1, 2, 3, 4, 5, 6, 7, 8, 9, 10, 11, 12, 13, 14, 15, 16, 17, 18, 19, 20};
DeleteCases[s1, a_ /; (Mod[a, 2] == 0 || Mod[a, 3] == 0 || Mod[a, 5] == 2)]
还可以这样:
s1 = {1, 2, 3, 4, 5, 6, 7, 8, 9, 10, 11, 12, 13, 14, 15, 16, 17, 18, 19, 20};
Select[s1, Mod[#, 2] != 0 && Mod[#, 3] != 0 && Mod[#, 5] != 2 &]
顺便,进了Mathematica的门,就早点把循环忘掉吧,那不是Mathematica的编程风格。
再顺便,慧河谷同学你要匿名何不把说话风格也改一改,知道上问Mathematica问题的人只有你老师老师的叫(还连续N个问题不采纳)。
追问
可能我没说清楚,我需要的是怎么实现数组的批量输入(不是一个一个地输入).假设有1000个模对应着1000个剩余,怎么批量输入?例如:s=Table[i, {i,2000}];
m=Table[Prime[n+1], {n, 1000}];
r=Table[Prime[n], {n, 1000}];
其中s是一个数组, m是模, r是与m一一对应的余数,怎么得到删除后的结果?谢谢!
追答
……把你之前学到的知识组合在一起不就行了吗。手机不便,你明天还没想出来我再补充。
————
怎么,没想出来吗:
s = Table[i, {i, 2000}];
m = Table[Prime[n + 1], {n, 1000}];
r = Table[Prime[n], {n, 1000}];
rule = Or @@ Thread[Mod[a, m] == r]
DeleteCases[s, a_ /; Evaluate@rule]
rule2[a_] = And @@ Thread[Mod[a, m] != r]
Select[s, rule2]
展开全部
如果在意速度的话,可以用Pick,向量化的操作一般更快
ls = Range[10^5];
Pick[ls, Mod[#, 2] Mod[#, 3] (Mod[#, 5] - 2) &@ls // Unitize, 1] // Timing
ls = Range[10^5];
Pick[ls, Mod[#, 2] Mod[#, 3] (Mod[#, 5] - 2) &@ls // Unitize, 1] // Timing
已赞过
已踩过<
评论
收起
你对这个回答的评价是?
展开全部
楼上正解!这里补充另一个思路^^
针对追问代码如下:
Fold[ Complement, s, Range[ #1, 2000, #2]&@@#&/@ Thread[ { r, m } ] ]
针对追问代码如下:
Fold[ Complement, s, Range[ #1, 2000, #2]&@@#&/@ Thread[ { r, m } ] ]
追问
比较满意,若s是连续数,确实不错,假设s是一个任意数组该怎么写?例如:s={1,5,10,12,14,15,18,20,30,40,50,60,70,80,100},m={2,5,7,11,13},r={0,1,2,,5,10}.谢谢!
已赞过
已踩过<
评论
收起
你对这个回答的评价是?
推荐律师服务:
若未解决您的问题,请您详细描述您的问题,通过百度律临进行免费专业咨询