作业帮 > 数学 > 作业

Mathematica如何使用纯函数筛选元素

来源:学生作业帮 编辑:作业帮 分类:数学作业 时间:2024/05/04 19:28:48
Mathematica如何使用纯函数筛选元素
比如有一个列表{1,2,8,3,9,4,10,5,6,7},我想把8,9,10这三个明显出错(就是和其余元素的趋势不同)的点给去除掉,想用Select函数,在参考资料中心看到Select函数可以用纯函数来定义选取规则,但是范例中规则每次只用到一个元素,比如Select[{1,2,4,7,6,2},# > 2 &]表示把所有大于2的取出来,但如果我想定义一个规则,让所有与前后的数相差超过1的元素(这里是8,9,10这三个元素)给剔除,需要怎么写这个规则?
我的尝试:
test = {1,2,8,3,9,4,10,5,6,7}
criterion=Table[Abs[test[[#1]] - test[[#2]] &[i,i + 1]]
Select 函数不能以直接以索引 True 或 False 的列表来选择元素,函数 Pick 是可以这样使用的.但是有一点是必须注意的就是 在使用 Pick 的时候,"选择" 列具有和数据列相同的长度和结构,也就是你的尝试中,test 和 criterion 的长度必须相同,但你的程序中,test 的长度是 10,而 criterion 的长度却为 9.
下面是我写的完整的代码,仅供参考.
Select[Partition[test, 3, 1, {2, 2}, {test[[-1]], test[[1]]}], 3*#[[2]] - Plus @@ # b
再问: 但是如果criterion的长度变成10(也就是 i 赋值到10)的话,就会出现test[11],但是test只有10个元素。。。。所以我是要人为地再定义最后一个判定条件(比如说最后一个元素是否大于1)嘛。。那这样criterion就相当于分段了,分段的要如何定义?
再答: 其实不需要分段定义的,直接在 criterion 的后面添加一个 判断条件即可,参见下面的语句。 Pick[test, Flatten@{criterion, test[[-1]] > 1}]
再问: 之前那段代码只能勉强理解,但我自己要做一些修改,但改了之后肯定就要报错了……所以说一下真实目的:
测了一组距离的数据,一共15.6万个,细看:(直线是拟合直线,忽略就好了)第一张图里这么粗的图像的原因是测出来的数据每隔几个就会大幅度跳动,我想把这些明显偏差的点去掉,所以你能根据现在的情况把这个criterion再修改一下嘛。。。要是你想要的话,我把悬赏提高一下补偿你来着。。。。。。
再答: 看图好像你的需要保留的数据应该都是集中在 3.0--3.2 之间吧, 你可以试试直接用 Select 函数挑选出在这个区间的坐标。
再问: 第二张图只显示了50个点,所以看上去数据都在3~3.2之间,但其实范围还是很广的,单用Select挑选坐标区间的方法最后效果并不好,所以我还是想采用“去除和前后两个数据点的差值都大于一个数值的数据点”的方法,所以能麻烦你把代码再修改一下嘛。。。我把悬赏又提高了30。。。 另外问个问题,我很想学Mathematica的语言,但自带的帮助里例子不多,讲的也不是很详细,所以想问下你都是在哪里学的来着?
再答:   今天想到了一个纯模式匹配的方法,比较简洁,对于你给的那个例子 test //. {a___, b_, c_, d_, e___} /; c - b > 1 && c - d > 1 -> {a, b, d, e}   然后推广到你的实际数据,你的数据是二元坐标,也就是相邻前后三个元素的纵坐标的差值如果大于某个数的话就剔除掉,假设你的原始数据变量为 zuobiao,阀值为 r 吧,试试下面的, zuobiao //. {a___, b_List, c_List, d_List, e___} /;   Abs[c[[2]] - b[[2]]] > r && Abs[c[[2]] - d[[2]]] > r -> {a, b, d, e}   我只是试验了一些小样本数据,测试基本没问题,不过你的数据量很大,有 15.6 万个,运行速度可能会有点慢,具体效果我也不晓得,但是确实满足你所说的要求。   另外,你所提到的要学习 Mathematica ,你可以到贴吧看看,我在置顶的帖子里分享了一些学习资料,你不妨下载下来看看。