数据类型
数据类型概述
TianYuan 支持以下数据类型:
| 类型 | 说明 | 示例 |
|---|---|---|
| 标量 / 矩阵 | 双精度浮点数,矩阵是一等公民 | x = 42,A = [1 2; 3 4] |
| 字符串 | 文本数据,使用双引号 | s = "hello" |
| 复数 | 实部 + 虚部,用 i/j 后缀表示虚部 | z = 3 + 4i |
| Cell 数组 | 可容纳不同类型元素的容器 | c = {1, "text", [1 2]} |
| Struct(结构体) | 具名字段的键值容器 | s.x = 1; s.name = "A" |
| 函数句柄 | 指向函数的引用,支持匿名函数 | f = @(x) x^2 |
所有数值类型在内部都使用双精度浮点数(double)表示。
标量(Scalars)
标量是单个数值,可以是整数或浮点数:
# 整数
x = 42
y = -10
# 浮点数
pi_val = 3.14159
e_val = 2.71828
# 科学计数法
avogadro = 6.022e23
planck = 6.626e-34
# 特殊值
inf_val = inf # 正无穷
neg_inf = -inf # 负无穷
nan_val = nan # 非数字(Not a Number)
预定义常量
| 常量 | 值 | 说明 |
|---|---|---|
pi | 3.14159... | 圆周率 |
e | 2.71828... | 自然常数(欧拉数) |
eps | 2.2204e-16 | 浮点机器精度 |
inf / Inf | ∞ | 正无穷大(两者等价) |
nan / NaN | NaN | 非数值(两者等价) |
特殊值的运算
# 无穷大运算
x = inf + 100 # inf
y = inf * 2 # inf
z = inf - inf # nan
# NaN 运算
a = nan + 5 # nan
b = nan == nan # false (NaN不等于任何值,包括自己)
向量和矩阵
创建矩阵
使用方括号 [] 创建矩阵,空格或逗号分隔列元素,分号或换行分隔行元素:
# 行向量
row = [1 2 3 4 5]
row2 = [1, 2, 3, 4, 5] # 逗号也可以
# 列向量
col = [1; 2; 3; 4; 5]
# 矩阵
A = [1 2 3; 4 5 6; 7 8 9]
# 等价于
A = [1 2 3
4 5 6
7 8 9]
# 空矩阵
empty = []
矩阵创建函数
TianYuan 提供了多个函数来创建特殊矩阵:
zeros - 零矩阵
Z1 = zeros(3) # 3×3 零矩阵
Z2 = zeros(2, 4) # 2×4 零矩阵
Z3 = zeros([3, 3]) # 使用向量指定大小
ones - 全1矩阵
O1 = ones(3) # 3×3 全1矩阵
O2 = ones(2, 5) # 2×5 全1矩阵
O3 = ones(size(A)) # 与矩阵A同大小的全1矩阵
eye - 单位矩阵
I1 = eye(3) # 3×3 单位矩阵
I2 = eye(3, 4) # 3×4 单位矩阵(对角线为1)
rand - 均匀分布随机矩阵
生成 [0, 1) 区间内的均匀分布随机数:
R1 = rand(3) # 3×3 随机矩阵
R2 = rand(2, 4) # 2×4 随机矩阵
R3 = rand([3, 3]) # 使用向量指定大小
randn - 正态分布随机矩阵
生成均值为0、标准差为1的正态分布随机数:
N1 = randn(3) # 3×3 正态随机矩阵
N2 = randn(2, 4) # 2×4 正态随机矩阵
randi - 整数随机矩阵
生成指定范围内的随机整数:
I1 = randi(10, 3) # 3×3 矩阵,元素为 [1, 10] 的整数
I2 = randi(5, 2, 4) # 2×4 矩阵,元素为 [1, 5] 的整数
I3 = randi([5, 10], 3) # 3×3 矩阵,元素为 [5, 10] 的整数
使用冒号运算符
# 生成等差序列
v1 = 1:10 # [1 2 3 4 5 6 7 8 9 10]
v2 = 0:0.5:2 # [0 0.5 1.0 1.5 2.0]
v3 = 10:-1:1 # [10 9 8 7 6 5 4 3 2 1]
# 使用 linspace 生成指定数量的点
x = linspace(0, 10, 5) # [0 2.5 5.0 7.5 10.0]
字符串
字符串使用双引号 " 表示:
str1 = "Hello, TianYuan!"
str2 = "这是中文字符串"
empty_str = ""
# 字符串连接
msg = "Hello" + " World" # "Hello World"
# 使用 strcat 连接
msg2 = strcat("Hello", " ", "World")
# 字符串函数示例
s = " Hello World "
s2 = strtrim(s) # 去首尾空白: "Hello World"
s3 = upper(s2) # 转大写: "HELLO WORLD"
s4 = lower(s2) # 转小写: "hello world"
# 查找和替换
pos = strfind("abcabc", "bc") # [2 5]
result = strrep("hello world", "world", "TianYuan") # "hello TianYuan"
# 字符串比较
strcmp("abc", "abc") # 1
strcmpi("ABC", "abc") # 1(忽略大小写)
# 格式化字符串
s = sprintf("x = %.2f", 3.14159) # "x = 3.14"
注意:TianYuan 使用双引号,不支持 Matlab 的单引号字符数组。
复数
TianYuan 支持复数类型。虚部使用 i 或 j 后缀:
% 创建复数
z1 = 3 + 4i # 实部3,虚部4
z2 = 2 - 1.5i # 实部2,虚部-1.5
z3 = 2i # 纯虚数
# 复数运算
z4 = z1 + z2 # (5+2.5i)
z5 = z1 * z2 # (12+3.5i)
# 复数函数
r = real(z1) # 实部: 3
i_part = imag(z1) # 虚部: 4
m = abs(z1) # 模: 5 (sqrt(3^2 + 4^2))
a = angle(z1) # 辐角(弧度)
z_conj = conj(z1) # 共轭: 3-4i
# 创建复数的另一种方式
z = complex(3, 4) # 等价于 3+4i
注意:TianYuan 不将 i/j 注册为预定义常量,虚数必须通过字面量(如 4i)或 complex() 函数创建,以避免破坏 for i = 1:10 等常见用法。
Cell 数组
Cell 数组可以存储不同类型的元素,使用花括号 {} 创建和索引:
% 创建 Cell 数组
c = {1, "hello", [1 2 3]} # 1行3列 cell
# 二维 Cell 数组
d = {1, "a"; 2, "b"} # 2×2 cell
# 访问元素(使用花括号索引)
val1 = c{1} # 1(数值)
val2 = c{2} # "hello"(字符串)
val3 = c{3} # [1 2 3](矩阵)
# 修改元素
c{2} = "world"
c{4} = 42 # 追加新元素
# 类型检查
iscell(c) # 返回 1
Cell 使用花括号 {} 定义和索引(对比矩阵的方括号 [] 和圆括号 ())。
Struct(结构体)
Struct 使用点号 . 访问命名字段,可以存储不同类型的数据:
% 直接赋值创建结构体(无需预先声明)
person.name = "Alice"
person.age = 30
person.scores = [85 90 95]
# 访问字段
disp(person.name) # "Alice"
disp(person.age) # 30
# 使用 struct() 函数创建
p = struct()
p.x = 1
p.y = 2
# struct 相关函数
fieldnames(person) # 返回字段名 Cell 数组:{"age", "name", "scores"}
isfield(person, "age") # 1(存在该字段)
isfield(person, "sex") # 0(不存在)
rmfield(person, "age") # 返回删除字段后的新结构体
isstruct(person) # 1
字段按字母顺序存储,fieldnames() 返回有序的字段名列表。
类型检查函数
isscalar - 检查是否为标量
isscalar(5) # 返回 1 (true)
isscalar([1 2 3]) # 返回 0 (false)
isscalar([5]) # 返回 1 (1×1 矩阵也是标量)
isvector - 检查是否为向量
isvector([1 2 3]) # 返回 1 (行向量)
isvector([1; 2; 3]) # 返回 1 (列向量)
isvector([1 2; 3 4]) # 返回 0 (2×2 矩阵)
isvector(5) # 返回 1 (标量也是向量)
ismatrix - 检查是否为矩阵
ismatrix([1 2; 3 4]) # 返回 1
ismatrix([1 2 3]) # 返回 1 (向量也是矩阵)
ismatrix(5) # 返回 1 (标量也是矩阵)
在 TianYuan 中,所有数值都是矩阵,所以 ismatrix 对所有数值都返回 true。
isempty - 检查是否为空
isempty([]) # 返回 1
isempty([1 2 3]) # 返回 0
isempty(zeros(0, 5)) # 返回 1
其他类型检查函数
% 检查特殊值
isnan(nan) # 返回 1
isnan(5) # 返回 0
isinf(inf) # 返回 1
isinf(5) # 返回 0
isfinite(5) # 返回 1
isfinite(inf) # 返回 0
# 检查复合类型
iscell({1, 2}) # 返回 1(是 Cell 数组)
iscell([1, 2]) # 返回 0
isstruct(person) # 返回 1(是结构体)
isstring("hello") # 返回 1(是字符串)
类型转换函数
double - 转换为双精度数值
在 TianYuan 中,所有数值已经是 double 类型,此函数主要用于兼容性:
x = double(42) # 确保为 double 类型
y = double([1 2 3]) # 对矩阵同样适用
num2str - 数字转字符串
s1 = num2str(42) # "42"
s2 = num2str(3.14) # "3.14"
s3 = num2str(pi) # "3.14159"
# 在输出中使用
disp("值为:" + num2str(x))
获取矩阵信息
A = [1 2 3; 4 5 6]
# 获取大小
sz = size(A) # 返回 [2 3]
[m, n] = size(A) # m = 2, n = 3
# 获取行数和列数
m = size(A, 1) # 2 (行数)
n = size(A, 2) # 3 (列数)
# 获取元素总数
n = numel(A) # 6
# 获取长度(最大维度)
len = length(A) # 3 (max(2, 3))
综合示例
# 创建不同类型的数据
scalar = 42
row_vec = [1 2 3 4 5]
col_vec = [1; 2; 3; 4; 5]
matrix = [1 2 3; 4 5 6; 7 8 9]
text = "Hello, TianYuan!"
# 使用矩阵创建函数
Z = zeros(3, 3)
O = ones(2, 4)
I = eye(4)
R = rand(2, 3)
N = randn(3, 3)
D = randi(10, 2, 3)
# 类型检查
if isscalar(scalar)
disp("scalar 是标量")
end
if isvector(row_vec)
disp("row_vec 是向量")
end
if isempty([])
disp("空矩阵")
end
# 获取矩阵信息
[rows, cols] = size(matrix)
disp("矩阵大小:" + num2str(rows) + "×" + num2str(cols))
# 生成随机数据
data = randn(100, 1) # 100个正态分布随机数
dice = randi(6, 10) # 模拟投掷10次骰子