在你开始敲代码之前,先了解它的核心优势:
符号计算霸主:它不仅仅是计算器,它是数学家。它能推导公式,而不是只给你一个近似的小数解(比如它知道 是根号2,而不是 1.414...)。
知识库集成:内置了包括地理、化学、物理常数甚至股票数据。
函数式编程:代码极其简洁,一行代码往往能干 C 语言一百行的事。
所见即所得:Notebook (.nb) 界面允许你将代码、运行结果、文字笔记和图片混排,非常适合做科研笔记。
Mathematica 的变量默认是全局的,且保留上次运行的状态。这非常容易导致你明明改了公式,算出来的数却不对。
在每个 Notebook 的开头,建议加上这段“起手式”:
(* 清除当前所有定义的符号,防止之前的变量值干扰 *)
ClearAll["Global`*"]
(* 如果你使用了下标变量,最好也清理一下 *)
ClearAll["Subscript"]
提示:运行代码的快捷键是
Shift + Enter,只按 Enter 只是换行。
Mathematica 的函数定义非常独特,请记住三个铁律:
系统内置函数首字母永远大写(如 Sin, Plot, Table)。
函数参数用方括号 [] 包裹,而不是圆括号。
定义变量模式用下划线 _。
:=)我们通常使用 := (延迟赋值) 来定义函数。意思是:“先别算,等我调用的时候再算”。
(* 定义一个函数 f,参数是 x *)
(* x_ 的意思是:这里匹配任何参数,并把这个参数命名为 x *)
f[x_] := x^2 + 2*x + 1
(* 调用 *)
f[5]
(* 输出: 36 *)
(* 它甚至支持符号代入 *)
f[a + b]
(* 输出: 1 + 2(a+b) + (a+b)^2 *)
Set (=) vs SetDelayed (:=) 的区别x = 5:立即赋值。右边立刻计算出结果赋给左边。
f[x_] := RandomReal[]:延迟赋值。每次调用 f[x] 时,右边的代码才会重新运行(每次得到不同的随机数)。
# 与 & 的魔法这是 Mathematica 最让新手困惑,但也最强大的功能。
当你只需要一个临时的、一次性的函数(类似 Python 的 lambda),不需要给它起名字时,就用纯函数。
# (Slot):代表参数(占位符)。
& (Function):放在最后,表示“纯函数定义结束”。
普通写法:
(* 先定义一个平方函数 *)
square[x_] := x^2
(* 把它应用到一个列表 *)
Map[square, {1, 2, 3, 4}]
(* 输出: {1, 4, 9, 16} *)
纯函数写法 (更简洁,不用起函数名):
(* # 代表要把列表里的元素填进去的地方 *)
(* & 告诉系统前面的代码是函数体 *)
Map[#^2 &, {1, 2, 3, 4}]
#^2 & /@ {1, 2, 3, 4}
(* 输出: {1, 4, 9, 16} *)
如果有两个参数怎么办?用 #1 和 #2:
(* 计算第一个参数加第二个参数 *)
f = #1 + #2 &;
f[3, 5]
(* 输出: 8 *)
#1^#2 & @@@ { {1, 2}, {2, 2}, {3, 2}, {4, 2} }
#[[1]]^#[[2]] & /@ { {1, 2}, {2, 2}, {3, 2}, {4, 2} }
(* 输出: {1, 4, 9, 16} *)
这是新手最大的误区! 在 Mathematica 中,尽量不要写 For 循环或 Do 循环。它们效率低且代码丑陋。
Mathematica 是针对列表 (List) 操作优化的。
C 语言思维:声明数组 -> For 循环 -> i++ -> 赋值。
Mathematica 思维:使用 Table。
(* 生成一个包含前10个整数平方的列表 *)
data = Table[i^2, {i, 1, 10}]
(* 输出: {1, 4, 9, 16, 25, 36, 49, 64, 81, 100} *)
(* 生成乘法口诀表风格的二维数组 *)
Table[i * j, {i, 1, 3}, {j, 1, 5}]
C 语言思维:For 循环遍历数组 -> 处理 -> 存回。
Mathematica 思维:使用 Map (/@)。
myList = {1, 2, 3, 4, 5};
(* 把列表里每个数都加上 10 *)
(* /@ 是 Map 的简写形式,非常常用 *)
(# + 10) & /@ myList
(* 输出: {11, 12, 13, 14, 15} *)
If vs Which)条件判断和 C 类似,但可以返回值。
x = 5;
(* If[条件, 真时执行, 假时执行] *)
result = If[x > 0, "Positive", "Negative"]
(* 多个条件建议用 Which,代替 Switch/Case *)
val = 15;
type = Which[
val < 10, "Small",
val < 20, "Medium",
True, "Large" (* True 相当于 default *)
]
除了你提到的 16 进制转 10 进制,反过来也很有用:
Mathematica
(* 16进制字符串 -> 10进制数值 *)
FromDigits["FE", 16]
(* 输出: 254 *)
(* 10进制数值 -> 16进制字符串 *)
IntegerString[254, 16]
(* 输出: "fe" *)
(* 2进制转换 *)
IntegerString[10, 2]
(* 输出: "1010" *)
Mathematica 的一切皆列表(类似 Array/List)。
list = {10, 20, 30, 40};
(* 取出第3个元素 (注意:下标从 1 开始!) *)
list[[3]]
(* 输出: 30 *)
(* 取出最后1个元素 *)
Last[list]
(* 只要大于 25 的数 (Select 相当于 Filter) *)
Select[list, # > 25 &]
(* 输出: {30, 40} *)
不要去背手册,善用内置帮助:
?函数名:在 Notebook 里输入 ?Table 然后 Shift+Enter,会显示简要用法。
F1 键:选中函数名按 F1,会打开超级详细的本地文档,里面全是可运行的例子(这是 Mathematica 最值钱的部分)。
Created for easier Mathematica learning.