You need to enable JavaScript to run this app.
优惠活动
大模型
产品
解决方案
定价
更多

VB.NET中如何为NDtw构造SeriesVariable处理多变量数据

解决NDtw多变量数据格式转换问题

NDtw处理多变量数据时,SeriesVariable要求的是「按时间点组织」的结构:每个元素对应一个时间点的所有变量测量值,而非按变量分组的二维数组。你的原始二维数组是「变量为行、时间点为列」,需要调整为「时间点为元素、每个元素包含对应所有变量值」的格式。

正确的转换方法

  1. 遍历每个时间点,提取对应所有变量的测量值,组成单个Double()数组
  2. 将这些数组集合转换为SeriesVariable类型

修改后的代码

Imports NDtw
Imports System.Collections.Generic

Public Class Form1
    Private Sub Button1_Click(sender As Object, e As EventArgs) Handles Button1.Click
        Dim dist As Double
        Dim actualdist As Double

        ' 原始数据:行=变量,列=时间点
        Dim rawSeries1(,) = {{1.0, 3.0, 7.0, 8.0, 11.0, 6.0, 6.0},
                             {3.0, 6.0, 3.0, 7.0, 13.0, 12.0, 7.0}}
        Dim rawSeries2(,) = {{3.0, 6.0, 3.0, 7.0, 13.0, 12.0, 7.0},
                             {1.0, 3.0, 7.0, 8.0, 11.0, 6.0, 6.0}}

        ' 转换为SeriesVariable格式:每个元素是一个时间点的所有变量值
        Dim series1 As New SeriesVariable(ConvertToTimePointSeries(rawSeries1))
        Dim series2 As New SeriesVariable(ConvertToTimePointSeries(rawSeries2))

        Dim dtw As New Dtw(series1, series2)
        dist = dtw.GetCost()

        TextBox3.Text = dist.ToString
    End Sub

    ' 辅助方法:将「变量为行」的二维数组转为「时间点为元素」的数组集合
    Private Function ConvertToTimePointSeries(rawData(,) As Double) As IEnumerable(Of Double())
        Dim timePointCount As Integer = rawData.GetLength(1) ' 时间点数量(列数)
        Dim variableCount As Integer = rawData.GetLength(0) ' 变量数量(行数)
        Dim timePointList As New List(Of Double())

        For timePointIndex As Integer = 0 To timePointCount - 1
            Dim variablesAtTimePoint(variableCount - 1) As Double
            For variableIndex As Integer = 0 To variableCount - 1
                variablesAtTimePoint(variableIndex) = rawData(variableIndex, timePointIndex)
            Next
            timePointList.Add(variablesAtTimePoint)
        Next

        Return timePointList
    End Function
End Class

关键说明

  • SeriesVariable的构造函数接受IEnumerable(Of Double())类型参数,每个Double()对应一个时间点的多变量观测值
  • 辅助方法ConvertToTimePointSeries负责将原始的「变量优先」二维数组,转换为NDtw要求的「时间点优先」结构
  • 如果你不想写辅助方法,也可以手动逐个创建时间点数组并添加到SeriesVariable中,比如:
    Dim series1 As New SeriesVariable()
    series1.Add(New Double() {1.0, 3.0}) ' 第一个时间点的两个变量值
    series1.Add(New Double() {3.0, 6.0}) ' 第二个时间点的两个变量值
    ' 依次添加剩余5个时间点的数据
    

内容的提问来源于stack exchange,提问作者Jamie

相关产品推荐
方舟 Agent Plan

超全模态模型 × Harness 升级,最新支持 Deepseek-V4.1-Flash、GLM-5.3 系列、Doubao-Seedream-5.0-pro、Kimi-K3 (部分), 限时 9.9 元起

最近更新时间:2026.07.04 13:06:11