これは MATLAB 言語に関する質問です。MathWorks の「入門」チュートリアルを進めていますが、期待に反する奇妙な「参照による代入」動作 (適切な用語がないため) に気付きました。
v1 = [4 6 1 3 4 9 5];
以下では、最初に括弧式を評価し、論理配列 [1 0 1 1 1 0 0] を生成し、次にインデックスを付けて結果を取得していると思いますv1
。ここまでは順調ですね。
>> v1(v1 < 5)
ans =
4 1 3 4
驚いたのは以下。実行すると、ans (デフォルトの結果変数、無名変数の一種) が[4 1 3 4]
ステートメントの左側の値である値を取得することがわかります。割り当てがansにのみ書き込まれることを期待しますが、代わりに参照によって通過し、参照対象の配列に書き込みますv1
。
>> v1(v1 < 5) = 1
v1 =
1 6 1 1 1 9 5
もちろん、これは他の言語と同様です。構文ではprint a[3]
の値を取得することを意味しますa[3]
がa[3] = 1
、構文では に新しい値を代入することを意味しますa[3]
。その意味で、唯一の「新しい」部分は、MATLAB がほとんどの言語よりも高度なインデックス式を使用できることです。
ここで紛らわしいのは、MATLAB が式を両方の方法で明確に評価することです。インデックス付きの値を取得してansに格納しますが、それを無視して、右側の値をインデックスによって参照される場所に配置します。
式を 2 回評価したり、舞台裏で他の魔法を実行したりせずに、これを行う方法がわかりません。評価の順番・ルールを把握している気がしません。
「本当に」何が起こっているのかについての洞察をありがとう。