954,499 Members — Technology Publication meets Social Media
Username:
Password:
Lost login information?
Have something to say? Contribute New Article Reply to this Article

finding matrix transpose - why doesn't it work when passing pointer argument?

Hi

I'm adapting some code I've written using 2d arrays (to represent matrices) to handle large arrays such that double matrix[][] goes to double **matrix and then I'm using malloc.

It seems to work fine for part of my program up to where I have to find the matrix transpose at which point it does something I don't understand. I've taken that bit of code out and run it by itself (included below), get the same problem and still can't work out why. Can anyone help??
Thanks
jbd

int find_transpose(int n, double **a, double **b)
{
 int i,j;
 for (i=0; i<n; i++)
  {
  for (j=0; j<n; j++)
  b[i][j] = a[i][j];
  }
 for (i=0; i<n; i++)
  {
  for (j=0; j<n; j++)
  b[i][j] = a[j][i];
  }

}


int main (void)
{

 int i, j, p=3;
 double **in, **out;

 in = malloc(p * sizeof(int *));
 out = malloc(p * sizeof(int *));

 for (i=0;  i<p; i++){
 in[i]= malloc(p * sizeof(int *));
 out[i]= malloc(p * sizeof(int *));}

  for (i=0;  i<p; i++)
  {
   for (j=0;  j<p; j++)
   {in[i][j]= 10./(i+1);
   printf("in[%i][%i] = %f\n", i, j, in[i][j]);
   }
 }

 find_transpose(p, in, out);

 for (i=0;  i<p; i++)
  {
   for (j=0;  j<p; j++)
   printf("in[%i][%i] = %f\n", i, j, in[i][j]);
  }

 for (i=0;  i<p; i++)
  {
   for (j=0;  j<p; j++)
   printf("out[%i][%i] = %f\n", i, j, out[i][j]);
  }

return
jbd
Newbie Poster
5 posts since Feb 2008
Reputation Points: 10
Solved Threads: 0
 

What does not work? Does it gives you compile errors? Does it crashes?

dubeyprateek
Junior Poster
176 posts since Mar 2006
Reputation Points: 39
Solved Threads: 24
 

I corrected minor syntactical errors in your code. I did not check the logic. Check following code.

#include<stdio.h>
#include<stdlib.h>

int find_transpose(int n, double **a, double **b)
{
	int i,j;
	for (i=0; i<n; i++)
	{
		for (j=0; j<n; j++)
			b[i][j] = a[i][j];
	}
	for (i=0; i<n; i++)
	{
		for (j=0; j<n; j++)
			b[i][j] = a[j][i];
	}
	return 0;
}


int main (void)
{

	int i, j, p=3;
	double **in, **out;

	in = (double **)malloc(p * sizeof(int *));
	out = (double **)malloc(p * sizeof(int *));

	for (i=0; i<p; i++){
		in[i]= (double *)malloc(p * sizeof(int *));
		out[i]= (double *)malloc(p * sizeof(int *));}

	for (i=0; i<p; i++)
	{
		for (j=0; j<p; j++)
		{in[i][j]= 10./(i+1);
		printf("in[%i][%i] = %f\n", i, j, in[i][j]);
		}
	}

	find_transpose(p, in, out);

	for (i=0; i<p; i++)
	{
		for (j=0; j<p; j++)
			printf("in[%i][%i] = %f\n", i, j, in[i][j]);
	}

	for (i=0; i<p; i++)
	{
		for (j=0; j<p; j++)
			printf("out[%i][%i] = %f\n", i, j, out[i][j]);
	}

	return 0;
}
dubeyprateek
Junior Poster
176 posts since Mar 2006
Reputation Points: 39
Solved Threads: 24
 

Still getting same problem... which is that the input matrix is getting modified when the function is called, here's an example for a test 3 by 3:
The input is:in[0][0] = 10.000000
in[0][1] = 10.000000
in[0][2] = 10.000000
in[1][0] = 5.000000
in[1][1] = 5.000000
in[1][2] = 5.000000
in[2][0] = 3.333333
in[2][1] = 3.333333
in[2][2] = 3.333333

but after being passed to find_transpose is comes out as:in[0][0] = 10.000000
in[0][1] = 10.000000
in[0][2] = 10.000000
in[1][0] = 10.000000
in[1][1] = 5.000000
in[1][2] = 10.000000
in[2][0] = 3.333333
in[2][1] = 3.333333
in[2][2] = 10.000000

and the actual transpose output is:
out[0][0] = 10.000000
out[0][1] = 10.000000
out[0][2] = 10.000000
out[1][0] = 10.000000
out[1][1] = 5.000000
out[1][2] = 3.333333
out[2][0] = 10.000000
out[2][1] = 10.000000
out[2][2] = 10.000000

I really don't understand why!?

Thanks
jbd

jbd
Newbie Poster
5 posts since Feb 2008
Reputation Points: 10
Solved Threads: 0
 

Watch your types.

Going off of dubydapreek's revision:Lines 7..11: Useless. Get rid of them. (You don't need to copy b to a before you copy b to a.)
Lines 27..28: You should be allocating an array of (double *).
Lines 31..32: You should be allocating an array of (double).

As a rule, when using malloc(), it should look something like:
<strong>type</strong> *foo = (<strong>type</strong> *)malloc( n *sizeof( <strong>type</strong> ) );
where "type" is whatever type you need it to be. In your case, "type" is first (double*) then it is (double).

Hope this helps.

Duoas
Postaholic
2,043 posts since Oct 2007
Reputation Points: 1,140
Solved Threads: 229
 

This article has been dead for over three months

Post: Markdown Syntax: Formatting Help
You