使用矩阵数学在矩阵上应用
Tapply over matrix using matrix math
全部,
我有以下代码,我想将其推广到更多集群,即 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 采用向量与矩阵:
> 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
可以通过 tapply
尝试这样做
tapply(seq_len(ncol(X)), cluster, function(x) f(T%*%X[, x]))
# 0 1
# 3840.681 1238.826
全部, 我有以下代码,我想将其推广到更多集群,即 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 采用向量与矩阵:
> 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
可以通过 tapply
tapply(seq_len(ncol(X)), cluster, function(x) f(T%*%X[, x]))
# 0 1
# 3840.681 1238.826