Почему действительно векторизовали индексы в R, запускаются с 1, вместо 0? [закрытый]

34
задан Frank 28 June 2010 в 19:02
поделиться

7 ответов

ФОРТРАН - это язык, который начинает массивы с 1. Математики имеют дело с векторами, которые всегда начинаются с компонента 1 и проходят через N. Соглашения о линейной алгебре начинаются со строки и столбца с номером 1 и проходят через N как хорошо.

C начал с нуля из-за неявной арифметики указателя. Java, JavaScript, C ++ и C # последовали примеру C.

45
ответ дан 27 November 2019 в 16:17
поделиться

0 является "обычным" только потому, что так делал язык C, и многие последующие языки рабски копировали синтаксис C. По умолчанию в Fortran массивы основаны на 1.

В Ada по умолчанию нет, и вы должны выбрать начальный и конечный диапазоны. Интересно, что большинство кода, с которым я сталкивался, выбирает '1' для нижней границы. Я думаю, что это довольно хороший показатель того, куда бы пошли люди, если бы у них был свободный выбор.

9
ответ дан 27 November 2019 в 16:17
поделиться

Вы делаете это неправильно. Если вы хотите сохранить в объекте дополнительные атрибуты, используйте attr :

> foo <- 1:20
> attr(foo, "created") <- Sys.time()               # just as an example
> str(foo)
 atomic [1:20] 1 2 3 4 5 6 7 8 9 10 ...
 - attr(*, "created")= POSIXct[1:1], format: "2010-06-28 14:07:15"    # our time
> summary(foo)                                     # object works as usual
   Min. 1st Qu.  Median    Mean 3rd Qu.    Max. 
   1.00    5.75   10.50   10.50   15.20   20.00 
> 
0
ответ дан 27 November 2019 в 16:17
поделиться

Векторы в математике часто представляются в виде n-кортежей, элементы которых индексируются от 1 до n. Я подозреваю, что r хотел остаться верным этой нотации.

17
ответ дан 27 November 2019 в 16:17
поделиться

R - это «платформа для экспериментов и исследований». Его цель - дать возможность «статистикам использовать все возможности такой среды» без переосмысления того, как они обычно работают со статистикой. Итак, люди используют формулы для построения регрессионных моделей и начинают считать с единицы.

4
ответ дан 27 November 2019 в 16:17
поделиться

Фрэнк, я думаю, вы неверно истолковали то, что видели, когда набирали arr [0]. Числовой (0) просто означает, что результатом является числовой вектор без элементов. Это не означает, что тип вектора «хранится» в элементе 0. Вы бы получили тот же результат, если бы набрали, например, arr [arr> 30]. Ни один элемент не удовлетворяет этому условию, поэтому результирующий вектор не имеет элементов. Точно так же ни один элемент не имеет индекса 0. Это сделано намеренно и не имеет ничего общего с пространством 0, используемым для чего-то еще.

9
ответ дан 27 November 2019 в 16:17
поделиться

На самом деле, я думаю, что версия C, которая «начинается с 0», очень логична, если посмотреть на то, как организована память. В C мы можем написать следующее:

int* T = new int[10];

Первый элемент массива - * T. Это совершенно «логично», потому что * T - это адрес первого указанного случая памяти. Второй элемент - это второй случай, поэтому * (T + 1): мы продвигаемся вперед на один «sizeof (int)».

Чтобы сделать код более читабельным, C реализовал псевдоним: T [i] для * (T + i). Чтобы получить доступ к первому элементу, вы должны получить доступ к * T, то есть T [0]. Это совершенно естественно.

Эта идея расширена итераторами:

std::vector<int> T(10);
int val = *(T.begin()+3);

T [i] - это просто псевдоним для * (T.begin () + i).

В fortran / R мы обычно начинаем с 1 из-за математических проблем, но, безусловно, есть и другие хорошие варианты (например, см. эту ссылку ). Не забывайте, что fortran может легко использовать массив, начинающийся с 0:

PROGRAM ZEROARRAY
REAL T(0:9)
T(0) = 3.14
END
3
ответ дан 27 November 2019 в 16:17
поделиться
Другие вопросы по тегам:

Похожие вопросы: