R:Оптимизация/Предварительное выделение памяти — различия между версиями
м (→Матрицы) |
м (→Матрицы) |
||
Строка 68: | Строка 68: | ||
Поскольку матрица является также массивом, то матрицу можно также создать с помощью функции <code>array()</code>. Например: | Поскольку матрица является также массивом, то матрицу можно также создать с помощью функции <code>array()</code>. Например: | ||
− | {{r- | + | {{r-code|code=<nowiki>> m <- array(NA, dim = c(100, 10))</nowiki>}} |
Переменные, полученные с помощью функций <code>matrix()</code> и <code>array()</code> будут идентичными. Убедиться в этом можно с помощью функции <code>identical()</code>: | Переменные, полученные с помощью функций <code>matrix()</code> и <code>array()</code> будут идентичными. Убедиться в этом можно с помощью функции <code>identical()</code>: | ||
Строка 75: | Строка 75: | ||
+ array(NA, dim = c(100, 10))) | + array(NA, dim = c(100, 10))) | ||
[1] TRUE</nowiki>}} | [1] TRUE</nowiki>}} | ||
+ | |||
+ | Матрицы и массивы можно также получить путём преобразования векторов или списков. Для этого необходимо изменить атрибут объекта, в котом хранится информация о размерности объекта. Получиться информацию о размерности объекта можно с помощью функции <code>dim()</code>. Данная функция также позволяет изменять размерность объекта. Приведём примеры: | ||
+ | |||
+ | {{r-code|code=<nowiki>> m <- array(NA, dim = c(3, 2)) # создаём двухмерный массив с 3 строками и 2 столбцами | ||
+ | > m | ||
+ | [,1] [,2] | ||
+ | [1,] NA NA | ||
+ | [2,] NA NA | ||
+ | [3,] NA NA | ||
+ | > dim(m) | ||
+ | [1] 3 2 | ||
+ | > dim(m) <- c(2, 3) # изменяем количество строк и столбцов | ||
+ | > m | ||
+ | [,1] [,2] [,3] | ||
+ | [1,] NA NA NA | ||
+ | [2,] NA NA NA</nowiki>}} | ||
== Примечания == | == Примечания == |
Версия 18:32, 13 апреля 2014
|
Материал «R:Оптимизация/Предварительное выделение памяти», созданный автором Артём Клевцов, публикуется на условиях лицензии Creative Commons «Attribution» («Атрибуция») 4.0 Всемирная. | |
|
Перед использованием функций из пакетов их необходимо предварительно установить и загрузить: КодR <syntaxhighlight lang="r">> install.packages(pkgs = "pkgname") > library(package = "pkgname")</syntaxhighlight> |
Содержание
Предварительное выделение памяти
Частой задачей, решаемой с помощью циклов, является выполнение расчётов и занесение результатов в переменную. Таким образом, результирующая переменная будет заполняться данными по мере работы цикла. Предварительное выделение памяти (preallocate) позволяет ускорить работу циклов, работающих с постепенной заполняемыми данными. Суть данного метода заключается в том, чтобы заранее выделить место в оперативной памяти, в которую будут записываться данные во время работы цикла. Выделение памяти осуществляется путём указания типа и размера переменной. Если этого не сделать, то при каждой новой итерации необходимо выделять новое место в памяти и производить туда запись.
Обратите внимание, что переменные, участвующие в цикле, должны быть объявлены до того, как будут использоваться.
<syntaxhighlight lang="r">> noaaloc <- function(n) { + x <- NULL # объявляем пустую переменную + for (i in seq_len(n)) + x[i] <- i * i + x + } > > alloc <- function(n) { + x <- integer(n) # объявляем переменную нужного типа и размера + for (i in seq_len(n)) + x[i] <- i * i + x + } > microbenchmark(noaaloc(10^4), alloc(10^4)) Unit: milliseconds expr min lq median uq max neval noaaloc(10^4) 41.746 42.719 43.353 44.603 76.31 100 alloc(10^4) 5.524 5.896 6.019 6.777 27.35 100</syntaxhighlight>
Создание объектов в R
Векторы
integer(n) |
создаёт объект типа integer (число с фиксированной запятой) длинной n .
|
numeric(n) |
создаёт объект типа double (число с плавающей запятой) длинной n [1].
|
double(n) |
создаёт объект типа double (число с плавающей запятой) длинной n (число двойной точности).
|
single(n) |
создаёт объект типа double (число с плавающей запятой) длинной n (число одинарной точности).
|
complex(n) |
создаёт объект типа complex (комплексный тип данных) длинной n .
|
character(n) |
создаёт объект типа character (строковый тип данных) длинной n .
|
logical(n) |
создаёт объект типа logical (логический тип данных) длинной n .
|
Создание любого типа вектора можно также осуществить с помощью функции vector()
. Данная функция принимает два аргумента: mode
, указывающая тип данных и length
, указывающая длину вектора. Например, создание вектора целых чисел, длиной 100 можно создать с помощью следующих команд:
<syntaxhighlight lang="r">> x <- integer(100) > x <- vector("integer", 100)</syntaxhighlight>
Списки
Списки можно создавать с помощью уже рассмотренной ранее функции vector()
:
<syntaxhighlight lang="r">l <- vector("list", 10)</syntaxhighlight>
Матрицы
Матрицы создаются с помощью соответствующей функции matrix()
. Для создания матрицы необходимой размера, нам нужно указать количество строк и столбцов. Пример создания матрицы:
<syntaxhighlight lang="r">> m <- matrix(NA, nrow = 100, ncol = 10)</syntaxhighlight>
Поскольку матрица является также массивом, то матрицу можно также создать с помощью функции array()
. Например:
<syntaxhighlight lang="r">> m <- array(NA, dim = c(100, 10))</syntaxhighlight>
Переменные, полученные с помощью функций matrix()
и array()
будут идентичными. Убедиться в этом можно с помощью функции identical()
:
<syntaxhighlight lang="r">> identical(matrix(NA, nrow = 100, ncol = 10), + array(NA, dim = c(100, 10))) [1] TRUE</syntaxhighlight>
Матрицы и массивы можно также получить путём преобразования векторов или списков. Для этого необходимо изменить атрибут объекта, в котом хранится информация о размерности объекта. Получиться информацию о размерности объекта можно с помощью функции dim()
. Данная функция также позволяет изменять размерность объекта. Приведём примеры:
<syntaxhighlight lang="r">> m <- array(NA, dim = c(3, 2)) # создаём двухмерный массив с 3 строками и 2 столбцами > m [,1] [,2] [1,] NA NA [2,] NA NA [3,] NA NA > dim(m) [1] 3 2 > dim(m) <- c(2, 3) # изменяем количество строк и столбцов > m [,1] [,2] [,3] [1,] NA NA NA [2,] NA NA NA</syntaxhighlight>
Примечания
- ↑ Эквивалент функции
double()