- VisualStudio2022插件的安装及使用-编程手把手系列文章
- pprof-在现网场景怎么用
- C#实现的下拉多选框,下拉多选树,多级节点
- 【学习笔记】基础数据结构:猫树
TSLiB是一个为深度学习时间序列分析量身打造的开源仓库。它提供了多种深度时间序列模型的统一实现,方便研究人员评估现有模型或开发定制模型。TSLiB涵盖了长时预测(Long-term forecasting)、短时预测(Short-term forecasting)、缺失值填补(Missing value imputation)、异常检测(Anomaly detection)和分类(Classification)等五种主流时间序列任务,是从事时间序列分析研究者的理想工具。TSLiB库官方地址见:Time-Series-Library.
TSLiB 支持的五种时序任务概述如下:
任务类型 | 定义 | 特点 | 应用场景示例 |
---|---|---|---|
长时预测 | 预测时间序列在未来较长时间段内的变化趋势 | 需要考虑长期趋势和季节性因素,使用复杂的模型来捕捉长期依赖性 | 股票价格预测、长期能源需求预测等 |
短时预测 | 预测时间序列在近期的未来值 | 通常关注短期波动,模型需要快速响应新数据 | 短期销售预测、交通流量预测等 |
缺失值填补 | 填补时间序列中缺失的数据点 | 需要保持时间序列的连续性和一致性 | 时间序列预处理、历史数据补全等 |
异常检测 | 识别时间序列中的异常或离群点 | 需要区分正常波动和异常事件 | 网络安全监控、设备故障检测等 |
分类 | 将时间序列数据分为不同的类别或标签 | 通常基于时间序列的特征进行分类 | 客户行为分析、医疗诊断等 |
本文写作时,TSLiB汇集截至2024年3月,在五项不同任务表现排名前三名的模型如下:
任务 | 第一 | 第二 | 第三 |
---|---|---|---|
长时预测-过去96步 | iTransformer | TimeMixer | TimesNet |
长时预测-搜索 | TimeMixer | PatchTST | DLinear |
短时预测 | TimesNet | Non-stationary Transformer |
FEDformer |
缺失值填补 | TimesNet | Non-stationary Transformer |
Autoformer |
分类 | TimesNet | FEDformer | Informer |
异常检测 | TimesNet | FEDformer | Autoformer |
TSLiB库中参与以上排名的深度学习时序模型如下:
还有一些深度学习时序模型包含在TSLiB库中,但是尚未参与TSLiB库的性能排行榜。可以关注TSLiB的官方链接 ,查询最新结果:
整个项目的结构说明如下图所示:
安装代码如下:
git clone https://github.com/thuml/Time-Series-Library
pip install -r requirements.txt
本文主要基于TimesNet模型来介绍TSLiB库的使用。TimesNet模型支持长时预测、短时预测、缺失值填补、异常检测和分类,同时也是TSLiB作者团队提出的模型。TimesNet具体介绍如下:TimesNet: 时序基础模型,预测、填补、分类等五大任务领先。TSLiB库基于TimesNet网络的使用教程见:TimesNet_tutorial.ipynb.
TimesNet是一个通用的时间序列神经网络,可处理各种不同的时间序列任务。从TimesNet的相关库加载可以看到,其关键组件包括实现快速傅里叶变换的fft函数和Inception特征提取主干网络.
import torch
import torch.nn as nn
import torch.nn.functional as F
import torch.fft
from layers.Embed import DataEmbedding
from layers.Conv_Blocks import Inception_Block_V1
基于快速傅里叶变换的数据转换 。
TimesNet的核心理念在于实现从一维数据到二维数据的转化。当下,多数现存方法主要聚焦于时间序列的时间维度以获取时序依赖性。原始的一维序列,恰似直线上依次排布的点,其主要呈现的是相邻时间点间的直接变动。例如,昨日的数据为0,今日的数据为12,仅能察觉出简易的增长或减少。然而,事实上,现实世界中的时间序列通常具备多重周期性,诸如每日周期、每周周期、每月周期等;并且,每个周期内部的时间点存在依赖关系(如今天10点与12点),不同相邻周期内的时间点同样存在依赖关系(如今天10点与明天10点)。以气温变化的时间序列为例,每天不同时刻的气温变动形成每日周期,每周的平均气温变化构建每周周期。将时间维度转化为二维,有利于更精确地把控气温的变化规律与趋势.
由此,作者提出TimesBlock模块来实现相关功能,它通过以下步骤来处理时间序列数据:
如下所示的图中,时间序列展现出三个周期性阶段(Period 1、Period 2、Period 3)。其中,红色代表周期内的变化(类似于环比,比如昨天与今天的变化情况),蓝色则表示周期间的变化(类似于同比的概念,例如今天10点和明天10点的对比)。此时间序列被转换为三种不同的二维数据。在每个二维数据中,每一列用于表征周期内的变化情况,而每一行则用于体现周期间的变化状况:
那么,应如何确定时间序列里的周期性呢?可运用快速傅里叶变换这一方法。对时间序列实施快速傅里叶变换操作后,其主要的周期将会呈现出相应具有高幅值的频率分量。设定一个超参数k,接着仅选取幅值最大的topk个频率分量,如此便能获取到k个主要的周期。具体操作如下图,假设设定k为3,经过快速傅里叶变换后,发现频率分量幅值最大的三个频率分别为 10Hz、20Hz 和 30Hz ,那么这三个频率所对应的周期就是主要周期。然后将1D时间序列按照这三个周期进行重塑,再用2D卷积处理并聚合结果,就能有效地捕捉到多周期的时序变化特征:
TimesBlock模块 。
TimesBlock实现了对时序变化特征进一步特征提取的功能,代码的实现位于models文件下的TimesNet.py文件:TimesBlock类。TimesBlock类定义如下:
class TimesBlock(nn.Module):
def __init__(self, configs):
super(TimesBlock, self).__init__()
pass
def forward(self, x):
pass
基于TimesBlock模块,可以构建适应于各类时序序列任务的TimesNet模型。相关代码位于models文件下的TimesNet.py文件:TimesNet类。实现TimesNet模型的Model类定义如下:
class Model(nn.Module):
def __init__(self, configs):
super(Model, self).__init__()
self.configs = configs
self.task_name = configs.task_name
pass
# 长时预测和短时预测
def forecast(self, x_enc, x_mark_enc, x_dec, x_mark_dec):
...
# 缺失值填补
def imputation(self, x_enc, x_mark_enc, x_dec, x_mark_dec, mask):
pass
# 异常检测
def anomaly_detection(self, x_enc):
pass
# 分类
def classification(self, x_enc, x_mark_enc):
pass
# 推理
def forward(self, x_enc, x_mark_enc, x_dec, x_mark_dec, mask=None):
if self.task_name == 'long_term_forecast' or self.task_name == 'short_term_forecast':
dec_out = self.forecast(x_enc, x_mark_enc, x_dec, x_mark_dec)
pass
if self.task_name == 'imputation':
dec_out = self.imputation(
x_enc, x_mark_enc, x_dec, x_mark_dec, mask)
pass
if self.task_name == 'anomaly_detection':
dec_out = self.anomaly_detection(x_enc)
pass
if self.task_name == 'classification':
dec_out = self.classification(x_enc, x_mark_enc)
pass
Model类在初始化函数中通过接收configs参数,并根据其中的task_name来决定执行哪个任务的处理逻辑。这使得模型可以通过修改配置来切换模型执行的任务,而无需对代码结构进行大的改动。同时从以上代码可以看到,如果未来需要添加一个新的任务,比如回归,可以轻松地添加一个新的方法regression来处理相关逻辑,大大增加了代码的灵活性.
模型训练 。
TimesNet网络的训练、验证和测试的相关代码是在exp目录下实现的。以长时预测为例,用于长时预测任务的模型训练过程可以简要地分为几个部分,包括数据准备、创建保存路径、初始化、优化器和损失函数选择、使用混合精度训练、训练循环、验证和提前停止、学习率调整、加载最佳模型。相关代码位于exp/exp_long_term_forecasting.py文件.
数据集支持 。
TSLiB的官方仓库提供了常见时序预测数据集的下载:谷歌云和百度云,然后将下载后的数据集放入dataset目录即可.
本节主要介绍TSLiB所使用的时序数据集。这些数据集在时序列分析领域中已被前人研究,并经过精心清洗以符合统一的格式标准。鉴于时序列分析领域的相对不成熟,现有的数据集多依赖于网络爬虫技术获取,或与现实应用场景存在一定差距。这些数据集的具体介绍可以查看TimesNet的论文:TimesNet: Temporal 2D-Variation Modeling for General Time Series Analysis.
更多时序数据集的介绍见:时间序列论文标准数据集和TimesNet复现结果.
长时预测是各大时序模型主要支持的任务。在长时预测中,TSLiB库基于均方误差(MSEloss)损失来训练模型。注意特征数不包含时间特征,但包含预测目标特征。这是因为TSLiB中集成的长时预测模型会在训练过程中将预测变量作为输入特征的一部分进行学习.
数据集 | 数据输入特征数 | 样本长度 | 时间粒度 |
---|---|---|---|
ECL | 321 | 26304 | 1小时 |
ETTh1/ETTh2 | 7 | 17420 | 1小时 |
ETTm1/ETTm2 | 7 | 69680 | 15分钟 |
Exchange_rate | 8 | 7588 | 1天 |
ILI | 7 | 966 | 1周 |
Traffic | 862 | 17544 | 1小时 |
Weather | 21 | 52696 | 10分钟 |
注意数据集的预测目标列都被命名为”OT“。这一命名为了构建一个标准化的长时预测数据集,将所有预测目标列的命名统一为与ETT数据集列名相一致的形式.
ECL 。
ECL(electricity)数据集涵盖了321位客户在四年期间的每小时用电记录,旨在预测不同区域的电力需求。鉴于数据中存在缺失值,数据集中的最后一列被作为预测目标。在TSLiB中基于Dataset_Custom类来读取数据集.
ETT 。
ETT-small电力变压器温度(Electricity Transformer Temperature)数据集,主要应用于电力系统时间预测的相关研究。此数据集涵盖了中国两个不同地区为期两年的数据,由两个小时级数据集(ETTh1、ETTh2)以及两个15分钟级数据集(ETTm1、ETTm2)共同构成。每个数据点均包含2016年7月至2018年7月这段时间内的目标值“油温度”以及6个电力负载特征。在TSLiB中基于Dataset_ETT_hour和Dataset_ETT_minute类来读取数据集。各列描述如下:
Exchange_rate 。
Exchange_rate数据集包括澳大利亚、英国、加拿大、瑞士、中国、日本、新西兰和新加坡八个国家的每日汇率数据,时间跨度从1990年到2016年。在TSLiB中基于Dataset_Custom类来读取数据集.
ILI 。
ILI(illness)数据集包括了从2002年到2020年间美国疾控中心的各周流感数据。在TSLiB中基于Dataset_Custom类来读取数据集。各特征列描述如下:
Traffic 。
Traffic数据集包含了来自美国加州交通部的862个传感器在2016至2018年间每小时的数据记录。这些数据详细记录了旧金山湾区高速公路上各传感器所测量的道路占用率。道路占用率的数值范围在0到1之间,0表示道路完全空闲,而1表示道路完全拥堵,这个数值范围反映了道路的实际使用情况。最后一列作为特征列。在TSLiB中基于Dataset_Custom类来读取数据集.
Weather 。
Weather数据集涵盖了21项关键气象指标,包括空气温度和湿度等。数据采集自2020年,以每10分钟的频率进行记录。在TSLiB中基于Dataset_Custom类来读取数据集。各列描述如下:
TSLiB在处理短时和长时预测任务时,其核心差异仅在于预测的时间跨度。深度学习时序预测模型能够一次性生成整个预测序列。因此,从模型结构的视角分析,短时预测与长时预测在本质上并无显著区别,主要的调整仅涉及模型输出长度这一超参数的设定。对于短时预测而言,采用对称平均绝对百分比误差(SMAPE)作为损失函数的计算基准。 TSLiB使用M4数据集来评价模型短时预测的能力。M4数据集的详细介绍见:M4。M4数据集是第四届Makridakis预测竞赛的多个时序数据集合,由年度、季度、月度、每周、每日、每小时等不同数据颗粒的时间序列组成,分为训练集和测试集。其涵盖经济、金融、商业、社会、环境等多个领域,M4数据集主要下数据文件如下:
缺失值填补是一项旨在预测时间序列中某些缺失值的任务,因此在某种程度上类似于预测。缺失值填补Imputation涉及到的数据集有ECL、ETT、Weather数据集。这些数据集在长时预测已经提到了。TSLiB库中用于实现Imputation的模型架构与长时预测相同。然而,其区别在于,TSLiB在训练过程中会对输入数据中的部分信息进行掩码处理,随后利用模型预测输入数据中被掩码的值。并基于均方误差(MSEloss)损失计算掩码部分的差值。这一阶段不需要训练标签的参与.
TSLib库基于CrossEntropyLoss损失来训练时序分类模型,注意输入数据特征不包含时间特征和分类特征。时序分类训练流程类似于图像分类模型的训练流程.
数据集 | 输入数据特征数 | 训练样本长度 | 分类类别数 |
---|---|---|---|
EthanolConcentration | 3 | 261个(1751, 3)的特征向量 | 4 |
FaceDetection | 144 | 5890个(62, 144)的特征向量 | 2 |
Handwriting | 3 | 150个(152,3)的特征向量 | 26 |
Heartbeat | 61 | 204个(405,61)的特征向量 | 2 |
JapaneseVowels | 12 | 270个(29,12)的特征向量 | 9 |
PEMS-SF | 963 | 267个(144,963)的特征向量 | 7 |
SelfRegulationSCP1 | 6 | 268个(896,6)的特征向量 | 2 |
SelfRegulationSCP2 | 7 | 200个(1152,7)的特征向量 | 2 |
SpokenArabicDigits | 13 | 6599个(93,13)的特征向量 | 10 |
UWaveGestureLibrary | 3 | 120个(315,3)的特征向量 | 8 |
EthanolConcentration 。
EthanolConcentration数据集是一个多变量时间序列数据集,它包含了44种不同真实威士忌酒瓶中水和乙醇溶液的原始光谱数据。这些数据用于预测样本中的乙醇浓度。数据集中的乙醇浓度分别为35%、38%、40%和45%,其中40%是苏格兰威士忌的最低法定酒精含量。数据集包含524个多变量时间序列,分为训练集(261个样本)和测试集(263个样本)。每个时间序列由1751个时间点组成,记录了三个变量的测量值。这些变量代表了在不同波长下的光谱强度,数据覆盖了从226nm到1101.5nm的波长范围,采样频率为0.5nm。输入数据集的列包括:
此外,还有一个数值向量classes,它包含了与输入数据相对应的四个类别,每个类别与不同的乙醇浓度相关联。因此模型对维度维度为(1751,3)的向量进行分类,判断其属于哪个类别。在TSLiB中基于UEAloader类来读取数据集,此类和普通时序数据读取类不一样。里面过于啰嗦,因为分类原始数据被统一为ts格式,需要过多数据处理代码.
FaceDetection 。
FaceDetection数据集属于面部时序数据,其中每组包含62个观测值,每个观测值又有144个特征点。该数据集主要用于区分输入数据表示人脸还是非人脸。这个数据集的读取速度较为缓慢。在TSLiB中基于UEAloader类来读取数据集.
Handwriting 。
Handwriting数据集包含26个字母的手写样本,共有150个训练用例和850个测试用例。数据集中包含的三个特征维度为加速度计和陀螺仪的输出。在TSLiB中基于UEAloader类来读取数据集.
Heartbeat 。
Heartbeat数据集是一个心跳音频监测时序数据,根据心跳声音分为声音正常和异常两类。共有204训练用例和205个测试用例。在TSLiB中基于UEAloader类来读取数据集.
JapaneseVowels 。
JapaneseVowels数据集记录了来自9名男性日语说话者的语音时间序列。特征为12个LPC cepstrum coefficients,共有270训练用例和370个测试用例。在TSLiB中基于UEAloader类来读取数据集.
PEMS-SF 。
PEMS-SF数据描述了旧金山湾区高速公路不同车道的占用率,介于0和1之间。测量范围为2008年1月1日至2009年3月30日,每10分钟采样一次。数据库中的每一天视为一个维度为963(在整个研究期间持续运行的传感器数量)、长度为6x24=144的单一时间序列。共有267训练用例和173个测试用例。在TSLiB中基于UEAloader类来读取数据集.
SelfRegulationSCP 。
SelfRegulationSCP1和SelfRegulationSCP2数据集为深入研究自我调节相关的皮层慢电位时序数据数据集。数据集详细介绍见:A spelling device for the paralysed。在TSLiB中基于UEAloader类来读取数据集.
SpokenArabicDigits 。
SpokenArabicDigits数据集包含与口语阿拉伯数字对应的梅尔频率倒谱系数(MFCC)的时间序列。从44名男性和44名女性阿拉伯语母语者那里采集了由8800个(10 位数字 × 10 次重复 × 88 位说话者)样本。每个样本由13个梅尔频率倒谱系数(MFCCs)组成,以代表10个阿拉伯语口语数字。共有6599个训练用例和2199个测试用例。在TSLiB中基于UEAloader类来读取数据集.
UWaveGestureLibrary 。
UWaveGestureLibrary数据集是一个有关手势运动的时序数据集合。其中,时序数据是由每个运动对应的 X、Y、Z 坐标构成,且每个序列的长度为315。该数据集一共记录了8种不同的手势。共有120个训练用例和320个测试用例。在TSLiB中基于UEAloader类来读取数据集.
异常检测在训练时类似于缺失值填补Imputation的训练方式,即训练模型重建输入数据,并使用MSEloss来计算重建误差。在测试阶段,模型尝试重建输入数据。如果重建误差高于某个阈值,则认为数据点是异常的。阈值通常设置为训练数据的高百分位数,这样只有那些重建误差极高的数据点才会被标记为异常。然后得到预测的异常标签,并与真实异常标签进行比较,计算准确率等评估指标.
数据集 | 数据输入特征数 | 序列长度 |
---|---|---|
MSL | 55 | 100 |
PSM | 25 | 100 |
SMAP | 25 | 100 |
SMD | 38 | 100 |
SWaT | 51 | 100 |
MSL 。
MSL(Mars Science Laboratory rover)数据集包含火星好奇号探测器的异常情况。输入为55个信道的探测数据。训练集无label,测试集有状态label。状态label为0或者1(0为信号没发送,而1信号代表已发送)。数据集更多介绍可查看https://github.com/khundman/telemanom。共有58317个训练用例、11664个验证用例(来自训练数据末端20%数据)和73729个测试用例。在TSLiB中基于MSLSegLoader类来读取数据集。在训练时,每次随机提取100个连续序列进行数据重建.
PSM 。
PSM数据集是从eBay公司的多个应用程序服务器节点内部收集的,共有132481个训练用例、26398个验证用例(来自训练数据末端20%数据)和87841个测试用例。在TSLiB中基于PSMSegLoader类来读取数据集.
SMAP 。
SMAP数据集是航天器数据集,输入为25个信道的探测数据。共有135084个训练用例、26938个验证用例(来自训练数据末端20%数据)和427518个测试用例。在TSLiB中基于SMAPSegLoader类来读取数据集.
SMD 。
SMD(服务器机组数据集,Server Machine Datase)由38个传感器数据组成。共有708405个训练用例、141681个验证用例(来自训练数据末端20%数据)和708420个测试用例。在TSLiB中基于SMDSegLoader类来读取数据集.
SWaT 。
SWaT数据集包含了水处理系统中传感器的时序异常数据。这些数据特征涵盖了来自51个传感器和执行器的信息。数据集记录了连续11天的运行情况,其中前7天为正常操作,后4天则模拟了遭受41次阶段性攻击的情况。数据的时间粒度为每秒一次。共有495000个训练用例、99000个验证用例(来自训练数据末端20%数据)和449919个测试用例。在TSLiB中基于SWATSegLoader类来读取数据集.
TSLiB库为各种时序任务提供了不同模型的训练脚本,具体内容请参见TSLiB项目仓库的scripts文件夹。以数据集ETTh1为例,查看TimesNet在长时预测任务中的表现:
model_name=TimesNet
python -u run.py \
--task_name long_term_forecast \
--is_training 1 \
--root_path ./dataset/ETT-small/ \
--data_path ETTh1.csv \
--model_id ETTh1_96_96 \
--model $model_name \
--data ETTh1 \
--features M \
--seq_len 96 \
--label_len 48 \
--pred_len 96 \
--e_layers 2 \
--d_layers 1 \
--factor 3 \
--enc_in 7 \
--dec_in 7 \
--c_out 7 \
--d_model 16 \
--d_ff 32 \
--des 'Exp' \
--itr 1 \
--top_k 5
不同训练任务和不同模型对应不同的训练参数。这些训练参数的介绍可以通过项目run.py文件中argparse参数找到所有参数的含义和介绍:https://github.com/thuml/Time-Series-Library/blob/main/run.py#L19-L135.
在Linux环境下运行以下代码即可执行相关脚本。注意,不同模型的脚本中包含多次训练选项,需要提取并使用单次运行选项:
./scripts/long_term_forecast/ETT_script/TimesNet_ETTh1.sh 。
在训练过程中,会输出训练集、验证集和测试集的数据集损失。许多深度学习领域的代码库普遍倾向于在训练过程中实时打印测试集的损失数据。这种做法目的是为了快速调参,同时避免逐个测试数据集。但是在工程项目中这样做是不对的,因为测试数据泄露了.
Epoch: 2, Steps: 265 | Train Loss: 0.3978408 Vali Loss: 0.8001348 Test Loss: 0.3954313
在模型训练完成后,将立即进行模型测试,以评估模型在测试集上的表现。注意,TSLiB并未提供模型推理的代码,需要自行编写相关代码:
print('>>>>>>>start training : {}>>>>>>>>>>>>>>>>>>>>>>>>>>'.format(setting))
exp.train(setting)
print('>>>>>>>testing : {}<<<<<<<<<<<<<<<<<<<<<<<<<<<<<<<<<'.format(setting))
exp.test(setting)
torch.cuda.empty_cache()
训练好的模型权重保存在checkpoints文件夹中。测试集详细结果将保存到results文件夹中。此外还有详细的可视化结果,以PDF格式保存到test_results文件夹中,内容如下所示.
在上图中,横轴表示序列长度,纵轴则显示预测结果。由于数据在处理过程中经过归一化处理,预测结果和实际结果均为负值。需要注意的是,TimesNet模型在训练和推理阶段也会对输入数据进行归一化处理.
最后此篇关于[深度学习]时间序列分析工具TSLiB库使用指北的文章就讲到这里了,如果你想了解更多关于[深度学习]时间序列分析工具TSLiB库使用指北的内容请搜索CFSDN的文章或继续浏览相关文章,希望大家以后支持我的博客! 。
我正在使用python 2.7 当我尝试在其上运行epsilon操作时出现此错误, 这是我的代码 import cv2 import numpy as np img = cv2.imread('img
1 很多程序员对互联网行业中广泛讨论的“35岁危机”表示不满,似乎所有的程序员都有着35岁的职业保质期。然而,随着AI技术的兴起,这场翻天覆地的技术革命正以更加残酷且直接的方式渗透到各行各业。程序员
我有一个包含多个子模块的项目,我想列出每个子模块的相对深度 该项目: main_project submodule1 submodule1\submodule1_1 submo
我有一张彩色图像及其深度图,它们都是由 Kinect 捕获的。我想将它投影到另一个位置(以查看它在另一个视角下的样子)。由于我没有 Kinect 的内在参数(相机参数);我该如何实现? P.S:我正在
给出了这三个网址: 1) https://example.com 2) https://example.com/app 3) https://example.com/app?param=hello 假
这个着色器(最后的代码)使用 raymarching 来渲染程序几何: 但是,在图像(上图)中,背景中的立方体应该部分遮挡粉红色实体;不是因为这个: struct fragmentOutput {
我希望能够在 ThreeJS 中创建一个房间。这是我到目前为止所拥有的: http://jsfiddle.net/7oyq4yqz/ var camera, scene, renderer, geom
我正在尝试通过编写小程序来学习 Haskell...所以我目前正在为简单表达式编写一个词法分析器/解析器。 (是的,我可以使用 Alex/Happy...但我想先学习核心语言)。 我的解析器本质上是一
我想使用像 [parse_ini_file][1] 这样的东西。 例如,我有一个 boot.ini 文件,我将加载该文件以进行进一步的处理: ;database connection sett
我正在使用 Mockito 来测试我的类(class)。我正在尝试使用深度 stub ,因为我没有办法在 Mockito 中的另一个模拟对象中注入(inject) Mock。 class MyServ
我试图在调整设备屏幕大小时重新排列布局,所以我这样做: if(screenOrientation == SCREEN_ORIENTATION_LANDSCAPE) { document
我正在 Ubuntu 上编写一个简单的 OpenGL 程序,它使用顶点数组绘制两个正方形(一个在另一个前面)。由于某种原因,GL_DEPTH_TEST 似乎不起作用。后面的物体出现在前面的物体前面
static FAST_FUNC int fileAction(const char *pathname, struct stat *sb UNUSED_PARAM, void *mo
我有这样的层次结构: namespace MyService{ class IBase { public: virtual ~IBase(){} protected: IPointer
我正在制作一个图片库,需要一些循环类别方面的帮助。下一个深度是图库配置文件中的已知设置,因此这不是关于无限深度循环的问题,而是循环已知深度并输出所有结果的最有效方法。 本质上,我想创建一个 包含系统中
如何以编程方式在树状结构上获取 n 深度迭代器?在根目录中我有 List 每个节点有 Map> n+1 深度。 我已修复 1 个深度: // DEPTH 1 nodeData.forEach(base
我正在构建一个包含大量自定义元素的 Polymer 单页界面。 现在我希望我的元素具有某种主样式,我可以在 index.html 或我的主要内容元素中定义它。可以这样想: index.html
我正在尝试每 25 秒连接到配对的蓝牙设备,通过 AlarmManager 安排,它会触发 WakefulBroadcastReceiver 以启动服务以进行连接。设备进入休眠状态后,前几个小时一切正
假设有一个有默认值的函数: int foo(int x=42); 如果这被其他人这样调用: int bar(int x=42) { return foo(x); } int moo(int x=42)
是否可以使用 Javascript 获取 url 深度(级别)? 如果我有这个网址:www.website.com/site/product/category/item -> depth=4www.w
我是一名优秀的程序员,十分优秀!