Arhn - архитектура программирования

Эффективное создание вектора, кодирующего суммированный вес позиции другого вектора

Предположим, у меня есть вектор v и я хотел бы создать другой вектор p такой же длины, который кодирует суммарный вес позиции каждой позиции в v (и 0 вместо 0 в v). Например, для v = c(0,1,3,0,1) я получаю p = c(0, 2, 11, 0, 16). Другими словами, i-й элемент в p (то есть не 0) становится v[i]*i плюс предыдущий элемент в p (то есть не 0).

Я придумал метод, но он кажется уродливым, и я боюсь, что он не очень эффективен по времени/памяти - мне нужно сделать это на огромных векторах. Есть идеи по улучшению?

fun <- function(v){ 
  res <- NULL
      s = 0
      for(i in 1:length(v)){   
        ifelse(v[i] == 0, res[i] <- 0, {res[i] <- v[i]*i + s; s <- res[i]}) 
      }
      return(res)
}

А потом:

> fun(c(0,1,3,0,1))
[1]  0  2 11  0 16

ОБНОВЛЕНИЕ:

Как изменить вывод этой функции, т.е. вернуться к c(0,1,3,0,1) из c(0,2,11,0,16)?

11.02.2016

Ответы:


1

Один из способов — получить кумулятивную сумму v при умножении вектора на номер позиции. Нули так и останутся, а остальные рассчитаются правильно. Наконец, мы можем умножить вектор на преобразованный вектор из единиц и нулей, чтобы по существу получить необходимые нулевые значения:

cumsum(v*seq_along(v))*+(!!v)
[1]  0  2 11  0 16

Для удобства чтения мы также можем написать:

cumsum(v * seq_along(v)) * as.integer(as.logical(v))

обновить

Попробуйте это для разворота:

w <- as.logical(r)
r[w] <- c(r[w][1], diff(r[w]))
r / seq_along(r)
[1] 0 1 3 0 1
11.02.2016
  • Такой компактный! Не могли бы вы объяснить, что делает *+(!!v)? 11.02.2016
  • Это эквивалентно as.integer(as.logical(v)) 11.02.2016
  • ты дважды погружаешься 12.02.2016
  • Спасибо, чувак, ты более чем рад переместить обновление в связанный пост. 12.02.2016
  • Новые материалы

    Коллекции публикаций по глубокому обучению
    Последние пару месяцев я создавал коллекции последних академических публикаций по различным подполям глубокого обучения в моем блоге https://amundtveit.com - эта публикация дает обзор 25..

    Представляем: Pepita
    Фреймворк JavaScript с открытым исходным кодом Я знаю, что недостатка в фреймворках JavaScript нет. Но я просто не мог остановиться. Я хотел написать что-то сам, со своими собственными..

    Советы по коду Laravel #2
    1-) Найти // You can specify the columns you need // in when you use the find method on a model User::find(‘id’, [‘email’,’name’]); // You can increment or decrement // a field in..

    Работа с временными рядами спутниковых изображений, часть 3 (аналитика данных)
    Анализ временных рядов спутниковых изображений для данных наблюдений за большой Землей (arXiv) Автор: Рольф Симоэс , Жильберто Камара , Жильберто Кейрос , Фелипе Соуза , Педро Р. Андраде ,..

    3 способа решить квадратное уравнение (3-й мой любимый) -
    1. Методом факторизации — 2. Используя квадратичную формулу — 3. Заполнив квадрат — Давайте поймем это, решив это простое уравнение: Мы пытаемся сделать LHS,..

    Создание VR-миров с A-Frame
    Виртуальная реальность (и дополненная реальность) стали главными модными терминами в образовательных технологиях. С недорогими VR-гарнитурами, такими как Google Cardboard , и использованием..

    Демистификация рекурсии
    КОДЕКС Демистификация рекурсии Упрощенная концепция ошеломляющей О чем весь этот шум? Рекурсия, кажется, единственная тема, от которой у каждого начинающего студента-информатика..