Разница между векторными, матричными и массивными типами данных помимо ограничений по размеру

R поставляется с тремя типами для хранения списков однородных объектов: vector, matrix и array.

Насколько я могу судить:

  • vector - специальные случаи для массивов с 1 размерностью
  • matrix - частный случай для массивов с двумя размерами
  • array также может иметь любой уровень измерения (включая 1 и 2).

Мое первое впечатление заключается в том, что это сильно усложняет ситуацию, но я вполне уверен, что для того, чтобы язык R был спроектирован, существуют веские причины для того, чтобы R приходил с тремя избыточными типами.

Может быть, они очень разные под капотом, или я что-то пропустил?

В чем разница между использованием 1D-массивов над векторами и 2D-массивами над матрицами? Нужно ли нам бросать между ними, или это произойдет автоматически?

Ответы

Ответ 1

Нет разницы между matrix и 2D array:

x <- matrix(1:10, 2)
y <- array(1:10, c(2, 5))
identical(x, y)
#[1] TRUE

matrix - это просто более удобный конструктор, и есть много функций и методов, которые принимают только матрицы 2D-матрицы a.k.a.

Внутренние массивы - это просто векторы с атрибутом измерения:

attributes(x)
#$dim
#[1] 2 5

dim(x) <- NULL
x
#[1]  1  2  3  4  5  6  7  8  9 10

z <- 1:10
dim(z) <- c(2, 5)
is.matrix(z)
#[1] TRUE

Чтобы указать определение :

Матрицы и массивы - это просто векторы с атрибутом dim и необязательно dimnames, прикрепленных к вектору.

[...]

Атрибут dim используется для реализации массивов. Содержание массив хранится в векторе в основном порядке столбца, а dim Атрибут - это вектор целых чисел, определяющий соответствующие экстенты массив. R гарантирует, что длина вектора является произведением длины размеров. Длина одного или нескольких размеров может быть нулевым.

Вектор не совпадает с одномерным массивом, поскольку последний имеет тусклый атрибут длины один, тогда как первый не имеет атрибут.