asdkhalifa
asdkhalifa

Reputation: 35

Transpose a matrix via pointer in C

I'm trying to transpose a matrix in C while passing the matrix to a function and return a pointer to a transposed matrix. What am I doing wrong in the second while loop?

in main

ptr = (float *) getMatrix(numRowsB, numColsB);
transposePtr = transpose(ptr, numRowsB, numColsB);
printf("\nBtranspose =\n");
printMatrix(transposePtr, numColsB, numRowsB);

create matrix

float* getMatrix(int n, int m)
{
  int i, j;
  float *arrayPtr;

  if ((n <= 0) || (m <= 0))
  {
    printf("function getMatrix(): matrix dimensions are invalid\n");
    return NULL;
  }
  arrayPtr = (float *) malloc(n*m*sizeof(float));
  if(arrayPtr == NULL)
  {
    printf("function getMatrix: Unable to malloc array\n");
    return NULL;
  }

transpose function

float* transpose(float *matrix, int n, int m)
{
    int i = 0;
    int j = 0;
    float num;
    float *transposed=(int*) malloc(sizeof(int)*n*m);
        while(i < n-1)
        {
            while(j < m-1)
            {
                num = *(matrix+i*m+j);
                *(transposed+j*m+i)= num;
                j++;
            }
            i++;
        }

    return transposed;
}

print fucntion

 void print(float *matrix, int n, int m)
{
   int i = 0;//row counter
   int j = 0;//col counter
   for(i = 0; i < n; i++){
     printf("\n");
     for(j = 0; j < m; j++){
       printf("%f ", *(matrix + i*n + j));
     }
   }
}

Example input:

1  2  3

4  5  6

Output:

 1.000000 0.000000

 2.000000 3396.580087

-0.000000 0.000000

Upvotes: 0

Views: 7165

Answers (1)

missimer
missimer

Reputation: 4079

Part of the problem was your print function

Here is a version of your functions that works:

float* transpose(float *matrix, int n, int m)
{
  int i = 0;
  int j = 0;
  float num;
  float *transposed=malloc(sizeof(float)*n*m);
  while(i < n) {
    j = 0;
    while(j < m) {
      num = *(matrix + i*m + j);
      *(transposed + i+n*j) = num; // I changed how you index the transpose
      j++;
    }
    i++;
  }

  return transposed;
}


void print(float *matrix, int n, int m)
{
  int i = 0;//row counter
  int j = 0;//col counter
  for(i = 0; i < n; i++){
    printf("\n");
    for(j = 0; j < m; j++){
      printf("%f ", *(matrix + i*m + j)); // Changed from n to m
    }
  }
}

There were a few things.

  1. Use sizeof(float) instead of sizeof(int)

  2. Your loop should be i < n and j < m instead of i < n-1 and j < m-1 and finally you need to reset j to zero every time

  3. The matrix indexes in inner most loop of your transpose function was incorrect

  4. Your print function was using the wrong variable in the multiplication

Also it is generally considered bad practice to cast the result of malloc in C.

Upvotes: 1

Related Questions