如何在 Mathnet 中从矩阵或向量中找到实体索引,vb.net?
How to find entity index from matrix or vector in Mathnet, vb.net?
假设我有一个矩阵 A=[1 2 3;4 5 6]
现在我想检查其中是否存在 5。答案应该是行和列,即
行=1
列=1
我试过 find 但没发现有用。
提前致谢
对于多维数组,我们的选择不多。
一种方法是循环数组以获取元素索引或尝试类似下面的代码,循环仅匹配搜索到的数字。
ReadOnly matrix(,) As Integer = New Integer(1, 2) {{1, 2, 5}, {4, 5, 6}}
Structure GridData
Dim Row As Integer
Dim Col As Integer
End Structure
Function FindIndexesOfNumber(searchedNr As Integer) As List(Of GridData)
Dim startIndex As Integer = 0
Dim enumerator As List(Of GridData) = (From elements In matrix).ToList.Where(Function(x) x.Equals(searchedNr)).Select(Function(x)
'fake select, it's only for the loop which find numbers
startIndex = Array.IndexOf(matrix.OfType(Of Integer)().ToArray(), searchedNr, startIndex + 1)
Dim matrixBound As Integer = matrix.GetUpperBound(1) + 1
Return New GridData With {
.Col = startIndex Mod matrixBound,
.Row = (startIndex \ matrixBound)
}
End Function).ToList
For Each c In enumerator
Console.WriteLine(String.Format("Col: {0} Row: {1}", c.Col.ToString, c.Row.ToString))
Next
Return enumerator
End Function
用法:
Dim indexes As List(Of GridData) = FindIndexesOfNumber(5)
你可以试试这个
Private Sub Form1_Load(sender As Object, e As EventArgs) Handles MyBase.Load
Dim a As Integer(,) = New Integer(,) {{0, 1, 2}, {3, 4, 5}, {6, 7, 8}, {9, 10, 11}, {12, 13, 14}}
Dim rw As Integer, cl As Integer
Dim xy As Integer = 13
If getXY(a, xy, rw, cl) = True Then
MessageBox.Show("Row: " & rw & " # Col: " & cl)
Else
MessageBox.Show("Not found")
End If
End Sub
Function getXY(arr As Array, findwhat As Object, ByRef row As Integer, ByRef col As Integer) As Boolean
Dim d = (From x In arr).ToList.IndexOf(findwhat)
If d = -1 Then Return False
row = Math.Ceiling((d + 1) / arr.GetLength(1)) - 1
col = d Mod arr.GetLength(1)
Return True
End Function
假设我有一个矩阵 A=[1 2 3;4 5 6] 现在我想检查其中是否存在 5。答案应该是行和列,即 行=1 列=1 我试过 find 但没发现有用。
提前致谢
对于多维数组,我们的选择不多。 一种方法是循环数组以获取元素索引或尝试类似下面的代码,循环仅匹配搜索到的数字。
ReadOnly matrix(,) As Integer = New Integer(1, 2) {{1, 2, 5}, {4, 5, 6}}
Structure GridData
Dim Row As Integer
Dim Col As Integer
End Structure
Function FindIndexesOfNumber(searchedNr As Integer) As List(Of GridData)
Dim startIndex As Integer = 0
Dim enumerator As List(Of GridData) = (From elements In matrix).ToList.Where(Function(x) x.Equals(searchedNr)).Select(Function(x)
'fake select, it's only for the loop which find numbers
startIndex = Array.IndexOf(matrix.OfType(Of Integer)().ToArray(), searchedNr, startIndex + 1)
Dim matrixBound As Integer = matrix.GetUpperBound(1) + 1
Return New GridData With {
.Col = startIndex Mod matrixBound,
.Row = (startIndex \ matrixBound)
}
End Function).ToList
For Each c In enumerator
Console.WriteLine(String.Format("Col: {0} Row: {1}", c.Col.ToString, c.Row.ToString))
Next
Return enumerator
End Function
用法:
Dim indexes As List(Of GridData) = FindIndexesOfNumber(5)
你可以试试这个
Private Sub Form1_Load(sender As Object, e As EventArgs) Handles MyBase.Load
Dim a As Integer(,) = New Integer(,) {{0, 1, 2}, {3, 4, 5}, {6, 7, 8}, {9, 10, 11}, {12, 13, 14}}
Dim rw As Integer, cl As Integer
Dim xy As Integer = 13
If getXY(a, xy, rw, cl) = True Then
MessageBox.Show("Row: " & rw & " # Col: " & cl)
Else
MessageBox.Show("Not found")
End If
End Sub
Function getXY(arr As Array, findwhat As Object, ByRef row As Integer, ByRef col As Integer) As Boolean
Dim d = (From x In arr).ToList.IndexOf(findwhat)
If d = -1 Then Return False
row = Math.Ceiling((d + 1) / arr.GetLength(1)) - 1
col = d Mod arr.GetLength(1)
Return True
End Function