У меня есть матрица NxM
, например, с именем A
. После некоторых процессов я хочу подсчитать нулевые элементы.
Как я могу сделать это в одном коде строки? Я попробовал A==0
, который возвращает 2D-матрицу.
Существует функция для поиска числа ненулевых матричных элементов 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(:))
.
некоторый базовый матлаб, который должен знать: оператор (:)
сгладит любую матрицу в вектор-столбец, ~
– это оператор NOT, переворачивающий нули в единицы и ненулевые значения в нуль, тогда мы просто используем сумму:
sum(~A(:))
Это также должно быть примерно 10 раз быстрее, чем схема length(find...
, если эффективность важна.
Изменить: в случае значений NaN вы можете прибегнуть к решению:
sum(A(:)==0)
Я добавлю что-то в микс. Вы можете использовать histc
и вычислить гистограмму всей матрицы. Вы указываете второй параметр, который будет содержать ячейки, в которые должны быть собраны цифры. Если мы просто хотим подсчитать количество нулей, мы можем просто указать 0
как второй параметр. Однако, если вы укажете матрицу в histc
, она будет работать вдоль столбцов, но мы хотим работать со всей матрицей. Таким образом, просто преобразуйте матрицу в вектор-столбец A(:)
и используйте histc
. Другими словами, сделайте следующее:
histc(A(:), 0)
Это должно быть эквивалентно подсчету количества нулей во всей матрице A
.
Ну, я не знаю, отвечаю ли я на вопрос, но вы можете его прописать следующим образом:
% 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