如何通过向量化计算复矩阵的欧氏距离矩阵?
复矩阵距离矩阵的向量化实现
对于给定的S×N型复矩阵X,我们可以通过欧氏距离的代数推导实现完全向量化的距离矩阵计算,替代双层循环,大幅提升大N场景下的运行效率。
推导过程
复向量x_i和x_j的欧氏距离平方可展开为:
$$|x_i - x_j|^2 = (x_i - x_j)^H (x_i - x_j) = |x_i|^2 + |x_j|^2 - 2\Re(x_i^H x_j)$$
其中$(\cdot)^H$表示共轭转置,$\Re(\cdot)$表示取实部。
基于这个公式,我们可以拆解为三步完成计算:
- 计算每个列向量的模长平方:
$\|x_i\|^2 = \sum_{k=1}^S |X(k,i)|^2$ - 构造两两模长平方和的矩阵:每个元素为
$\|x_i\|^2 + \|x_j\|^2$ - 计算共轭内积的实部矩阵,代入公式得到距离平方矩阵,最后开根号得到距离矩阵
向量化代码实现
% 计算每个列向量的模长平方 norm_sq = sum(abs(X).^2, 1)'; % 构造两两模长平方和的矩阵 A = norm_sq * ones(1, N); B = ones(N, 1) * norm_sq'; % 计算共轭内积的实部矩阵 inner_prod = X' * X; % 计算距离平方矩阵并开根号 D_sq = A + B - 2 * real(inner_prod); % 处理浮点精度误差导致的极小负值 D_sq(D_sq < 0) = 0; D = sqrt(D_sq);
代码说明
abs(X).^2计算每个复元素的模平方,sum(...,1)按列求和得到每个列向量的模长平方X' * X在MATLAB中对复矩阵自动执行共轭转置乘法,得到的矩阵元素为$x_i^H x_j$- 最后修正距离平方矩阵的极小负值(由浮点精度误差导致),再开根号得到最终的距离矩阵
正确性验证
该代码的计算结果与原循环代码完全一致,且对于大N(如N=1000),向量化实现的运行速度远快于双层循环。
内容的提问来源于stack exchange,提问作者Jie zhou
相关产品推荐
相关产品推荐

