将距离向量转换为 R 中距离对象的有效方法(理想情况下无需创建完整距离矩阵)

问题描述 投票:0回答:2

我有一个从其他过程中获得的距离向量,并希望将其转换为

dist
语言中的
R
对象。

下面我给出一个例子,这样的向量看起来像

distVector
的计算方式与其他过程计算距离向量的方式相同。理想情况下,我想将这个向量转换为距离矩阵(
dist
对象)而不浪费资源。

我想我可以将其转换为矩阵,将其复制为上三角和下三角矩阵,将对角线设置为 0,并处理与

upside down
对象结构相比,它有点
dist
的事实(比较下面的输出)。话又说回来,首先创建一个完整的矩阵,然后(可能?)再次将其减少为
dist
对象中的向量对我来说似乎很浪费。有更好的办法吗?

示例代码(注意:我无法更改

distVector
的计算方式):

rawData<-matrix(c(1,1,1,1.1,1,1,1,1,1.2,2,2,2,2.2,2,2,2,2.2,2.2,3,3,3,3.4,3,3),ncol=3,byrow=TRUE);

distVector<-integer(0);
for(i in 1:dim(rawData)[1]) {
  for(j in (i+1):dim(rawData)[1]) {
    a <- (rawData[i,]-rawData[j,]);
    distVector <- c(distVector, sqrt(a %*% a));
  }
}

print(distVector)
print(dist(rawData))

输出:将

distVector
dist
函数的输出进行比较,它是颠倒的)

> print(distVector)
 [1] 0.1000000 0.2000000 1.7320508 1.8547237 1.9697716 3.4641016 3.7094474 0.2236068 1.6763055
[10] 1.7916473 1.9209373 3.4073450 3.6455452 1.6248077 1.7549929 1.8547237 3.3526109 3.6055513
[19] 0.2000000 0.2828427 1.7320508 1.9899749 0.3464102 1.6248077 1.8547237 1.5099669 1.8000000
[28] 0.4000000

> print(dist(rawData))
          1         2         3         4         5         6         7
2 0.1000000                                                            
3 0.2000000 0.2236068                                                  
4 1.7320508 1.6763055 1.6248077                                        
5 1.8547237 1.7916473 1.7549929 0.2000000                              
6 1.9697716 1.9209373 1.8547237 0.2828427 0.3464102                    
7 3.4641016 3.4073450 3.3526109 1.7320508 1.6248077 1.5099669          
8 3.7094474 3.6455452 3.6055513 1.9899749 1.8547237 1.8000000 0.4000000

非常感谢, 托马斯。

r matrix vector distance
2个回答
0
投票

您可以将类设置为

dist
,但您还需要将
Size
属性设置为全距离矩阵中的行数:

> v=4:9;class(v)="dist";attr(v,"Size")=ceiling(sqrt(length(v)*2));v
  1 2 3
2 4
3 5 7
4 6 8 9

0
投票

使用以下内容:

structure(x, class = 'dist',
          Size = Re(polyroot(c(-2*length(x),-1,1))[1]))

x
是你的
distVector

© www.soinside.com 2019 - 2024. All rights reserved.