У меня есть вектор, например,
a = [0 1 0 3]
Я хочу повернуться в b, который равняется b = [1 3]
.
Как я выполняю это в целом? Таким образом, у меня есть вектор с некоторыми нулевыми компонентами, и я хочу удалить обнуление и оставить просто ненулевые числа?
Если вы просто хотите удалить нули, оставив ненулевые в 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, размер которых не меньше вашего допуска.