矩阵函数

TianYuan 提供了完整的矩阵创建、操作和线性代数计算功能。矩阵是 TianYuan 的核心数据结构,所有数值都可以视为矩阵(标量是 1×1 矩阵,向量是 n×1 或 1×n 矩阵)。

矩阵创建函数

zeros - 零矩阵

语法 说明
zeros(n) 创建 n×n 零矩阵
zeros(m, n) 创建 m×n 零矩阵
zeros([m, n]) 使用尺寸向量创建零矩阵
# 创建不同尺寸的零矩阵
A = zeros(3)       # 3×3 零矩阵
B = zeros(2, 4)    # 2×4 零矩阵
C = zeros([3, 2])  # 3×2 零矩阵

# 使用 size 函数创建同样大小的矩阵
D = rand(4, 3)
E = zeros(size(D))  # 创建与 D 同尺寸的零矩阵

ones - 全1矩阵

语法 说明
ones(n) 创建 n×n 全1矩阵
ones(m, n) 创建 m×n 全1矩阵
ones([m, n]) 使用尺寸向量创建全1矩阵
# 创建全1矩阵
A = ones(3)        # 3×3 全1矩阵
B = ones(2, 5)     # 2×5 全1矩阵

# 创建常数矩阵
C = 5 * ones(3, 3)  # 3×3 全5矩阵

# 创建列向量
v = ones(5, 1)      # 5×1 列向量

eye - 单位矩阵

语法 说明
eye(n) 创建 n×n 单位矩阵
eye(m, n) 创建 m×n 矩阵,对角线为1
eye([m, n]) 使用尺寸向量创建单位矩阵
# 创建单位矩阵
I3 = eye(3)         # 3×3 单位矩阵
I5 = eye(5)         # 5×5 单位矩阵

# 验证单位矩阵性质
A = rand(3, 3)
B = A * eye(3)      # B = A
C = eye(3) * A      # C = A

# 创建非方阵单位矩阵
D = eye(3, 5)       # 3×5,前3列对角线为1

rand - 均匀分布随机矩阵

语法 说明
rand(n) 创建 n×n 随机矩阵,元素在 [0,1) 均匀分布
rand(m, n) 创建 m×n 随机矩阵
rand([m, n]) 使用尺寸向量创建随机矩阵
# 生成随机矩阵
A = rand(3, 3)      # 3×3 随机矩阵,元素在 [0,1)

# 生成指定范围的随机数
# [a, b) 范围: a + (b-a) * rand(...)
B = -5 + 10 * rand(2, 4)  # 2×4 矩阵,元素在 [-5, 5)

# 生成随机向量
v = rand(10, 1)     # 10×1 随机列向量

randn - 正态分布随机矩阵

语法 说明
randn(n) 创建 n×n 随机矩阵,元素服从标准正态分布 N(0,1)
randn(m, n) 创建 m×n 标准正态分布随机矩阵
randn([m, n]) 使用尺寸向量创建正态分布随机矩阵
# 生成标准正态分布随机矩阵
A = randn(3, 3)     # 均值0,标准差1

# 生成指定均值和标准差的正态分布
mu = 10             # 均值
sigma = 2           # 标准差
B = mu + sigma * randn(100, 1)  # 100个正态分布随机数

# 验证统计特性
data = randn(10000, 1)
mean_val = mean(data)     # 应接近 0

randi - 均匀分布随机整数矩阵

语法 说明
randi(imax, n) 创建 n×n 矩阵,元素为 [1, imax] 范围的整数
randi(imax, m, n) 创建 m×n 随机整数矩阵
randi([imin, imax], m, n) 创建元素在 [imin, imax] 范围的随机整数矩阵
# 生成随机整数矩阵
A = randi(10, 3, 3)         # 3×3 矩阵,元素在 [1, 10]
B = randi([5, 15], 2, 4)    # 2×4 矩阵,元素在 [5, 15]

# 模拟掷骰子
dice_rolls = randi(6, 100, 1)  # 100次掷骰子结果

# 生成随机索引
n = 50
random_indices = randi(n, 10, 1)  # 10个在 [1, n] 范围的随机索引

rng - 随机数生成器种子

语法 说明
rng(seed) 设置随机数生成器种子,用于生成可重复的随机序列
# 设置随机种子以获得可重复结果
rng(42)
A1 = rand(3, 3)

rng(42)             # 重新设置相同种子
A2 = rand(3, 3)     # A2 与 A1 相同

# 用于调试和测试
rng(0)
test_data = randn(100, 1)

linspace - 线性等间距向量

语法 说明
linspace(x1, x2, n) 生成从 x1 到 x2 的 n 个等间距点的行向量
# 生成等间距点
x = linspace(0, 10, 11)     # [0, 1, 2, ..., 10]
y = linspace(-1, 1, 5)      # [-1, -0.5, 0, 0.5, 1]

# 用于绘图
x = linspace(0, 2*pi, 100)
y = sin(x)
plot(x, y)

# 生成网格
x = linspace(-5, 5, 50)
y = linspace(-5, 5, 50)

冒号运算符 - 序列生成

语法 说明
start:end 从 start 到 end,步长为1
start:step:end 从 start 到 end,步长为 step
# 基本序列
a = 1:5             # [1, 2, 3, 4, 5]
b = 0:2:10          # [0, 2, 4, 6, 8, 10]
c = 5:-1:1          # [5, 4, 3, 2, 1]

# 浮点序列
d = 0:0.1:1         # [0, 0.1, 0.2, ..., 1.0]

# 用于循环索引
for i = 1:10
    disp(i)
end

矩阵信息函数

函数 说明 返回值 示例
size(A) 返回矩阵尺寸 行向量 [行数, 列数] size([1 2; 3 4]) → [2, 2]
length(A) 返回最大维度 max(行数, 列数) length([1 2 3]) → 3
numel(A) 返回元素总数 行数 × 列数 numel([1 2; 3 4]) → 4
isscalar(A) 判断是否为标量 布尔值 isscalar(5) → 1
isvector(A) 判断是否为向量 布尔值 isvector([1 2 3]) → 1
ismatrix(A) 判断是否为矩阵 布尔值(总是1) ismatrix([1 2]) → 1
isempty(A) 判断是否为空 布尔值 isempty([]) → 1

矩阵信息函数示例

# 获取矩阵尺寸
A = rand(3, 4)
sz = size(A)          # [3, 4]
rows = sz(1)          # 3
cols = sz(2)          # 4

# 判断矩阵类型
x = 5
v = [1 2 3]
M = [1 2; 3 4]

if isscalar(x)
    disp('x 是标量')
end

if isvector(v)
    n = length(v)
    disp(['v 是长度为 ', num2str(n), ' 的向量'])
end

# 计算元素总数
total_elements = numel(M)

# 动态创建相同尺寸的矩阵
B = zeros(size(A))
C = ones(size(A))

矩阵操作函数

transpose - 转置

语法 说明
transpose(A)A' 返回矩阵 A 的转置
# 矩阵转置
A = [1 2 3; 4 5 6]
B = transpose(A)      # 或 B = A'
# B = [1 4; 2 5; 3 6]

# 向量转置
row_vec = [1 2 3]
col_vec = row_vec'    # 列向量

# 转置的性质
C = rand(3, 4)
D = rand(4, 2)
result1 = (C * D)'
result2 = D' * C'     # result1 == result2

reshape - 重塑

语法 说明
reshape(A, m, n) 将矩阵 A 重塑为 m×n 矩阵(按列顺序)
# 重塑矩阵
A = [1 2 3 4 5 6]     # 1×6 行向量
B = reshape(A, 2, 3)  # 2×3 矩阵
# B = [1 3 5; 2 4 6]

C = reshape(A, 3, 2)  # 3×2 矩阵
# C = [1 4; 2 5; 3 6]

# 向量化
M = [1 2; 3 4; 5 6]
v = reshape(M, 1, 6)  # 转为行向量 [1 3 5 2 4 6]

# 转为列向量
v_col = reshape(M, 6, 1)

diag - 对角矩阵和提取对角线

语法 说明
diag(v) 以向量 v 为对角线创建对角矩阵
diag(A) 提取矩阵 A 的主对角线为列向量
# 创建对角矩阵
v = [1 2 3]
D = diag(v)
# D = [1 0 0; 0 2 0; 0 0 3]

# 提取对角线
A = [1 2 3; 4 5 6; 7 8 9]
d = diag(A)           # [1; 5; 9]

# 创建单位矩阵的另一种方式
I = diag(ones(1, 5))  # 5×5 单位矩阵

# 对角矩阵的应用
eigenvalues = [2, 3, 5]
D = diag(eigenvalues)

dot - 向量点积

语法 说明
dot(a, b) 计算向量 a 和 b 的点积(内积)
# 向量点积
a = [1, 2, 3]
b = [4, 5, 6]
result = dot(a, b)    # 1*4 + 2*5 + 3*6 = 32

# 等价计算
result2 = sum(a .* b)
result3 = a * b'      # 如果是行向量

# 计算向量长度
v = [3, 4]
length_v = sqrt(dot(v, v))  # 5

# 判断向量正交
v1 = [1, 0]
v2 = [0, 1]
if dot(v1, v2) == 0
    disp('向量正交')
end

cross - 向量叉积

