数组索引可用于efficient array preallocation。例如
2(ones(1, 3))
ans =
2 2 2
但这不适用于NaN或Inf
NaN(ones(1, 3))
ans = NaN
为什么?
答案 0 :(得分:3)
NaN
和Inf
在没有括号的情况下使用时看起来像特殊变量。
但他们是actually functions。
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])
。
然后记住how indexing works。
使用整数数组A
对数组indexes
建立索引A(indexes)
。例如
A([i1, i2, i3])
这会准备一个与indexes
大小相同的数组(此处为1x3)。此新数组的每个元素都将获得A
元素的值,该元素具有由indexes
的相应元素指定的索引。那是
[A(i1), A(i2), A(i3)]
因此2(ones (1, 3))
的结果,即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]
。