Вопрос:
У меня есть матрица NxM, например, с именем A. После некоторых процессов я хочу подсчитать нулевые элементы.
Как я могу сделать это в одном коде строки? Я попробовал A==0, который возвращает 2D-матрицу.
Ответ №1
Существует функция для поиска числа ненулевых матричных элементов nnz. Вы можете использовать эту функцию в логической матрице, которая вернет число true.
В этом случае мы применяем nnz к матрице A==0, поэтому элементы логической матрицы true, если исходный элемент равен 0, false для любого другого элемента, кроме 0.
A = [1, 3, 1; 0, 0, 2; 0, 2, 1]; nnz(A==0) %// returns 3, i.e. the number of zeros of A (the amount of true in A==0)
Кредиты для бенчмаркинга принадлежат Divarkar.
Бенчмаркинг
Используя следующие параметры и входы, можно провести сравнение решений, представленных здесь с помощью timeit.
Размеры ввода
- Малый размер данных – 1:10:100
- Среднее значение datasize – 50:50:1000
- Размер большого массива – 500:500:4000
Изменение% нулей
- ~ 10% случая нулей – A = round(rand(N)*5);
- ~ 50% случая нулей – A = rand(N);A(A<=0.5)=0;
- ~ 90% случая нулей – A = rand(N);A(A<=0.9)=0;
Результаты показаны ниже –
1) Малые данные
2. Средние значения
3. Большие данные
Наблюдения
-
Если вы внимательно посмотрите на графики производительности nnz и SUM для средних и больших данных, вы заметите, что их характеристики становятся ближе друг к другу для случаев 10% и 90% нулей. Для случая 50% нулей разрыв производительности между методами SUM и nnz сравнительно широк.
-
Как общее наблюдение во всех данных и всех трехфазных случаях нулей,
Метод SUM представляется бесспорным победителем. Опять же, здесь наблюдалось интересное, что решение общего случая sum(A(:)==0) кажется лучшим в производительности, чем sum(~A(:)).
Ответ №2
некоторый базовый матлаб, который должен знать: оператор (:) сгладит любую матрицу в вектор-столбец, ~ – это оператор NOT, переворачивающий нули в единицы и ненулевые значения в нуль, тогда мы просто используем сумму:
sum(~A(:))
Это также должно быть примерно 10 раз быстрее, чем схема length(find…, если эффективность важна.
Изменить: в случае значений NaN вы можете прибегнуть к решению:
sum(A(:)==0) Ответ №3
Я добавлю что-то в микс. Вы можете использовать histc и вычислить гистограмму всей матрицы. Вы указываете второй параметр, который будет содержать ячейки, в которые должны быть собраны цифры. Если мы просто хотим подсчитать количество нулей, мы можем просто указать 0 как второй параметр. Однако, если вы укажете матрицу в histc, она будет работать вдоль столбцов, но мы хотим работать со всей матрицей. Таким образом, просто преобразуйте матрицу в вектор-столбец A(:) и используйте histc. Другими словами, сделайте следующее:
histc(A(:), 0)
Это должно быть эквивалентно подсчету количества нулей во всей матрице A.
Ответ №4
Ну, я не знаю, отвечаю ли я на вопрос, но вы можете его прописать следующим образом:
% Random Matrix M = [1 0 4 8 0 6; 0 0 7 4 8 0; 8 7 4 0 6 0]; n = size(M,1); % Number of lines of M p = size(M,2); % Number of columns of M nbrOfZeros = 0; % counter for i=1:n for j=1:p if M(i,j) == 0 nbrOfZeros = nbrOfZeros + 1; end end end nbrOfZeros