将距离向量转换为R中距离对象的有效方法(理想情况下无需创建完整的距离矩阵)
我有一个距离向量,我从其他程序中得到,我想把它转换成将距离向量转换为R中距离对象的有效方法(理想情况下无需创建完整的距离矩阵),r,matrix,vector,distance,R,Matrix,Vector,Distance,我有一个距离向量,我从其他程序中得到,我想把它转换成R语言中的dist对象 下面我给出一个这样一个向量的例子:distVector的计算方法与上述其他过程计算距离向量的方法相同。理想情况下,我希望在不浪费资源的情况下将此向量转换为距离矩阵(distobject) 我想我可以把它转换成一个矩阵,把它复制成上三角矩阵和下三角矩阵,把对角线设置为0,然后处理这样一个事实,即与dist对象结构相比,它有点像倒置的(比较下面的输出)。再一次,首先创建一个完整的矩阵,然后(可能?)在dist对象中将其再次缩
R
语言中的dist
对象
下面我给出一个这样一个向量的例子:distVector
的计算方法与上述其他过程计算距离向量的方法相同。理想情况下,我希望在不浪费资源的情况下将此向量转换为距离矩阵(dist
object)
我想我可以把它转换成一个矩阵,把它复制成上三角矩阵和下三角矩阵,把对角线设置为0,然后处理这样一个事实,即与dist
对象结构相比,它有点像倒置的(比较下面的输出)。再一次,首先创建一个完整的矩阵,然后(可能?)在dist
对象中将其再次缩减为向量,这对我来说似乎是浪费。有更好的办法吗
示例代码(注意:我无法更改distVector
的计算方式):
非常感谢,,
托马斯。创建矩阵对我来说似乎是合理的<这是一个简短而漂亮的答案。我还不熟悉R
。我想知道这个的内存消耗是多少?这会创建一个完整的mm矩阵,用我的数据填充它的下三角,然后在我随后的as.dist
调用中再次提取这个下三角吗?或者它只是为mm矩阵或其他东西创建了一个空容器,而不消耗太多内存?不管怎样,你的方法对我来说似乎是可行的。谢谢^ ^对不起,我不知道R的内存使用/对象复制等情况。有相当多的问题,所以我们已经看了这些东西虽然-是我的第一次搜索命中。。可能是useful@user20650:啊,那太多了。好吧,除非有一个更简单的,非矩阵创建的解决方案,我会接受你的建议,因为它是非常紧凑的代码。如果明天之前没有非矩阵创建解决方案出现,如果您愿意,可以复制粘贴您的评论作为答案,我将接受。(基本上,这是一个答案。)@user20650:注意,标题已更改。再次感谢。创建矩阵对我来说似乎是合理的<这是一个简短而漂亮的答案。我还不熟悉R
。我想知道这个的内存消耗是多少?这会创建一个完整的mm矩阵,用我的数据填充它的下三角,然后在我随后的as.dist
调用中再次提取这个下三角吗?或者它只是为mm矩阵或其他东西创建了一个空容器,而不消耗太多内存?不管怎样,你的方法对我来说似乎是可行的。谢谢^ ^对不起,我不知道R的内存使用/对象复制等情况。有相当多的问题,所以我们已经看了这些东西虽然-是我的第一次搜索命中。。可能是useful@user20650:啊,那太多了。好吧,除非有一个更简单的,非矩阵创建的解决方案,我会接受你的建议,因为它是非常紧凑的代码。如果明天之前没有非矩阵创建解决方案出现,如果您愿意,可以复制粘贴您的评论作为答案,我将接受。(基本上,这是一个答案。)@user20650:注意,标题已更改。再次感谢。
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))
> 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