数据类型

数据类型概述

TianYuan 支持以下数据类型:

类型说明示例
标量 / 矩阵双精度浮点数,矩阵是一等公民x = 42A = [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)

预定义常量

常量 说明
pi3.14159...圆周率
e2.71828...自然常数(欧拉数)
eps2.2204e-16浮点机器精度
inf / Inf正无穷大(两者等价)
nan / NaNNaN非数值(两者等价)

特殊值的运算

# 无穷大运算
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 支持复数类型。虚部使用 ij 后缀:

% 创建复数
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次骰子