在Mathematica中加速绘制图形(LibraryLink)
Wolfram LibraryLink 所提供的函数能够优化数值计算,同时保留 Wolfram 语言的灵活性与通用性。若已有大量现成的数值代码,无论是通过 Wolfram 符号传输协议(WSTP)还是 LibraryLink,都能有效地将这些代码与 Wolfram 语言连接,实现从 Wolfram 语言驱动运行。另一方面,若正在开发数值计算程序,可以先用 Wolfram 语言进行原型开发,当某些部分出现性能瓶颈时,再使用 LibraryFunction 对这些关键模块进行加速。LibraryFunction 还能直接与 Wolfram 语言的数值计算函数无缝集成,因此在处理需在不同采样点进行计算的场景时,编写针对性代码往往能显著提升运算效率。这里,将要简单介绍一下LibraryLink的使用。
系统提供的源码,是在这个文件中:
demo_numerical.c
使用代码:
source = FileNameJoin[{$InstallationDirectory, "SystemFiles", "Links", "LibraryLink", "LibraryResources", "Source"}]; FilePrint[FileNameJoin[{source, "demo_numerical.c"}]]
可以查看这个源码文件的详细内容。这些源码文件中,包含的函数,主要有:
parabola,mandelbrot,duffing_rhs et etc.
这里将展示mandelbrot函数的使用。这个函数的源码为:
static mint mandelbrot_max_iterations = 1000; DLLEXPORT int mandelbrot(WolframLibraryData libData, mint Argc, MArgument *Args, MArgument Res) { mint n = 0; mcomplex z = {0.,0.}; mcomplex c = MArgument_getComplex(Args[0]); mreal rr = mcreal(z)*mcreal(z); mreal ii = mcimag(z)*mcimag(z); while ((n < mandelbrot_max_iterations) && (rr + ii < 4)) { mcimag(z) = 2.*mcreal(z)*mcimag(z) + mcimag(c); mcreal(z) = rr - ii + mcreal(c); rr = mcreal(z)*mcreal(z); ii = mcimag(z)*mcimag(z); n++; } if (n == mandelbrot_max_iterations) n = 0; MArgument_setInteger(Res, n); return LIBRARY_NO_ERROR; }
首先是加载函数:
这个函数mlf就可以像Mathematica中的函数一样,可以计算复平面中的点。
Plot3D[mlf[x + I y], {x, -2., .5}, {y, -1.25, 1.25}, PlotPoints -> 100, ColorFunction -> "SolarColors", ViewAngle -> Pi/8]
使用如下代码,
n = 501; samples = Table[mlf[x + I y], {y, -1.25, 1.25, 2.5/(n - 1)}, {x, -2., .5, 2.5/(n - 1)}]; Image[Unitize[samples], "Bit"]
可以绘制黑白图形:
将函数值映射为颜色通道,结合使用Raster函数,可以绘制彩色图形:
colormap = Function[If[# == 0, {0., 0., 0.}, {#/25., #/25., 1.}]]; Graphics[Raster[Map[colormap, samples, {2}]], ImageSize -> 512]
也可以绘制随机颜色图形:
colormap = Function[If[# == 0, {0., 0., 0.}, Part[r, #]]] /. r -> RandomReal[1, {1000, 3}]; Graphics[Raster[Map[colormap, samples, {2}]], ImageSize -> 512]