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

使用矢量化赋值时的意外matlab行为,matlab,vectorization,Matlab,Vectorization,我在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

我在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会选择给出一个错误,而不是发明一个值(好的选择)。后者必须向数组元素写入一个值;如果
i
超出范围,MATLAB会选择扩展数组,使其足够大,能够写入该位置(这也被证明是一个不错的选择,它非常有用,并在代码中广泛使用)。数字数组通过添加零进行扩展


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

让我们看一个更简单的示例
a=4
然后
a(2)
将给出该错误,并且
a(2)=1
将正常。分配到越界索引将扩展数组并写入该索引。读取越界索引是一个错误。感谢您的解释。我经常使用这个功能,不知道为什么它在这里如此神秘!