先来占一个坑,以后慢慢回答。
首先表明观点,Mathematica有多厉害这个问题底下的东西比别的几个问题高了几百个档次!
例如MATLAB有多厉害这个问题底下的回答我一看的感觉就是:这玩意很厉害么……(例如各种简单的图像处理啦,暴力吹嘘矩阵运算之类的啦,事实上很多时候Mathematica的矩阵比MATLAB快,而且对非规则矩阵等等支持好到不知哪里去了!)
算了,我改一下写的方案,一块一块看到啥写啥,前面代码都不会麻烦,用来展示Mathematica简单代码能完成的大量复杂功能(简单来说就是Mathematica很方便)。后面可能会加一点比较复杂的代码(Mathematica也能很优雅的完成复杂功能!)。
1. 大家感官上最喜欢的:图像处理和数据提取!
Mathematica里面的ComponentMeasurements结合上一大坨方便的图像二值化和处理函数简直超级好用,先给图像变变样子,然后就可以很顺利的提取出图片的各种奇奇怪怪的信息并进行下一步处理。
Example1:流体的波纹提取
原图:
一张普通的黑白图,水流形状还算清晰,但是干扰很多,稍微裁剪并自适应二值化一下:
LocalAdaptiveBinarize[img,30, {1, 1, 0}]
人是能看出来个水流形状的大概了,但是仍然有很多干扰。
稍微再对形状进行内进行处理,大概就是合并一下挨得比较进的条之类的:
Binarize@Blur[%,5]
然后大杀器!!!
dat=ComponentMeasurements[%, {"Orientation", "Centroid", "Length"}, 2000 > #Count > 60 && #Elongation > .6 &]
这个是根据长宽比和大小来筛选所有的独立色块!因为干扰的特点很明显,都是小块或者是圆圆一坨,很容易就被选择的两个特征筛掉了,所以只剩下长条的。
看下效果:
HighlightImage[%%, Arrow[{#2 - Sign[Sin[#1]] {Cos@#1, Sin@#1}*#3/2, #2 + Sign[Sin[#1]] {Cos@#1, Sin@#1}*#3/2}] & @@@ dat[[;; , 2]]]
可以说效果不错,但是这还没完!还可以通过这一坨数据作一张更炫酷的图,然后就可以和理论图对比了~
ListStreamPlot[{#2, Sign[Sin[#1]] {Cos@#1, Sin@#1}*((#2[[1]] - 300)^2 + (#2[[2]] + 200)^2)^(3/2)} & @@@ dat[[;; , 2]], RegionFunction -> Function[{x, y, vx, vy, n},700^2 < (x - 400)^2 + (y + 200)^2 < 1200^2], StreamStyle -> "Dart", StreamColorFunction -> "Rainbow", StreamPoints -> 100, Mesh -> 10, MeshShading -> (Directive[Opacity[.15], ColorData["Rainbow"]@#] & /@ Range[0, 1, .1]), AspectRatio -> Automatic, ImageSize -> Large]
Example2: 莱顿弗洛斯特效应的分析
这个差不多,也是类似的图像处理,没有仔细做,而且比较简单,不过大家可以看着玩玩:
这是一张典型的图片,目标是从一个视频中截取出这个水滴的形状变化并且分析出来振动模式。当然大家都能看出来这个边界比较明显,然后提取边界再稍微处理一下就能得到数据。在Mathematica里这也是一气呵成:
导入:
imgs = Import[NotebookDirectory[] <> "test_1//" <> #] & /@ Import[NotebookDirectory[] <> "test_1"];
图像处理:
makemask[img_Image, radius_Integer: 10, over_: .4] := Image@MaximalBy[ ComponentMeasurements[ LocalAdaptiveBinarize[ GradientFilter[img, radius] // ImageAdjust, radius, {1, over}], {"Mask", "Count"}, #Count > 500 &], Last][[ 1, 2, 1]];
数据提取和分析:
Analysismask[mask_Image, resamplepts_Integer: 500, max_Integer: 10] := Block[{cen, thin}, cen = ComponentMeasurements[FillingTransform@mask, "Centroid"][[1, 2]];(*Centroid of Region*) thin = Interpolation[ DeleteDuplicatesBy[ With[{raw = SortBy[With[{pt = # - cen}, {ArcTan @@ pt, Norm@pt}] & /@ ImageValuePositions[Thinning@mask, 1], First]}, Thread[{raw[[;; , 1]], GaussianFilter[raw[[;; , 2]], 5]}]], First], InterpolationOrder -> 1];(*Thinning the region and get an interpolating function out of the datapoints.*) Thread[{Range[max], Abs@Fourier[Quiet[thin /@ N@Range[-Pi, Pi, 2 Pi/resamplepts]]][[ 2 ;; max + 1]]}](*FOURIER TRANSFORM!!!! Return the AMPLITUTE spectrum, NOT POWER spectrum!!!*) ]
作图:
dat = With[{dat = Analysismask@*makemask /@ imgs}, Transpose[Thread /@ Select[Thread[{Range@Length@dat, dat[[;; , ;; , 2]]}], #[[2, 1]] <= 100 &]]]; ListLinePlot[dat, PlotRange -> {{500, 650}, {0, 300}},PlotLegends -> Range[10]]
我比较懒惰,就没有把这个图做漂亮,不过大家就当看看Mathematica的默认作图效果吧:
能看出来在这个视频中的水滴基本都是六角形,而且还有点椭圆,而且两个的振动频率也都能提取出来,还是蛮方便的。
Example3: 星图的处理~
拿手机也能拍出银河~
某位同学最近在光污染较弱的草原玩过,然后我就请她顺手拿手机拍一张长曝的照片给我,拍照条件:mi5手机,曝光32s(最长了),ISO3200,对焦无穷远(嗯,应该是这个条件)得到了如下图片:
星空果真不错,光污染的确挺小,背景模模糊糊能看见个银河。(我猜这基本是手机的极限了吧,mi5s的IMX378和新的IMX400应该能好些,但是估计也好不到哪里去)
那怎么处理呢?第一步肯定是先对像素处理一下,调一下曝光曲线:
col = ImageData@ColorConvert[img, "LAB"]; result = Image[Thread /@ Thread[{2*Tanh[3 (col[[;; , ;; , 1]] - 0.13)] + 0.4, col[[;; , ;; , 2]], col[[;; , ;; , 3]]}], ColorSpace -> "LAB"]
这一步很简单,PS也行,啥都行。
虽然银河能看见了,但是旁边的星星却很恼人:你们来凑什么热闹!然后就是展示Mathematica神迹的时候:
result1 = Inpaint[result, Dilation[LocalAdaptiveBinarize[result, 8, {1, 1, .2}], DiskMatrix[2]]]
一句话,Bye bye, stars~
星星没了哦,而且毫无违和感好吧!
Example4: 知乎非官方吉祥物——蛤蛤表情的矢量化
前段时间出来了一个很萌的蛤蛤表情包,但是很快就下架了,而且无法互相转存,这就让我很恼火,怎么办呢,让同学发来一遍,然后我截图处理下再重置,效果也还可以。
大概代码就是先RemoveBackground,然后ComponentMeasurements+Trim取图像。
但是我岂能止步于此?原图可是矢量化的诶,这么搞出来是位图,不爽。矢量化这玩意很多软件都有,而且效果都还凑活,但是效果特别好的都要收钱,于是我就要自己做~
Mathematica的内置函数ImageGraphics我觉得效果太烂了,自己在这个基础上来搞一个也并不麻烦:
原图(放大过,为了展示边缘的不清晰):
然后拿出来边界并且稍微拿画图修正一下,例如这样:
再最终矢量化(代码15行左右,有点长,且难看,就不贴了):
虽然有点失真(很难避免啊……可能得加入机器学习等等自动识别各种地方的原版是怎么画的是啥才能更好)但是效果我觉得还好啦~
Example5,6,7,...:
详见http://mathematica.stackexchange.com的ImageProcessing专栏,还有各种奇技淫巧,例如图片换特定物品的颜色,产生特殊风格的图片,等等。随便上两个链接吧:
这是巨神巨贴的集合!Highest Voted 'image-processing' Questions
这些是养眼+有趣的的(可能有些更应该算在下一个部分里?):
How to peel the labels from marmalade jars using Mathematica?
Programmatic approach to HDR photography with Mathematica image processing functions
Changing color of an object in an image
https:// mathematica.stackexchange.com /questions/59620/composition-%c3%a0-la-mondrian
How to ask Mathematica to imitate Andy Warhol's pop-art painting?
Generating stippled (Penrose-style) drawings of surfaces
Image Shadow Removal in Mathematica
2. 绘图(不是图像处理),也比较养眼,所以放上来好了:
今天懒得写了,反正好多,等再闲下来想写了再更新吧。
在Programming Puzzles & Code Golf Stack Exchange上,有人发起了这么一个游戏(popularity contest - Showcase your language one vote at a time ):每个回答者选一种编程语言,先说一点关于这门语言的有趣事实;然后,如果获得N个赞,就可以添上长度从1到N不等的至多N条代码片段(中间可以跳过一些数字)来展示这门语言的各种特性。
目前(北京时间2015年1月28日21时)排在第一位的语言是Mathematica,获得了144个赞,恰好是第二名的两倍,比起Python、MATLAB之类的更是不知高到哪里去了。
这个回答的作者是Martin Büttner。我就搬运一下,顺便翻译一下。原回答是按从长到短排列的,我把它倒了过来,还补上了若干作者已经删掉的代码片段。翻译得不好。欢迎去看原回答,有stackexchange帐号的话可以顺便点个赞。这个问题里其它语言的回答同样精彩。
另外,这里的很多代码片段仅适用于Mathematica 10。
-----
事实
Mathematica可以执行符号操作,所以在处理变量的时候变量不需要有值。
长度为1的代码片段
π
猜猜看?这就是π。它不是用浮点数表示的近似值,它就是π的精确值,因此涉及到π的复变函数和三角函数的运算可以得到精确的结果。
长度为2的代码片段
3x
把两个东西放在一起,就可以做乘法,不需要添加*或者空格,只要能明确识别出一个标识符的结束和另一个标识符的开始。乘法的因数还可以是字符串或者未赋值的变量。
长度为3的代码片段
x-x
只是展示一下“事实”里说的:不需要知道x的值,也能算出结果是0。
长度为4的代码片段
Here
该展示一下Mathematica中各种疯狂的内建函数了。这段代码可以给出你所在的地理位置;比如说,作者的运行结果是GeoPosition[{51.51, -0.09}]。(看来作者在伦敦……)
长度为5的代码片段
Green
Mathematica把颜色作为一种内建类型,还包含了一批预定义的颜色。更好的是,Mathematica会把它显示成一个这种颜色的小方块:
你可以复制这个小方块,把它用在你的代码当中,就像使用别的符号一样。
长度为6的代码片段
23^^H5
让我们回到数学。在Mathematica中,你可以用从2到36的各种不同的进制来输入数字,可以用大写或小写字母,也可以混用。还可以用这种方法来输入浮点数。这里输入是23进制的H5,结果是396。
长度为7的代码片段
9!/43!!
Mathematica中不仅有表示阶乘的运算符(!),还有表示双阶乘的运算符(!!)(n的双阶乘是n*(n-2)*(n-4)*…)。而且,它还支持任意精度的整数,因此43!!可以算出精确值。此外,有理数也会被精确地计算。因此,这里Mathematica不会给出一个浮点数的结果,而是把它约分,最终给出:
128/198893132162463319205625
当然,只要你需要,也可以随时进行浮点数的运算。一般地,如果你的输入不含浮点数,就会得到精确的结果。
长度为8的代码片段
Sunset[]
又一个疯狂的内建函数。不给任何参数的话,这个函数会返回你所在的地方的下一次日落的时间。也可以输入日期和地点作为参数。这是作者当时运行的结果:
长度为9的代码片段
Exp[I*Pi]
到这里还没有做过复数运算。你可以看到,π只是Pi的一个别名。这段代码会返回精确的答案:整数-1。
长度为10的代码片段
f=Exp@*Cos
Mathematica 10中新增了@*这个运算符来表示一个原有的函数:Composition。上面的代码把f定义为Exp和Cos的复合:先将Cos作用于参数,然后将Exp作用于其结果。因此f[Pi]会返回1/E。Mathematica 10中还有/*这个运算符,表示的是RightComposition,它先应用的是左边的函数,比如说Cos/*Exp就相当于Exp@*Cos。
长度为11的代码片段
Tuples[l,n]
来点组合数学。这段代码会给出以列表l中的元素为元素的所有n元组。比如说,如果l是{1, 2, 3},n是2,你就会得到:
{{1, 1}, {1, 2}, {1, 3}, {2, 1}, {2, 2}, {2, 3}, {3, 1}, {3, 2}, {3, 3}}
长度为12的代码片段
D[x^y^x,x,y]
偏微分。D会给出第一个参数(某个表达式)对于后面的参数的偏导数,结果以符号表达式的形式给出。所以上面的代码的意思是∂²(x^y^x)/∂x∂y,Mathematica算出来是:
x^y^x (y^(-1 + x) + y^(-1 + x) Log[x] + x y^(-1 + x) Log[x] Log[y]) + x^(1 + y^x) y^(-1 + x) Log[x] (y^x/x + y^x Log[x] Log[y])
长度为13的代码片段
l~Riffle~" "
首先,这里展示了另一种调用双参数的函数的方式:x~f~y是f[x, y]的中缀表达式。其次,Riffle是一个相当使用的函数,它以一个列表和一个值作为参数,然后在那个列表每相邻两个元素间插入那个值。比如说,上面的例子会在l的每相邻两个元素间插入一个" "。
长度为14的代码片段
Prime~Array~9
这是构造列表的一种方式。Array会对从1到它的第二个参数的每一个整数调用它的第一个参数(本身也是个函数)。上面的例子会给出前9个素数的列表:
{2, 3, 5, 7, 11, 13, 17, 19, 23}
长度为15的代码片段
{##4,#,#2,#3}&
这里展示了两个更强大的特性。这整个东西是一个未命名的纯函数。类似于Python中的lambda和Ruby中的Procs。纯函数以&结尾。&这个运算符的优先级非常低,因此往往会把左边的一切东西包含进去。纯函数的参数用#来表示,有时候会在#后面添上别的东西。第一个参数是#或者#1,第二个参数是#2,以此类推。
另一个特性是Sequence(序列)。它类似于某些语言中的*。你可以把它理解为两边的括弧的列表——它只是一序列的值,可以用在列表或函数的参数中。##表示纯函数的全部参数的序列,##2则表示纯函数的从第二个开始的参数的序列。所以,如果我们把上面的例子中的纯函数命名为f,那么,
f[1,2,3,4,5]
的结果会是
{4,5,1,2,3}
所以这个函数只是把左边的三个参数挪到右边。注意这里##4表示的是序列4, 5,并且被压平到列表当中。
长度为16的代码片段
Partition[l,2,1]
Partition是一个非常实用的处理列表的函数,它有一大堆的重载。上面是作者最常用的一种形式。它会给出列表l的所以长度为2的子列表(这里的1使得子列表互相交叠)。如果l是{1, 2, 3},你会得到
{{1, 2}, {2, 3}, {3, 4}}
长度为17的代码片段
Plot[x^x,{x,0,2}]
终于有足够的字符数可以画图了。这只是绘制一维图表的一个最简单的例子。后面还会展示一些更加酷炫的图表。
长度为18的代码片段
PetersenGraph[7,2]
Mathematica 8引进了图这个内建类型,随之而来的是一大批图论方面的函数。如果它没有这么多内建函数,它就不是Mathematica了。上面的代码生成了一个广义的佩特森图。Mathematica生成的事实上是一个可以进行各种操作的数据结构,但显示出来的就是一幅……图:
长度为19的代码片段
MandelbrotSetPlot[]
嗯……非常“有用”的函数……有时,他们支持各种可能的计算的意愿走得有点太远了……
其实这函数比这个要更有用一些:可以指定作图的区域。
长度为20的代码片段
"Sun"~StarData~"Age"
回到内建的数据。Mathematica中有一大批以Data结尾的函数,包含了任何你可能想到的数据。使用这些函数的时候,你只需要输入你想要查找数据的东西,和你想要检索的属性。上面只是一个最短的例子,Sun、Star和Age都很短,因为作者等不及要展示这一特性。
从第9版开始,Mathematica支持带单位的量。上面的例子算出来是:
Quantity[4.57*10^9, "Years"]
在Mathematica中显示成:
长度为21的代码片段
Integrate[E^(-x^2),x]
前面展示过了微分。现在该展示积分了。Mathematica能计算定积分和不定积分。Integrate会给你一个精确的解,它能处理很多种不同的积分;NIntegrate则会给出数值解。如果你学过微积分,你会记得上面的高斯积分并没有解析解,除非把误差函数也当作是解析解。Mathematica返回的是:
1/2 Sqrt[π] Erf[x]
长度为22的代码片段
30~ElementData~"Color"
又一个内建的以Data结尾的函数。对于化学元素,你不仅可以得到原子序数、熔点、名字之类的东西,还可以得到它在室温下的颜色。上面的代码给出了锌的颜色:
SlateGray
长度为23的代码片段
Rotate[Rectangle, Pi/2]
嘿嘿。你以为你知道这段代码干的是什么,其实你不知道。Rectangle本身只是一个函数的名字。要真正地得到一个长方形,你必须调用这个函数,给它一些参数。所以这段代码是在干什么呢?其实:
长度为24的代码片段
Series[ArcSin@x,{x,0,9}]
又一个有趣的功能。Mathematica能够求出一个函数在任意点处的泰勒展开。上面的例子给出的是反正弦函数在0处的直到9次的泰勒展开:
SeriesData[x, 0, {1, 0, Rational[1, 6], 0, Rational[3, 40], 0, Rational[5, 112], 0, Rational[35, 1152]}, 1, 10, 1]
显示为:
长度为25的代码片段
{{1,5},{2,3},{7,4}}.{8,9}
终于有足够的字数可以展示向量的运算了。上面的代码展示了一个2x3的矩阵乘以一个2维的列向量:
{53, 43, 92}
长度为26的代码片段
PolarPlot[Sin[5θ],{θ,0,π}]
又一个有趣的绘图功能。PolarPlot绘制的是极坐标下的图像。你需要的是对每个θ给出一个r,而不是对每个x给出一个y。
长度为27的代码片段
CountryData["ITA", "Shape"]
又一个Data。CountryData是一个相当强大的函数。获取国家的形状仅仅是其功能的冰山一角。关于国家的数据太多了,你可以为这个函数写一本书。比如说,有一个数据叫FemaleLiteracyFraction。你甚至可以查询不同时间的数据。完整的列表见Mathematica参考资料中心。
长度为28的代码片段
Graphics3D@{Sphere[],Cone[]}
该是三维的图像了。这是绘制的是重叠起来的默认参数下的一个球面和一个圆锥,看起来像一个水晶球:
在Mathematica中,你可以点击并拖动来旋转这个图形。
长度为29的代码片段
Piecewise[{{13+2x^2,x>0}},13]
Piecewice让你可以定义在不同区域有不同定义的函数。它显示出来就跟标准的数学表达式一样:
作为展示,如果绘制它从-5到5的图像,你会得到:
长度为30的代码片段
FourierTransform[E^(-x^2),x,k]
跟别的东西一样,只要可能的话,傅立叶变换算出来也是精确解:
E^(-(k^2/4))/Sqrt[2]
长度为31的代码片段
Permutations[{1,1,2,3,3,4},{3}]
再来一点组合数学。这段代码给出了由这个列表的元素组成的所有3个元素的组合。即使列表中的元素有重复,给出的组合也不会重复:
{{1, 1, 1}, {1, 1, 3}, {1, 1, 4}, {1, 3, 1}, {1, 3, 3}, {1, 3, 4}, {1, 4, 1}, {1, 4, 3}, {3, 1, 1}, {3, 1, 3}, {3, 1, 4}, {3, 3, 1}, {3, 3, 4}, {3, 4, 1}, {3, 4, 3}, {4, 1, 1}, {4, 1, 3}, {4, 3, 1}, {4, 3, 3}}
长度为32的代码片段
NumberLinePlot[x^2<2^x,{x,-2,5}]
一个不太寻常的绘图。它可以在数轴上绘制一系列不同的东西,比如说点和区间。你还可以给出一个条件,它会绘制出使条件成立的区域:
这里的箭头表示这个区域会延伸到无穷大,空心的圈圈则表示这是开区间。如果是闭区间,圈圈会变成实心。
长度为33的代码片段
ExampleData[{"TestImage","Lena"}]
Mathematica包含了一系列的范例数据,从图片、纹理、声音片段到3D模型(比如说犹他茶壶)。Lena的名字相当短,也还算出名,所以作者选择了她:
长度为34的代码片段
Solve[a*x^4+b*x^3+c*x^2+d*x==0, x]
Mathematica可以用来解方程,或者方程组。和往常一样,给出的也是符号解:
{ {x -> 0}, {x -> -(b/(3 a)) - (2^(1/3) (-b^2 + 3 a c))/(3 a (-2 b^3 + 9 a b c - 27 a^2 d + Sqrt[4 (-b^2 + 3 a c)^3 + (-2 b^3 + 9 a b c - 27 a^2 d)^2])^(1/3)) + (-2 b^3 + 9 a b c - 27 a^2 d + Sqrt[4 (-b^2 + 3 a c)^3 + (-2 b^3 + 9 a b c - 27 a^2 d)^2])^(1/3)/(3 2^(1/3) a)}, {x -> -(b/(3 a)) + ((1 + I Sqrt[3]) (-b^2 + 3 a c))/(3 2^(2/3) a (-2 b^3 + 9 a b c - 27 a^2 d + Sqrt[4 (-b^2 + 3 a c)^3 + (-2 b^3 + 9 a b c - 27 a^2 d)^2])^(1/3)) - ((1 - I Sqrt[3]) (-2 b^3 + 9 a b c - 27 a^2 d + Sqrt[4 (-b^2 + 3 a c)^3 + (-2 b^3 + 9 a b c - 27 a^2 d)^2])^(1/3))/(6 2^(1/3) a)}, {x -> -(b/(3 a)) + ((1 - I Sqrt[3]) (-b^2 + 3 a c))/(3 2^(2/3) a (-2 b^3 + 9 a b c - 27 a^2 d + Sqrt[4 (-b^2 + 3 a c)^3 + (-2 b^3 + 9 a b c - 27 a^2 d)^2])^(1/3)) - ((1 + I Sqrt[3]) (-2 b^3 + 9 a b c - 27 a^2 d + Sqrt[4 (-b^2 + 3 a c)^3 + (-2 b^3 + 9 a b c - 27 a^2 d)^2])^(1/3))/( 6 2^(1/3) a)} }
注意解是以规则的形式给出。后面可能会有关于规则的更具体的例子。
长度为35的代码片段
StreamPlot[{x^2,y},{x,0,3},{y,0,3}]
一个非常漂亮的绘图,绘制的是一个二维向量场的流线。类似于常规的向量图,它的每一个箭头都相切于向量场;不过,箭头不是按固定的点阵来排列,而是首尾相接连成流线。如果这个向量场是流体的速度场,这些线就是流体中粒子的轨迹(我觉得作者这里说得并不准确……)。上面的例子的输出为:
长度为36的代码片段
f[1]=1 f[2]=1 f[n_]:=f[n-1] + f[n-2]
又该展示新的语言特性了。Mathematica中有几个定义函数方面的好处。首先,你可以给一个函数名提供不同的定义,只要参数的数量或类型不同。你可以用模式来描述参数的类别。而且,你还可为给单独的值添加定义。调用函数的时候,Mathematica会自动选取最特殊的定义;如果没有符合的定义,则会不进行任何计算。这使得可以以更自然的方式来定义递归函数,而不必用If来在不同情况间切换。
另一点要注意的是这里同时用到了=和:=。不同之处在于=的右边只是在定义的时候计算一次,而:=的右边则是在每次调用的时候计算。其实在定义变量的时候也可以用:=,这时变量就会有动态的值。
因此上面定义的就是斐波那契数列。不过这是一个非常低效的定义,在作者的电脑上计算前30个数就画了4秒。在后面我们会看到,只要稍作改进,甚至不用改掉递归,便能大大提高其性能。
长度为37的代码片段
l//.{a___,x_,b___,x_,c___}:>{a,x,b,c}
上一个代码片段中提到了模式。模式常被用在规则中,规则则常用于修改匹配某一模式的结构。让我们来看看这个代码片段。
{a___,x_,b___,x_,c___}:>{a,x,b,c}是一个规则。x后面跟着一个下划线(x_)是一个模式,它可以代表任意的值(这个值本身也可以是一个列表或者类似的东西)。a___则是一个序列模式(参见长度为15的代码片段),它可以代表长度为0或者更长的序列。这里x_出现了两次,说明其代表的是相同的值。因此,整个模式{a___,x_,b___,x_,c___}匹配的是一个有重复元素的列表,两个x代表的是重复的元素,a、b和c代表的是围绕这两个元素的序列。根据规则,它被替换为{a,x,b,c},也就是去掉了第二个x。
//.会重复地执行一个规则,直到找不到可以匹配这个模式的结构。因此,上面的代码会去掉列表l中所有重复的元素。不过,它的功能并不仅限于此://.会在任何层次上运用规则,因此如果l中的某个元素也是列表,这个列表中重复的元素也会被去掉。
长度为38的代码片段
RegionPlot[x^y>2&&y<x,{x,0,3},{y,0,3}]
又回到绘图。它绘制的是是条件成立的二维区域。当你想绘制一个不以显式表示区域的话,这个函数非常有用。上面的代码画出来是:
长度为39的代码片段
f[1]=1 f[2]=1 f[n_]:=f[n]=f[n-1]+f[n-2]
前面说过要把斐波那契数列的定义改得更高效。这段代码展示了menmoization在Mathematica中是多么平凡。这里唯一的改动就是在第三行增加一个f[n]=。这样,每次f计算一个新的值,比如说f[3]的时候,执行了f[3]=f[3-1]+f[3-2]。这计算了f[2]+f[1],然后把结果赋值给f[3](注意这里用的是=而非:=)。因此,每次调用f计算一个没计算过的值的时候,它就会为这个值添加一条新的定义;这一定义显然比一般的定义更特殊,因此在再次计算这个值的时候就会直接使用这个定义。
在长度为36的代码片段中,计算前30个斐波那契数画了4秒;而这里计算前300000个只需要3秒(请勿在内存太小的计算机上尝试)。
长度为40的代码片段
SortBy[PlanetData[#, "EscapeVelocity"]&]
和你预料的一样,SortBy的功能是根据一个列表中每个元素应用某个给定的函数的结果来给列表排序。不过等等,这里调用SortBy的时候并没有给它一个列表!其实,在Mathematica 10中,某些函数开始支持柯里化和部分应用。与某些纯函数式的语言不同,这不是一个语言特性,只是一批特定的函数的功能。上面这段代码返回的是一个新的函数,这个函数仅仅以一个列表为参数,并且根据前面给定的函数来为这个列表排序。当你在代码中要多次用到同一个排序规则的时候,这个用法会非常有用。
另外,这里又出现了一个Data。这是根据逃逸速度来给行星的名字排序。
长度为41的代码片段
Thread[{"foo","bar","hm"}<>{"a","b","c"}]
差点忘了Thread。如果你有两个长度相同的列表,想对位置相应的每一对元素进行某个操作。当然,你可以对列表长度进行迭代;也可以连接两个列表,转置这个矩阵,然后对每对元素进行操作。不过Thread让这一切变得更加简单。大致上,它就是把最顶层的Head(函数或类型)往下“推”一层。所以上面的代码算出来是:
{"foo"<>"a","bar"<>"b","hm"<>"c"}
而<>表示字符串的连接,因此最终的结果是:
{"fooa","barb","hmc"}
Thread这个函数非常实用。比如,如果你有一组“左边”和一组“右边”,可以用它来生成一个方程组。
长度为42的代码片段
Animate[Plot[Sin[t-x],{x,0,10}], {t,0,10}]
在Mathematica中,让东西动起来很简单,它们甚至不必是图像。你只要给出一个在每帧进行计算的表达式,以及随帧数变化的变量。上面的代码会生成一个正弦波的动画,看起来就像下面这个gif一样(啊,知乎不支持动图?那我贴图片地址好了:http://i.stack.imgur.com/EOPuu.gif):
长度为43的代码片段
HighlightGraph[graph,FindVertexCover@graph]
前面提到过图。Mathematica中有大量常用的图论方面的功能,除了解决各种图论问题的函数外,还有漂亮的可视化工具。例如上面的代码,对于给定的图graph,找出一个顶点数最小的顶点覆盖,并且将图中的这些顶点突出显示。例如,如果graph是长度为18的代码片段中的PetersenGraph[7,2]的话,会得到:
长度为44的代码片段
ArrayPlot@CellularAutomaton[110,{{1},0},100]
终于有足够多的字数来用上CellularAutomaton这个函数并画出其结果了。据作者所知,这是Mathematica中唯一一个关于元胞自动机的函数。但Stephen Wolfram似乎认为自己是元胞自动机领域的第一人,因此这个函数尤其强大。这里展示的只是它最简单的用法。它模拟的是一个一维元胞自动机的前100步,事实上它返回的是每一步的状态,因此结果是一个二维的数组。函数的第一个参数是元胞自动机的规则,可以用一个列表来详细地指定,也可以只用一个简单的数字编码。在这个例子中,作者选择了著名的图灵完备元胞自动机,Rule 110。{{1},0}定义了初始条件:单独的一个1,以及作为背景的0。在后面会展示CellularAutomaton的更多特性:它可以模拟更高维数、更大邻域、更多状态的元胞自动机。
ArrayPlot是又一个绘图的工具,用于绘制二维数组,以不同颜色的方块表示数组中不同的值。在最简单的情形下,0对应于白色,1对应于黑色。这段代码的运行结果是:
长度为45的代码片段
EdgeDetect@ExampleData@{"TestImage","Splash"}
然后是图像处理。Mathematica包含了一系列的范例数据,包括图像(例如Lena)、纹理、3D模型和声音片段。我们首先加载其中一个范例图像:
想要查找边缘?只要调用一个函数!
长度为48的代码片段
Import["http://www.google.com/doodles","Images"]
Import是一个相当强大的命令。它既可以导入磁盘中的文件,也可以下载网上的文件。它懂得很多种不同的文件格式,还可以从其中的一些(例如HTML)直接提取数据。上面的代码会下载Google Doodle页面的所有图片。
长度为52的代码片段
Manipulate[Plot[x^2a+x*b,{x,-3,3}],{a,.1,3},{b,0,3}]
这个相当好玩。你给Manipulate函数任意一个表达式,它会通过一组变量来把这个表达式参数化,然后返回一个小部件,让你可以调整这些参数,并实时地看到表达式怎样随参数的变化而变化。 这里的表达式可以是某种图表。如果你要在讲座中用Mathematica演示一组解怎样随参数的变化而变化,Manipulate会特别有用。上面的代码展示了抛物线如何随系数a和b的变化而缩放和平移。
长度为59的代码片段
SphericalPlot3D[Re[Sin[θ]Cos[θ]Exp[2I*φ]],{θ,0,π},{φ,0,2π}]
还记得长度为29的代码片段里的极坐标绘图吗?我们还可以在三维中干类似的事情。事实上,Mathematica中有两个相关的函数:用于柱面坐标的RevolutionPlot3D和用于球面坐标的SphericalPlot3D。和Graphics3D一样,Mathematica中所有的三维绘图都可以自动旋转,因此你无须为寻找一个好的角度而烦恼。上面的代码绘制的是一个类似于球谐函数的东西。
长度为64的代码片段
CellularAutomaton[{224,{2,{{2,2,2},{2,1,2},{2,2,2}}},{1,1}},i,n]
之前说过会为大家展示更多CellularAutomaton的魔法。这一代码片段计算了康威生命游戏在初始条件i下的前n步,并返回中间每一步的结果。
关于函数参数的一点说明:2是细胞状态的数量。{{2,2,2},{2,1,2},{2,2,2}}为3x3邻域中的9个细胞加权,这确保了细胞本身的状态与其周围8个细胞之和有所区分。{1,1}指的是这个元胞自动机规则取决于两个方向上距离不超过一格的细胞。最后,224是这个元胞自动机规则的数字编码。算出这个数字并不是一件容易的事情,不过Mathematica的文档里有一份还不错的教程。更复杂的元胞自动机往往不会使用数字编码,因为这个数字会特别大。后面会有相关的例子。
总之,如果令i为一个随机的点阵,n为200,用ArrayPlot绘制出结果并制成动画,就是这个样子:
(动图,图片地址:http://i.stack.imgur.com/ny4Fw.gif)
长度为69的代码片段
DSolve[r^2*R''[r]+2r*R'[r]-R[r]==0&&(R[r]==1&&R'[r]==2/.r->1),R[r],r]
回到实用的功能。除了一般的方程组,Mathematica还能解微分方程组。这个例子中的严格说来只是一个微分方程的边值问题, 不过你可以把它当成由3条方程组成的方程组来提交给DSolve。就像积分一样,DSolve用来求精确解,NDSolve则用来求数值解。上面的方程解出来是:
{{R[r] -> 1/2 r^(-(1/2) - Sqrt[5]/2) (1 - Sqrt[5] + r^Sqrt[5] + Sqrt[5] r^Sqrt[5])}}
你可以用它来进行进一步的计算或绘图。
长度为81的代码片段
CellularAutomaton[{{0,2,3,If[0<Count[#,1,2]<3,1,3]}[[#[[2,2]]+1]]&,{},{1,1}},i,n]
这是最后一个元胞自动机的例子。这是一种叫Wireworld的元胞自动机。这次不再将规则编码成一个简单的数字,一来是因为这个数字很可能会大得离谱(作者懒得把它算出来),二来是为了展示CellularAutomaton的另一种用法。这次的规则用一个纯函数来指定,这个函数接收一个细胞的邻域的状态并返回这个细胞的新状态。对于超过两种颜色/状态的元胞自动机,这是更可行的用法。
总之,下图中的i用的维基百科里的例子(两个时钟发生器和一个异或门),并让它走了50步:
(动图,图片地址:http://i.stack.imgur.com/yMhPe.gif)
事实上,这里的绘图和动画可以用一个长度为77的代码片段来完成:
ListAnimate[ArrayPlot[#,ColorRules->{0->Black,1->Blue,2->Red,3->Yellow}]&/@w]
长度为100的代码片段
GeoGraphics[{GeoStyling[Opacity[0.5]], NightHemisphere[]}, GeoBackground -> GeoStyling["ReliefMap"]]
作者一直想着以某些漂亮的Geo函数作为长度为100的代码片段,但最终在Tweet-a-Program上找到了一个漂亮的例子,因此只需要把它偷过来。上面的代码生成了一幅展示当前地球上能被太阳找到的地方的地图。它在一个浮雕地图上为夜半球覆盖上了一层半透明的阴影。
长度为143和144的代码片段
(感谢评论中 @公孙立夏 的翻译)
最后这一刻我等了好久,有些迫不及待了。我之前提到Mathematica可以求方程的数值解,也可以解微分方程。现在我想举一个很有价值的例子。
假设在一杆上的双摆问题(即两个单摆连在一起),并且每个杆都是单位长度。每个单摆都是单位质量。在此,我也用到单位重力来缩短公式。下面143个字符的代码片段解出了这个系统运动所遵循的拉格朗日方程(未知参量为单摆的角度和角动量)。更详细的戳这里,当然,如果你熟悉拉格朗日理论的话,这只是个很简单的练习。
代码很难读,是为了这143字符的长度
d=θ@t-φ@t;NDSolve[{#''@t==-#4#2''[t]Cos@d-##3#2'@t^2Sin@d-Sin@#@t&@@@{{θ,φ,1,.5},{φ,θ,-1,1}},θ@0==2,φ@0==1,θ'@t==φ'@t==0/.t->0},{θ,φ},{t,0,60}]
Mathematica立即给出了一个非常整齐的答案,用缩略图像展示了方程的解:
但上述结果有些生硬,我们想知道双摆的运动实际是什么样子的。因此,我写了这个144个字符的代码片段,它动态展示了双摆的运动和位于下部的单摆运动的轨迹。
Graphics@{Line@{{0,0},p=θ~(h={Sin@#@#2,-Cos@#@#2}&)~t,p+φ~h~t},White,{0,0}~Circle~2.2}~Show~ParametricPlot[θ~h~u+φ~h~u,{u,0,t}]~Animate~{t,0,60}
结果如图:(动图,图片地址:http://i.stack.imgur.com/3WS9q.gif)
PS:我不得不作点弊:如果画图超过t=30,ParametricPlot将会画很少的点,并且线条将会变成锯齿状。但有趣的动力学刚好发生在这个时
间后,因此我用了这个选项PlotPoints -> 200 来使下半部分的运动更顺滑。没什么实质的区别,而且上半部分会看不出什么不同。
(译者注:如果要尝试运行这两段代码,在运行143之后,144之前,应该要加一个{θ, φ} = {θ, φ} /. %[[1]] 。作者省去了这一步。)
---
以上是全文。
最后,有兴趣的可以关注一下我的这个收藏夹,专门收集Mathematica在知乎里的各种奇妙应用:Mathematica - 收藏夹
最近一直在黑 Matlab ,这次不了,人总要有点追求,黑一下 Photoshop 吧。
1. 图形扭曲
PhotoShop 的图像变形、扭曲的功能非常强大,我辈也经常使用,可有些奇怪的用法,Photoshop也做不到,只能依赖我大 Mathematica。近日我想把一个圆形图片变成一个环形图片,其要求外面精密,内里宽松,Phtoshop 无法做到。更何况我对其扭曲程度的要求是用函数表示的:
变出来是这样的:
Mathematica 只需要如下之代码即可:
ImTrans[{x_, y_}, r0_, R0_, Rp_, c_] := Module[{z = N[x + I y - c]}, {Re[((Rp - r0) Sqrt[Abs[z]/R0] + r0) z/Abs[z] + c], Im[((Rp - r0) Sqrt[Abs[z]/R0] + r0) z/Abs[z] + c]}]
2. 匹配两图的配色
Photoshop 也有这个功能,不过这里用 Mathematica 来做:
3. 绘制分子三维空间填充分子图:
ChemicalData["Caffeine", "SpaceFillingMoleculePlot"]
4. 图像自动拼接:
5. 用图片制作配色卡:
我拿来玩比较多……正经计算少,已经完全不是编程、计算工具类。
首先,绘图。
以前用数学函数 plot 坐标轴 绘制的皮卡丘。
那么我们就可以依据这个特征来制作动画。
有屏幕的地方就有东方Project的Bad apple。
视频点击
http://www. acfun.tv/v/ac1709546然后我们来玩下乐器演奏功能。
mathematica里面内置了估计又100种左右的音色,具体请自行查找关于SoundNote的信息。
另外还不止这些,它除了可以输出超低音C-1到高音B9,还可以输出半音那种东西,像上面写的C#,Cb这些,所以只要稍微有点了解音乐乐谱和mathematica的话,就可以拿它来演出音乐了~
为了方便后面的演奏,我们需要写个简单的函数先,可以输出从指定的一个音,比如说C4,往上数或者往下数n个音的那个音符,比如C4+7=C5,C4+1=D4,C4-1=B3这种:
Letter2Num[letter_] := Switch[ToUpperCase[letter], "C", 1, "D", 2, "E", 3, "F", 4, "G", 5, "A", 6, "B", 7]; Number2Letter[num_] := Switch[num, 1, "C", 2, "D", 3, "E", 4, "F", 5, "G", 6, "A", 7, "B"]; GetTone[base_, idx_] := Module[{tone = Characters[base][[1]], step = Characters[base][[2]]}, Number2Letter[Mod[Letter2Num[tone] - 1 + Mod[idx, 7], 7] + 1] <> ToString[ToExpression[step] + Floor[idx/7]]]
实践测试《一闪一闪亮晶晶》
GetMusicSingleTone[i_] := Module[{}, If[i == 0, Play[0, {t, 0, 1}], SoundNote[GetTone["C4", i], 1]]]; (*一闪一闪亮晶晶*) xingxing = Flatten[Riffle[{ IntegerDigits[1155665], IntegerDigits[4433221], IntegerDigits[5544332], IntegerDigits[5544332], IntegerDigits[11556654433221] }, 0]]; Sound[Table[GetMusicSingleTone[#[[i]]], {i, 1, Length[#]}], 20] &[xingxing]
第一人称视角模拟游戏
Mathematica 3D 视角 http://v.youku.com/v_show/id_XNzMzMDgxNDQ4.html这是一个叫Vespa的博主做的一个游戏。他是浙大研究生,印象中是图像处理跟微波光子学专业的,恩,也是跟我一样拿Mathematica当玩具玩的,不过他玩得溜。
Mma设置3D视角有很多参数,他只用两个:ViewVector和ViewAngle。
前者可以指定两个点,表示视角是站在A点往B点方向看过去。
后者是模拟相机的半角,可以直接理解成视角大小,效果上等价于缩放;因为我们绘图的窗口是恒定大小的,现在看的位置和方向也指定好了,那么这个角度越小,说明显示在绘图窗口的东西只是在3D世界中很小的一点,但是这一点却要放满整个窗口(我们的眼睛),换言之我们可以看到更多细节,也就是放大效果;【其实这个跟我们想模拟的没什么关联,毕竟跑酷运动员眼睛是不可能任意改变视野角度的是吧,但是Mma比较烦一点就是,你不设置这个,它就自己“自适应”地变化,无奈之下只好手动把这个参数定死】。
代码:
https:// github.com/Vespa314/Mat hematica3DRun2048游戏
2D版本
http:// blog.wolfram.com/2014/0 5/09/2048/3D版本
Poor performance from Graphics3D下载:
百度盘
http:// pan.baidu.com/s/1gdGNnC f360云盘
http:// yunpan.cn/cKxn6p6nQZScY(提取码:ffd7)
迅雷快传
http:// kuai.xunlei.com/d/yKEuA AIBLgClJMtUf8a推箱子游戏
下载链接:
百度盘
http:// pan.baidu.com/s/1hqipo6 C360云盘
http:// yunpan.cn/cKxnRtGNsIknL(提取码:497d)
迅雷快传
http:// kuai.xunlei.com/d/yKEuA AL-LQCSJMtUb66解24点游戏
Poke24[nums_] := Module[{toExprs, expand, next, exprs}, toExprs[x_, y_] := "(" <> # <> ")" & /@ Flatten[{x <> # <> y, y <> # <> x} & /@ {"+", "-", "*", "/"}]; expand[set_] := Flatten[ Function[sub, Append[Complement[set, sub], #] & /@ toExprs @@ sub] /@ Subsets[set, {2}], 1]; next[sets_] := Flatten[expand /@ sets, 1]; exprs = Flatten[Nest[next, {ToString /@ nums}, Length[nums] - 1]]; Select[DeleteDuplicates[exprs], Quiet[ToExpression[#] == 24] &]] In[2] := Poke24[{3, 4, 5, 7}] Out[2] := {((3*4)+(5+7)),((5+7)+(3*4)),((3*4)+(7+5)),((7+5)+(3*4)),((3*4)*(7-5)),((7-5)*(3*4)),(7+(5+(3*4))),((5+(3*4))+7),(7+((3*4)+5)),(((3*4)+5)+7),(5+(7+(3*4))),((7+(3*4))+5),(5+((3*4)+7)),(((3*4)+7)+5),((4*3)+(5+7)),((5+7)+(4*3)),((4*3)+(7+5)),((7+5)+(4*3)),((4*3)*(7-5)),((7-5)*(4*3)),(7+(5+(4*3))),((5+(4*3))+7),(7+((4*3)+5)),(((4*3)+5)+7),(5+(7+(4*3))),((7+(4*3))+5),(5+((4*3)+7)),(((4*3)+7)+5),((3+5)*(7-4)),((7-4)*(3+5)),((5+3)*(7-4)),((7-4)*(5+3)),((4*5)-(3-7)),((5*4)-(3-7)),(4-(5*(3-7))),(4-((3-7)*5)),((7-3)+(4*5)),((4*5)+(7-3)),((7-3)+(5*4)),((5*4)+(7-3)),(4+(5*(7-3))),((5*(7-3))+4),(4+((7-3)*5)),(((7-3)*5)+4),(3*(7-(4-5))),((7-(4-5))*3),(3*(7+(5-4))),((7+(5-4))*3),(3*((5-4)+7)),(((5-4)+7)*3),(7-(3-(4*5))),(7+((4*5)-3)),(((4*5)-3)+7),((7+(4*5))-3),(((4*5)+7)-3),(7-(3-(5*4))),(7+((5*4)-3)),(((5*4)-3)+7),((7+(5*4))-3),(((5*4)+7)-3),(3*(5-(4-7))),((5-(4-7))*3),(3*(5+(7-4))),((5+(7-4))*3),(3*((7-4)+5)),(((7-4)+5)*3),(3*((5+7)-4)),(((5+7)-4)*3),(3*((7+5)-4)),(((7+5)-4)*3),(4*(3*(7-5))),((3*(7-5))*4),(4*((7-5)*3)),(((7-5)*3)*4),(3*(4*(7-5))),((4*(7-5))*3),(3*((7-5)*4)),(((7-5)*4)*3)}
甚至更复杂的创建符号数学所支持的计算机动画
游戏《模拟城市3000》(SimCity 3000)就有利用 Mathematica 实时生成数学上正确的道路网。
图片去水印
调用Mathematica的Inpaint函数,Mma语法支持直接把图片当做参数直接传进去。
抓取相册图片
调用变量XMLElement,结构化源文件。也是Vespa写的API。
DownLoadDouBan[CurPage_, URL_] := Block[{st, PicAddress, rawpic, NextPage}, (*Print[URL];*) (*读取源文件*) st = Import[URL, "XMLObject"]; (*获取图片URL*) PicAddress = Cases[st, XMLElement["li", {___, "data-id" -> ___, ___}, {___, XMLElement["div", {"class" -> "cover"}, {___, XMLElement["a", {"shape" -> "rect", "href" -> ___}, {___, XMLElement["img", {"src" -> src_}, {}], ___} ], ___} ], ___}] :> src, {0, Infinity}]; (*转成大图URL*) rawpic = StringReplace[#, "thumb" -> "raw"] & /@ PicAddress; Print[rawpic]; (*输出*) Export["e://" <> StringSplit[#, "/"][[-1]], Import[#]] & /@ rawpic; NextPage = Cases[st, XMLElement[ "a", {___, "href" -> src_, ___}, {ToString[CurPage + 1]}] :> src, {0, Infinity}]; If[Length[NextPage] != 0, DownLoadDouBan[CurPage + 1, NextPage[[1]]], Return] ]
统计字母频率, 加密、破解字母频率密码
调用DictionaryLookup函数,它可以返回各门语言的单词,还可以根据正则表达式之类的输入来搜索单词,想要找出字母组成的单词代码如下。
获取所有单词的信息,代码和结果
把上面的结果以列表的形式显示出来,对每个字母出现的频率排序。
寻找最相似的汉字
这个是顾森(Matrix67)的博客看到的,嗯,还是要吐槽下这数学达人是北京大学中文系应用语言学……
调用函数Rasterize,以图片的格式输出运算结果。比如,下面这个句子可以打印出 (x+1)^n 的展开式的“倒影”:
可以利用这个函数很方便地分析汉字在图象上的性质。函数 Binarize 可以把图象转换为单色单通道, ImageData 则可以把图象转换成数组的形式,以便我们定量分析。
可以把一个汉字转换成 12*12 的 01 矩阵:
利用这个特征,可以做一张“汉字视力表”。
制作蒙太奇马赛克拼图
imagePool = Map[With[{i = Import[#]}, {i, Mean[Flatten[N[i[[1, 1]]], 1]]}] &, FileNames["Pool/*.jpg"]]; closeMatch[c_] := RandomChoice[Take[SortBy[imagePool, Norm[c - #[[2]]] &], 20]][[1]]; Grid[Reverse[Map[closeMatch, Import["MasterImage.tif"][[1, 1]], {2}]], Spacings -> {0, 0}]
”Pool/*.jpg”是图库;”MasterImage.tif”是目标图片。
构建一个显示所有气象站的地球仪
显示出世界各地气象站位置的地球仪。
map = Join @@ ((List @@ First@CountryData[#, "Polygon"]) & /@ CountryData[]); coordsToXYZ[list_] := Transpose[{Cos[#[[1]]]*Cos[#[[2]]], Cos[#[[1]]]*Sin[#[[2]]], Sin[#[[1]]]} &@Reverse@Transpose[list*Pi/180.]]; stations = WeatherData[]; coords = coordsToXYZ[{WeatherData[#, "Longitude"], WeatherData[#, "Latitude"]} & /@ stations]; globe = First@ ParametricPlot3D[.99*{Sin[u] Sin[v], Cos[u] Sin[v], Cos[v]}, {u, -[Pi], [Pi]}, {v, -[Pi], [Pi]}, MaxRecursion -> 4, Axes -> None, PlotStyle -> Opacity[.5]]; Graphics3D[{globe, Black, Line /@ coordsToXYZ /@ map , Red, Point@coords}, Boxed -> False, ImageSize -> Medium, Lighting -> "Neutral"]
分析图像中的分段细胞
对分段图像采用 blob 分析技术,标记显微镜图像中完整且不重叠的细胞位置和大小。
分析道路网络
与图像处理功能结合,建立并分析道路网络. 突出显示预定区域内的街道。
img = WolframAlpha["Champaign IL", {{"Map:CityData", 1}, "Image"}]; g = MorphologicalGraph[Binarize[ColorNegate[img]], EdgeStyle -> LightGray]; Row[{img, HighlightGraph[g, NeighborhoodGraph[g, 400, 20], ImageSize -> {256, 278}, VertexSize -> {400 -> 15}]}]
人脸识别
调用函数FindFaces以边界框列表的形式返回检测到的人脸
从图像提取字符
调用TextRecognize函数识别图像中的文本并返回一个字符串。
识别条纹码跟二维码
调用BarcodeRecognize函数识别图像中的条形码、二维码并将其作为字符串返回。
查找单词
调用WordData函数,可以查找单词意思。
In[8]:= WordData["需要查的单词", "Definitions"]
Mathematica的强大甚至能导入导出所有标准光栅、向量以及三维几何和建模格式,比如 Maya、3DS、VRML、 FLV、POV、DXF、SVG、EPS、PDF、TIFF、GIF 等等,先进的图形指令支持光源、曲面的镜面反射度、几何上正确的透明度等,与数据库、网络服务、C/C++、Java和.NET 框架,以及带有自动输出的 C 和 Fortran 代码即时连接。皮克斯、工业光魔、迪士尼那些都有用这个开发特效算法的程序。
参考资料
[1]Vespa的个人博客
http://www.kylen314.com/[2]Matrix67的个人博客
http://www. matrix67.com/[3]wolfram官方文档
http://www. wolfram.com/support/? source=nav[4]制作蒙太奇马赛克拼图
http:// blog.wolfram.com/2008/0 5/02/making-photo-mosaics/[5]解24点游戏
http:// demonstrations.wolfram.com /Calculating24/ http://www. douban.com/group/topic/ 15763875/[6]人脸识别
FindFaces—Wolfram Language Documentation[7]画皮卡丘的方程
Sina Visitor System暂时这样吧,以后想到好玩的再更新。