#matlab
#matlab
Вопрос:
Я новичок в MATLAB. Предположим, у меня есть вектор, подобный x = [1 1 1 1 1 1 0 0 1 0]. Я хочу вычислить общее количество элементов в векторе и количество ненулевых элементов в векторе. Затем определите соотношение обоих чисел. Я ищу в справке MATLAB. как сделать подсчет элементов, но до сих пор мне не везло. Если кто-нибудь окажет мне помощь, это было бы большим подспорьем. Заранее спасибо.
Ответ №1:
Вы можете получить количество элементов с помощью numel(x)
.
Вы можете получить количество ненулей с помощью sum(x ~= 0)
.
Таким образом, соотношение равно одному, деленному на другое.
Комментарии:
1. @Oli: Спасибо за ваш быстрый ответ, я использую all (x ==1), чтобы проверить, содержит ли вектор x все ненулевые элементы или нет. Но даже если у меня есть вектор, подобный x = [0 0 0 0 0 0 ], все (x == 1) дает мне ИСТИННОЕ значение, можете ли вы сказать мне, почему это так?
2. @user: Это дает мне значение false, а не true.
3. Ооо … извините за мой проступок … предположим, я хотел проверить, все ли мои элементы равны нулю, будут ли все (x == 0) работать?
4. @user: Да, это сработало бы. В качестве альтернативы,
~any(x)
сработало бы.5. @Oli: Более быстрый подход к ненулевым элементам, который работает только для булевых векторов, таких как этот, — это внутреннее произведение. Если
x
это вектор-столбец,x'*x
выдает тот же ответ, что иnnz
илиsum()
, и на порядок быстрее.
Ответ №2:
Правильный способ найти количество ненулевых элементов (в общем случае) — использовать nnz()
функцию; использование sum()
также работает в этом конкретном случае, но не сработает, если в используемой матрице есть числа, отличные от нуля и единицы. Поэтому, чтобы вычислить общее количество элементов, ненулевое количество элементов и соотношение, используйте код, подобный этому:
x = [1 1 1 1 1 1 0 0 1 0];
nonzeroes = nnz(x);
total = numel(x);
ratio = nonzeroes / total;
Ответ №3:
Отношение ненулевых элементов ко всем элементам в векторе равно:
r = length(find(x)) / length(x)
То, что length
делает, отчасти очевидно. find
дает вам индекс всех ненулевых элементов.
Редактировать: Исправлена ошибка с использованием size вместо length.
Комментарии:
1. Нет, потому что
size
не дает вам скаляр!2. @Darhuuk: Удалено -1. Но
numel
это более общее решение, чем четноеlength
(рассмотрим, что произойдет, еслиx
это матрица, а не вектор).3. @Oli-Charlesworth Хорошая мысль, я думал о том же, когда вы ввели свой комментарий и уже обновили мой ответ, чтобы уточнить.
Ответ №4:
a= numel(find(x))/numel(x)
это еще один способ сделать это.