使用矢量化赋值时意外的 matlab 行为

Unexpected matlab behaviour when using vectorised assignment

我在 matlab 中遇到了一些我在执行向量化赋值时无法理解的意外行为:

>> q=4;

>> q(q==[1,3,4,5,7,8])
The logical indices contain a true value outside of the array bounds.

>> q(q==[1,3,4,5,7,8])=1

q =

     4     0     1

为什么命令q(q==[1,3,4,5,7,8])出错,而命令q(q==[1,3,4,5,7,8])=1有效?它是如何到达 4 0 1 作为输出的?

q(i)q(i)=a的区别在于前者必须产生一个数组元素的值;如果 i 超出范围,MATLAB 选择给出错误而不是发明一个值(IMO 的好选择)。而后者必须向数组元素写入一个值;如果 i 超出范围,MATLAB 选择扩展数组,使其足够大以能够写入该位置(这也被证明是一个不错的选择,它很有用并在代码中广泛使用).通过添加零来扩展数值数组。

在您的特定情况下,q==[1,3,4,5,7,8] 是逻辑数组 [0,0,1,0,0,0]。这意味着您正在尝试索引 i=3。由于 q 有一个值,读取索引 3 是越界的,但我们可以在那里写入。 q通过加零填充到大小3,然后将值1写入第三个元素。