Улучшение R эффективность сценария

Я пытаюсь написать сценарий R, который, как первый шаг, вычисляет dist() и другие вещи для каждого ряда входной матрицы и затем, как второй шаг сценария, использование каждый пары матриц продукции, полученных в шаге один, чтобы сделать другое вычисление. Моя проблема состоит в том, что я не в состоянии "сохранить" все матрицы, полученные из шага один. Кто-то может сказать мне хорошую стратегию?

Мой код похож на это:

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
nl ja de
Замена еще с } еще { прежде, чем стараться избегать вложенного для петли и возможно векторизует.
добавлено автор Roland, источник

2 ответы

Вы не должны повторно вычислить внутреннюю часть j петля, взять ее снаружи.

Кроме того, вы не должны пересматривать функцию в петле каждый раз (предполагающий, что это ни от чего не зависит в петле).

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
            }
    }
}   

Попробуйте это, запустите ваши тесты (вы написали тесты, правильно?) и посмотрите.

3
добавлено
Это работает отлично!!!!!!!!!!!: D очень счастливый за! Огромное спасибо!!!!!!!:)
добавлено автор Gabelins, источник
Я попробовал его на довольно большой испытательной матрице (400x400). it' s быстрее уважают мой сценарий (занимает половину времени, когда для моего сценария нужно). Проблема - это I' ve, чтобы использовать его на 5000x700 матрица.... это возьмет так или иначе к большому количеству времени! Другой improvments/advices? спасибо
добавлено автор Gabelins, источник
Переосмысление, в который смысл? переписать в C и использовать RCpp или другие чувства?
добавлено автор Gabelins, источник
Звучит великолепно вещь пляжа. I' ll пробуют тот алгоритм! спасибо за терпение!
добавлено автор Gabelins, источник
Для реальной скорости перепишите все это в C или C++, и используйте RCpp. Общие руководящие принципы при ускорении вещей на каком-либо языке программирования применяют - случаи теста записи, представляют ваш код (см.? Rprofile), затем оптимизируйте биты, которые занимают большую часть времени.
добавлено автор Spacedman, источник
Можно внести более крошечные изменения (например, sqrt (средний (A*A)) постоянное в j петле, поэтому возьмите ту внешнюю сторону), но если вы хотите ускорения порядка величины, необходимо заново обдумать.
добавлено автор Spacedman, источник
Переосмысление в каждом смысле: подобразец от ваших данных, рассмотрите управление параллельно или на группе, нахождение нового алгоритма, уйти c работы и проживание как художник на пляже где-нибудь...
добавлено автор Spacedman, источник

Теперь, когда вы заставили улучшения своего кода изучить пакет компилятора. Используя компилятор с enablejit (3) МОЖНО побрить некоторое свободное время сценарий с большим перекручиванием.

0
добавлено