Простой вопрос, но я прошу просто убедиться, что я не пропускаю очевидное
решение, которое может быть гораздо более эффективным.
Если у вас большой буфер данных, скажем, очень большой список, который необходимо обновить, и
хотел передать его в функцию для обновления внутри функции, как в
a = Table[0,{10}]
a = update[a]
и так как я не могу использовать передачу по ссылке (в CDF нельзя изменить
Атрибуты функции к чему-либо, например, HoldFirst), то я вынужден
сделать копию списка внутри самой функции, чтобы обновить его,
и верните обратно копию.
Мой вопрос, кроме использования «глобальных переменных», который не годится,
Есть ли более эффективный способ сделать это?
пс. около года назад я спрашивал про копию по ссылке, вот ссылка
на мой вопрос Mathgroup. (Спасибо Леониду за ответ, кстати, был полезный ответ).
Но мой вопрос здесь немного другой, так как теперь я НЕ могу использовать HoldFirst,
Есть ли другие альтернативы, которые я не вижу, чтобы избежать этого дополнительного
копирование данных все время, кажется, что программа замедляется
размер становится слишком большим.
(нельзя использовать SetAttributes и его друзей, не разрешено в CDF).
Сначала я покажу базовый пример, затем покажу, как бы я это сделал, если
Я мог бы использовать HoldFirst.
Пример
update[a_List] := Module[{copyOfa = a}, copyOfa[[1]] = 5; copyOfa]
a = Table[0, {10}];
a = update[a]
----> {5, 0, 0, 0, 0, 0, 0, 0, 0, 0}
Если бы я мог использовать HoldFirst, я бы написал
update[a_] := Module[{}, a[[1]] = 5; a]
Attributes[update] = {HoldFirst};
a = Table[0, {10}];
a = update[a]
----> {5, 0, 0, 0, 0, 0, 0, 0, 0, 0}
Гораздо эффективнее, поскольку копирование не производится. Передайте по ссылке.
Я мог бы использовать глобальную переменную, как в
a = Table[0, {10}];
updateMya[] := Module[{}, a[[1]] = 5]
updateMya[];
a
----> {5, 0, 0, 0, 0, 0, 0, 0, 0, 0}
Но это, конечно, плохое программирование, даже если оно очень быстрое.
Поскольку у меня большие буферы данных, и я хотел бы модульно кодировать мой код Mathematica,
Мне нужно создать функции, которые я передаю большие данные для обработки, но в то же время
время хотело, чтобы оно было «эффективным».
Какие-нибудь другие варианты, которые можно увидеть, чтобы сделать это?
извините, если раньше об этом спрашивали, трудно искать ТАК.
спасибо,
сложение 1
Использование Unevaluated легко в использовании, но я больше не могу использовать проверку типов, мне нужно было убедиться, что список передается. Например
update[a_List] := Module[{}, a[[1]] = 5; a]
a = Table[0, {10}];
a = update[Unevaluated[a]]
Теперь вызов не «привязывается» к определению, поскольку «a» теперь не имеет заголовка List.
Итак, я теряю некоторую надежность, которую я имел в коде. Но использование Unevaluated работает в CDF, и изменить код для его использования было легко. Мне просто нужно было убрать те дополнительные «проверки типов», которые у меня были, чтобы заставить его работать.