Thread: Help me Solve this problem

  1. #1
    Registered User
    Join Date
    Jun 2008
    Posts
    5

    Help me Solve this problem

    I have an array(size 35) with various positive double values. I need to use these values in an algorithm ultimately to calculate an (x,y) position on a graph, but that is irrelevant. What I need help with is how to narrow this array down from 35 values to 20. You see, the 35 values range (from around 40 to 80...usually) and what I want to do, is get my array of 35 (all the values) to become a smaller array of 20 that is made up of the 20 highest values from the array of 35. I have been working on this algorithm the past 3 hours and am getting kind of sick of it, so any hints or help from you guys would be appreciated.
    Here is basically what I have so far.
    Code:
    for( i=0; i+1<=35; i++ )
    	{
    		GetVal ( dRSSI[i] );                          // I fill my array of 35 w/ values i need
    	}
    for( i=0, n=0; i+1<=35, n+1<=20; i++, n++ )
    	{
    		if( dRSSI[i] >= dRSSI[i+1] )                 //If val a > b, keep a and put it into smaller
    			{                                    //array
    				LessdRSSI[n] = dRSSI[i];
    			}
    	}

  2. #2
    The larch
    Join Date
    May 2006
    Posts
    3,573
    If you are allowed to use the standard library, then the solution might be nth_element.
    I might be wrong.

    Thank you, anon. You sure know how to recognize different types of trees from quite a long way away.
    Quoted more than 1000 times (I hope).

  3. #3
    Registered User
    Join Date
    Jun 2008
    Posts
    5
    I am actually working in CVI (in a version which is unable to access certain c++ functions) so I don't think that will work

  4. #4
    The larch
    Join Date
    May 2006
    Posts
    3,573
    The easiest (though not most efficient) way might be to sort the array and then select the first (or last) 20?
    I might be wrong.

    Thank you, anon. You sure know how to recognize different types of trees from quite a long way away.
    Quoted more than 1000 times (I hope).

  5. #5
    Banal internet user
    Join Date
    Aug 2002
    Posts
    1,380
    Sort the array in descending order then copy the first 20 elements out of it and into a new, smaller array?

    edit: beaten but still relevant

  6. #6
    Registered User
    Join Date
    Jan 2007
    Location
    Euless, TX
    Posts
    144
    What's wrong with applying a sort to your array to sort from low to high or vice-versa??

  7. #7
    Registered User
    Join Date
    Jun 2008
    Posts
    5
    Yes... That would be the obvious choice.
    However, that way is not very user friendly because you constantly need to remember to sort the array before you do the algorithm (takes time).
    Also, in my algorithm, I need to use values that I have stored in other arrays to relate to my values in dRSSI[].
    Look at the code below. I reverted back to what I had, which calculates every values distance and uses all values in the algorithm. Again, my goal is to only use the 20 highest RSSI values (instead of all of them) to calculate position.
    Code:
    //Array of X-Coordinate values
    double xLCMs[NUMBER_OF_LCMS] = {9, 9, 9, 7, 20, 20, 20, 20, 31, 31, 31, 31, 42, 42, 42, 53.5, 53.5, 53.5,32.5, 34, 34, 34, 34, 43.5, 43.5, 43.5, 43.5, 43.5, 43.5, 54.5, 54.5, 54.5, 54.5, 54.5, 54.5};
    //Array of Y-Coordinate values
    double yLCMs[NUMBER_OF_LCMS] = {12, 26, 40, 56, 12, 26, 40, 54, 12, 26, 40, 54, 12, 26, 40, 12, 26, 40,101, 115, 122, 132, 142.5, 73, 87, 101, 115, 129, 142, 73, 87, 101, 115, 129, 142};
    	double dA=0;
    	double dN=4.0;
    	double sumXNumerator;
    	double sumYNumerator;
    	double sumDenominator;
    	double LessdRSSI[NUMBER_OF_LCMS];
    	double dDistance[NUMBER_OF_LCMS];	
    	double dXSumNumerator[NUMBER_OF_LCMS];								 
    	double dYSumNumerator[NUMBER_OF_LCMS];
    	double dSumDenominator[NUMBER_OF_LCMS];
    	int i;
    
    for( i=0; i+1<=NUMBER_OF_LCMS; i++ )								  
    {
      GetTableCellVal ( tabHandle, TABPANEL_TABLE_VALUES, MakePoint( 2, i+1 ), &dRSSI[i] );
      dDistance[i] = pow ( 10, ((dRSSI[i]-dA)/(dN*10.00)) );
      dXSumNumerator[i] = xLCMs[i]/dDistance[i];
      dYSumNumerator[i] = yLCMs[i]/dDistance[i];
      dSumDenominator[i] = 1.00/dDistance[i];
    }
           //Calculate the sum of each array
    	Sum1D( dXSumNumerator, 20, &sumXNumerator );
    	Sum1D( dYSumNumerator, 20, &sumYNumerator );
    	Sum1D( dSumDenominator, 20, &sumDenominator );
    			
    	//Use the sum's calculated for XNum,YNum, and Denom and determine (x,y) position.
    	*XPuckValue = ( sumXNumerator/sumDenominator );
    	*YPuckValue = ( sumYNumerator/sumDenominator );
    			
    	PlotPoint ( panelHandle, PANEL_SYSTEM, *XPuckValue, *YPuckValue, VAL_X,
    					    VAL_BLUE );

  8. #8
    and the Hat of Guessing tabstop's Avatar
    Join Date
    Nov 2007
    Posts
    14,336
    Quote Originally Posted by letsgoredwings View Post
    Yes... That would be the obvious choice.
    However, that way is not very user friendly because you constantly need to remember to sort the array before you do the algorithm (takes time).
    I'm not sure I understand your point here -- you're going to have to remember to do something before you start, whether it's sort or prune or whatever. And for 35 elements, I would bet that sorting would be just as fast as anything else to get 20 elements.

    The catch is going to be to remember that when you sort on distance[], you'll also need to swap xLCMs[] and yLCMs[] also. What I would probably do is, instead of sorting the arrays themselves, sort a list of indices. So you'd have an index[] that starts out at 0 through 34, and then gets shuffled around to give the order. Then you can display xLCM[index[0]] to get the x-coordinate of the largest, and xLCM[index[1]] to get the x-coordinate of the next-largest, and so on.

  9. #9
    Registered User
    Join Date
    Jun 2008
    Posts
    5
    My point is that as a user constantly were to use this program, it would get annoying to constantly have to remember to sort the column before running through your algorithm....
    I want as much of the program to happen automatically... without the user doing anything...(not sure if that makes sense... lets just say i need to find another way to get the solution besides sorting column)

  10. #10
    Banal internet user
    Join Date
    Aug 2002
    Posts
    1,380
    You can use a sorting algorithm to do the sorting, the user doesn't have to remember to do anything.

  11. #11
    Registered User
    Join Date
    Jun 2008
    Posts
    5
    yeah... i was trying to sort the column using the set table cell attribute function when i should've looked for, and found the sort function...
    i'm a noob... or whatever you nerds call it

    anyways, i think i got it now

Popular pages Recent additions subscribe to a feed

Similar Threads

  1. Solve This Problem Within 3 Hr Urgent Need
    By annum in forum C Programming
    Replies: 12
    Last Post: 10-04-2009, 09:56 AM
  2. problem solve
    By coolnarugodas in forum C Programming
    Replies: 7
    Last Post: 04-26-2005, 12:31 PM
  3. Replies: 2
    Last Post: 04-25-2005, 11:59 AM
  4. Bubble Sort / selection problem
    By Drew in forum C++ Programming
    Replies: 7
    Last Post: 08-26-2003, 03:23 PM
  5. problem cant solve please help.
    By sarah in forum C Programming
    Replies: 6
    Last Post: 09-03-2001, 01:32 PM