Желаемое поведение
В Python я могу создать замаскированный массив в NumPy примерно так:
>>> import numpy as np
>>> x = np.arange(1, 7).reshape(3, 2)
>>> x = np.ma.array(x, mask=[[0, 0], [1, 0], [0, 0]])
>>> x
masked_array(
data=[[1, 2],
[--, 4],
[5, 6]],
mask=[[False, False],
[ True, False],
[False, False]],
fill_value=999999)
И затем вычисления обрабатывают его так, как если бы маскированные значения не существовать. Например, сравните
# Matrix multiplication on raw data.
>>> np.dot(x.data, x.data.T)
array([[ 5, 11, 17],
[11, 25, 39],
[17, 39, 61]])
# Matrix multiplication on masked data.
>>> np.ma.dot(x, x.T)
masked_array(
data=[[5, 8, 17],
[8, 16, 24],
[17, 24, 61]],
mask=[[False, False, False],
[False, False, False],
[False, False, False]],
fill_value=999999)
Обратите внимание, что это отличается от заполнения маскированных значений нулем или наном, поскольку такие вещи, как деление на ноль, игнорируются. Например:
>>> y = np.copy(x.data)
>>> y
array([[1, 2],
[3, 4],
[5, 6]])
>>> y / x
masked_array(
data=[[1.0, 1.0],
[--, 1.0],
[1.0, 1.0]],
mask=[[False, False],
[ True, False],
[False, False]],
fill_value=999999)
>>> z = np.copy(x.data)
>>> z[1, 0] = 0
>>> z
array([[1, 2],
[0, 4],
[5, 6]])
>>> y / z
...RuntimeWarning: divide by zero encountered in true_divide...
array([[ 1., 1.],
[inf, 1.],
[ 1., 1.]])
Вопрос
Мой вопрос: есть ли способ воспроизвести эту функцию в MATLAB? Я пробовал nan
, но я получаю ошибки в последующих функциях вызываемого абонента, например, minFun c.