Array
не имеет преимуществ по сравнению с Table
. Есть различия между ними, которые делают одно предпочтение перед другим.
EDIT Несколько человек отметили, что
Table
медленнее для многомерных массивов. Все они использовали переменную для хранения размера таблицы.
Table
имеет
HoldAll
атрибутов и автоматически оценивает только самые внешние границы. Поскольку внутренние итераторы остаются неоцененными, элемент таблицы не может быть скомпилирован. Использование явных чисел или
With
с результатом автокомпиляции:
In[2]:= With[{b = 10^4, c = 10^4},
{Timing@(#[[1, 1]] &[ar = Array[(# + #2) &, {b, c}]]) ,
Timing@(#[[1, 1]] &[ta = Table[(i + j), {i, b}, {j, c}]])}
]
Out[2]= {{4.93, 2}, {4.742, 2}}
In[3]:= Attributes[Table]
Out[3]= {HoldAll, Protected}
Array
позволяет вам создать массив значений функций так же, как
Table
. Они принимают разные аргументы.
Array
принимает функцию:
In[34]:= Array[Function[{i, j}, a[i, j]], {3, 3}]
Out[34]= {{a[1, 1], a[1, 2], a[1, 3]}, {a[2, 1], a[2, 2],
a[2, 3]}, {a[3, 1], a[3, 2], a[3, 3]}}
пока таблица принимает явный вид:
In[35]:= Table[a[i, j], {i, 3}, {j, 3}]
Out[35]= {{a[1, 1], a[1, 2], a[1, 3]}, {a[2, 1], a[2, 2],
a[2, 3]}, {a[3, 1], a[3, 2], a[3, 3]}}
Array
может работать только с обычными массивами, а Table
может выполнять произвольные итерации по списку:
In[36]:= Table[a[i, j], {i, {2, 3, 5, 7, 11}}, {j, {13, 17, 19}}]
Out[36]= {{a[2, 13], a[2, 17], a[2, 19]}, {a[3, 13], a[3, 17],
a[3, 19]}, {a[5, 13], a[5, 17], a[5, 19]}, {a[7, 13], a[7, 17],
a[7, 19]}, {a[11, 13], a[11, 17], a[11, 19]}}
Иногда Array
может быть более кратким. Сравните таблицу умножения:
In[37]:= Array[Times, {5, 5}]
Out[37]= {{1, 2, 3, 4, 5}, {2, 4, 6, 8, 10}, {3, 6, 9, 12, 15}, {4, 8,
12, 16, 20}, {5, 10, 15, 20, 25}}
против
In[38]:= Table[i j, {i, 5}, {j, 5}]
Out[38]= {{1, 2, 3, 4, 5}, {2, 4, 6, 8, 10}, {3, 6, 9, 12, 15}, {4, 8,
12, 16, 20}, {5, 10, 15, 20, 25}}
Array
позволяет строить выражения с любой головой, а не просто списком:
In[39]:= Array[a, {3, 3}, {1, 1}, h]
Out[39]= h[h[a[1, 1], a[1, 2], a[1, 3]], h[a[2, 1], a[2, 2], a[2, 3]],
h[a[3, 1], a[3, 2], a[3, 3]]]
По умолчанию заголовок h
выбран равным List
, что приводит к созданию регулярного массива. Таблица не обладает такой гибкостью.