次のように、Mathematica で反復名を持つ複数の変数を作成したいと思います。
Do["f" <> ToString[i] = i*2, {i, 1, 20}]
ここで、f1=2、f2=4、f3=6 などを取得します。
私はエラー:
Set::write: f<>1 のタグ StringJoin は保護されています。>>
どんな助けでも素晴らしいでしょう。ありがとう!
次のように、Mathematica で反復名を持つ複数の変数を作成したいと思います。
Do["f" <> ToString[i] = i*2, {i, 1, 20}]
ここで、f1=2、f2=4、f3=6 などを取得します。
私はエラー:
Set::write: f<>1 のタグ StringJoin は保護されています。>>
どんな助けでも素晴らしいでしょう。ありがとう!
これを達成するには、( ) がそれを見る"f" <> ToString[i]
前に式を評価するか、エラーメッセージが伝えようとしているのと同じように、 head でオブジェクトに割り当てようとする必要があります。さらに、文字列への割り当てを行うことはできないため、 (surprise) を使用して Symbol に変換する必要があります。1 つの方法は、次を使用することです。Set
=
StringJoin
Symbol
Evaluate
Do[Evaluate[Symbol["f" <> ToString[i]]] = i*2, {i, 1, 20}]
{f1, f2, f17}
{2, 4, 34}
ただし、これはMathematicaでは通常は適切な方法ではありません。たとえば、これらのシンボルのいずれかがすでに存在し、値が割り当てられている場合、操作は失敗します。評価せずにシンボルをブロックする方法への回答に見られるように、より多くの努力でこれを回避できますか? (または、より具体的には、ここでの私の回答で)しかし、繰り返しますが、これは通常、適切な行動方針ではありません。
通常の方法は、PrinceBilliard が示すように、インデックス付きオブジェクトを使用することです。
このトピックの一般的な詳細については、この質問、その回答、およびその下のコメントにリンクされている 4 つの関連する質問を参照してください。
Do[f[i] = i^2, {i,1,20}]
反復変数名は f[i] のように機能します。次のように、反復関数名を宣言することもできます。f[2][x_] := ...