Mathematica太封闭
mathematica吧
全部回复
仅看楼主
level 1
MMA虽然强大,功能非常人性化,这归功于其涉及面广阔而纷繁复杂的各种内置函数和相应的选项,可以实现我们所需要绝大部分功能。但由于算法的复杂性或是商业保密原因,它拒绝将内部过程透露给你,也不给数据接口,这就导致多元化的自定义不是那么自由了。
要知道,人需求是随着所遇到的问题、时间逐渐增加的,既然内置函数都是封装的,那么新的需求或者功能,只能依靠开发人员进行版本更新、添加补充新的函数才能实现。
当然,用户也可以自己从基础开始,依照算法来写想要功能的代码,对于特殊问题,显然工作量不是一般的大(因为封闭性,无法通过搭积木的方式,利用已有的内置函数组合创造),而且自己写的代码肯定没有开发人员写的精简效率高。
然而MATLAB则不同,除了一些需要高效率的算法之外,大部分的函数实现代码都保存着,用户不仅可以得知其实现细节(理解其函数执行原理便于优化代码),还可参照代码学习思路等等。
因此感觉Mathematica用起来还是那么不太让人感觉通透。或许是我了解的Trick或者深入的用法不够的原因?
2016年07月15日 13点07分 1
吧务
level 12
1.“MMA提供了非常多的绘图函数,可是返回的是图像,无法获取图中的点、线或者面片的坐标数据”
你一定没有仔细看过Plot的帮助,里面明确说了 Plot 通常返回 Graphics[{Line[...],...}],途中所有点线面的信息都可以用Part或者Cases直接提取,比如这样
Cases[Normal@Plot[Sin[x], {x, 0, 6 Pi}], Line[pts_] :> pts, Infinity]
2.等高线渐变
我查了一下确实没有查到直接实现的相关选项,但是自己动手写一个也没什么难度
Normal@Plot3D[x Exp[-x^2 - y^2], {x, -2, 2}, {y, -2, 2},
PlotRange -> {-0.5, 0.5}, MeshFunctions -> {
#1 &, #
2 &, #3 &},
PlotStyle -> None, MeshStyle -> {Gray, Gray, Red},
BoundaryStyle -> Gray] /. {RGBColor[1, 0, 0], lines___} :> {{Hue[#[[1, 1, 3]]], #} & /@ {lines}}
3.曲面上的等值线
完全同样的道理,先用meshfunction画出曲面上的等值线,然后再重新着色。
为了取得更好的效果在着色之前先把函数值都Rescale到0和1之间
Peaks = Evaluate[
With[{x =
#1, y = #
2}, 3 (1 - x)^2 Exp[-x^2 - (y + 1)^2] - 10 (x/5 - x^3 - y/5) Exp[-x^2 - y^2] - Exp[-(x + 1)^2 - y^2]/3]] &;
Normal@ContourPlot3D[ z == -x^2 - y^2, {x, -3, 3}, {y, -3, 3}, {z, -18, 0},
MeshFunctions -> {
#1 &, #
2 &, Peaks}, Mesh -> {18, 18, 6},
MeshStyle -> {Opacity[.1], Opacity[.1], Red},
BoundaryStyle -> Opacity[0.05], ContourStyle -> None,
Boxed -> False, FaceGrids -> {{-1, 0, 0}, {0, 1, 0}, {0, 0, -1}},
FaceGridsStyle -> Dashed] /. {RGBColor[1, 0, 0], lines___} :>
Inner[Line[#1[[1]],
VertexColors -> ColorData["SolarColors"] /@ #2] &, {lines},
Rescale@Apply[Peaks, {lines}[[All, 1]], {2}], List]
真正自己手写的东西也就/.之后的那两行
2016年07月15日 15点07分 3
[大拇指]
2016年07月16日 05点07分
[真棒]
2016年07月16日 07点07分
[真棒]
2016年07月16日 15点07分
[真棒]
2016年07月17日 13点07分
level 1
然而上述方式也只对至少有一个曲面是解析的情况有效。如果两个曲面都是ListSurfacePlot3D构建的,或者ListContourPlot3D获得的,那么MeshFunctions的方法就无法使用了。
比如用数据点拟合得到的曲面
data = ExampleData[{"Geometry3D", "StanfordBunny"}, "VertexData"];
ListPointPlot3D[data] (* 兔子表面空间离散数据点 *)
ListSurfacePlot3D[data, MaxPlotPoints -> 50] (* 拟合得到的曲面 *)
如果要绘制一个隐式曲面,比如x^2
+3
Sin[x] y^3==1与上述兔子曲面的交线,如何做到呢?
2016年07月16日 06点07分 6
你把兔子的点取出来 判断一下每个点是不是在隐函数曲线附近不就行了吗 最后在描点出图
2016年08月08日 06点08分
@wshzh1966 data = ExampleData[{"Geometry3D", "StanfordBunny"}, "VertexData"];pic = ListSurfacePlot3D[data*20, MaxPlotPoints -> 300];
2016年08月08日 08点08分
@wshzh1966 :Show[Plot3D[Sin[x + y^2] + 2, {x, -3, 3}, {y, -2, 2}], ListSurfacePlot3D[data*20, MaxPlotPoints -> 50],Graphics3D@{Red,Point[Select[pic[[1, 1]], Abs[Sin[
#[[1]] + #
[[2]]^2] + 2 - #[[3]]] < 0.005 &]]},PlotRange -> All]
2016年08月08日 08点08分
@wshzh1966 这里只是举个例子说明,千万别把简单问题想的太复杂
2016年08月08日 08点08分
level 1
三维数据经常会进行复杂处理,最常见的就是取包络面(轮廓面),matlab提供了convhull函数和convhulln函数实现任意维空间的凸包提取(MMA有ConvexHull函数,但只是2维情形,不能用于3维情形)。
但很多情况下,大部分空间数据点集的外轮廓面不是凸的,所以ConvexHull算法就不适用了。后来有研究者提出AlphaShape算法,以及Crust算法,都是针对非凸包络面的情形。MATLAB都有相应函数来实现,MMA倒是没有相应的函数(当然也可以自己编写一个,不过效率或者稳定性就不敢保证了)。
例如,我们随意构建一组空间散乱点数据。注意,这个数据是是实体数据(与上面的兔子不同,兔子只是表面采样的数据)。
data1 = Cases[
Flatten[Table[{x, y, z}, {x, -4, 4, 0.1}, {y, -4, 4, 0.1}, {z, -2,
2, 0.2}], 1], {x_, y_, z_} /;
x^3 + x y^2 + x z^2 > 1 && x + y Sin[x y] < 2, 2];
ListPointPlot3D[data1]
拟合包络面
ListSurfacePlot3D@data1
可见ListSurfacePlot3D只能实现一个单一的表面,而不能将其封闭,特别是有多个分支时,其他分支无法被绘制。
MATLAB使用AlphaShape算法得到的结果:
对比散乱点集图可知,上述包络面还是比较准确的。
2016年07月16日 07点07分 9
楼主也很厉害 [真棒]
2016年07月16日 07点07分
level 1
你的问题,说了那么多,给我的感觉就是,你很厉害,又很不厉害。
太多了就随便说几点。
1. 有一些是mma的算法不够好,例如ListSurfacePlot3D。
2. 有一些是你的问题,ListContourPlot3D是插值并“画”出来,由于需要画出来,所以才会说限定了1维和2维插值(也就是ListContourPlot和ListContourPlot3D)。但是就“插值”这个操作来说,Interpolation表示任意维都没问题。
3. MMA没有DelaunayTrangulation函数,如果你指的是DelaunayMesh函数,那么例子里明明白白写的是也可以3D。
4. MMA也没有ConvexHull函数,如果你指的是ConvexHullMesh函数,那么例子里明明白白写的是也可以3D。
5. MMA没有AlphaShape算法,这和封闭无关,就是没有某个功能。单列举功能,MMA有一堆matlab内置但MMA不内置的算法,matlab也有一堆MMA内置但matlab没有的算法,没有哪个软件是万能的。所以我去查了一下SE,http://mathematica.stackexchange.com/,发现一个简单的AlphaShape算法,就是算的慢了些。
data1 = Cases[
Flatten[Table[{x, y, z}, {x, -4, 4, 0.1}, {y, -4, 4, 0.1}, {z, -2,
2, 0.2}], 1], {x_, y_, z_} /;
x^3 + x y^2 + x z^2 > 1 && x + y Sin[x y] < 2, 2];
data3D = data1;
tetrahedra = Level[MeshPrimitives[DelaunayMesh[data3D], 3], {-3}];
radius[p_] := Sqrt[Area[Circumsphere[p]]/(4 Pi)];
radii = radius /@ tetrahedra;
alphashape[rmax_] := Pick[tetrahedra, radii, r_ /; r < rmax]
faces[tetras_] :=
Flatten[tetras /. {a_, b_, c_,
d_} :> {{a, b, c}, {a, b, d}, {a, c, d}, {b, c, d}}, 1];
externalfaces[faces_] :=
Cases[Tally[Sort /@ faces], {face_, 1} :> face];
rmax = 0.2;
polys = externalfaces@faces@alphashape[rmax];
Graphics3D[Polygon@polys, Boxed -> False]
需要手动修改合适的rmax值。
6. MMA是有区域逻辑计算的,请查RegionDifference、RegionUnion、RegionIntersection。
2016年07月16日 08点07分 13
如果你认为MMA应该自带函数实现matlab的所有功能,那就太天真了。包括后来你添加的那几个图,我扫了一眼,至少有一些很容易就实现,虽然确实没内置。
2016年07月16日 08点07分
MMA的几何计算是从版本10开始加入的,目前可以说有很多bug或者不完善的地方,但是“没有这个功能”说的就有点不对了。
2016年07月16日 08点07分
你上面说到的都是新版的吧,我是针对9来说的。
2016年07月16日 13点07分
interpolation是没问题,但是你不知道ListSurfacePlot这个插值算法,如何去得到高维的插值数据结果?我的想法是,不要画出来,只是要用这个内部算法去插值高维数据,然后把数据给我返回来。
2016年07月16日 13点07分
level 12
用Graph和GraphEmbedding可以完成那个圆圈图
2016年07月16日 10点07分 15
额,是GraphLayout
2016年07月16日 11点07分
@eyofdu 感觉不难么简单,可能需要更深层次编程。
2016年07月16日 13点07分
level 12
置信域也可以用Filling画
2016年07月16日 10点07分 16
这很简单,查查Filling怎么用再加上点简单的列表操作就好。懒得贴代码了,用手机发帖
2016年07月16日 11点07分
@eyofdu 确实,这个需要细微调节设置。
2016年07月16日 13点07分
level 12
散点的话可以用Nearest和ImplicitRegion,也很方便
2016年07月16日 10点07分 17
level 12
slice函数现在也有了,不是问题
2016年07月16日 10点07分 19
SliceVectorPlot3D
2016年07月16日 10点07分
这玩意还可以各种调,还是很不错的
2016年07月16日 10点07分
@eyofdu 哪个版本?
2016年07月16日 13点07分
level 10
我要双修,哈哈
2016年07月16日 10点07分 23
吧务
level 15
1. 楼主所举的论据,没有一个可以论证顶楼的论点。这个帖子实际上已经跑题成了“××功能是Mathematica没有的,能否编程实现”。
2. 吧里对讨论Mathematica没有的功能如何实现并无限制,甚至可以说是鼓励的。但我个人觉得把这么一堆关联性很低的问题,堆在一个完全不相关的主题下面,没有好处。
3. 版本10不够稳定,没升新版本很正常,但是既然你是想讨论Mathematica没有的问题,那你至少应该把版本10(这两天都出到版本11了)的新功能列表读一遍再来开帖吧?(不要告诉我你不知道怎么查。)
4. 在这边没得到解答的问题可以考虑去Stackexchange问问。
5. 因为我现在还在用版本9、参与计算几何方面的讨论太亏+今日身体抱恙+《伪恋》结局让我不爽,更具体的讨论我就暂时不参与了。
2016年08月06日 11点08分 27
我就是觉得楼猪问的问题太乱然后又装专家所以才懒得答[滑稽]
2016年08月06日 12点08分
@qsraaaa520 我是个菜鸟,是专家的话就不用来这里学习了,对吧?下面的问题基本上已经解决了,唯独6楼的问题确实比较棘手,还望能花点您宝贵时间赐教下,先行谢过[吐舌]
2016年08月07日 04点08分
我觉得楼主就是来砸场子的
2017年11月06日 08点11分
level 1
@xzcyr
1. 可以这么认为,因为楼主本来想解决某个问题的,发现是需要用到内部一些实现细节才能解决的(比如RegionFunction或者MeshFunction的内部实现如果有接口,那么6楼问题很容易解决)。
后来由此联想到很多一些功能都没有相应的函数实现(我本身还是比较喜欢MMA的),如果自己写的话工作量也不小,所以才问,并不是故意歪楼。可能吧主是处女座,所以对于帖子格式以及内容形式什么的比较敏感。但不管怎样,您是吧主,最后我也按照你的要求做了,对吧。
2. 后来也分贴专门问了一个问题。
3. 阅读过,但没读全,因为我这里访问Wolfram网络版的reference,网页刷新速度比较慢(就是页面一直空白,等很久才接收道数据显示完整页面,很奇怪)。
4. 好的,我有SE账号不过目前不知为何点击登录按钮却无任何反应。
5. 我也是用的版本9,计算几何本身对于符号运算要求并不多,更多的是一些成熟的算法处理和参数调节。我承认这是需要复杂的编程实现(不等于MMA无法做到),目前自己就在尝试一些之前感兴趣的问题。
2016年08月07日 04点08分 28
level 4
我感觉到的是恰好完全相反……
我对MMA的体会就是非常灵活、用户友好,定制性强,只要会用帮助文档,且不说很多东西都能实现,并且是能很巧妙地实现。反而Matlab什么都藏起来,不像MMA有实例,有出现问题的实例,有算法和函数比较的实例,有通常用法的实例和进阶用法的实例。你觉得自己学习算法很难吗(我指的一般的常用算法)?我倒是觉得不了解使用场景更糟糕啊。不是人人都能时刻奇思妙想的,而MMA的实例提供了意想不到的可能,有时看到一个新鲜的用法就能萌生新的研究思路,这一点才叫做开放吧。
使用上Matlab对某些工程应用还算便利(但不是不可替代),范围却很难拓展,自带帮助也难用,当然我对Matlab了解不深,也许就和你对MMA了解不深一样。
感觉
lz
是做流体相关的,包括你举的例子在内,所有相关计算和画图都不能说是问题。你说Matlab透明,真的么?那么就应该很清楚一些功能实现的逻辑其实非常直接和简单才对。就比如说画个流管这种小规模的东西,自己写几句话在效率上根本不会降低多少,在计算成本上也不会增加。我自己就是,做一些小型的计算结果的可视化的时候,很多软件在“读数据、画流管、进行各种渲染和数据处理”这个过程上都没有MMA好写,想画个什么立刻就能写好一气呵成。
对你来说是很想要的功能,对大部分人来说是能轻松找到替代方案,这就是每个软件在资源有限的情况下对增加功能有所取舍的原因。
再说如果要集中做大规模可视化,就应该直接选用专门的可视化软件而不是计算软件了。要说MMA画出来不如那些可视化软件好看或好处理,那是显然的,没有可比性,那时候这些都没什么讨论意义了。
2016年09月03日 14点09分 29
我觉得帮助文档都好用啊,但是帮助文档不是万能的。你如果觉得MMA用的很溜了,你可以试试6楼或者14楼的问题,看看是不是像你说的那样很轻松几句话就解决。
2016年09月04日 05点09分
1