# Homework Help: Comparing array of data is fortran

1. May 16, 2010

### vjramana

Hi FORTRAN experts,

I have two arrays of data, called data1.dat and data2.dat. each contains 60 data. What I want to do is to compare the data in each file and write the counting into bins. It goes like this. First, take the first data in data1.dat file and compare with the 60 data in data2.dat file. If there is any data which is same with the data in data1.dat then it count in bin. The total bins are also 60. Next it goes to the second data in data1.dat and compare with all the 60 data in data2.dat. If there is any data same then it add in second bin. And it repeats to all the data in data1.dat

I am not very sure how to write this code.

Can anyone help me?

Vijay

2. May 17, 2010

### Staff: Mentor

According to the rules of this forum, you need to make an effort to write the code for this problem before we can give you any help.

To do this problem you need to know about file I/O, arrays, and for loops to iterate through the data in both files.

3. May 17, 2010

### vjramana

Yea I have tried writing the code. It is as below:

program array
implicit none
!
integer, parameter :: D = 60 ! Number of data
integer, parameter :: BB=60 ! Number if bins
integer i, j, k
integer, dimension(1:D) :: xData, yData
integer, dimension(1:BB) :: bins
integer, dimension(0:BB) :: binPart ! Number of partition

!! open data from input file
open(unit=40,status="unknown",file="data1.dat")
open(unit=41,status="unknown",file="data2.dat")

!! read data from input file

!! create bin partitions
do i=0, BB
binPart(i) = 1 * i
end do

!! assign zero value to the bins
do k=1, BB
bins(k)=0
end do

! count the data into the bins according to the criteria
do i=1, D
do k=1,D
do j=0, BB
if (xData(i) == yData(k) )then
bins(j+1) = bins(j+1) + 1
end if
!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!
end do
end do
end do

! write output in a file
do k=1, BB
write(50, *) k, binPart(k-1), binPart(k), bins(k)
end do

end

4. May 17, 2010

### Staff: Mentor

1. Since all your files contain the same number of data, you don't need two different variables - D and BB.

2. What is the purpose of this code?
!! create bin partitions
do i=0, BB
binPart(i) = 1 * i
end do
3. Why do you need bin partitions? And why are you assigning the value 1*i? Obviously that's the same as i.

4. You have a triple-nested loop that does the comparison. I would do this with a double-nested loop by iterating through xData array comparing a given entry with each entry in yData, storing the number of hits in the bins array. For example, if xData(2) = 15, and the yData array contains three elements that are 15, bins(2) would be set to 3.

Next, I would go do the same thing with the yData array, seeing how many elements in the xData array match a given element in yData, storing the count in a different array, bins2. Your description of what you needed to do was not very clear.

5. May 17, 2010

### vjramana

Dear Sir,

1) It is true that I can use the same variables for D and BB. But I used them just for my clarity purpose.

2) I used 1 * i since the bin size I used was 1. If the size is 0.5 than I need to replace the 1 with 0.5. This also just for my clarity purpose.

3) Actually what I want is, I want to count the number of occurrences of xData(i) and yData(j) and write the counting into bins... ( just call the bin as zdata_bin(i,j). ). I do not know how to write the code to do this task.

Could you kindly help?
Thank you.
Vijay

6. May 18, 2010

### Staff: Mentor

If you use two variables when only one is needed, that is not making things clearer.
You've completely lost me here. How can the bin size be .5? What does bin size mean in the context of your program?
This is not clear either. It would help me understand what you are trying to do if you came up with a small example, with two small arrays (10 elements or so in each) and what the 3rd array would look like. No code.

7. May 18, 2010

### rcgldr

You create an integer arrray call binPart, apparently to be used for indexing into bins, but never use it. This is a programming issue, not a language (Fortran) issue. It appears that the changes you need to make are the ones shown below. There's no need to use the "j" index variable.

...
integer, dimension(0:D) :: binPart ! needs to be large enough to translate all possible index values
...
do i=0, D
binPart(i) = 1 * i
...
bins(binPart(i)) = bins(binPart(i)) + 1
...
write(50, *) k, bins(k)
...

Last edited: May 18, 2010
8. May 18, 2010

### vjramana

Dear sir,

I may want to explain like this. Imagine we have x,y and z co-ordinate.
Lets say I have 10 values along x-axis and another 10 values along y-axis. The co-ordinates may look like this (x,y).

(1,4), (4,6), (2,6), (1,4), (2,6), (8,0), (1,4), (2,6), (1,4), (8,0)

Additionally I put 5 bins in the size of two units along x-axis and y-axis. This could be imagined as
x y
binx1= (0 to 2) biny1= (0 to 2)
binx2= (2 to 4) biny2= (2 to 4)
binx3= (4 to 6) biny3= (4 to 6)
binx4= (6 to 8) biny4= (6 to 8)
binx5= (8 to 10) biny5= (8 to 10)

Now if we see,
in the region of binx1 and biny2 there are 4 points.
In the region of binx1 and biny3 there are 3 points.
In the region of binx2 and biny3 there is only 1 point
and
in the region of binx4 and biny1 there are 2 points.

The total points in the regions are equal to the total (x,y) points.

My z-axis (where here I imagined as normal to the x y plane) would represent the number of points present in each location of the region ( like 4,3,1,and 2 as in the example)

This is what I am trying to do to plot a contour graph. using binx biny and binz later

Hope this explanation gives you better picture of the problem.

Thank you
sir

Regards
Vijay

9. May 18, 2010

