这一篇文章我会讲一下在mathematica中Map函数的思想,并举一个例子,希望大家举一反三。
更新:
对于这个问题还有一种更好的解答,大家可以看下面的评论。
文章目录(Table of Contents)
问题
有一组数,我想将 > 1 的全部变成1, < 1 的全部变成0,应该如何操作。
想法
我们可以先定义一个规则,就是把上面的要求变成一个表达式,如下所示
If[t > 1, 1, 0]
接着,我们可以使用Map
函数将上面的规则应用到数组中的每一个元素中去。于是我们得到了下面的解决方案
当然,我们也可以将上面的式子缩写,写成如下的形式
问题扩展
我们将上面的问题变为:我想将 > 1 的全部变成1, <-1 的全部变成-1,在-1到1之间的变成0,应该如何操作。
其实这个问题的解决办法和上面的是一样的,也是先把规则定义好,在使用Map即可。
作用
我们再来看一个具体的应用场景:比如想要统计一组数组中大于1的元素的个数,那么就可以进行如下的操作。
思路
-
首先将数组中>1的数都变成1,<1的数都变成0
-
对新的数组进行求和
- 这样就统计出一个数组中所有大于1的元素的个数
Clear[rule];
rule[t_] := If[t >= 1, 1, 0]
Total[Map[rule, list]]
或者,上面的也可以变成对一个数组中大于一的元素进行求和,也可以进行如下的操作
-
首先将数组中>1的数都变成1,<1的数都变成0
-
将新的数组与原数组相乘,此时<1的都是0*x,都变成了0,而大于1的不变
- 对新的数组求和,这样就统计出一个数组中所有大于1的元素的和了
Clear[rule];
rule[t_] := If[t >= 1, 1, 0]
Total[Map[rule, list]*list]
- 微信公众号
- 关注微信公众号
- QQ群
- 我们的QQ群号
2017年10月24日 下午4:39 1F
1-UnitStep[1-x]
即可,能用内置的,数学的,列表化的就不要用自己写的If+Map了~
2017年10月25日 下午8:21 B1
@ wjxway 很棒的方法!