簡単な質問ですが、はるかに効率的な明らかな解決策を見落としていないことを確認するために質問しています。
非常に大きなリストなどの大きなデータ バッファーがあり、それを更新する必要があり、それを関数に渡して関数内で更新を行いたい場合は、次のようにします。
a = Table[0,{10}]
a = update[a]
また、参照渡しを使用できないため (CDF では、関数の属性を HoldFirst などの何かに変更することはできません)、関数自体の内部でリストのコピーを順番に作成する必要があります。それを更新し、コピーを返します。
私の質問は、良くない「グローバル変数」を使用する以外に、これを行うためのより効率的な方法はありますか?
ps。約 1 年前、参照によるコピーについて 質問しました。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 コードをモジュール化したいので、処理する大きなデータを渡す関数を作成する必要がありますが、同時に「効率的」に保ちたいと考えていました。
これを行うために見ることができる他のオプションはありますか?
これが以前に尋ねられた場合は申し訳ありませんが、SOを検索するのは難しいです。
ありがとう、
追加1
Unevaluated を使用するのは簡単ですが、リストが渡されていることを確認するために必要だった型チェックを使用できなくなりました。例えば
update[a_List] := Module[{}, a[[1]] = 5; a]
a = Table[0, {10}];
a = update[Unevaluated[a]]
「a」にはヘッダー List がないため、この呼び出しは定義に「バインド」しません。
そのため、コードの堅牢性の一部が失われます。しかし、Unevaluated を使用すると CDF で機能し、それを使用するようにコードを変更するのは簡単でした。機能させるためにそこにあった余分な「型チェック」を削除する必要がありました。