Найти число нулевых элементов в матрице в MATLAB

Вопрос:

У меня есть матрица 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) Малые данные

enter image description here

enter image description here

enter image description here

2. Средние значения

enter image description here

enter image description here

enter image description here

3. Большие данные

enter image description here

enter image description here

enter image description here

Наблюдения

  • Если вы внимательно посмотрите на графики производительности 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

Оцените статью
TechArks.Ru
Добавить комментарий