2012-07-15 179 views
0

在我的研究中,每個科目都有n *(n-1)/ 2個問題,關於他對n = 5個對象之間的不相似性的主觀看法(以後用於3維多維縮放)。如何從差異向量中輕鬆創建差異矩陣?

我想從10個項目的矢量v創建一個不相似矩陣,在以下的方式(對於n = 5):

1 
    2 5 
    3 6 8 
    4 7 9 10 

這是實現它對於該特定n中的代碼的示例代碼:

dissim<-rep(0,n*n) 
dim(dissim)<-c(5,5) 
dissim[2,1]<-v[1] 
dissim[3,1]<-v[2] 
dissim[4,1]<-v[3] 
dissim[5,1]<-v[4] 
dissim[3,2]<-v[5] 
dissim[4,2]<-v[6] 
dissim[5,2]<-v[7] 
dissim[4,3]<-v[8] 
dissim[5,3]<-v[9] 
dissim[5,4]<-v[10] 

是否有這有助於做它的任何任何效用函數N +我知道我可以使用兩個嵌套循環來完成它,但是如果我使用了專用函數,代碼會更清晰。

也許我會了解在這個過程中另一個有用的庫的存在?

回答

3
n <- 5 
mat <- matrix(0, ncol = n, nrow = n) 
mat[lower.tri(mat)] <- 1:10 
mat 
    [,1] [,2] [,3] [,4] [,5] 
[1,] 0 0 0 0 0 
[2,] 1 0 0 0 0 
[3,] 2 5 0 0 0 
[4,] 3 6 8 0 0 
[5,] 4 7 9 10 0 
+0

這對我自己的解決方案更好,因爲它不依賴於對象的內部結構。謝謝! – 2012-07-15 11:46:50

0

呃......偶然我自己找到了解決方案。碰巧,dist對象的內部結構是,只是矢量v。那麼,什麼工作原理是:

dissim<-v 
class(dissim)='dist' 
attr(dissim,"Size")<-5 
dissim<-as.dist(dissim) 

它現在,但我不知道這是一個記錄的方式,將永遠是有效的。

+0

這取決於你將如何使用它,因爲'as.matrix(dissim)'顯示完整的矩陣,它不是你需要的矩陣,即距離矩陣是對稱的,只打印下面的三角形就足夠了。 – Julius 2012-07-15 12:12:37