现代C++中的从头开始深度学习:【4/8】梯度下降
一、说明
在本系列中,我们将学习如何仅使用普通和现代C++编写必须知道的深度学习算法,例如卷积、反向传播、激活函数、优化器、深度神经网络等。
在这个故事中,我们将通过引入梯度下降算法来介绍数据中 2D 卷积核的拟合。我们将使用卷积和上一个故事中引入的成本函数概念,将所有内容编码为现代C++和特征。
这个故事是:C++的梯度下降,查看其他故事:
0 — 现代C++深度学习编程基础
1 — 在C++中编码 2D 卷积
2 — 使用 Lambda 的成本函数
4 — 激活函数
...更多内容即将推出。
二、函数逼近作为优化问题
如果你读过我们之前的演讲,你已经知道,在机器学习中,我们大部分时间都在关注使用数据来寻找函数近似值。
通常,我们通过找到最小化成本值的系数来获得函数近似。因此,我们的近似问题被转换为优化问题,我们试图最小化成本函数的值。
三、成本函数和梯度下降
成本函数计算使用函数 H(X) 近似目标函数 F(X) 的开销。例如,如果 H(X) 是输入 X 和核 k 之间的卷积,则 MSE 成本函数由下式给出:
我们通常做 Yn = F(Xn),结果是:
MSE是均方误差,是上一个故事中介绍的成本函数
因此,我们的目标是找到最小化MSE(k)的内核值km。找到 km 的最基本(但最强大)的算法是梯度下降。
梯度下降使用成本函数梯度来查找最小成本。为了理解什么是梯度,让我们谈谈成本表面。
四、绘制成本曲面
为了更容易理解,让我们暂时假设内核仅由两个系数组成。如果我们为每个可能的组合绘制 MSE(k) 的值,我们最终会得到这样的表面:k
[k00, k01]
[k00, k01]
在每个点上,曲面与0k₀₀轴有一个倾角,与0k₀₁轴有另一个倾角:(k00, k01, MSE(k00, k01))
偏导数
这两个斜率分别是 MSE 曲线相对于轴 O k₀₀ 和 Ok₀₁ 的偏导数。在微积分中,我们非常使用符号∂来表示偏导数:
这两个偏导数共同构成了MSE相对于轴O k₀₀和Ok₀₁的梯度。此梯度用于驱动梯度下降算法的执行,如下所示:
梯度下降的实际应用
在成本表面上执行此“导航”的算法称为梯度下降。
五、梯度下降
梯度下降伪代码描述如下:
gradient_descent:initialize k, learning_rate, epoch = 1repeatk = k - learning_rate x ∇Cost(k)until epoch <= max_epochreturn k
learning_rate x ∇Cost(k) 的值通常称为权重更新。我们可以通过以下方式恢复梯度下降的行为:
for each iteration:calculate the weight updatesubtract it from the parameter k
顾名思义,Cost(k) 是配置 k 的成本函数。梯度下降的目的是找到成本(k)最小的k值。
learning_rate通常是像 0.1、0.01、0.001 左右这样的标量。此值控制优化过程中的步长。
该算法循环 max_epoch 次。有时,我们会更早地停止算法,即,即使纪元< max_epoch,在 Cost(k) 太小的情况下。
我们通常用超参数的名称来指代learning_rate和max_epoch等参数。
要实现梯度下降,我们需要知道的最后一件事是如何计算 C(k) 的梯度。幸运的是,在成本函数为 MSE 的情况下,如前所述,查找 ∇Cost(k) 非常简单。
六、查找 MSE 梯度
到目前为止,我们已经看到梯度的分量是每个轴 0kij 的成本面的斜率。我们还看到,MSE(k) 相对于每个 i 个、核 k 的系数 j-的梯度由下式给出:
让我们记住,MSE(k) 由下式给出:
其中n是每对的索引(Yn,Tn),r&c是输出矩阵系数的索引:
输出布局
使用链式规则和线性组合规则,我们可以通过以下方式找到MSE梯度:
由于 N、R、C、Yn 和 T n 的值是已知的,我们需要计算的只是 Tn 中每个系数相对于系数 kij 的偏导数。在带有填充 P 的卷积的情况下,此导数由下式给出:
如果我们展开 r 和 c 的总和,我们可以发现梯度由下式给出:
其中 δn 是矩阵:
以下代码实现此操作:
auto gradient = [](const std::vector<Matrix> &xs, std::vector<Matrix> &ys, std::vector<Matrix> &ts, const int padding)
{const int N = xs.size();const int R = xs[0].rows();const int C = xs[0].cols();const int result_rows = xs[0].rows() - ys[0].rows() + 2 * padding + 1;const int result_cols = xs[0].cols() - ys[0].cols() + 2 * padding + 1;Matrix result = Matrix::Zero(result_rows, result_cols);for (int n = 0; n < N; ++n) {const auto &X = xs[n];const auto &Y = ys[n];const auto &T = ts[n];Matrix delta = T - Y;Matrix update = Convolution2D(X, delta, padding);result = result + update;}result *= 2.0/(R * C);return result;
};
现在我们知道了如何获得梯度,让我们来实现梯度下降算法。
七、编码梯度下降
最后,我们的梯度下降的代码在这里:
auto gradient_descent = [](Matrix &kernel, Dataset &dataset, const double learning_rate, const int MAX_EPOCHS)
{std::vector<double> losses; losses.reserve(MAX_EPOCHS);const int padding = kernel.rows() / 2;const int N = dataset.size();std::vector<Matrix> xs; xs.reserve(N);std::vector<Matrix> ys; ys.reserve(N);std::vector<Matrix> ts; ts.reserve(N);int epoch = 0;while (epoch < MAX_EPOCHS){xs.clear(); ys.clear(); ts.clear();for (auto &instance : dataset) {const auto & X = instance.first;const auto & Y = instance.second;const auto T = Convolution2D(X, kernel, padding);xs.push_back(X);ys.push_back(Y);ts.push_back(T);}losses.push_back(MSE(ys, ts));auto grad = gradient(xs, ys, ts, padding);auto update = grad * learning_rate;kernel -= update;epoch++;}return losses;
};
This is the base code. We can improve it in several ways, for example:
- using the loss of each instance to update the kernel. This is called Stochastic Gradient Descent (SGD), which is very useful in real-world scenarios;
- grouping instances in batches and updating the kernel after each batch, which is called Minibatch;
- 使用学习率时间表来降低各个时期的学习率;
- 在这一行中,我们可以连接一个优化器,如Momentum、RMSProp或Adam。 我们将在接下来的故事中讨论优化器;
kernel -= update;
- 引入验证集或使用某些交叉验证架构;
- 通过矢量化替换嵌套循环以获得性能和 CPU 使用率(如上一个故事所述);
for(auto &instance: dataset)
- 添加回调和钩子以更轻松地自定义我们的训练循环。
我们可以暂时忘记这些改进。现在,重点是了解如何使用梯度来更新参数(在我们的例子中是内核)。这是当今机器学习的基本、核心概念,也是推进更高级主题的关键因素。
让我们通过说明性实验将其付诸行动,看看这段代码是如何工作的。
八、实际实验:修复索贝尔边缘探测器
在上一个故事中,我们了解到我们可以应用 Sobel 滤波器 Gx 来检测垂直边缘:
现在,问题是:给定原始图像和边缘图像,我们是否设法恢复了 Sobel 滤镜 Gx?
换句话说,我们可以在给定输入 X 和预期输出 Y 的情况下拟合内核吗?
答案是肯定的,我们将使用梯度下降来做到这一点。
九、加载和准备数据
首先,我们使用OpenCV从文件夹中读取一些图像。我们对它们应用 Gx 过滤器,并将它们成对存储在我们的数据集对象中:
auto load_dataset = [](std::string data_folder, const int padding) {Dataset dataset;std::vector<std::string> files;for (const auto & entry : fs::directory_iterator(data_folder)) {Mat image = cv::imread(data_folder + entry.path().c_str(), cv::IMREAD_GRAYSCALE);Mat formatted_image = resize_image(image, 640, 640);Matrix X;cv::cv2eigen(formatted_image, X);X /= 255.;auto Y = Convolution2D(X, Sobel.Gx, padding);auto pair = std::make_pair(X, Y);dataset.push_back(pair);}return dataset;
};auto dataset = load_dataset("../images/");
我们使用辅助实用程序 .resize_image 格式化每个输入图像以适合 640x640 网格
如上图所示,将每个图像集中到黑色 640x640 网格中,而无需通过简单地调整图像大小来拉伸图像。resize_image
我们使用 Gx 过滤器为每个图像生成真实输出 Y。现在,我们可以忘记这个过滤器了。我们将使用梯度下降和 2D 卷积从数据中恢复它。
十、运行实验
通过连接所有部分,我们最终可以看到训练执行情况:
int main() {const int padding = 1;auto dataset = load_dataset("../images/", padding);const int MAX_EPOCHS = 1000;const double learning_rate = 0.1;auto history = gradient_descent(kernel, dataset, learning_rate, MAX_EPOCHS);std::cout << "Original kernel is:\n\n" << std::fixed << std::setprecision(2) << Sobel.Gx << "\n\n";std::cout << "Trained kernel is:\n\n" << std::fixed << std::setprecision(2) << kernel << "\n\n";plot_performance(history);return 0;
}
The following sequence illustrates the fitting process:
一开始,内核充满了随机数。因此,在第一个纪元中,输出图像通常是黑色输出。
然而,在几个纪元之后,梯度下降开始使核拟合到全局最小值。
最后,在最后一个纪元中,输出几乎等于基本事实。此时,损失值渐近移动到最低值。让我们检查一下各时期的损失表现:
训练表现
在机器学习中,这种损失曲线形状非常常见。事实证明,在第一个纪元中,参数基本上是随机值。这会导致初始损失很高:
成本面上的算法搜索表示
在最后一个时期,梯度下降终于完成了它的工作,将核拟合到合适的值,这使得损失收敛到最小值。
现在,我们可以将学习到的内核与原始 Gx Sobel 的过滤器进行比较:
正如我们所料,学习内核和原始内核非常接近。请注意,如果我们在更多的时期训练内核(并使用较小的学习率),这种差异仍然可以更小。
用于训练此内核的代码可以在此存储库中找到。
十一、关于差异化和autodiff
在这个故事中,我们使用常见的微积分规则来查找MSE偏导数。然而,在某些情况下,为给定的复数成本函数找到代数导数可能具有挑战性。幸运的是,现代机器学习框架提供了一个神奇的功能,称为自动微分或简称。autodiff
autodiff
跟踪每个基本算术运算(如加法或乘法),将链式规则应用于它们以找到偏导数。因此,在使用时,我们不需要计算偏导数的代数公式,甚至不需要直接实现它们。autodiff
由于这里我们使用的是简单的、众所周知的成本公式,因此不需要手动使用甚至解决复杂的微分。autodiff
更详细地涵盖导数、偏导数和自动微分值得一个新的故事!
十二、结论
在这个故事中,我们学习了如何使用梯度来拟合数据中的内核。我们介绍了梯度下降,它简单、强大,是推导出更复杂的算法(如反向传播)的基础。我们还使用梯度下降法进行了一项实际实验,从数据中恢复了Sobel滤波器。
参考书
机器学习,米切尔
Cálculo 3, Geraldo Ávila(巴西葡萄牙语)
神经网络:综合基础,Haykin
模式分类,杜达
计算机视觉:算法和应用,Szeliski。
Python machine learning, Raschka
相关文章:
![](https://img-blog.csdnimg.cn/img_convert/022a7b0fdeadfba74194a83ba9d36117.png)
现代C++中的从头开始深度学习:【4/8】梯度下降
一、说明 在本系列中,我们将学习如何仅使用普通和现代C编写必须知道的深度学习算法,例如卷积、反向传播、激活函数、优化器、深度神经网络等。 在这个故事中,我们将通过引入梯度下降算法来介绍数据中 2D 卷积核的拟合。我们将使用卷积和上一个…...
![](https://img-blog.csdnimg.cn/760c3220d88b4afa845835ed6007de97.png)
Yolov5缺陷检测/目标检测 Jetson nx部署Triton server
使用AI目标检测进行缺陷检测时,部署到Jetson上即小巧算力还高,将训练好的模型转为tensorRT再部署到Jetson 上供http或GRPC调用。1 Jetson nx 刷机 找个ubuntu 系统NVIDIA官网下载安装Jetson 的sdkmanager一步步刷机即可。 本文刷的是JetPack 5.1, 其中包…...
![](https://csdnimg.cn/release/blog_editor_html/release2.3.5/ckeditor/plugins/CsdnLink/icons/icon-default.png?t=N6B9)
MobaXterm 中文乱码, 及pojie
中文解决方法: 把“连字”去掉! MobaXterm网页,可以生成一个授权文件Custom.mxtpro。放在安装目录就可以了 MobaXterm Keygen (husbin.top)http://b70.husbin.top:5000/...
![](https://img-blog.csdnimg.cn/b845abad71dc40af977b46cb704b0c28.png)
java: 程序包sun.misc不存在
启动失败,rebuild时也报错:java: 程序包sun.misc不存在 问题出在JDK版本上,这个包在JDK9的时候已经被弃用了,这里改回JDK8即可 步骤如下:...
![](https://www.ngui.cc/images/no-images.jpg)
WSL2Linux 子系统(五)
WLS2Linux 子系统编译 Android 上一篇文章中讲解 《WLS2Linux 子系统迁移/恢复》,从C盘迁移到D盘。既可以防止C盘爆红,又可以释放磁盘空间。有更大存储空间意味大有可为,比如说编译Android系统。本文则以开源 firefly Android10代码为例简单…...
![](https://img-blog.csdnimg.cn/15fb1fc7936845f78b576b8c442f3f5e.png)
java 企业工程管理系统软件源码 自主研发 工程行业适用 em
工程项目管理软件(工程项目管理系统)对建设工程项目管理组织建设、项目策划决策、规划设计、施工建设到竣工交付、总结评估、运维运营,全过程、全方位的对项目进行综合管理 工程项目各模块及其功能点清单 一、系统管理 1、数据字典&#…...
IPO观察丨困于门店扩张的KK集团,还能讲好增长故事吗?
KK集团发起了其IPO之路上的第三次冲击。 近日,KK集团更新了招股书,继续推进港交所上市进程,此前两次上市搁置后终于有了新动向。从更新内容来看,KK集团招股书披露了公司截至2023年一季度的最新业绩,交出一份不错的“成…...
![](https://img-blog.csdnimg.cn/5431d992fcf144fe9ae381f2d24591b3.png)
【iOS】RunLoop
前言-什么是RunLoop? 什么是RunLoop? 跑圈?字面上理解确实是这样的。 Apple官方文档这样解释RunLoop RunLoop是与线程息息相关的基本结构的一部分。RunLoop是一个调度任务和处理任务的事件循环。RunLoop的目的是为了在有工作的时候让线程忙起来&#…...
![](https://img-blog.csdnimg.cn/20201209154518318.png?x-oss-process=image/watermark,type_ZmFuZ3poZW5naGVpdGk,shadow_10,text_aHR0cHM6Ly9ibG9nLmNzZG4ubmV0L3dlaXhpbl80ODAwNjE3MA==,size_16,color_FFFFFF,t_70)
数据包传输方式:单播、多播、广播、组播、泛播
数据包传输方式 单播、多播、广播、组播、泛播 网络中假设X代表所有的机器,Y代表X中的一部分机器,Z代表一组机器,1代表一台机器,那么 1:1 那就是单播;1:Y 那就是多播;1࿱…...
![](https://img-blog.csdnimg.cn/5885ebb1a7714ae9985c3454c55afcd4.png)
WebRTC基础知识
文章目录 基础概念NAT (Network Address Translation) 打洞STUN(Session Traversal Utilities for NAT)基于STUN协议的DDoS反射攻击 # TODO TURN(Traversal Using Relays around NAT)ICE(Interactive Connectivity Est…...
![](https://img-blog.csdnimg.cn/4999ee2674f24cee8b7b50e88d3a7af4.png)
积累常见的有针对性的python面试题---python面试题001
1.考点列表的.remove方法的参数是传入的对应的元素的值,而不是下标 然后再看remove这里,注意这个是,删除写的那个值,比如这里写3,就是删除3, 而不是下标. remove不是下标删除,而是内容删除. 2.元组操作,元组不支持修改,某个下标的内容 可以问他如何修改元组的某个元素 3.…...
![](https://www.ngui.cc/images/no-images.jpg)
在springboot使用websocket时mapper无法注入
直接上代码 package cn.ujoined.combined.utils;import org.springframework.beans.BeansException; import org.springframework.context.ApplicationContext; import org.springframework.context.ApplicationContextAware; import org.springframework.stereotype.Componen…...
![](https://img-blog.csdnimg.cn/cd4368aca59a44b8bfb99957e19c3157.png)
前端加密与解密的几种方式
1.base64加密方式 1. base64是什么? Base64,顾名思义,就是包括小写字母a-z、大写字母A-Z、数字0-9、符号""、"/"一共64个字符的字符集,(另加一个“”,实际是65个字符,至于…...
![](https://img-blog.csdnimg.cn/d3891ce1aef247c1979caa2c58f00fc9.png#pic_center)
详解Spring Bean的生命周期
详解Spring Bean的生命周期 Spring Bean的生命周期包括以下阶段: 1. 实例化Bean 对于BeanFactory容器,当客户向容器请求一个尚未初始化的bean时,或初始化bean的时候需要注入另一个尚未初始化的依赖时,容器就会调用createBean进…...
![](https://www.ngui.cc/images/no-images.jpg)
详解Shell 脚本中 “$” 符号的多种用法
通常情况下,在工作中用的最多的有如下几项: $0:Shell 的命令本身 1到9:表示 Shell 的第几个参数 $? :显示最后命令的执行情况 $#:传递到脚本的参数个数 $$:脚本运行的当前进程 ID 号 $*&#…...
![](https://www.ngui.cc/images/no-images.jpg)
Redis如何实现Session存储
在Redis中实现Session存储,主要有两种方式:使用Spring Session和手动存储。 使用Spring Session:Spring Session是Spring框架提供的一个模块,用于简化Session管理,并将Session数据存储到外部数据存储中,如Redis。使用Spring Session,你只需要在Spring Boot项目中添加相应…...
![](https://img-blog.csdnimg.cn/img_convert/347711c9d8b8668388a8399eb29b6ee7.jpeg)
安防视频监控汇聚EasyCVR平台接入Ehome告警,公网快照不显示的原因排查
智能视频监控汇聚平台TSINGSEE青犀视频EasyCVR可拓展性强、视频能力灵活、部署轻快,可支持的主流标准协议有国标GB28181、RTSP/Onvif、RTMP等,以及支持厂家私有协议与SDK接入,包括海康Ehome、海大宇等设备的SDK等,视频监控管理平台…...
![](https://www.ngui.cc/images/no-images.jpg)
【Springboot】@ComponentScan 详解
文章目录 ComponentScanComponentScan ANNOTATION 和 REGEXComponentScan CUSTOMComponentScan ASSIGNABLE_TYPE ComponentScan ComponentScan 是 Spring 框架中的一个注解,用于自动扫描和注册容器中的组件。 使用 ComponentScan 注解可以告诉 Spring 在指定的包或…...
![](https://www.ngui.cc/images/no-images.jpg)
flask-----信号
安装: flask中的信号使用的是一个第三方插件,叫做blinker。通过pip list看一下,如果没有安装,通过以下命令即可安装blinker: pip install blinker flask其中有内置的信号 template_rendered _signals.signal(temp…...
![](https://img-blog.csdnimg.cn/d7e6a03a3e1d4535a0e77b8808293983.png)
10_Vue3 其它的组合式API(Composition API)
Vue3 中的其它组合式API 1.shallowReactive 与 shallowRef 2. readonly 与 shallowReadonly 3.toRaw 与 markRaw 4.customRef 5.provide 与 inject 6.响应式数据的判断...
![](https://img-blog.csdnimg.cn/cf8b9d506e51427a942c3b21e90d2f76.png)
COCOS项目运行的时候图片模糊的原因
1、首先。用X坐标来分析,如果size*Anchor Position有小数,如上图57*0.5667695.5。这样就会导致x模糊。如果y同样计算结果包含小数,那么y也会模糊。xy同时模糊的情况是最模糊的。 2、如果当前node没有问题,那么就要检查上级node是…...
![](https://img-blog.csdnimg.cn/1e4215fbd6984f6bbcacb7aed8cb1759.png)
Python中搭建IP代理池的妙招
在Python的爬虫世界里,你是否也想搭建一个功能强大的IP代理池,让你的爬虫无忧无虑地畅游各大网站?今天,我就来教你使用Scrapy框架搭建IP代理池,让你的爬虫更加智能、高效!跟着我一步一步来,轻松…...
![](https://www.ngui.cc/images/no-images.jpg)
学习pytorch 2
学习pytorch 2 2. dataset实战代码数据集 2. dataset实战 B站小土堆视频 代码 from torch.utils.data import Dataset from PIL import Image #import cv2 import osclass MyData(Dataset):def __init__(self, root_dir, label_dir):self.root_dir root_dirself.label_dir …...
![](https://www.ngui.cc/images/no-images.jpg)
elementui动态表单实现计算属性携带参数,并将计算出的值四舍五入保留两位小数
提示:文章写完后,目录可以自动生成,如何生成可参考右边的帮助文档 文章目录 前言方法1方法2结论 前言 写项目的时候,遇到需要在动态表单中,将同一级输入框输入的内容计算出来,并动态显示,发现c…...
![](https://www.ngui.cc/images/no-images.jpg)
嵌入式面试5 -makefile shell
2、 如果有一个简单的helloworld项目目录如下: tree helloworld helloworld |– file2.h |– file1.cpp |– file2.cpp 请编写一个Makefile文件。 答: TARGET helloworld CXX g COMPILE : $(COMPILE) file1.cpp COMPILE : $(COMPILE) file2.cpp OBJE…...
![](https://www.ngui.cc/images/no-images.jpg)
获40余家主机厂青睐,这家OTA「吸金王」完成超亿元B2轮融资!
继今年4月获得上汽集团旗下尚颀资本及其合作方山高投控的投资后,近日上海艾拉比智能科技有限公司(以下简称“艾拉比”)正式完成总额过亿元的B2轮融资,新的投资方为聚卓资本、老股东国科新能继续增持,势能资本持续担任独…...
![](https://img-blog.csdnimg.cn/img_convert/612c670bd59626604d013ba9979bfef3.png)
CGI, FastCGI, WSGI, uWSGI, uwsgi分别是什么?
CGI 1、通用网关接口(Common Gateway Interface/CGI),CGI描述了服务器(nginx,apache)和请求处理程序(django,flask,springboot web框架)之间传输数据的一种标准. 2.所有bs架构软件都是遵循CGI协议的 3.一…...
![](https://img-blog.csdnimg.cn/00ddc5bdfa14495ab9c20a27c55b16d0.png)
Android T 窗口层级相关的类(更新中)
窗口在App端是以PhoneWindow的形式存在,承载了一个Activity的View层级结构。这里我们探讨一下WMS端窗口的形式。 可以通过adb shell dumpsys activity containers 来看窗口显示的层级 窗口容器类 —— WindowContainer类 /*** Defines common functionality for c…...
![](https://img-blog.csdnimg.cn/53eb78e1d88148959258a4b30d6d7e1d.png)
【云原生】深入掌握k8s中Pod和生命周期
个人主页:征服bug-CSDN博客 kubernetes专栏:kubernetes_征服bug的博客-CSDN博客 目录 1 什么是 Pod 2 Pod 基本操作 3 Pod 运行多个容器 4 Pod 的 Labels(标签) 5 Pod 的生命周期 1 什么是 Pod 摘取官网: Pod | Kubernetes 1.1 简介 Pod 是可以在 …...
![](https://www.ngui.cc/images/no-images.jpg)
openKylin+KingbaseES+Nginx安装
openKylin开放麒麟开启ssh 一、查看ssh服务是否开启。 终端输入命令:sudo ps -e |grep ssh ,只显示如下内容则证明未安装ssh服务。 2127 ? 00:00:00 ssh-agent若显示如下内容则证明ssh服务已开启。 1657 ? 00:00:00 ssh-agent 2349 ?…...
![](https://img-blog.csdnimg.cn/img_convert/14c2019e043951565c6a5c7517a7b864.png)
中国建设银行招标网站/企业营销策划合同
前几天在读者群里,大家针对看书好、还是看视频好、还是自学好,展开了激烈的讨论,场面一度失控。作为群主的我,为了缓和气氛,选择了和稀泥,我说都好,并且拿我自己举了例子。说着说着我发现&#…...
![](/images/no-images.jpg)
网站建设首页图片插入/网站推广在哪好
arr.reduce(function(prev,cur,index,arr){ ... }, init);其中, arr 表示原数组; prev 表示上一次调用回调时的返回值,或者初始值 init; cur 表示当前正在处理的数组元素; index 表示当前正在处理的数组元素的索引,若提…...
![](https://images0.cnblogs.com/blog/318872/201312/23182305-7ae60ec9b09e4b0eab68b04204fd01db.jpg)
centos amh wordpress/网络推广app是干什么的
第4章 OpenGL Android通过使用开放图形库(OpenGL)对高性能的2D和3D图形处理提供支持,尤其是,OpenGL ES API。OpenGL是一个跨平台图形处理的API,并且定义了标准的软件接口用来调用处理3D图形的硬件。OpenGL ES是专门为嵌…...
![](https://images0.cnblogs.com/blog/331622/201305/19122340-83a7d761f263483e84cfd8d8b0b360e1.gif)
潍坊专业网站制作公司营销/企业网站推广模式
转载于:https://www.cnblogs.com/zhouwenwu/archive/2013/05/19/3086688.html...
柳传志 潘石屹做水果网站/如何弄一个自己的网站
题目 T(T<2e5)组样例,每次给出一个n(n<2e5)和一个s(s<2e14), n个人需要被发钱,第i个人被发的要求满足在[li,ri]之间(1<li<ri<1e9) 总共有s元钱,且保证所有人发下限的钱数时够发,即 求最大的x&am…...
![](/images/no-images.jpg)
哪个小说网站版权做的好/官网建设
因为Bzoj是权限题,所以可以去清橙做一下 Sol 突然考了一道这样的题,考场上强行\(yy\)出来了win下评测Long double爆零TAT 首先肯定是破环为链变成序列问题辣 那么就要求第一个的颜色和最后的颜色不同 怎么统计,枚举前面有多长和右面有多长长度…...