Matlab Вставить NaN в массив - PullRequest
2 голосов
/ 21 марта 2020

Мне нужно вставить NaN в указанные c позиции массива. Я написал код, который правильно делает это, но так как мне нужно сделать это для действительно больших массивов, он занимает слишком много времени для запуска. Numpy имеет функцию insert(i, x), которая вставляет элемент в заданную позицию. Есть ли подобная функция в Matlab? Или есть более эффективный способ сделать это?

a = [1 2 3 5 6 7 9 10 13 14];
insertNanIndex = [0 1 0 1 1 0 0 0 1 1 0 0 1 0 0 0];

for i = find(insertNanIndex)
    a = [a(1:i-1), NaN, a(i:end)]
end

1 Ответ

4 голосов
/ 21 марта 2020

Эффективный способ сделать это состоит в том, чтобы предварительно вычислить размер результата, убедиться, что insertNanIndex был достаточно большим, чтобы служить маской, и вставить a в правильные индексы сразу. Прямо сейчас вы буквально перераспределяете весь массив для каждого NaN. Numpy Функция insert будет в равной степени неэффективной, поскольку она будет выполнять ту же операцию.

Если, как в вашем примере, число нулей соответствует количеству элементов a, вы можно выделить массив на основе insertNanIndex и замаскировать его напрямую:

result = nan(size(insertNanIndex));
result(~insertNanIndex) = a;

Если число нулей в insertNanIndex не равно размеру a, вы можете дополнить или обрезать его, но в этом случае это становится более спорным относительно того, что все это значит.

...