Возможно, вы должны были опубликовать их как отдельные вопросы, но не беспокойтесь!
Проблема одна
Проблема с Алисой, конечно, то, что вы ожидаете. Проблема с Бобом состоит в том, что внутренний Table
вычисляется один раз за итерацию внешнего Table
. Это хорошо видно по трассировке:
Trace[Table[Table[i, {i, 1, 3}], {3}]]
{
Table[Table[i,{i,1,2}],{2}],
{Table[i,{i,1,2}],{i,1},{i,2},{1,2}},{Table[i,{i,1,2}],{i,1},{i,2},{1,2}},
{{1,2},{1,2}}
}
Добавлены разрывы строк для выделения, и да, вывод Trace on Table немного странный, но вы можете это увидеть. Очевидно, что Mathematica могла бы оптимизировать это лучше, зная, что во внешней таблице нет итератора, но по какой-то причине она не учитывает это. Только Крис делает то, что ты хочешь, хотя ты можешь изменить Боба:
Transpose[Table[Evaluate[Table[V[i],{i,1,300}]],{1000}]]
Похоже, что он фактически опережает Криса в два раза, потому что ему не нужно хранить промежуточный результат.
Задача вторая
Существует более простое решение с Evaluate, хотя я ожидаю, что оно не будет работать со всеми возможными компилируемыми функциями (т. Е. Теми, которые действительно должны быть сохранены):
f1 = Compile[{x}, Evaluate[x + y]];
Вы также можете использовать With
:
With[{y=7.3},
f1 = Compile[{x}, x + y];
]
Или, если y определен где-то еще, используйте временное значение:
y = 7.3;
With[{z = y},
f1 = Compile[{x}, x + z];
]
Я не эксперт по механизмам определения и оценки Mathematica, так что может быть гораздо лучший способ, но, надеюсь, один из них сделает это за вас!