Skip to content
  • Categories
  • Recent
  • Tags
  • Popular
  • World
  • Users
  • Groups
Skins
  • Light
  • Cerulean
  • Cosmo
  • Flatly
  • Journal
  • Litera
  • Lumen
  • Lux
  • Materia
  • Minty
  • Morph
  • Pulse
  • Sandstone
  • Simplex
  • Sketchy
  • Spacelab
  • United
  • Yeti
  • Zephyr
  • Dark
  • Cyborg
  • Darkly
  • Quartz
  • Slate
  • Solar
  • Superhero
  • Vapor

  • Default (No Skin)
  • No Skin
Collapse
Code Project
CODE PROJECT For Those Who Code
  • Home
  • Articles
  • FAQ
Community
  1. Home
  2. General Programming
  3. Visual Basic
  4. Approximate zero values in an array

Approximate zero values in an array

Scheduled Pinned Locked Moved Visual Basic
helpquestiondata-structurestutorial
12 Posts 6 Posters 0 Views 1 Watching
  • Oldest to Newest
  • Newest to Oldest
  • Most Votes
Reply
  • Reply as topic
Log in to reply
This topic has been deleted. Only users with topic management privileges can see it.
  • L Lost User

    Johnkokk wrote:

    It should be easy but i am completely stuck in here.

    This is simple mathematics. Add up the numbers surrounding the zeros and calculate the average (by division). Replace the zeros with the average values. Try doing it with pencil and paper to see how it can be achieved.

    D Offline
    D Offline
    David Skelly
    wrote on last edited by
    #3

    It's not really the average, though, if I've understood the question. The sequence 23, 0, 20 becomes 23, 21.5, 20. 18, 0, 0, 24 becomes 18, 20, 22, 24 20, 0, 0, 0, 16 becomes 20, 19, 18, 17, 16. Not sure what the technical term for that is. Interpolation? Even so, it is still simple maths. The only tricky bit is handling the end conditions if a 0 occurs at the first or last position in the array.

    L 2 Replies Last reply
    0
    • D David Skelly

      It's not really the average, though, if I've understood the question. The sequence 23, 0, 20 becomes 23, 21.5, 20. 18, 0, 0, 24 becomes 18, 20, 22, 24 20, 0, 0, 0, 16 becomes 20, 19, 18, 17, 16. Not sure what the technical term for that is. Interpolation? Even so, it is still simple maths. The only tricky bit is handling the end conditions if a 0 occurs at the first or last position in the array.

      L Offline
      L Offline
      Lost User
      wrote on last edited by
      #4

      David Skelly wrote:

      It's not really the average, though, if I've understood the question.

      You're right of course, I was confused (quite easy thing to do) by the questioner using the expression "approximate(average)".

      1 Reply Last reply
      0
      • D David Skelly

        It's not really the average, though, if I've understood the question. The sequence 23, 0, 20 becomes 23, 21.5, 20. 18, 0, 0, 24 becomes 18, 20, 22, 24 20, 0, 0, 0, 16 becomes 20, 19, 18, 17, 16. Not sure what the technical term for that is. Interpolation? Even so, it is still simple maths. The only tricky bit is handling the end conditions if a 0 occurs at the first or last position in the array.

        L Offline
        L Offline
        Lost User
        wrote on last edited by
        #5

        David Skelly wrote:

        Interpolation

        Ding ding ding! Winner winner chicken dinner!

        Check out the CodeProject forum Guidelines[^] The original soapbox 1.0 is back![^]

        J P 2 Replies Last reply
        0
        • L Lost User

          David Skelly wrote:

          Interpolation

          Ding ding ding! Winner winner chicken dinner!

          Check out the CodeProject forum Guidelines[^] The original soapbox 1.0 is back![^]

          J Offline
          J Offline
          Johnkokk
          wrote on last edited by
          #6

          Ok, we established that what i need, is some sort of linear interpolation. Any ideas ? :)

          N 1 Reply Last reply
          0
          • J Johnkokk

            Ok, we established that what i need, is some sort of linear interpolation. Any ideas ? :)

            N Offline
            N Offline
            nlarson11
            wrote on last edited by
            #7
                Dim arr() As Single = {17, 18, 0, 0, 24, 23, 0, 20, 0, 0, 0, 16}
                Dim idx1 As Int16 = -1, idx2 As Int16 = -1
                Dim FoundAZero As Boolean = False
            
                For i As Int16 = 0 To arr.GetUpperBound(0)
            
                    If Not FoundAZero Then
                        If arr(i) = 0 Then
                            FoundAZero = True 'once we find an zero the else will be used below until we find the next non zero 
                        Else
                            idx1 = i 'hold on to the index every non zero
                        End If
                    Else
                        If arr(i) <> 0 Then '
                            idx2 = i 'hold on to the index of the non zero 
                            '--------------------------------------
                            'get the value that's held in both indexes
                            Dim val1 As Int16 = arr(idx1), val2 As Int16 = arr(idx2)
                            Dim IncVal As Single
            
                            'increment value is non zero 1 minus non zero 2 / the number of zeros between
                            'the \* -1 is whether or not we need to increment up or down depending on values of the array
            
                            If val1 < val2 Then
                                IncVal = (val2 - val1) / (idx2 - idx1)
                            Else
                                IncVal = ((val1 - val2) / (idx2 - idx1)) \* -1
                            End If
            
                            For x As Int16 = idx1 + 1 To idx2 - 1
                                arr(x) = arr(x - 1) + IncVal 'replace the 0 inbetween both indexes with the incremented value 
                            Next
                            '--------------------------------------
                            idx1 = idx2        'take the last none zero and set it to the first hold as we continue down the array
                            FoundAZero = False 'reset finding a zero flag
                        End If
                    End If
                Next
            

            'Never argue with an idiot; they'll drag you down to their level and beat you with experience.' ~ anonymous 'Life's real failure is when you do not realize how close you were to success when you gave up.' ~ anonymous

            J G 2 Replies Last reply
            0
            • N nlarson11
                  Dim arr() As Single = {17, 18, 0, 0, 24, 23, 0, 20, 0, 0, 0, 16}
                  Dim idx1 As Int16 = -1, idx2 As Int16 = -1
                  Dim FoundAZero As Boolean = False
              
                  For i As Int16 = 0 To arr.GetUpperBound(0)
              
                      If Not FoundAZero Then
                          If arr(i) = 0 Then
                              FoundAZero = True 'once we find an zero the else will be used below until we find the next non zero 
                          Else
                              idx1 = i 'hold on to the index every non zero
                          End If
                      Else
                          If arr(i) <> 0 Then '
                              idx2 = i 'hold on to the index of the non zero 
                              '--------------------------------------
                              'get the value that's held in both indexes
                              Dim val1 As Int16 = arr(idx1), val2 As Int16 = arr(idx2)
                              Dim IncVal As Single
              
                              'increment value is non zero 1 minus non zero 2 / the number of zeros between
                              'the \* -1 is whether or not we need to increment up or down depending on values of the array
              
                              If val1 < val2 Then
                                  IncVal = (val2 - val1) / (idx2 - idx1)
                              Else
                                  IncVal = ((val1 - val2) / (idx2 - idx1)) \* -1
                              End If
              
                              For x As Int16 = idx1 + 1 To idx2 - 1
                                  arr(x) = arr(x - 1) + IncVal 'replace the 0 inbetween both indexes with the incremented value 
                              Next
                              '--------------------------------------
                              idx1 = idx2        'take the last none zero and set it to the first hold as we continue down the array
                              FoundAZero = False 'reset finding a zero flag
                          End If
                      End If
                  Next
              

              'Never argue with an idiot; they'll drag you down to their level and beat you with experience.' ~ anonymous 'Life's real failure is when you do not realize how close you were to success when you gave up.' ~ anonymous

              J Offline
              J Offline
              Johnkokk
              wrote on last edited by
              #8

              Ok, the code above works almost perfectly. THe only problem is that if the first position of the array is populated with 0, it crashes at " Dim val1 As Int16 = arr(idx1)", because idx1 remains -1 Thanks.

              N G 2 Replies Last reply
              0
              • J Johnkokk

                Ok, the code above works almost perfectly. THe only problem is that if the first position of the array is populated with 0, it crashes at " Dim val1 As Int16 = arr(idx1)", because idx1 remains -1 Thanks.

                N Offline
                N Offline
                nlarson11
                wrote on last edited by
                #9

                I understood that when I wrote but I figured it wouldn't be possible to have the array start with a zero or end with one because how can you figure out what those should be. I guess you could take the number to the right of the 0 and divide by 2 but wasn't sure if that's what should happen.

                'Never argue with an idiot; they'll drag you down to their level and beat you with experience.' ~ anonymous 'Life's real failure is when you do not realize how close you were to success when you gave up.' ~ anonymous

                1 Reply Last reply
                0
                • L Lost User

                  David Skelly wrote:

                  Interpolation

                  Ding ding ding! Winner winner chicken dinner!

                  Check out the CodeProject forum Guidelines[^] The original soapbox 1.0 is back![^]

                  P Offline
                  P Offline
                  peterchen
                  wrote on last edited by
                  #10

                  Hmmmmm... chicken!

                  Personally, I love the idea that Raymond spends his nights posting bad regexs to mailing lists under the pseudonym of Jane Smith. He'd be like a super hero, only more nerdy and less useful. [Trevel]
                  | FoldWithUs! | sighist | µLaunch - program launcher for server core and hyper-v server

                  1 Reply Last reply
                  0
                  • N nlarson11
                        Dim arr() As Single = {17, 18, 0, 0, 24, 23, 0, 20, 0, 0, 0, 16}
                        Dim idx1 As Int16 = -1, idx2 As Int16 = -1
                        Dim FoundAZero As Boolean = False
                    
                        For i As Int16 = 0 To arr.GetUpperBound(0)
                    
                            If Not FoundAZero Then
                                If arr(i) = 0 Then
                                    FoundAZero = True 'once we find an zero the else will be used below until we find the next non zero 
                                Else
                                    idx1 = i 'hold on to the index every non zero
                                End If
                            Else
                                If arr(i) <> 0 Then '
                                    idx2 = i 'hold on to the index of the non zero 
                                    '--------------------------------------
                                    'get the value that's held in both indexes
                                    Dim val1 As Int16 = arr(idx1), val2 As Int16 = arr(idx2)
                                    Dim IncVal As Single
                    
                                    'increment value is non zero 1 minus non zero 2 / the number of zeros between
                                    'the \* -1 is whether or not we need to increment up or down depending on values of the array
                    
                                    If val1 < val2 Then
                                        IncVal = (val2 - val1) / (idx2 - idx1)
                                    Else
                                        IncVal = ((val1 - val2) / (idx2 - idx1)) \* -1
                                    End If
                    
                                    For x As Int16 = idx1 + 1 To idx2 - 1
                                        arr(x) = arr(x - 1) + IncVal 'replace the 0 inbetween both indexes with the incremented value 
                                    Next
                                    '--------------------------------------
                                    idx1 = idx2        'take the last none zero and set it to the first hold as we continue down the array
                                    FoundAZero = False 'reset finding a zero flag
                                End If
                            End If
                        Next
                    

                    'Never argue with an idiot; they'll drag you down to their level and beat you with experience.' ~ anonymous 'Life's real failure is when you do not realize how close you were to success when you gave up.' ~ anonymous

                    G Offline
                    G Offline
                    Gideon Engelberth
                    wrote on last edited by
                    #11

                    You may want to turn on Option Strict. When you use val1 and val2 as integers, you will produce incorrect results if one of the non-zero values has a decimal component. Also, I would recommend using Integer instead of Int16 for the index variables as turning on Option Strict will cause errors for both of your loop declarations.

                    1 Reply Last reply
                    0
                    • J Johnkokk

                      Ok, the code above works almost perfectly. THe only problem is that if the first position of the array is populated with 0, it crashes at " Dim val1 As Int16 = arr(idx1)", because idx1 remains -1 Thanks.

                      G Offline
                      G Offline
                      Gideon Engelberth
                      wrote on last edited by
                      #12

                      Then add some error checking. Assuming you put this code in a method, you can do the check at the right at the top of the method to make sure that the parameter a) is not nothing, b) does not start with a zero, and c) does not end with a zero and throw the appropriate exception. Like so:

                      Private Sub Interpolate(ByVal values() As Single)
                      If values Is Nothing Then Throw New ArgumentNullException("values")
                      'nothing to do in this routine and the other error checks would cause errors
                      If values.Length = 0 Then Exit Sub
                      If values(0) = 0 Then
                      Throw New ArgumentException("Value array cannot start with a 0.", "values")
                      End If
                      If values(values.Length - 1) = 0 Then
                      Throw New ArgumentException("Value array cannot end with a 0.", "values")
                      End If

                      'other code to do interpolation here
                      

                      End Sub

                      1 Reply Last reply
                      0
                      Reply
                      • Reply as topic
                      Log in to reply
                      • Oldest to Newest
                      • Newest to Oldest
                      • Most Votes


                      • Login

                      • Don't have an account? Register

                      • Login or register to search.
                      • First post
                        Last post
                      0
                      • Categories
                      • Recent
                      • Tags
                      • Popular
                      • World
                      • Users
                      • Groups