2015-04-27 181 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