Получить индексы 1 из двоичной матрицы в виде столбца - PullRequest
0 голосов
/ 09 июня 2018

1 1 0 1 0 0
0 1 1 0 1 0
1 0 0 0 1 1
0 0 1 1 0 1

Я реализовал программу, которая находит индексыиз числа 1 в столбце моды.Например, на примере приведенной выше двоичной матрицы необходимо получить следующие индексы: 0 2 0 1 1 3 0 3 1 2 2 3.

Моя проблема заключается в том, что для получения этих индексов мне пришлось добавитьдва дополнительных ряда, полных нулей.Полностью рабочая программа, которую я реализовал, ниже:

#include <stdio.h>
#include <stdlib.h>
#define padding 2
#define rows_Matrix 4  + padding
#define cols_Matrix 6

int main() 
{

   int index = 0;

   //Allocation of Memory for the Binary Matrix. 
   unsigned **Matrix = (unsigned**)malloc(sizeof(unsigned*)*rows_Matrix); //Rows

   for (int i = 0; i < rows_Matrix; i++) //Rows
   {
       Matrix[i] = (unsigned *)malloc(sizeof(unsigned) * cols_Matrix); //Columns 
   }

   //Assigning elements to the Binary Matrix. 
   Matrix[0][0] = 1; Matrix[0][1] = 1; Matrix[0][2] = 0; Matrix[0][3] = 1;  Matrix[0][4] = 0;  Matrix[0][5] = 0;
   Matrix[1][0] = 0; Matrix[1][1] = 1; Matrix[1][2] = 1; Matrix[1][3] = 0;  Matrix[1][4] = 1;  Matrix[1][5] = 0;
   Matrix[2][0] = 1; Matrix[2][1] = 0; Matrix[2][2] = 0; Matrix[2][3] = 0;  Matrix[2][4] = 1;  Matrix[2][5] = 1;
   Matrix[3][0] = 0; Matrix[3][1] = 0; Matrix[3][2] = 1; Matrix[3][3] = 1; Matrix[3][4] = 0;  Matrix[3][5] = 1;

   //Added padded rows of 0s to get the Matrix a square in order to obtain indices.
   Matrix[4][0] = 0; Matrix[4][1] = 0; Matrix[4][2] = 0; Matrix[4][3] = 0;  Matrix[4][4] = 0;  Matrix[4][5] = 0;
   Matrix[5][0] = 0; Matrix[5][1] = 0; Matrix[5][2] = 0; Matrix[5][3] = 0;  Matrix[5][4] = 0;  Matrix[5][5] = 0;

   //Finding indices of number of 1s in the columns of the matrix.
   printf("Vertical Indices of 1s in the Matrix:\n");

   for (int i = 0; i < rows_Matrix; i++)
   {
      for (int j = 0; j < cols_Matrix; j++)
      {
         if (Matrix[j][i] == 1)
         {
            index = j;
            //Printing indices of 1s in a column fashion.
            printf("%d\t", index); 
         }
      }
   }
   printf("\n");

  return 0;
}

Вывод программы, которую я реализовал, выглядит следующим образом:

Вертикальные индексы 1 с в матрице: 0 2 0 1 13 0 3 1 2 2 3

Я бы хотел сохранить матрицу как матрицу 4x6, а не как матрицу 6x6, и все же получить вышеупомянутые показатели, которые я получил с моей программой.Есть ли способ получить эти индексы без необходимости добавлять дополнительные отступы в C?

Ответы [ 2 ]

0 голосов
/ 09 июня 2018

Определение препроцессора

#define rows_Matrix 4  + padding

должно быть

#define rows_Matrix (4  + padding)

Если вы посмотрите на эту строку

unsigned **Matrix = (unsigned**)malloc(sizeof(unsigned*)*rows_Matrix);

, она расширится до

unsigned **Matrix = (unsigned**)malloc(sizeof(unsigned*)*4  + padding);

Это не будет вести себя так же в

for (int i = 0; i < rows_Matrix; i++)

, где ошибка доброкачественная.Всегда ставьте круглые скобки вокруг операторов препроцессора.

0 голосов
/ 09 июня 2018

Я думаю, что ваша проблема здесь:

for (int i = 0; i < rows_Matrix; i++)
{
   for (int j = 0; j < cols_Matrix; j++)

Вам нужно поменять строки и столбцы, как:

for (int i = 0; i < cols_Matrix; i++)  // cols instead of rows
{
   for (int j = 0; j < rows_Matrix; j++)  // rows instead of cols

После этого вы можете удалить отступ

...