语法 说明
cross(a, b) 计算3维向量 a 和 b 的叉积(外积)
# 向量叉积
a = [1, 0, 0]
b = [0, 1, 0]
c = cross(a, b)       # [0, 0, 1]

# 验证叉积性质
# a × b 垂直于 a 和 b
dot_ac = dot(a, c)    # 0
dot_bc = dot(b, c)    # 0

# 计算平行四边形面积
v1 = [3, 0, 0]
v2 = [1, 4, 0]
area_vec = cross(v1, v2)
area = sqrt(dot(area_vec, area_vec))

线性代数函数

函数 说明 要求 示例
inv(A) 矩阵的逆 方阵且可逆 inv(eye(3)) → 单位矩阵
det(A) 行列式 方阵 det(eye(3)) → 1
rank(A) 矩阵的秩 任意矩阵 rank([1 2; 2 4]) → 1
trace(A) 矩阵的迹 方阵 trace([1 2; 3 4]) → 5
cond(A) 条件数 方阵 cond(eye(3)) → 1
norm(A) 矩阵范数 任意矩阵 norm([3, 4]) → 5
eig(A) 特征值 方阵 返回特征值向量
chol(A) Cholesky分解 对称正定矩阵 返回上三角矩阵 R,使得 A = R'*R

逆矩阵示例

# 计算逆矩阵
A = [1 2; 3 4]
A_inv = inv(A)

# 验证 A * inv(A) = I
I = A * A_inv
disp('A * inv(A):')
disp(I)

# 求解线性方程组 Ax = b
# x = inv(A) * b
b = [5; 11]
x = inv(A) * b
# 验证
result = A * x        # 应该等于 b

# 判断矩阵是否可逆
if det(A) != 0
    disp('矩阵可逆')
end

行列式示例

# 计算行列式
A = [1 2 3; 0 4 5; 0 0 6]
d = det(A)            # 1*4*6 = 24

# 判断矩阵是否奇异
if abs(det(A)) < 1e-10
    disp('矩阵接近奇异')
else
    disp('矩阵非奇异')
end

# 计算体积(3维情况)
# 三个向量构成的平行六面体体积
v1 = [1, 0, 0]
v2 = [0, 2, 0]
v3 = [0, 0, 3]
V = [v1; v2; v3]
volume = abs(det(V))  # 6

秩和迹示例

# 计算矩阵的秩
A = [1 2 3; 2 4 6; 3 6 9]
r = rank(A)           # 1,因为所有行线性相关

B = eye(3)
r2 = rank(B)          # 3,满秩

# 计算迹
A = [1 2 3; 4 5 6; 7 8 9]
tr = trace(A)         # 1 + 5 + 9 = 15

# 迹的性质: trace(A + B) = trace(A) + trace(B)
B = rand(3, 3)
tr1 = trace(A + B)
tr2 = trace(A) + trace(B)

特征值和特征向量

# 计算特征值
A = [4 1; 2 3]
lambda = eig(A)
disp('特征值:')
disp(lambda)

# 对称矩阵的特征值
S = [2 1; 1 2]
lambda_s = eig(S)     # 对称矩阵特征值为实数

# 应用:判断矩阵是否正定
lambda_vals = eig(A)
if min(lambda_vals) > 0
    disp('矩阵正定')
end

范数和条件数

# 向量范数
v = [3, 4]
v_norm = norm(v)      # 欧几里得范数: sqrt(3^2 + 4^2) = 5

# 矩阵范数
A = [1 2; 3 4]
A_norm = norm(A)

# 条件数(衡量矩阵的病态程度)
A = [1 2; 3 4]
cond_A = cond(A)
# 条件数越大,矩阵越病态

# 希尔伯特矩阵(病态矩阵示例)
n = 5
H = zeros(n, n)
for i = 1:n
    for j = 1:n
        H(i, j) = 1 / (i + j - 1)
    end
end
cond_H = cond(H)      # 很大的数,表示病态

Cholesky 分解

# Cholesky 分解(用于对称正定矩阵)
A = [4 2; 2 3]        # 对称正定
R = chol(A)           # 上三角矩阵

# 验证 A = R' * R
A_reconstructed = R' * R
disp('原始矩阵 A:')
disp(A)
disp('重建的矩阵 R''*R:')
disp(A_reconstructed)

# 应用:高效求解线性方程组
b = [8; 7]
# 求解 Ax = b,其中 A = R'*R
# 先解 R'*y = b,再解 R*x = y

统计函数

函数 说明 用法
sum(A) 求和 按列求和(返回行向量)
mean(A) 平均值 按列计算平均值
max(A) 最大值 按列找最大值
min(A) 最小值 按列找最小值

统计函数示例

