2015-04-27 215 views
2

全部, 我有以下代碼,我想將它推廣到更多的羣集,即C羣集。有沒有辦法做到這一點沒有循環?這裏,X的行對應於變量x1,x2,T是X的線性變換。謝謝。使用矩陣運算矩陣求矩陣

X=matrix(c(2,3,4,5,6,7,8,9,2,3,4,5,6,7,8,9),2) 
cluster=c(1,1,1,0,0,0,0,0) 
T=matrix(c(1,2,2,1),2) 
f<-function(x) max(eigen(t(x)%*%x)$values) 
f(T%*%X[,cluster==0])+f(T%*%X[,cluster==1]) 
## [1] 1134.87 

我在想

sum(tapply(X,cluster,function(x) f(T%*%x))) 

,但我得到這個錯誤,我想是因爲tapply需要一個向量VS矩陣:

> sum(tapply(X,cluster,function(x) f(T%*%x))) 
Error in tapply(X, cluster, function(x) f[x]) : 
    arguments must have same length 

這裏是一個for循環的答案,如果你能找到沒有迴路的東西,請讓我知道

# 
    c=length(levels(factor(cluster))) 
    cluster=factor(cluster,labels=1:c) 
    s=0 
    for (i in 1:c){ 
    s=s+f(T%*%X[,cluster==c]) 
    } 
    s 
    ## [1] 1134.872 
+0

這樣做,你應該叫'F'用圓括號中,'F()' – Frank

+0

不,T%*%X不是正方形的,這就是爲什麼f爲以T(X )%*%x做一個正方形矩陣。 T是X的線性變換,我正在研究如何影響編號爲0和1的集羣的主要組件。 – Rik

回答

1

可以試試通過tapply

tapply(seq_len(ncol(X)), cluster, function(x) f(T%*%X[, x])) 
#  0  1 
# 3840.681 1238.826 
+0

非常好!我用sum(sapply(split(t(X),cluster),function(x)f(T%*%t(X)))),但基本上是相同的東西。謝謝 – Rik

+0

對不起,你得到了相同的結果,因爲我在代碼中有一個錯字,它是f(x)中的一個大寫字母x – Rik

+0

由於某種原因,此分割線給出了相同的答案,可能是一個錯誤,我認爲這是正確的,因爲當我分裂X時,它給了我載體。你可以將矢量轉換成一個矩陣,但是有一個缺失的步驟,並且它變成一條長線 – Rik