You need to enable JavaScript to run this app.
优惠活动
大模型
产品
解决方案
定价
更多

如何在Octave中手动生成pdist2函数的索引I?

替代MATLAB pdist2返回索引I的实现方法

MATLAB的pdist2函数支持返回[D, I],其中D是样本间的距离矩阵,I是对应最近邻(或指定k个邻居)的索引;但GNU Octave的pdist2仅能输出距离矩阵D。以下是手动生成索引I的方法:

示例数据

给定矩阵X:

X = [-0.2515    1.0451   -1.2817
     -1.9741    0.2782   -1.0234
     10.6772   10.7365    9.9264
      8.7785   11.1680    9.5915
    -34.2330  -30.8410  -31.7200
    -32.6290  -31.7860  -31.2900
     45.0000   43.0000         0
     23.0000   -3.0000    2.0000];

通过D = pdist2(X, X, "euclidean")得到欧氏距离矩阵:

D = [0.0000000       1.9032127       18.4114208      17.3850403      55.6593018      55.0153084      61.7215919      23.8278294
     1.9032127       0.0000000       19.7314529      18.6247940      54.3260574      53.7019653      63.5040855      25.3691425
     18.4114208      19.7314529      0.0000000       1.9757286       74.0272751      73.3647156      48.1406441      20.0840893
     17.3850403      18.6247940      1.9757286       0.0000000       72.9478302      72.3251266      49.1657410      21.4619255
     55.6593018      54.3260574      74.0272751      72.9478302      0.0000000       1.9108551       112.8561935     72.0262222
     55.0153084      53.7019653      73.3647156      72.3251266      1.9108551       0.0000000       112.2420197     70.9326706
     61.7215919      63.5040855      48.1406441      49.1657410      112.8561935     112.2420197     0.0000000       51.0294037
     23.8278294      25.3691425      20.0840893      21.4619255      72.0262222      70.9326706      51.0294037      0.0000000];

方法1:生成每个样本的最近邻索引(排除自身)

由于距离矩阵对角线是样本自身的距离(值为0),通常我们需要排除自身,找到其他样本中的最近邻:

% 将对角线(自身距离)设为无穷大,避免选中自己
D_no_self = D;
D_no_self(1:size(D,1)+1:end) = Inf;
% 提取每行最小值对应的索引,即最近邻索引
[min_dist, I] = min(D_no_self, [], 2);

运行后I的结果为:[2;1;4;3;6;5;3;6],对应每个样本的最近邻索引。

方法2:生成每个样本的k个最近邻索引

如果需要获取每个样本的前k个最近邻(例如k=2),可以通过排序实现:

k = 2;
% 对每行距离排序,得到排序后的距离和对应索引
[sorted_D, sorted_I] = sort(D, 2);

% 排除自身索引,提取前k个最近邻
I_k = cell(size(D,1), 1);
for i = 1:size(D,1)
    % 过滤掉当前行的自身索引
    non_self_idx = sorted_I(i, sorted_I(i,:) ~= i);
    % 取前k个索引
    I_k{i} = non_self_idx(1:k);
end

运行后I_k为单元格数组,每个元素是对应样本的前2个最近邻索引,例如第一行的结果是[2,4],对应距离最小的两个样本。


内容的提问来源于stack exchange,提问作者euraad

相关产品推荐
方舟 Agent Plan

超全模态模型 × Harness 升级,最新支持 Deepseek-V4.1-Flash、GLM-5.3 系列、Doubao-Seedream-5.0-pro、Kimi-K3 (部分), 限时 9.9 元起

最近更新时间:2026.07.03 04:37:08