NaN或Inf阵列预分配

时间:2016-05-04 13:28:32

标签: arrays octave pre-allocation

数组索引可用于efficient array preallocation。例如

2(ones(1, 3))
ans =

   2   2   2

但这不适用于NaN或Inf

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

为什么?

1 个答案:

答案 0 :(得分:3)

NaNInf在没有括号的情况下使用时看起来像特殊变量。

但他们是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]