【问题标题】:how to transfer the pairwise distance value in a distance matrix如何在距离矩阵中传输成对距离值
【发布时间】:2013-05-31 20:49:06
【问题描述】:

我对 Matlab 很陌生,现在我想使用 matlab 做一些聚类工作。 如果我有 3 列值

id1 id2 distvalue1

id1 id3 distvalue2 ....

id2 id4 distvalue i .....

总共 5000 个 id,但一些 id 对缺少距离值 在 python 中,我可以循环将这些距离值导入矩阵形式。我怎么能在matlab中做到这一点? 并让matlab知道id1,...idx是标识,第三列是值

谢谢!

【问题讨论】:

  • 这些值在哪里,如果它们还没有在矩阵中?一份文件?数据库? “让 MATLAB 知道”它们是标识符是什么意思?您打算如何访问数据?
  • 它在一个文件中,但我可以 importdata('filename') 并将它们切成一个 n*3 矩阵到 matlab 但我想将它们转移到一个距离矩阵中,比如在第一个和二维数据只是 id。
  • 好的。目前还不清楚你的具体问题是什么......
  • 就这么简单... 如何将第三列(向量)转换成距离矩阵。
  • 假设你的数据是矩阵x,那么x(:, 3)呢?

标签: matlab matrix matlab-guide


【解决方案1】:

基于 cmets,您知道如何将数据转换为 N x 3 矩阵的形式,称为 X,其中X(:,1) 是第一个索引,X(:,2) 是第二个索引,X(:,3) 是对应的距离。

假设索引 (id1...idx) 是任意数字标签。

那么我们可以这样做:

% First, build a list of all the unique indices    
indx = unique([X(:,1); X(:,2)]);
Nindx = length(indx);

% Second, initialize an empty connection matrix, C
C = zeros(Nindx, Nindx);  %or you could use NaN(Nindx, Nindx)

% Third, loop over the rows of X, and map them to points in the matrix C
for n = 1:size(X,1)
     row = find(X(n,1) == indx);
     col = find(X(n,2) == indx);
     C(row,col) = X(n,3);
end

这不是最有效的方法(即以矢量化的方式将 X 的索引重新映射到范围 [1...Nindx]),但对于 5000 个 id 应该没问题。

如果您最终要处理大量唯一索引,其中只有极少数索引对分配了距离值,那么您可能需要考虑使用稀疏矩阵 -- 尝试使用 help sparse -- 代替预分配一个大的零矩阵。

【讨论】:

  • 是的!我认为这很有帮助!非常感谢!