Индексация массива может использоваться для efficient array preallocation. НапримерNaN или Inf arrays preallocation
2(ones(1, 3))
ans =
2 2 2
, но это не работает с NaN или Inf
NaN(ones(1, 3))
ans = NaN
Почему?
Индексация массива может использоваться для efficient array preallocation. НапримерNaN или Inf arrays preallocation
2(ones(1, 3))
ans =
2 2 2
, но это не работает с NaN или Inf
NaN(ones(1, 3))
ans = NaN
Почему?
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]
.
Возможно, стоит объяснить другую сторону, как можно использовать тот же синтаксис для работы с 'Inf' и' NaN', e.g., 'Inf() (единицы (1, 3))'. – carandraug
Или, может быть, 'NaN (размер (единицы (1,3)))', хотя это и лишнее. @carandraug: 'Inf() (те (1, 3))' недействителен Matlab. Не уверен, что вы предлагаете. – horchler
@horchler Я просто предлагал, чтобы это было приятное дополнение (только от образовательного POV), чтобы объяснить, почему '2 ([1 1 1])' работает и показывает тот же синтаксис с 'Inf() ([1 1 1]) '. Опять же, только образовательный, ответ правильный, как есть. Кроме того, этот вопрос Octave не помечен Matlab, поэтому недействительный Matlab не должен быть проблемой. – carandraug