# 向量统计
v = [1, 5, 3, 9, 2]
total = sum(v)        # 20
average = mean(v)     # 4
max_val = max(v)      # 9
min_val = min(v)      # 1

# 矩阵统计(按列)
A = [1 2 3; 4 5 6]
col_sums = sum(A)     # [5, 7, 9]
col_means = mean(A)   # [2.5, 3.5, 4.5]
col_max = max(A)      # [4, 5, 6]
col_min = min(A)      # [1, 2, 3]

# 计算所有元素的统计值
total_sum = sum(sum(A))        # 21
overall_mean = mean(mean(A))   # 3.5

# 数据分析示例
scores = [85, 92, 78, 95, 88]
average_score = mean(scores)
highest_score = max(scores)
lowest_score = min(scores)
total_score = sum(scores)

disp(['平均分: ', num2str(average_score)])
disp(['最高分: ', num2str(highest_score)])
disp(['最低分: ', num2str(lowest_score)])
disp(['总分: ', num2str(total_score)])

综合应用示例

示例1:最小二乘法拟合

# 线性最小二乘拟合 y = ax + b
# 数据点
x = [1, 2, 3, 4, 5]'
y = [2.1, 3.9, 6.2, 8.1, 9.8]'

# 构造设计矩阵
X = [x, ones(length(x), 1)]

# 法方程求解: X'*X*beta = X'*y
beta = inv(X' * X) * (X' * y)

a = beta(1)
b = beta(2)
disp(['拟合结果: y = ', num2str(a), 'x + ', num2str(b)])

# 绘制结果
x_plot = linspace(min(x), max(x), 100)'
y_fit = a * x_plot + b
plot(x, y, 'o')
hold('on')
plot(x_plot, y_fit, '-')
legend(['数据点', '拟合直线'])

示例2:主成分分析(PCA)简化

# 数据矩阵(每行一个样本)
X = randn(100, 5)     # 100个样本,5个特征

# 中心化数据
X_mean = mean(X)
X_centered = X - ones(size(X, 1), 1) * X_mean

# 计算协方差矩阵
C = (X_centered' * X_centered) / (size(X, 1) - 1)

# 特征值分解
lambda = eig(C)
disp('特征值(按降序):')
disp(sort(lambda, 'descend'))

# 主成分的方差贡献率
explained_variance = lambda / sum(lambda) * 100

示例3:图像处理(2D卷积)

# 创建简单图像
image = zeros(10, 10)
image(3:7, 3:7) = 1   # 中心白色方块

# 边缘检测滤波器(简化的Sobel)
kernel_x = [-1 0 1; -2 0 2; -1 0 1]
kernel_y = [-1 -2 -1; 0 0 0; 1 2 1]

# 卷积操作(简化版)
# 实际应用中需要更复杂的实现

示例4:马尔可夫链

# 转移概率矩阵
P = [0.7 0.3 0; 0.2 0.6 0.2; 0.1 0.3 0.6]

# 初始状态分布
pi0 = [1; 0; 0]

# 计算 n 步后的状态分布
n = 10
pi_n = (P^n)' * pi0

disp([num2str(n), ' 步后的状态分布:'])
disp(pi_n)

# 稳态分布(特征值为1的特征向量)
# 这里简化处理,实际应求解 (P-I)*pi = 0
pi_steady = (P^100)' * pi0
disp('稳态分布:')
disp(pi_steady / sum(pi_steady))

示例5:数值积分(梯形法则)

# 计算 ∫[a,b] f(x) dx
a = 0
b = pi
n = 100

x = linspace(a, b, n)
y = sin(x)

# 梯形法则
h = (b - a) / (n - 1)
integral = h * (sum(y) - (y(1) + y(n)) / 2)

disp(['数值积分结果: ', num2str(integral)])
disp(['理论值: ', num2str(2)])  # ∫[0,π] sin(x) dx = 2

注意事项

矩阵索引

  • TianYuan 使用1-based索引(第一个元素索引为1)
  • 支持单索引和双索引:A(i, j)A(k)
  • 支持切片:A(1:3, 2:4)

数值稳定性

  • 避免直接计算逆矩阵,优先使用线性求解器
  • 计算 x = A\bx = inv(A)*b 更稳定
  • 对于病态矩阵(大条件数),结果可能不准确
  • 使用 Cholesky 分解处理对称正定矩阵效率更高

内存考虑

  • 大矩阵运算消耗大量内存
  • 使用稀疏矩阵技术处理稀疏数据
  • 及时清理不需要的大矩阵

随机数

  • 使用 rng(seed) 设置种子以获得可重复结果
  • rand 生成 [0,1) 均匀分布
  • randn 生成标准正态分布 N(0,1)
  • randi 生成整数