1

私は vb.net にかなり慣れていないため、数時間検索しても特定のヘルプが見つかりません。

3 つの列を持つデータ ポイントのテーブルがあります。列 1 は「ポイント ID」、列 2 は「x 座標」、列 3 は「y 座標」です。4 番目の列を追加し、反復プロセスから 2 番目に低い値を入力する必要があります。

反復プロセスは、そのポイントから他の各ポイントまでの距離を見つけ、2 番目に低い値を返します。これは、最小値が 0 (それ自体までの距離) になるためです。ポイント 1 とポイント 2 の間の距離の計算は、sqrt(((x2-x1) (x2-x1))+((y2-y1) (y2-y1))) です。

単一の値を返すために、反復プロセス内で反復プロセスを実行するのに苦労しています。

どんな助けでも大歓迎です:)

4

2 に答える 2

1

テーブル内の行を反復処理します。次に、各行について、テーブル内の行をもう一度繰り返します。ただし、現在プライマリ イテレーションが実行されている行に到達すると、その行をスキップして先に進むことができます。また、距離はポイントのペアの間であるため、すべての距離を取得するには、テーブル内の行の半分を反復処理するだけで済みます。

これをどのように正確に実装しているかについてさらに詳細を投稿すると、いくつかのコードで役立つ可能性がありますが、現在のように、テーブルの種類やプログラムの設定方法についても言及していませんということで、具体的に言うのは難しいです。

于 2013-03-27T00:20:58.153 に答える
1

これは可能な解決策の 1 つです [テストされていません]。メソッドはAddNearestColumn()各行をループし、テーブル内の他のポイントまでの距離のリストを取得します。次に、リストをループして最小値を取得します。 手動でループするのではなくdistances.Sort()inを使用する必要がありますが、それはあなたに任せます。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
于 2013-03-27T00:41:27.920 に答える