很多Mathematica的函数,都有Listable属性。而我们的自定义函数,往往没有任何属性。所以,本文介绍一下,怎么查看函数的属性,以及怎么设定自定义函数的属性。
工具/原料
电脑
Mathematica
查看属性
1、用Attributes可以查看内置函数的属性,如Plus函数,有六个属性:{{Flat},{List锾攒揉敫able},{NumericFunction},{OneIdentity},{Orderless},{Protected}}
2、这些属性的含义如下图。
3、其中,比较有趣的是Listable和Order盟敢势袂less。Listable的意思是,Plus可以分别作用于列表的每一个元素,洹彭岣啬而保持列表的结构不变。这在图片处理的时候,有重要意义。比如,给定一个3维列表list:list = {{{9, 9, 5}, {4, 3, 5}, {5, 7, 0}, {7, 7, 5}, {7, 7, 5}, {2, 9,3}}, {{6, 1, 0}, {5, 2, 6}, {6, 9, 5}, {6, 5, 5}, {5, 9, 9}, {6,2, 3}}, {{6, 4, 8}, {4, 6, 2}, {8, 8, 6}, {8, 6, 9}, {5, 8, 9}, {4, 1, 4}}, {{0, 3, 0}, {5, 2, 2}, {7, 0, 5}, {4, 1, 6}, {6, 8, 2}, {4, 3, 5}}, {{7, 0, 1}, {0, 8, 5}, {4, 9, 1}, {5, 5, 2}, {4, 4, 6}, {6, 5, 4}}};这个列表的结构是5*6*3,对应一个5*6的3通道图像。
4、要想对list里面的每个数字,都加上0.6,就可以使用Plus:list0=0.6+list可以验跷高瘴玷证,list0确实是5*6*3的列表:Length[#] & /@ {list0, list0[[1]], list0[[1, 1]]}而对应的图像,大小完全一样,只有颜色变了。
5、Orderless是可交换的意思,就是说,加法满足交换率。
6、而减法只有三个属性:Attributes[Subtract] // Column容易验证,减法不满足交换律。
设定属性
1、先自定义一个函数:f[x_] := If[x >= 0.5, x^2, x^3]此时,可以验证,自定义函数f没有任何特定属性:Attributes[f]
2、然而,我想用这个自定义函数来处理图像,希望f具有listable属性,就需要指定一下:Attributes[f] = {Listable}
3、此时给定一幅图片,如下图。
4、把上图变成图片数据data,再用f来作用于data的每一个元素,得到新的图片数据,转化为图片,结果如下。
5、实际代码如下图。