1. 项目概述
在数据分析与机器学习领域,计算样本间的距离是基础且频繁的操作。MATLAB作为科学计算的主流工具,其内置的pdist函数虽然能计算各种距离,但在处理特定场景时效率未必最优。今天要介绍的sqdistance函数,是我在多年MATLAB性能优化实践中总结出的专门用于计算成对样本平方距离的高效实现。
这个函数特别适合以下场景:
- 需要反复计算大规模数据集的平方距离(如K-means聚类迭代)
- 实时系统对计算延迟敏感的应用
- 需要避免重复计算距离矩阵的算法实现
需要模型API调用? 免费领10W Token,多模型网关一键接入 Claude、DeepSeek 等主流模型。
2. 数学原理与算法选择
2.1 平方距离的矩阵表达
给定两个数据集X(m×d维)和Y(n×d维),它们的平方欧氏距离矩阵D(m×n维)可以通过矩阵运算高效计算:
D(i,j) = ||x_i - y_j||² = (x_i - y_j)ᵀ(x_i - y_j)
= x_iᵀx_i - 2x_iᵀy_j + y_jᵀy_j
这个推导将距离计算转化为矩阵乘法,是MATLAB向量化计算的基础。
2.2 三种实现方案对比
在实际编码中,我们测试了三种实现方式:
- 双重循环逐元素计算(最直观但最慢)
- 使用repmat展开矩阵后向量化计算(中等效率)
- 基于矩阵乘法的优化实现(最快)
测试数据显示,在1000×10维数据上,方案3比方案1快约400倍,比方案2快约3倍。这也是sqdistance函数选择方案3作为核心算法的原因。
3. 函数实现详解
3.1 核心代码解析
matlab复制function D = sqdistance(X, Y)
% 计算两组样本间的平方欧氏距离矩阵
% 输入:
% X - m×d矩阵,每行一个样本
% Y - n×d矩阵,每行一个样本
% 输出:
% D - m×n距离矩阵
if nargin < 2 % 单输入情况,计算X内部样本距离
Y = X;
end
% 核心计算部分
XX = sum(X.^2, 2);
YY = sum(Y.^2, 2);
XY = X * Y';
D = XX + YY' - 2*XY;
% 确保对称性和非负性(处理浮点误差)
D = max(D, 0);
if nargin < 2
D = (D +
