答案1
您想通过该命令完成什么任务z(y)=1
?
z
由于和的大小不同,您将得到一些奇怪的行为y
。您应该检查数组索引有关 MATLAB 的文档,以便更好地理解正在发生的事情以及数组索引的工作原理。
由于您以图像形式提供了代码,因此我将使用不同的 x 矩阵来解释正在发生的事情。按照您的步骤,我们有:
rng('default'); % set random number generator, so you will get the same matrix as me
x=randi(10,[2 8]); % create random matrix
> x =
>
> 9 2 7 3 10 2 10 9
> 10 10 1 6 10 10 5 2
查找大于 4 的元素: y=x>4 % 创建 y
> y =
>
> 2×8 logical array
>
> 1 0 1 0 1 0 1 1
> 1 1 0 1 1 1 1 0
创建长度为 8 的数组(?)。(让我们跳过这一步)
...
分配:
z(y)=1
> z =
>
> 1 1 0 1 1 0 0 1 1 1 0 1 1 1 1
这里发生了什么?MATLAB 将使用数组y
作为新创建变量的索引z
。为了更好地理解数组索引 0 和 1 之间的区别以及数组的y
赋值,让我们将值更改为 2:=1
z
z(y)=2
> z =
>
> 2 2 0 2 2 0 0 2 2 2 0 2 2 2 2
现在应该更容易理解了。首先,由于z
工作区中不存在(或者,在您的情况下,因为中的元素数z
小于中的元素数y
),MATLAB 将创建此变量。变量的大小与具有非零元素的 y 数组的大小相同:
y(:)'
> ans =
>
> 1×16 logical array
>
> 1 1 0 1 1 0 0 1 1 1 0 1 1 1 1 0
注意y
是一个逻辑数组。考虑到这一点,赋值操作z(y)=2
就是将 赋值2
给true
数组的每个元素y
。由于最后一个元素为 0,MATLAB 将忽略该元素,不会将其包含在数组中。可以将其想象为 MATLAB 会做的事情:
z(logical([1 1 0 1 1 0 0 1 1 1 0 1 1 1 1 0]))=2
最后一条注释是 MATLAB 如何将 2×8 y 数组更改为 1×16 数组。请查看其他有关数组索引的文档,以便更好地理解使用单一索引进行索引。当您调用数组的所有元素(如 y(:))时,MATLAB 使用线性指标而不是数组索引。我们称之为按行操作,因为 MATLAB 会将每列视为一维数组并将它们连接在一起,如下所述这里,借助视觉辅助: