2

数组索引可用于有效的数组预分配。例如

2(ones(1, 3))
ans =

   2   2   2

但这不适用于 NaN 或 Inf

NaN(ones(1, 3))
ans = NaN

为什么 ?

4

1 回答 1

3

NaN并且Inf看起来像特殊变量,当不带括号使用时。

但它们实际上是函数

NaN(ones (1, 3))扩展到NaN ([1, 1, 1])显然被评估为NaN (1, 1, 1). 那是一个1x1x1数组,它只有一个元素。

初始化 1x3 NaN 数组的正确方法是

NaN (1, 3)

Inf.


按照@carandraug 的建议,这里有一点题外话

也可以使用NaN ()(ones(1, 3)).

在此表达式中,NaN ()计算为NaN标量值(不再是函数)。ones(1, 3)评估为[1, 1, 1]

所以中间步骤可以读作<NaN scalar value>([1 1 1]).

然后记住索引是如何工作的。A使用整数数组对数组进行索引会indexes被写入A(indexes)。例如

A([i1, i2, i3])

indexes这准备了一个与(此处为 1x3)大小相同的数组。这个新数组的每个元素都将获得A具有 的相应元素给定索引的元素的值indexes。那是

[A(i1), A(i2), A(i3)]

所以2(ones (1, 3))ie的结果2([1, 1, 1])很明显[2(1), 2(1), 2(1)]。即[2, 2, 2]。(请记住,标量可以解释为单个元素数组。因此2(1)表示数组的第一个元素[2],即2)。

同样,中间步骤<NaN scalar value>([1 1 1])最终转化为

[<NaN scalar value>, <NaN scalar value>, <NaN scalar value>]

或者干脆[NaN, NaN, NaN]

于 2016-05-04T13:28:32.000 回答