ФОРТРАН - это язык, который начинает массивы с 1. Математики имеют дело с векторами, которые всегда начинаются с компонента 1 и проходят через N. Соглашения о линейной алгебре начинаются со строки и столбца с номером 1 и проходят через N как хорошо.
C начал с нуля из-за неявной арифметики указателя. Java, JavaScript, C ++ и C # последовали примеру C.
0 является "обычным" только потому, что так делал язык C, и многие последующие языки рабски копировали синтаксис C. По умолчанию в Fortran массивы основаны на 1.
В Ada по умолчанию нет, и вы должны выбрать начальный и конечный диапазоны. Интересно, что большинство кода, с которым я сталкивался, выбирает '1' для нижней границы. Я думаю, что это довольно хороший показатель того, куда бы пошли люди, если бы у них был свободный выбор.
Вы делаете это неправильно. Если вы хотите сохранить в объекте дополнительные атрибуты, используйте 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
>
Векторы в математике часто представляются в виде n-кортежей, элементы которых индексируются от 1 до n. Я подозреваю, что r хотел остаться верным этой нотации.
R - это «платформа для экспериментов и исследований». Его цель - дать возможность «статистикам использовать все возможности такой среды» без переосмысления того, как они обычно работают со статистикой. Итак, люди используют формулы для построения регрессионных моделей и начинают считать с единицы.
Фрэнк, я думаю, вы неверно истолковали то, что видели, когда набирали arr [0]. Числовой (0) просто означает, что результатом является числовой вектор без элементов. Это не означает, что тип вектора «хранится» в элементе 0. Вы бы получили тот же результат, если бы набрали, например, arr [arr> 30]. Ни один элемент не удовлетворяет этому условию, поэтому результирующий вектор не имеет элементов. Точно так же ни один элемент не имеет индекса 0. Это сделано намеренно и не имеет ничего общего с пространством 0, используемым для чего-то еще.
На самом деле, я думаю, что версия 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