Как найти количество нулей в матрице

AGOUTI

1 / 1 / 1

Регистрация: 11.11.2016

Сообщений: 68

1

Посчитать количество нулей в веденной матрице!

27.11.2016, 15:45. Показов 2200. Ответов 1

Метки c++, матрица, цикл for (Все метки)


Студворк — интернет-сервис помощи студентам

Мой код, по непонятным мне причинам, не считает нули вводимой матрицы, не могу найти ошибку (последний ИФ)

C++
1
2
3
4
5
6
7
8
9
10
11
12
13
14
15
16
17
18
19
20
21
22
23
24
25
26
27
28
29
30
31
32
33
34
35
36
37
38
39
40
41
42
43
44
45
46
47
48
49
50
51
#include <iostream>//Библиотека ввода-вывода
#include <Windows.h>//Библиотека для русского языка
 
using namespace std;//Использования стандартного пространства
 
int main()//Отсутствует взаимодействие с внешней средой
{
    SetConsoleCP(1251);//Подключаем русский язык
    SetConsoleOutputCP(1251);
 
//Объявляем:
    int sum=0, dob=1, kil=0;//Начальную сумму, произведение и количество.
    int n=4, m=3;//Размерность массива
    int mas[n][m];//массив
 
    for (int i = 0; i < n; i++) // двигаемся по строкам
    {for(int j = 0; j < m; j++)// двигаемся по столбцам
        {cout<<"ntВведите "<<j<<" элемент "<<i<<" строки:";
        cin>>mas[i][j] ; // вводим массив
        }
    }
//Цикл перебирания элементов массива:
    for (int i = 0; i < n; i++) // строки
    {
    for(int j = 0; j < m; j++)//столбцы
        {
            if (abs(mas[i][j]) < 1) // если модуль меньше еденицы,переходим к следующему элементу массива с помощью оператора continue
            {continue;}
                else
                {dob*=mas[i][j];} // в противном случае элементы перемножаются
 
            if (mas[i][j] < 0) // если элемент меньше еденицы,переходим к следующему элементу массива с помощью оператора continue
            {continue;}
                else
                {sum+=mas[i][j];} // в противном случае элементы суммируются
 
            if (mas[i][j] != 0) // если элемент не равен нулю,переходим к следующему элементу массива с помощью оператора continue
            {continue;}
                else
                {kil++;} // в противном срабатывает счетчик
 
 
        }
    }
 
        cout<<"nПроизведение элементов массива, модуль которых больше 1: "<<dob;
        cout<<"ntСумма положительных элементов: "<<sum;
        cout<<"nttКоличество нулевых элементов: "<<kil<<endl;//Выводим результат на экран
 
    return 0;
}



0



lawr

385 / 279 / 478

Регистрация: 09.05.2014

Сообщений: 769

28.11.2016, 13:01

2

вы же блин сами написали, что “если модуль меньше еденицы,переходим к следующему элементу массива с помощью оператора continue”. ноль ведь по модулю меньше меньше 1? ну так чего же вы удивляетесь, что встретив ноль, программа переходит сразу к следующему элементу, даже не проверив является ноль нолем))) пишите условия нормально.

C++
1
2
3
4
5
6
            if (abs(mas[i][j]) > 1) 
                {dob*=mas[i][j];} 
            if (mas[i][j] > 0) 
                {sum+=mas[i][j];} 
            if (mas[i][j] == 0) 
                {kil++;}

и да, библиотеку <cmath> было бы неплохо подключить, раз уж юзаете abs



1



Without storing any external information, no, you can’t do any better than Θ(N2). The rationale is simple – if you don’t look at all N2 locations in the matrix, then you can’t guarantee that you’ve found all of the zeros and might end up giving the wrong answer back. For example, if I know that you look at fewer than N2 locations, then I can run your algorithm on a matrix and see how many zeros you report. I could then look at the locations that you didn’t access, replace them all with zeros, and run your algorithm again. Since your algorithm doesn’t look at those locations, it can’t know that they have zeros in them, and so at least one of the two runs of the algorithm would give back the wrong answer.

More generally, when designing algorithms to process data, a good way to see if you can do better than certain runtimes is to use this sort of “adversarial analysis.” Ask yourself the question: if I run faster than some time O(f(n)), could an adversary manipulate the data in ways that change the answer but I wouldn’t be able to detect? This is the sort of analysis that, along with some more clever math, proves that comparison-based sorting algorithms cannot do any better than Ω(n log n) in the average case.

If the matrix has some other properties to it (for example, if it’s sorted), then you might be able to do a better job than running in O(N2). As an example, suppose that you know that all rows of the matrix are sorted. Then you can easily do a binary search on each row to determine how many zeros it contains, which takes O(N log N) time and is faster.

Depending on the parameters of your setup, you might be able to get the algorithm to run faster if you assume that you’re allowed to scan in parallel. For example, if your machine has K processors on it that can be dedicated to the task of scanning the matrix, then you could split the matrix into K roughly evenly-sized groups, have each processor count the number of zeros in the group, then sum the results of these computations up. This ends up giving you a runtime of Θ(N2 / K), since the runtime is split across multiple cores.

Помогите найти количество нулей в матрице на Паскале. матрица заполнена случайными числами

Кирилл Иванов



Ученик

(211),
закрыт



12 лет назад

Лучший ответ

Тимур Хафизов

Мыслитель

(8776)


12 лет назад

k := 0;
for i := 1 to N do
for j := 1 to M do
if A[ i, j ] = 0 then k := k + 1;
writeln(‘k=’, k);

Остальные ответы

Витя

Мыслитель

(6598)


12 лет назад

Пиши в личку сделаю за недорого

Maxima

Мудрец

(13766)


12 лет назад

count:=0;
for i:=1 to N do
for j:=1 to M do
if(A[i,j]=0) inc(count);
Writeln(‘Count: ‘, count);

Похожие вопросы

Не могу написать программу которая считает количество нулевых елементов в матрице.
Мне сказали что её можно написать за 5 минут, у меня невыходит!

#include <stdio.h>
#include <conio.h>
main()
{
int s[3][3];
int i,j,o,a,b,c;
o=0;a=0;b=0;c=0;
printf("Vvedite matricu 3x3n");
for(i=0;i<=2;i=i+1){
  for(j=0;j<=2;j=j+1){
                      scanf("%d", &s);
                     }}
for(i=0;i<=2;i=i+1){
 for(j=0;j<=2;j=j+1){
                     if(s[i][j]==0){o=o+1;}
                     }}
                     printf("Vsego v matrice nulei: %dn", o);
for(i=0;i<=0;i++){
 for(j=0;j<=2;j=j+1){
                     if(s[i][j]==0){a=a+1;}
                     }}
                     printf("V pervoy stroke nulei: %dn", a);
for(i=1;i<=1;i++){
 for(j=0;j<=2;j=j+1){
                     if(s[i][j]==0){b=b+1;}
                     }}
                     printf("V vtoroy stroke nulei: %dn", b);
for(i=2;i<=2;i++){
 for(j=0;j<=2;j=j+1){
                     if(s[i][j]==0){c=c+1;}
                     }}
                     printf("V tretey stroke nulei: %dn", c);
                     getch();//PAUSE                                          
 
}

Вопрос:

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

Добавить комментарий