Задания в Wolfram Mathematica - PullRequest
       54

Задания в Wolfram Mathematica

1 голос
/ 21 марта 2012

Вопрос о присваиваниях и переменных

(* For example *) SP = SparseArray[{},5] or SP = Range[5]

Теперь мы хотим поработать с этим массивом в другой функции:

(* example *) Fun[array_]:= array[[3]] = 100 ; (* set cell №3 equal to 100*)

тогда мы оцениваем

Fun[SP]

ОШИБКА! вывод будет ошибкой типа: Set::write Tag SparseArray in ... is Protected.

Так, как правильно изменить аргументы функции в функции (не чисто функции)? Как создать аналог как Part[]?

может быть, что-то вроде:

Clear[f]; f[a_]:=Set[Symbol[a][[3]],100]; A =SparseArray[{},5]; f["A"]; 

Но это снова ошибка

Ответы [ 2 ]

2 голосов
/ 30 марта 2012

Я считаю, что метод Криса Дегнена, как правило, следует избегать.
Mathematica предоставляет лучший способ: атрибуты Hold .

a = Range[5];

SetAttributes[fun, HoldFirst]

fun[array_] := array[[3]] = 100

fun[a];

a
{1, 2, 100, 4, 5}

Как «чистая функция»:

b = Range[5];

fun2 = Function[array, array[[3]] = 100, HoldFirst];

fun2[b];

b
{1, 2, 100, 4, 5}
0 голосов
/ 21 марта 2012

Вы можете сделать это так:

SP = Range[5];
Fun[array_] := array[[3]] = 100;(*set cell №3 equal to 100*)
Fun[Unevaluated@SP];
SP

{1, 2, 100, 4, 5}

...