MATLAB:扩大数组和逻辑索引

MATLAB:扩大数组和逻辑索引

我在 MATLAB 中创建以下数组:

在此处输入图片描述

现在我找出哪些元素x大于 4:

在此处输入图片描述

到目前为止一切顺利。现在我创建一个长度为 8 的数组:

在此处输入图片描述

现在我执行这个命令:

在此处输入图片描述

我对刚刚发生的事情感到非常困惑。这个命令在做什么?为什么z现在是一个长度为 15 的数组?

答案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:=1z

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就是将 赋值2true数组的每个元素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 会将每列视为一维数组并将它们连接在一起,如下所述这里,借助视觉辅助:

在此处输入图片描述

相关内容