【发布时间】:2017-07-28 14:38:56
【问题描述】:
这是一个关于 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 中,但随后它会忽略该值并将右侧值放入索引引用的位置。
如果不对表达式进行两次评估,或者在幕后执行其他魔术,我看不出它怎么能做到这一点。我觉得我没有掌握评估的顺序/规则。
感谢您对“真正”发生的事情的任何见解。
【问题讨论】:
-
我对您在 MATLAB World 中生活这么久的期望感到有些困惑。但是,
ans仅在未指定输出参数但表达式至少返回一个时才起作用。v1(v1 < 5) = 1表达式以某种方式解析为带有标量扩展的subasgn调用。我不知道引用赋值是从哪里来的。
标签: matlab variable-assignment evaluation matrix-indexing language-details