数组索引可用于有效的数组预分配。例如
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]
。