То, как может я эффективно удалять, обнуляет от (нередкой) матрицы?

Согласно документации // - V :: 3085 в начале файла должен подавлять все предупреждения V3085 в файле.

Этот синтаксис работает для модулей компиляции, а не для отдельных файлов, и он работает как комментарий в исходном файле только на C ++ - для C # вам нужно добавить файл pvsconfig (описанный в предоставленной вами ссылке выше) к вашему проекту и добавьте туда эту строку - это отключит предупреждение для всего проекта (так как в C # весь проект представляет собой один модуль компиляции).

11
задан gnovice 5 May 2017 в 06:36
поделиться

4 ответа

В одну сторону:

x(x == 0) = [];

Примечание о сроках:

Как упомянуто древесных щепок этот метод кажется медленным по сравнению с методом, использованным KitsuneYMG . Это также было отмечено Лорен в одном из ее сообщений в блоге MathWorks . Поскольку вы упоминали о необходимости сделать это тысячи раз, вы можете заметить разницу, в этом случае я сначала попробую x = x (x ~ = 0); .

ПРЕДУПРЕЖДЕНИЕ: Осторожно если вы используете нецелые числа. Например, если у вас очень маленькое число, которое вы хотите считать достаточно близким к нулю, чтобы его можно было удалить, приведенный выше код не удалит его. Только точные нули удаляются. Следующее поможет вам также удалить числа «достаточно близко» к нулю:

tolerance = 0.0001;  % Choose a threshold for "close enough to zero"
x(abs(x) <= tolerance) = [];
16
ответ дан 3 December 2019 в 01:16
поделиться

Вот еще один способ

y = x (найти (x))

Я оставлю это Вы должны выяснить относительную эффективность различных подходов, которые вы пробуете - пишите и дайте нам всем знать.

3
ответ дан 3 December 2019 в 01:16
поделиться

Просто чтобы быть другим:

x=x(x~=0);

или

x=x(abs(x)>threshold);

Это имеет бонус работы с комплексными числами тоже

11
ответ дан 3 December 2019 в 01:16
поделиться

Это три общих решения. Это помогает увидеть разницу.

x = round(rand(1,15000));

y = x;

tic,y(y==0) = [];toc

Elapsed time is 0.004398 seconds.

y = x;

tic,y = y(y~=0);toc

Elapsed time is 0.001759 seconds.

y = x;

tic,y = y(find(y));toc

Elapsed time is 0.003579 seconds.

Как вы видите, самый дешевый способ - это прямой логический индекс, выбирающий элементы, которые нужно сохранить. Поиск является более дорогим, поскольку matlab находит эти элементы, возвращает их список, а затем индексирует в векторе.

11
ответ дан 3 December 2019 в 01:16
поделиться
Другие вопросы по тегам:

Похожие вопросы: