Warning: file_get_contents(/data/phpspider/zhask/data//catemap/1/vb.net/16.json): failed to open stream: No such file or directory in /data/phpspider/zhask/libs/function.php on line 167

Warning: Invalid argument supplied for foreach() in /data/phpspider/zhask/libs/tag.function.php on line 1116

Notice: Undefined index: in /data/phpspider/zhask/libs/function.php on line 180

Warning: array_chunk() expects parameter 1 to be array, null given in /data/phpspider/zhask/libs/function.php on line 181
Vb.net 双精度函数列表成员之间的减法_Vb.net_List_Function - Fatal编程技术网

Vb.net 双精度函数列表成员之间的减法

Vb.net 双精度函数列表成员之间的减法,vb.net,list,function,Vb.net,List,Function,我正在为一维线性插值创建一个公共函数。我在问是否可以使用List of Double而不是Double(),因为这些数组没有固定的长度,但它是参数化的,这取决于在datagridview中插入的行数。我试图将double()声明为double()的列表,但我收到了一个关于成员之间减法的错误-这似乎是不允许的。代码如下: Public Shared Function Interp1(ByVal xnative As Double(), ByVal ynative As Double(), ByVa

我正在为一维线性插值创建一个公共函数。我在问是否可以使用List of Double而不是Double(),因为这些数组没有固定的长度,但它是参数化的,这取决于在datagridview中插入的行数。我试图将double()声明为double()的列表,但我收到了一个关于成员之间减法的错误-这似乎是不允许的。代码如下:

Public Shared Function Interp1(ByVal xnative As Double(), ByVal ynative As Double(), ByVal xinterpol As Double()) As Double()
    Dim yinterpol As Double()
    For i = 1 To ynative.Length - 1
        For j = 0 To xnative.Length - 1
            If xinterpol(j) > xnative(i - 1) And xinterpol(j) < xnative(i) Then
                yinterpol(j) = (ynative(i - 1) * (xinterpol(j) - xnative(i + 1)) / (xnative(i - 1) - xnative(i + 1))) - (ynative(i + 1) * (xinterpol(j) - xnative(i - 1)) / (xnative(i - 1) - xnative(i + 1)))
            Else i += 1
            End If
        Next
        If xinterpol(xinterpol.Length) > xnative(xnative.Length) Then
            Exit For
        End If
    Next
End Function
公共共享函数Interp1(ByVal xnative为Double()、ByVal ynative为Double()、ByVal xinterpol为Double())为Double()
Dim yinterpol作为双()
对于i=1到y,长度为-1
对于j=0到xnative.Length-1
如果xinterpol(j)>xnative(i-1)并且xinterpol(j)xnative(xnative.Length),那么
退出
如果结束
下一个
端函数
我哪里做错了?我不明白哪里会出错。我要问的另一件事是,如果使用提供的代码,yinterpol是我函数的结果,因为这是我需要的结果。提前谢谢


编辑:以下是我使用Double()列表的代码版本:

公共共享函数Interp1(ByVal xnative As List(Of Double)(),ByVal ynative As List(Of Double)(),ByVal xinterpol As List(Of Double)()As List(Of Double)()
Dim yinterpol作为新列表(双倍)()
对于i=1到y,长度为-1
对于j=0到xnative.Length-1
如果xinterpol(j)>xnative(i-1)并且xinterpol(j)xnative(xnative.Length),那么
退出
如果结束
下一个
端函数

我收到了错误BC30452:运算符“-”、“”>“”和“Re:您使用数组收到的错误,这里有几个问题

一个是,实际上并没有从函数返回值。 另一个原因是您没有用大小初始化
yinterpol
数组

声明索引类型而不是推断索引类型也是一种很好的做法(将
选项显式
设置为打开,
选项推断
设置为关闭,并始终将
选项严格
设置为打开)

试试这个:

Public Shared Function Interp1(ByVal xnative As Double(), ByVal ynative As Double(), ByVal xinterpol As Double()) As Double()
    Dim yinterpol(9) As Double '<- Initialize array length
    For i As Integer = 1 To ynative.Length - 1 '<- Declare type of i
        For j As Integer = 0 To xnative.Length - 1 '<- Declare type of j
            If xinterpol(j) > xnative(i - 1) AndAlso xinterpol(j) < xnative(i) Then
                yinterpol(j) = (ynative(i - 1) * (xinterpol(j) - xnative(i + 1)) / (xnative(i - 1) - xnative(i + 1))) - (ynative(i + 1) * (xinterpol(j) - xnative(i - 1)) / (xnative(i - 1) - xnative(i + 1)))
            Else
                i += 1 '<- Don't modify outer loop index
            End If
        Next j
        If xinterpol(xinterpol.Length) > xnative(xnative.Length) Then Exit For
    Next i
    Return yinterpol '<- Return a value
End Function

Re:您使用数组收到的错误,这里有几个问题

一个是,实际上并没有从函数返回值。 另一个原因是您没有用大小初始化
yinterpol
数组

声明索引类型而不是推断索引类型也是一种很好的做法(将
选项显式
设置为打开,
选项推断
设置为关闭,并始终将
选项严格
设置为打开)

试试这个:

Public Shared Function Interp1(ByVal xnative As Double(), ByVal ynative As Double(), ByVal xinterpol As Double()) As Double()
    Dim yinterpol(9) As Double '<- Initialize array length
    For i As Integer = 1 To ynative.Length - 1 '<- Declare type of i
        For j As Integer = 0 To xnative.Length - 1 '<- Declare type of j
            If xinterpol(j) > xnative(i - 1) AndAlso xinterpol(j) < xnative(i) Then
                yinterpol(j) = (ynative(i - 1) * (xinterpol(j) - xnative(i + 1)) / (xnative(i - 1) - xnative(i + 1))) - (ynative(i + 1) * (xinterpol(j) - xnative(i - 1)) / (xnative(i - 1) - xnative(i + 1)))
            Else
                i += 1 '<- Don't modify outer loop index
            End If
        Next j
        If xinterpol(xinterpol.Length) > xnative(xnative.Length) Then Exit For
    Next i
    Return yinterpol '<- Return a value
End Function

考虑到后面的
()
,函数的参数看起来像列表数组。这可以在声明
新的
列表时使用,以指示您正在调用构造函数,尽管在vb.net中这不是必需的(与C#不同)。您要求调用代码提供和列表数组

您得到的错误是因为
xinterpol(j)
是列表数组中索引j处的列表。显然,您无法将(Double)列表转换为Double

.Length
不适用于
列表(共T个)
。您应该使用
.Count

你的索引
j
让我有点紧张。你是基于
xnative
.Count
,但将其应用于
xinterpol
。如果
xnative
xinerpol
长怎么办?你是在乞求索引超出范围异常

我不明白为什么您要在
yinterpol
中添加单个项目,然后在
xinterpol
.Count
大于
xnative
.Count
时退出

Public Shared Function Interp1(xnative As List(Of Double), ynative As List(Of Double), xinterpol As List(Of Double)) As List(Of Double)
    Dim yinterpol As New List(Of Double)
    For i = 1 To ynative.Count - 1
        For j = 0 To xnative.Count - 1
            If xinterpol(j) > xnative(i - 1) And xinterpol(j) < xnative(i) Then
                yinterpol.Add((ynative(i - 1) * (xinterpol(j) - xnative(i + 1)) / (xnative(i - 1) - xnative(i + 1))) - (ynative(i + 1) * (xinterpol(j) - xnative(i - 1)) / (xnative(i - 1) - xnative(i + 1))))
            Else i += 1
            End If
        Next
        If xinterpol(xinterpol.Count) > xnative(xnative.Count) Then
            Exit For
        End If
    Next
    Return yinterpol
End Function
公共共享函数Interp1(xnative As List(Of Double)、ynative As List(Of Double)、xinterpol As List(Of Double))As List(Of Double)
Dim yinterpol作为新列表(双倍)
对于i=1到y,计数为-1
对于j=0到xnative.Count-1
如果xinterpol(j)>xnative(i-1)并且xinterpol(j)xnative(xnative.Count),那么
退出
如果结束
下一个
返回英特波尔
端函数

考虑到后面的
()
,函数的参数看起来像列表数组。这可以在声明
新的
列表时使用,以指示您正在调用构造函数,尽管在vb.net中没有必要这样做(与C#不同)。您要求调用代码来提供和列表数组

您得到的错误是因为
xinterpol(j)
是列表数组中索引j处的列表。显然,您无法将(Double)列表转换为Double

.Length
不适用于
列表(共T个)
。您应该使用
.Count

你的索引
j
让我有点紧张。你是基于
xnative
.Count
,但将其应用于
xinterpol
。如果
xnative
很长呢
Public Shared Function Interp1(xnative As List(Of Double), ynative As List(Of Double), xinterpol As List(Of Double)) As List(Of Double)
    Dim yinterpol As New List(Of Double)
    For i = 1 To ynative.Count - 1
        For j = 0 To xnative.Count - 1
            If xinterpol(j) > xnative(i - 1) And xinterpol(j) < xnative(i) Then
                yinterpol.Add((ynative(i - 1) * (xinterpol(j) - xnative(i + 1)) / (xnative(i - 1) - xnative(i + 1))) - (ynative(i + 1) * (xinterpol(j) - xnative(i - 1)) / (xnative(i - 1) - xnative(i + 1))))
            Else i += 1
            End If
        Next
        If xinterpol(xinterpol.Count) > xnative(xnative.Count) Then
            Exit For
        End If
    Next
    Return yinterpol
End Function