Как удалить нулевые компоненты в векторе в Matlab?

У меня есть вектор, например,

a = [0 1 0 3]

Я хочу повернуться в b, который равняется b = [1 3].

Как я выполняю это в целом? Таким образом, у меня есть вектор с некоторыми нулевыми компонентами, и я хочу удалить обнуление и оставить просто ненулевые числа?

38
задан Léo Léopold Hertz 준영 5 March 2016 в 17:47
поделиться

2 ответа

Если вы просто хотите удалить нули, оставив ненулевые в a, тогда самое лучшее решение -

a(a==0) = [];

. Это удаляет нулевые элементы, используя подход логической индексации в MATLAB. Когда индекс для вектора является логическим вектором той же длины, что и вектор, тогда MATLAB может использовать этот логический результат для его индексации. Так что это эквивалентно

a(find(a==0)) = [];

И, когда вы устанавливаете некоторые элементы массива в [] в MATLAB, соглашение состоит в том, чтобы удалить их.

Если вы хотите поместить нули в новый результат b, оставив неизменным, вероятно, наилучшим способом будет

b = a(a ~= 0);

Здесь снова используется логическая индексация. Вы могли бы использовать эквивалентную версию (с точки зрения результата)

b = a(find(a ~= 0));

, но в конечном итоге mlint пометит строку как ту, в которой чисто логический индекс был более эффективным и, следовательно, более подходящим.

Как всегда, остерегайтесь ТОЧНЫХ тестов на ноль или на любое число, если вы приняли бы элементы a, находящиеся в пределах некоторого эпсилонического допуска нуля. Выполните эти тесты, подобные этому

b = a(abs(a) >= tol);

. При этом сохраняются только те элементы a, размер которых не меньше вашего допуска.

82
ответ дан 27 November 2019 в 03:11
поделиться
b = a(find(a~=0))
3
ответ дан 27 November 2019 в 03:11
поделиться
Другие вопросы по тегам:

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