### Staff: Mentor

You might not have noticed that with five pairs of bins binx1, binx2, ..., binx2, and biny1, biny2, ..., biny5, a point could go into any one of 25 bins. The number of bins needed would depend on the range of data in the two dimensions, and the width of each bin. In your small example, the range for x and y was 0 through 10, and you chose a bin width of 2.

And if you have 60 data points, and a bin width of 1 (as you had in your original code), you might need up to 3600 separate bins. Again, the number of bins would depend on the range of the data, and the number of subintervals along each axis.

When you plot the values in pairs of bins, what you're getting is a frequency histogram, not a contour plot.

10. May 19, 2010

### vjramana

Dear Sir,

You are correct sir. Actually what I want is the frequency histogram.
So in order to get this how the code should be?
I need help in this.

In this process, I have rewritten the code. Below is the code :-

**************************************************************************************
program dummy
implicit none
!
integer :: i,j,k,l
integer,parameter :: noData=30
integer,parameter :: noBins=5
integer,parameter :: binSize=2
integer,dimension(1:30) :: xdata, ydata
integer,dimension(0:noBins) :: xBINS,yBINS, xbinPart, ybinPart
!integer,dimension(0:noBins, 0:noBins) :: xyBins, xyBinPart

! OPEN FILES
open(unit=50,status="unknown",file="xyData.dat",form="formatted")
open(unit=51,status="old",file="xDATA.dat",form="formatted")
open(unit=52,status="old",file="yDATA.dat",form="formatted")

DO i=1,noData
END DO

! PARTITION FOR BIN SIZE
do i=0, noBins
xbinPart(i) = binSize * (i)
ybinPart(i) = binSize * (i)
end do

! ASSIGIN ZERO VALUES IN EACH BIN

do i=0, noBins
xBINS(i) = 0
yBINS(i) = 0
end do

! CLASSIFY THE DATA
do k=1,noData
do l=0, noBins
!if((xdata(k).ge.xbinPart(l).and.xdata(k).lt.xbinPart(l+1)).and.(ydata(k).ge.ybinPart(l).and.ydata(k).lt.ybinPart(l+1)))then
!if((xdata(k).ge.xbinPart(l).and.ydata(k).ge.ybinPart(l)).and.(xdata(k).lt.xbinPart(l+1).and.ydata(k).lt.ybinPart(l+1)))then
!!if(xdata(k).ge.xbinPart(l).and.(xdata(k).lt.xbinPart(l+1)))then
!!xBINS(l) = xBINS(l) + 1
!yBINS(l) = yBINS(l) + 1

if (ydata(k).ge.ybinPart(l).and.(ydata(k).lt.ybinPart(l+1)))then
yBINS(l) = yBINS(l) + 1
end if
end do
end do

! PRINT OUT
do i = 0, noBins
!print*,"binNo",i, " ", xBINS(i), yBINS(i)
print*,"binNo",i," ",yBINS(i)
end do

end program dummy
******************************************************************************

Vijay

Last edited: May 19, 2010
11. May 20, 2010

### Staff: Mentor

This is the section that probably needs work:
Code (Text):

! CLASSIFY THE DATA
do k=1,noData
do l=0, noBins
!if((xdata(k).ge.xbinPart(l).and.xdata(k).lt.xbinP art(l+1)).and.(ydata(k).ge.ybinPart(l).and.ydata(k ).lt.ybinPart(l+1)))then
!if((xdata(k).ge.xbinPart(l).and.ydata(k).ge.ybinP art(l)).and.(xdata(k).lt.xbinPart(l+1).and.ydata(k ).lt.ybinPart(l+1)))then
!!if(xdata(k).ge.xbinPart(l).and.(xdata(k).lt.xbin Part(l+1)))then
!!xBINS(l) = xBINS(l) + 1
!yBINS(l) = yBINS(l) + 1

if (ydata(k).ge.ybinPart(l).and.(ydata(k).lt.ybinPart (l+1)))then
yBINS(l) = yBINS(l) + 1
end if
end do
end do

This is very difficult to read, because there are no spaces except for those that are syntax errors (e.g. xbin Part, which should be xbinPart).

Also, instead of using an if statement nested four levels deep, a logic structure using if ... then ... else if ... then ... else if... then ... end if would be easier to understand.

Now that I understand better what you're trying to do, it seems to me that your x and y bins are not necessary. All you need is a two-dimensional bin, like what you have for xyBins.

For this to work your program needs to know the ranges of x and y values. In the sample points you supplied earlier, all the x values were between 1 and 8, inclusive, and the y values were between 0 and 6. If you assume that all values are between 0 and 10, and that the bin size is 2, you can test the x value to determine the first coordinate of the bin it should go in, and test the y value for the second coordinate of the bin it should go in.

For example with bins 0 - 2, 2 - 4, 4 - 6, 6 - 8, and 8 - 10, the point (8, 0) would go in xyBins(4, 0). I am counting bin numbers from zero; i.e., bin 0 is 0 - 2, and bin 4 is 8 - 10.

12. May 21, 2010

### vjramana

The actual section as below::

! CLASSIFY THE DATA
do k=1,noData
do l=0, noBins
if (ydata(k).ge.ybinPart(l).and.(ydata(k).lt.ybinPart (l+1)))then
yBINS(l) = yBINS(l) + 1
end if
end do
end do

13. May 21, 2010

### Staff: Mentor

I understand that there are a lot of lines commented out in the code, but take a closer look at what I wrote in post #11.