矩阵函数
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\b 比 x = inv(A)*b 更稳定
- 对于病态矩阵(大条件数),结果可能不准确
- 使用 Cholesky 分解处理对称正定矩阵效率更高
内存考虑
- 大矩阵运算消耗大量内存
- 使用稀疏矩阵技术处理稀疏数据
- 及时清理不需要的大矩阵
随机数
- 使用
rng(seed) 设置种子以获得可重复结果
rand 生成 [0,1) 均匀分布
randn 生成标准正态分布 N(0,1)
randi 生成整数