Hi all , i am supposed to create a program that performs a specific
operation to a 2-D matrix whose elements are positive (or zero ).
This operation is repeated T times on the matrix and only the final
matix is needed . The operation to be perormed is
V(t,x,y)=1/2*(sqrt(V(t-1,x-1,y))+sqrt(V(t-1,x-1,y))) . The problem iis
that i have (or i think i have ) created a correct program that
performs this operation but something happens that i cannot understand
.. The final matrix is the same regardless the value of T . That means
that the final matrix is the same for T=10 and T=1000 !!! The code i
have managed to write so far is the following :
/********** VERSION FOR ONE PROCESSOR *****/
#include <stdio.h>
#include <stdlib.h>
#include <malloc.h>
#include <math.h>
#define T 2000
#define X 10
#define Y 10
/* TODO ... to pass these values from the command line ... */
double **CreateMatrix(int,int);
void DestroyMatrix(double **,int);
void InitializeMatrix(double **,int,int);
void CopyMatrix(double **,double **,int,int);
/* The following function is for DEBUG purposes only */
void PrintMatrix(double **,int,int);
int main(void)
{
double **currentMatrix; // Initialization ??? cast to NULL
???
double **tempMatrix; // Initialization ???
double tempValue;
int t,x,y;
for(t=1; t<T; t++)
{
currentMatrix=CreateMatrix(X,Y);
InitializeMatrix(currentMatrix,X,Y);
/* printf("Matrix Created .... \n"); */
if(t==1)
{
tempMatrix=CreateMatrix(X,Y);
InitializeMatrix(tempMatrix,X,Y);
}
for(x=1; x<X; x++)
{
for(y=1; y<Y; y++)
{
if((x==1) && (y==1))
{
tempValue=(double)1;
}
if((x==1) && (y>1))
{
tempValue=(double)1+(double)sqrt(tempMatrix[y-1][x]);
}
if((y==1) && (x>1))
{
tempValue=(double)sqrt(tempMatrix[y][x-1]);
}
if((x>1) && (y>1))
{
tempValue=(double)sqrt(tempMatrix[y][x-1])+(double)sqrt(tempMatrix[y-1][x]);
}
currentMatrix[y][x]=((double)tempValue)/((double)2);
}
}
/* printf("After changing the matrix ..... \n"); */
/* PrintMatrix(currentMatrix,Y,X); */
if(t!= T-1)
{
/* printf("You reached so far .... !!\n"); */
CopyMatrix(tempMatrix,currentMatrix,Y,X);
/* printf("Now printing the old matrix..... \n");
*/
/* PrintMatrix(tempMatrix,Y,X); */
DestroyMatrix(currentMatrix,Y);
}
} /* end of the triple loop ... */
for(int tempi=0; tempi<Y ; tempi++)
{
for(int tempj=0; tempj<X; tempj++)
{
printf(" %f ",currentMatrix[tempi][tempj]);
}
printf("\n");
}
DestroyMatrix(currentMatrix,Y);
DestroyMatrix(tempMatrix,Y);
return 0;
}
double ** CreateMatrix(int X_dim,int Y_dim)
{
double **retdouble=malloc(Y_dim*(sizeof(double *)));
if(retdouble == NULL)
{
printf("Error Allocating memory ..... \n");
exit(EXIT_FAILURE);
}
for (int k=0; k<Y_dim; k++)
{
retdouble[k]=malloc(X_dim*(sizeof(double)));
if(retdouble[k]==NULL)
{
printf("Error Allocating memory ... \n");
exit(EXIT_FAILURE);
}
}
return retdouble;
}
void DestroyMatrix(double ** matrix,int Y_dim)
{
for(int i=0; i<Y_dim; i++)
{
free(matrix[i]);
}
free(matrix);
}
void InitializeMatrix(double **matrix,int X_dim,int Y_dim)
{
for(int i=0; i<Y_dim; i++)
{
for(int j=0; j<X_dim; j++)
{
matrix[i][j]=0;
}
}
}
void CopyMatrix(double **target,double **source,int Y_dim,int X_dim)
{
for (int i=0; i<Y_dim; i++)
{
for(int j=0; j<X_dim; j++)
{
target[i][j]=source[i][j];
}
}
}
void PrintMatrix(double **dest,int Y_dim,int X_dim)
{
for(int tempi=0; tempi<Y_dim ; tempi++)
{
for(unsigned short tempj=0; tempj<X_dim; tempj++)
{
printf(" %f ",dest[tempi][tempj]);
}
printf("\n");
}
}
The program simply creates two matrices dynamically , currentMartix
for the current operation and tempMatrix for the last operation ...
After all the elements of the current matrix have changed according to
the mathematical formula i wrote before they are going to be copied
to the tempMatrix and then the currentMatrix is going to be erased ...
This is performed T times ..
(Sorry for my english ) 3 1617
On Sat, 06 Dec 2003 17:27:17 +0200, Andrew
<af********************@yahoo.com> wrote: Hi all , i am supposed to create a program that performs a specific operation to a 2-D matrix whose elements are positive (or zero ). This operation is repeated T times on the matrix and only the final matix is needed . The operation to be perormed is V(t,x,y)=1/2*(sqrt(V(t-1,x-1,y))+sqrt(V(t-1,x-1,y))) . The problem iis that i have (or i think i have ) created a correct program that performs this operation but something happens that i cannot understand . The final matrix is the same regardless the value of T . That means
I ran your code with T defined as 5 and determined from the debugger
that tempMatrix[1] had three non-zero values. Ran it again with T
defined as 100 and tempMatrix had nine non-zero values. Something
else must be the problem. Keep reading.
that the final matrix is the same for T=10 and T=1000 !!! The code i have managed to write so far is the following :
/********** VERSION FOR ONE PROCESSOR *****/
#include <stdio.h> #include <stdlib.h> #include <malloc.h> #include <math.h>
#define T 2000 #define X 10 #define Y 10
/* TODO ... to pass these values from the command line ... */
double **CreateMatrix(int,int); void DestroyMatrix(double **,int); void InitializeMatrix(double **,int,int); void CopyMatrix(double **,double **,int,int);
/* The following function is for DEBUG purposes only */
void PrintMatrix(double **,int,int);
int main(void) { double **currentMatrix; // Initialization ??? cast to NULL ???
There is no need since you initialize it immediately during execution.
Some like to do it as a matter of style.
double **tempMatrix; // Initialization ??? double tempValue; int t,x,y; for(t=1; t<T; t++)
You are aware that this will only execute the loop T-1 times, not T?
{ currentMatrix=CreateMatrix(X,Y);
It is a little confusing that you pass the parameters as X and Y when
you reference the matrix as y and x.
InitializeMatrix(currentMatrix,X,Y); /* printf("Matrix Created .... \n"); */ if(t==1) { tempMatrix=CreateMatrix(X,Y); InitializeMatrix(tempMatrix,X,Y); } for(x=1; x<X; x++) { for(y=1; y<Y; y++) { if((x==1) && (y==1))
You seem to be ignoring row and column 0 here.
{ tempValue=(double)1;
The cast is irrelevant. 1 is an int and would be converted to double
automatically. If you want an indication in the source line that you
are not dealing with integers, 1.0 would be preferable.
} if((x==1) && (y>1)) {
tempValue=(double)1+(double)sqrt(tempMatrix[y-1][x]);
sqrt returns a double so that cast is completely superfluous.
} if((y==1) && (x>1)) {
tempValue=(double)sqrt(tempMatrix[y][x-1]); } if((x>1) && (y>1)) {
tempValue=(double)sqrt(tempMatrix[y][x-1])+(double)sqrt(tempMatrix[y-1][x]); }
currentMatrix[y][x]=((double)tempValue)/((double)2);
You really are in love with casts, aren't you? Why? What do you
think they accomplish?
} } /* printf("After changing the matrix ..... \n"); */ /* PrintMatrix(currentMatrix,Y,X); */ if(t!= T-1) { /* printf("You reached so far .... !!\n"); */ CopyMatrix(tempMatrix,currentMatrix,Y,X);
This copies currentMatrix to tempMatrix.
/* printf("Now printing the old matrix..... \n"); */ /* PrintMatrix(tempMatrix,Y,X); */ DestroyMatrix(currentMatrix,Y);
This completely frees currentMatrix in preparation for reallocating it
during the next iteration through the loop.
It would have been simpler to merely reinitialize currentMatrix.
} } /* end of the triple loop ... */ for(int tempi=0; tempi<Y ; tempi++) { for(int tempj=0; tempj<X; tempj++) { printf(" %f ",currentMatrix[tempi][tempj]);
Can you guess which parameter above no longer exists. You are
invoking undefined behavior.
} printf("\n"); }
DestroyMatrix(currentMatrix,Y);
You cannot free memory that has already been freed. More undefined
behavior.
DestroyMatrix(tempMatrix,Y); return 0; }
double ** CreateMatrix(int X_dim,int Y_dim) { double **retdouble=malloc(Y_dim*(sizeof(double *))); if(retdouble == NULL) { printf("Error Allocating memory ..... \n"); exit(EXIT_FAILURE); } for (int k=0; k<Y_dim; k++)
Unless you happen to have a C99 compiler, declaring variables inside
the for statement is a non-standard extension.
{ retdouble[k]=malloc(X_dim*(sizeof(double))); if(retdouble[k]==NULL) { printf("Error Allocating memory ... \n");
A different error message would be nice to distinguish between the two
different allocations.
exit(EXIT_FAILURE); } } return retdouble; } void DestroyMatrix(double ** matrix,int Y_dim) { for(int i=0; i<Y_dim; i++) { free(matrix[i]); } free(matrix); }
void InitializeMatrix(double **matrix,int X_dim,int Y_dim) { for(int i=0; i<Y_dim; i++) { for(int j=0; j<X_dim; j++) { matrix[i][j]=0; } } }
void CopyMatrix(double **target,double **source,int Y_dim,int X_dim) { for (int i=0; i<Y_dim; i++) { for(int j=0; j<X_dim; j++) { target[i][j]=source[i][j]; } } }
void PrintMatrix(double **dest,int Y_dim,int X_dim) { for(int tempi=0; tempi<Y_dim ; tempi++) { for(unsigned short tempj=0; tempj<X_dim; tempj++)
I give up. Why is this index different from all other indices?
{ printf(" %f ",dest[tempi][tempj]);
Since your values are doubles, wouldn't you like to print them as
doubles instead of floats?
} printf("\n"); } }
The program simply creates two matrices dynamically , currentMartix for the current operation and tempMatrix for the last operation ... After all the elements of the current matrix have changed according to the mathematical formula i wrote before they are going to be copied to the tempMatrix and then the currentMatrix is going to be erased ... This is performed T times ..
(Sorry for my english )
Why? It was understandable.
<<Remove the del for email>>
Barry Schwarz wrote: On Sat, 06 Dec 2003 17:27:17 +0200, Andrew <af********************@yahoo.com> wrote:
#include <malloc.h>
Additional comment: <malloc.h> is not a standard header. Use <stdlib.h>
for all your mallocing needs.
-Kevin
--
My email address is valid, but changes periodically.
To contact me please use the address from a recent posting.
On 6 Dec 2003 22:20:29 GMT, Barry Schwarz <sc******@deloz.net> wrote:
Mr. Schwarz thank you very-very much for reading/commenting/executing
my code . I can now remove all the unnecessary operations and make it
run faster . It doesn't matter if the loop(s) are executed T or T-1
times because i am creating a parallel version of the program ( for
more than one processors , actually 16 ) and I must ensure that the
final matrix is the same with that calculated from the one processor
program . We even ignore the boundary conditions (for X=0 and Y=0 )
we need them only to compute the V(t,1,y) and V(t,x,1) values...
Anyway a friend of mine is getting the same results with this program
so I think I don't make something wrong with the algorithm ... I will
optimize my code to get faster execution times following your remakrs
..
Thanks again !! This thread has been closed and replies have been disabled. Please start a new discussion. Similar topics
by: strutsng |
last post by:
I want if "a C program is a standard C++ program, but not vice versa"
is a correct statement?
In a C++ program, we can use standard C libraries. However, we cannot
use C++ libraries inside C...
|
by: bnp |
last post by:
Hi,
I took a test on C.
there was an objective question for program output type.
following is the program:
main()
{
char ch;
int i =2;
|
by: vashwath |
last post by:
Might be off topic but I don't know where to post this question.Hope
some body clears my doubt.
The coding standard of the project which I am working on say's not to
use malloc.When I asked my...
|
by: findmadhav |
last post by:
I need a program in C (something like a TSR) which will automatically
press the function key F6, say about every 5 seconds. Can anyone
provide me with an exe of such a program?
Thanks in advance.
|
by: sami.jan |
last post by:
Hi
I am using the xlC_r compiler on AIX 5.2 - this program crashes with a
segmentation fault (core dumped) - I compile with a command: xlC_r
filename.C - no switches or anything...
|
by: Andrea |
last post by:
I wrote this code:
void * xmalloc (size_t size){
register void *value = OPENSSL_malloc(size);
if (value == 0)
printf("virtual memory exhausted");
return value;
}
int _chooseTSK(char*...
|
by: Rajeet Dalawal |
last post by:
Good day group.
I was asked in an interview to explain the behavior of this program.
void main()
{
char *s = "abc";
int *i = (int *) s;
printf("%x", *i);
}
|
by: bintom |
last post by:
Is there any reason why the following C++ code behaves as it does ?
int i;
i=1; cout << (++i)++; Output: 2
i=1; cout << ++(++i); Output: 3
|
by: bintom |
last post by:
Why doe the following C++ code behaves as it does?
int i;
i=1; cout << (++i)++; Output: 2
i=1; cout << ++(++i); Output: 3
i=1; cout << (i++)++; Output: Error. LValue required...
|
by: ryjfgjl |
last post by:
ExcelToDatabase: batch import excel into database automatically...
|
by: isladogs |
last post by:
The next Access Europe meeting will be on Wednesday 6 Mar 2024 starting at 18:00 UK time (6PM UTC) and finishing at about 19:15 (7.15PM).
In this month's session, we are pleased to welcome back...
|
by: isladogs |
last post by:
The next Access Europe meeting will be on Wednesday 6 Mar 2024 starting at 18:00 UK time (6PM UTC) and finishing at about 19:15 (7.15PM).
In this month's session, we are pleased to welcome back...
|
by: Vimpel783 |
last post by:
Hello!
Guys, I found this code on the Internet, but I need to modify it a little. It works well, the problem is this: Data is sent from only one cell, in this case B5, but it is necessary that data...
|
by: ArrayDB |
last post by:
The error message I've encountered is; ERROR:root:Error generating model response: exception: access violation writing 0x0000000000005140, which seems to be indicative of an access violation...
|
by: PapaRatzi |
last post by:
Hello,
I am teaching myself MS Access forms design and Visual Basic. I've created a table to capture a list of Top 30 singles and forms to capture new entries. The final step is a form (unbound)...
|
by: Defcon1945 |
last post by:
I'm trying to learn Python using Pycharm but import shutil doesn't work
|
by: af34tf |
last post by:
Hi Guys, I have a domain whose name is BytesLimited.com, and I want to sell it. Does anyone know about platforms that allow me to list my domain in auction for free. Thank you
|
by: isladogs |
last post by:
The next Access Europe User Group meeting will be on Wednesday 3 Apr 2024 starting at 18:00 UK time (6PM UTC+1) and finishing by 19:30 (7.30PM).
In this session, we are pleased to welcome former...
| |