Logo Questions Linux Laravel Mysql Ubuntu Git Menu
 

How to copy matrix in C?

Tags:

c

pointers

matrix

I'm trying to write the function matricopy that should copy a matrix but the compiler complains:

/* minmatrix.c - test rows and columns of a matrix
 * Copyright abandoned. This file is in the public domain. */

#include <stdio.h>
#define ROWCOUNT (3)
#define COLUMNCOUNT (4)

int imat[ ROWCOUNT ][ COLUMNCOUNT ]; 
char cmat[ ROWCOUNT ][ COLUMNCOUNT ];
double dmat[ ROWCOUNT ][ COLUMNCOUNT ];
int rmat[ ROWCOUNT ][ COLUMNCOUNT ]; 

void matriscopy (int * destmat, int * srcmat, int rowcount, int columncount) 
{
  int i, j;
  for (i=0; i<rowcount; i=i+1) /* rad-nr */
    for (j=0; j<columncount; j=j+1) /* kolumn-nr */
      destmat[i][j] = srcmat[i][j];
}

int main()
{
  int i; int j;
  int * ip; char * cp; double * dp;

  for( i = 0; i < ROWCOUNT; i = i + 1 )
    for( j = 0; j < COLUMNCOUNT; j = j + 1 )
    {
      imat[ i ][ j ] = 10000 + 100*i + j;
      cmat[ i ][ j ] = 10*i + j;
      dmat[ i ][ j ] = 1.0 + i/100.0 + j/10000.0;
      rmat[ i ][ j ] = 0;
    };

  printf( "\n Examining imat:\n" );
  for( ip = &imat[ 0 ][ 0 ];
       ip <= &imat[ ROWCOUNT - 1 ][ COLUMNCOUNT - 1 ];
       ip = ip + 1 )
    printf( "memory at: %lx contains value: %d\n", (unsigned long) ip, *ip );

  printf( "\n Examining cmat:\n" );
  for( cp = &cmat[ 0 ][ 0 ];
       cp <= &cmat[ ROWCOUNT - 1 ][ COLUMNCOUNT - 1 ];
       cp = cp + 1 )
    printf( "memory at: %lx contains value: %d\n", (unsigned long) cp, *cp );

  printf( "\n Examining dmat:\n" );
  for( dp = &dmat[ 0 ][ 0 ];
       dp <= &dmat[ ROWCOUNT - 1 ][ COLUMNCOUNT - 1 ];
       dp = dp + 1 )
    printf( "memory at: %lx contains value: %f\n", (unsigned long) dp, *dp );

/* Add a statement here to call your matriscopy function. */

  printf( "\n Examining rmat:\n" );
  for( ip = &rmat[ 0 ][ 0 ];
       ip <= &rmat[ ROWCOUNT - 1 ][ COLUMNCOUNT - 1 ];
       ip = ip + 1 )
    printf( "memory at: %lx contains value: %d\n", (unsigned long) ip, *ip );

  return( 0 );
}

I get this error:

$ cc minmatrix.c
minmatrix.c: In function ‘matriscopy’:
minmatrix.c:18:17: error: subscripted value is neither array nor pointer nor vector
minmatrix.c:18:32: error: subscripted value is neither array nor pointer nor vector

Can you help me understand?

like image 721
Niklas Rosencrantz Avatar asked Oct 01 '12 15:10

Niklas Rosencrantz


2 Answers

You can simply use memcpy

void matriscopy (void * destmat, void * srcmat) 
{
  memcpy(destmat,srcmat, ROWCOUNT*COLUMNCOUNT*sizeof(int));
}

The destmat and srcmat should have the same size.

this function allow to copy only the whole matrix.

this function is not able to copy a sub matrix from the mother matrix.

example: If I have a matrix with 7 column and 7 rows. I can not copy with the above function a sub matrix (4 rows and 4 columns) from the mother matrix. To Do it, we have to make a copy cell by cell

like image 90
MOHAMED Avatar answered Oct 16 '22 11:10

MOHAMED


Your matrixcopy function signature should look like this:

void matrixcopy (int destmat[][COLUMNCOUNT], int srcmat[][COLUMNCOUNT], int rowcount, int columncount) 

Of course, then columncount is redundant.

Alternatively, you can treat the matrix as a 1D array of rowcount * columncount integers. In that case, you can do the copy in a single loop, or use the function memcpy from the standard library.

like image 3
Dima Avatar answered Oct 16 '22 09:10

Dima