迭代过程返回第二低的值

时间:2013-03-26 22:41:23

标签: .net vb.net iteration nearest-neighbor

我对vb.net相当新,经过几个小时的搜索后找不到任何具体的帮助。

我有一个包含三列的数据点表,第1列是“点ID”,第2列是“x坐标”,第3列是“y坐标”。我需要添加第四列,然后使用迭代过程中的第二个最小值填充它。

迭代过程是找到从该点到另一个点的距离,返回第二个最低值,因为最低值将是0(距离自身的距离)。点1和点2之间距离的数学是sqrt(((x2-x1)(x2-x1))+((y2-y1)(y2-y1)))。

我很想在迭代过程中进行迭代过程,以便重新调整单个值。

任何帮助都会非常感激:)

2 个答案:

答案 0 :(得分:1)

遍历表格中的行。然后,对于每一行,再次遍历表中的行。但是当你到达主要迭代当前所在的行时,你可以跳过那一行并继续前进。此外,由于距离在点对之间,因此您只需要遍历表中的一半行以获得所有距离。

如果你发布一些关于你如何实现这一点的更多细节,可能会帮助你解决一些代码问题,但就像现在一样,你甚至不会说你有什么样的表或你的程序如何设置好了,所以很难具体化。

答案 1 :(得分:1)

这是一种可能的解决方案[未经测试]。 AddNearestColumn()方法循环遍历每一行,并获取到表中其他点的距离列表。然后它循环遍历列表并获得最小值。您应该在distances.Sort()中使用AddNearestColumn()而不是手动循环,但我会留给您。 : - )

Public Sub ProcessTable(table As Data.DataTable)
    AddNearestColumn(table)
End Sub

Private Sub AddNearestColumn(table As Data.DataTable)
    table.Columns.Add("Nearest", GetType(Double))
    For Each r As Data.DataRow In table.Rows
        Dim distances As List(Of Double) = GetDistancesFromPoint(table, r)
        Dim nearest As Double = Double.MaxValue
        For Each distance As Double In distances
            If (distance < nearest) Then nearest = distance
        Next
        r.Item("Nearest") = nearest
    Next
End Sub

Private Function GetDistancesFromPoint(table As Data.DataTable, referenceRow As Data.DataRow) As List(Of Double)
    Dim output As New List(Of Double)
    For Each r As Data.DataRow In table.Rows
        Dim referenceId As String = CStr(referenceRow.Item("ID"))
        Dim rowId As String = CStr(r.Item("ID"))
        If (rowId = referenceId) Then Continue For
        Dim x1 As Double = Convert.ToDouble(referenceRow.Item("X"))
        Dim y1 As Double = Convert.ToDouble(referenceRow.Item("Y"))
        Dim x2 As Double = Convert.ToDouble(r.Item("X"))
        Dim y2 As Double = Convert.ToDouble(r.Item("Y"))
        output.Add(Math.Sqrt(((x2 - x1) * (x2 - x1)) + ((y2 - y1) * (y2 - y1))))
    Next
    Return output
End Function