数组索引可用于有效的数组预分配。例如
2(ones(1, 3))
ans =
2 2 2
但这不适用于 NaN 或 Inf
NaN(ones(1, 3))
ans = NaN
为什么 ?
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]。