2014 dxdy logo

Научный форум dxdy

Математика, Физика, Computer Science, Machine Learning, LaTeX, Механика и Техника, Химия,
Биология и Медицина, Экономика и Финансовая Математика, Гуманитарные науки




 
 [Mathematica 8] Не вычислять аргумент функции
Сообщение04.10.2014, 19:26 
Знаю про атрибуты HoldFirst и пр., но у меня несколько другая ситуация: вычисляться не должно e в f[...][e], а атрибуты можно присвоить только символу.

Попробовал так:
Код:
f1[var_, indexCount_][HoldPattern[e_]] := Sum @@ Prepend[{{var, indexCount}}, Unevaluated@e]
f2[var_, indexCount_] := Function[{e}, Sum @@ Prepend[{{var, indexCount}}, Unevaluated@e], HoldFirst]
но всё тщётно: в процессе вычисления
Код:
a = {1, 2, 3};
a[[i]] // f1[i, 3]
a[[i]] // f2[i, 3]
всё же выводятся сообщения Part::pspec о том что i — не целое и не список целых, т. е. вычисление e происходит, ну и Trace об этом сообщит.

Может быть, это всё-таки как-то можно сделать?

 
 
 
 Re: [Mathematica 8] Не вычислять аргумент функции
Сообщение04.10.2014, 22:49 
Вот так
Код:
f1[var_, indexCount_][e_] :=  Sum @@ Prepend[{{var, indexCount}}, ReplacePart[e, 2 -> var]];

она считает, но предупреждение выдает.

Если не писать индекс у a, который все равно уже есть в аргументе f1, то все работает:
Код:
f1[var_, indexCount_][e_] := Sum[e[[var]], {var, indexCount}];
a // f1[i, 3]

 
 
 
 Re: [Mathematica 8] Не вычислять аргумент функции
Сообщение04.10.2014, 23:50 
Как раз хотел с индексами — написал две функции для упрощения формул с индексами (пакет тензорной алгебры ставить не хочется), чтобы
Код:
expr // s[i, j, ...] = Sum[expr, {i, $IndexCount}, {j, $IndexCount}, ...]
expr // t[i, j, ...] = Table[expr, {i, $IndexCount}, {j, $IndexCount}, ...]
т. е. индексы будут не обязательно в фиксированном положении, expr может содержать много чего (умножение, сложение). Хотя, видимо, из вычисляющегося будет содержать только Part. Если другого способа нет, придётся добавлять к коду отключение-включение Part::pspec. :-)

 
 
 [ Сообщений: 3 ] 


Powered by phpBB © 2000, 2002, 2005, 2007 phpBB Group