这是一个关于 MATLAB 语言的问题。我正在阅读 MathWorks 的“Onramp”教程,我注意到一种奇怪的“通过引用分配”行为(因为没有更好的术语),这与我的期望背道而驰。
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 中,但随后它会忽略它并将右侧的值放入索引引用的位置。
如果不对表达式进行两次评估,或者在幕后做其他魔术,我看不出它怎么能做到这一点。我不觉得我掌握了评估的顺序/规则。
感谢您对“真正”发生的事情的任何见解。