Mathematica变量名中的下划线
用\[LetterSpace]
字符代替,打起来麻烦,但显示是正常的。直接用键盘上的_
字符会被解析成其他东西。
用\[LetterSpace]
字符代替,打起来麻烦,但显示是正常的。直接用键盘上的_
字符会被解析成其他东西。
Mathematica 10默认的色调是挺好看,但是想写一篇蓝色为主色调的报告,然后就去查修改绘图的色调,了解到了ColorData
这个玩意。它内置了一系列的色调,每个色调可通过向其传递一个0-1的数值获取一个对应的色调中颜色。具体操作敬请参考Mathematica内置的强大帮助引擎。
然后找到了一个比较理想的"DeepSeaColors"
,但是当它作为参数传递给不论是ChartStyle
还是ColorFunction
的时候,都相当地不尽人意,要么全局颜色过浅,要么全局颜色过深。后来想,能不能从中提取出部分色调供自己使用?因为觉得其中某段颜色还是挺好看的。
然后在网上查到了用匿名函数和Resize
实现的方法。不过当时不知道ColorData
里面取出来的是ColorDataFunction
。
暂时记在这:
https://community.wolfram.com/groups/-/m/t/113779
ColorFunction -> (ColorData["VisibleSpectrum"][ Rescale[#, k*{-1, 1}, {380, 750}]] &)
然后就有了后来自己的想法,由于时间有限,只使用了一次函数来表达进行映射:
myBlueSeries = Table[
ColorData[{"DeepSeaColors", "Reversed"}][x/1.6 + 0.1], {x, 0, 1, 0.2}];
然后使用的时候在图表中添加选项ChartStyle -> myBlueSeries
,即可获得效果还可以的蓝色图例系列。
生成颜色的数量和变化规律都在上面那句Table
里设置,有需要的自行修改即可。
在拿绘制Julia集练手的时候,取参数为-0.8+0.156i
的时候,实轴方向有效区域大小约在-2~2之间,而虚轴方向有效区域大小为-1~1。然后用ContourPlot
绘制的时候,发现不论xy取值区域大小关系如何,默认都会化画成一个正方形。然后发现自己语文水平8行,不知道该搜什么。。。
想了老半天,试了interval
,scale
都没有什么效果。不过搜着搜着发现了ratio
这一关键词,顺藤摸瓜找到了AspectRatio
这一参数。经过试验,该参数至少在ContourPlot
内可用。
不过自己画的效果果然还是没有内置函数好,JuliaSetPlot
函数和自己根据CUDA编程书设计的Julia函数画起图来效果简直是一个天上一个地下= =
在一开始接触Mathematica的时候,对它的理解可能更加接近解释型语言,比如Python一类的,输入和输出是确定对应的。
Mathematica里的赋值运算符有两种,=
和:=
。前者就是传统的赋值,后者叫做“延时赋值”,即在使用到被赋值变量时才计算其对应的值。一开始并没有仔细看文档,只是发现两者的区别是在句尾不加分号的时候,前者会输出计算值,后者不会,以为区别在这里。。但是这是错误用法
而后在进行高级运用,涉及到了带有循环编程的时候,程序就开始报错了,说递归超过最大深度。在简单的尝试后,发现将:=
替换成=
问题就解决了,这才意识到自己之前对这两个操作符的理解可能有误。
简要总结:
=
赋值符用于立即赋值,适合最为广泛的面向过程编程;
:=
用于延时赋值,对于函数的定义需要使用这个符号(显然传入了自变量值才能计算出结果来嘛),可能更多用于函数式编程,一般的数值计算不要轻易用这个符号;
;
加在句尾,可用于在一行做多条语句的分隔符,同时在句尾添加了分号的语句将不会产生输出,与Matlab的分号抑制输出功能相同。
最近再考虑用Mathematica实现一些基本的机器学习功能。因为在初步接触到科学计算工具的时候,显然会发现Mathematica的语言更友好,至少详细的离线文档和中文的即时函数名显示已经让我觉得很好了。Matlab没怎么用过新版本的,不过似乎好像周围人用的都是英文版。。这就导致我下定决心,同为多功能的科学计算工具,一定要在Mathematica上实现Matlab上的,至少大部分功能。
然后问题出在了循环上。在执行代码的时候,卡在For循环这里只执行一遍。自己试了很久,发现跟之间建立的矩阵变量有关,只要一使用这些变量,不但只执行一遍,甚至还会修改循环变量的显示值。
大致代码:
data := {{x1, x2, x3, y}, ...}
dataX := data[[1;;3]]
dataY := data[[4]]
For[a = 1, a <= 10,
dataX;
Print[a];
a += 1;
]
其中只有dataX
的一行用于省略表示含有该数据输入的参数更新过程。很奇怪,在我用的时候(版本10.4),只要在循环里使用了dataX
或者dataY
的时候,循环只会执行一次,出来的结果也十分奇怪(不可描述),且输出a
的值固定变为了10。包括自己debug和在某度上查找的结果,都无法解释这个问题。
然后我又来推销stackoverflow了: https://mathematica.stackexchange.com/questions/134609/why-should-i-avoid-the-for-loop-in-mathematica
For循环语法:
For[循环变量初值,循环结束条件,循环体(分号分隔多语句)]
Do循环语法:
Do[循环体(分号分隔多语句),{循环变量名,初值,结束值(包含)}]
这里提到说,Mathematica里的For循环的循环变量的作用域是开放的,和传统的C/C++不一样,在外部也能调用。要达到相同的效果,需要使用Module
函数将其声明为局部变量。然后就推荐了Do循环。Do循环有着类似于我们常用的C语言for循环的功能,以变量的初始值和结束值为条件,执行循环体,而且还可以直接支持多变量循环。相比于For循环,Do循环的循环变量是局部的。
然后就有了:
...
Do[
dataX;
Print[a],
{a, 1, 10}
]
换了循环语句之后,似乎问题就解决了。。