我正在尝试编写一个R脚本,作为第一步,为输入矩阵的每一行计算dist()
和其他内容,然后,作为脚本的第二步,使用每对输出矩阵在步骤1中获得进行另一次计算。
我的问题是我无法“保存”从第一步获得的所有矩阵。有人能告诉我一个好的策略吗?
我的代码如下所示:
n<- nrow (aa)
output <- matrix (0, n, n)
for (i in 1:n)
{
for (j in i:n)
{
akl<- function (dii){
ddi<- as.matrix (dii)
m<- rowMeans(ddi)
M<- mean(ddi)
r<- sweep (ddi, 1, m)
b<- sweep (r, 2, m)
return (b + M)
}
A<- akl(dist(aa[i,]))
B<- akl(dist(aa[j,]))
V <- sqrt ((sqrt (mean(A * A))) * (sqrt(mean(B * B))))
if (V > 0) {
output[i,j] <- (sqrt(mean(A * B))) / V else output[i,j] <- 0
}
}
}
我想从akl
函数中获取所有生成的矩阵,然后将其用于剩余的计算。
我在这里展示的脚本在时间上是昂贵的,因为它每次都计算akl,而对于大输入矩阵则是一个问题。
答案 0 :(得分:3)
你不需要在j循环中重新计算A,把它带到外面。
此外,您不需要每次都重新定义循环内的函数(假设它不依赖于循环内的任何内容)。
n<- nrow (aa)
output <- matrix (0, n, n)
akl<- function (dii){
ddi<- as.matrix (dii)
m<- rowMeans(ddi)
M<- mean(ddi)
r<- sweep (ddi, 1, m)
b<- sweep (r, 2, m)
return (b + M)
}
for (i in 1:n)
{
A<- akl(dist(aa[i,]))
for (j in i:n)
{
B<- akl(dist(aa[j,]))
V <- sqrt ((sqrt (mean(A * A))) * (sqrt(mean(B * B))))
if (V > 0) {
output[i,j] <- (sqrt(mean(A * B))) / V else output[i,j] <- 0
}
}
}
试试看,运行你的测试(你有书面测试,对吗?)并看看。
答案 1 :(得分:0)
现在您已经对代码进行了改进,看看编译器包。通过使用带有enablejit(3)的编译器,您可以通过大量循环来缩短脚本的时间。