Rust 学习笔记:泛型

rust笔记12:rust的泛型 Rust 的泛型实现是其类型系统的核心特性之一,它允许编写灵活且可重用的代码,同时保持类型安全和性能。以下从 泛型数据类型、泛型类型参数、trait bound 和 生命周期泛型 四个方面详细介绍 Rust 的泛型实现,并解释编译器如何通过 静态分发 处理泛型。 阅读详情

Rust 学习笔记:泛型

泛型是 Rust 用于消除重复的工具之一。

我们使用泛型为函数签名或结构体等项创建定义,然后将其用于许多不同的具体数据类型。让我们首先看一下如何使用泛型定义函数、结构体、枚举和方法。然后我们将讨论泛型如何影响代码性能。

在函数定义中使用泛型

在定义使用泛型的函数时,我们将泛型放在函数的签名中,通常在签名中指定参数和返回值的数据类型。

fn largest_i32(list: &[i32]) -> &i32 {
    let mut largest = &list[0];

    for item in list {
        if item > largest {
            largest = item;
        }
    }

    largest
}

fn largest_char(list: &[char]) -> &char {
    let mut largest = &list[0];

    for item in list {
        if item > largest {
            largest = item;
        }
    }

    largest
}

fn main() {
    let number_list = vec![34, 50, 25, 100, 65];

    let result = largest_i32(&number_list);
    println!("The largest number is {result}");

    let char_list = vec!['y', 'm', 'a', 'q'];

    let result = largest_char(&char_list);
    println!("The largest char is {result}");
}

函数 largest_i32 和 largest_char 都在切片中查找最大值。

我们将这些组合成一个使用泛型的函数。为了定义泛型的最大函数,我们将类型名称声明放在函数名和形参列表之间的尖括号 <> 内,如下所示:

fn largest<T>(list: &[T]) -> &T {

我们将这个定义理解为:函数最大是某种类型 T 上的泛型函数。这个函数有一个名为 list 的形参,它是 T 类型值的切片。

下面给出完整的泛型函数 largest:

fn largest<T>(list: &[T]) -> &T {
    let mut largest = &list[0];

    for item in list {
        if item > largest {
            largest = item;
        }
    }

    largest
}

fn main() {
    let number_list = vec![34, 50, 25, 100, 65];

    let result = largest(&number_list);
    println!("The largest number is {result}");

    let char_list = vec!['y', 'm', 'a', 'q'];

    let result = largest(&char_list);
    println!("The largest char is {result}");
}

注意,这段代码还不能通过编译。

在这里插入图片描述

帮助文本提到了 std::cmp::PartialOrd,这是一个 trait。这个错误表明,对于 T 可能是的所有类型,largest 函数体并不适用。因为要比较主体中类型 T 的值,所以只能使用值可以排序的类型。为了启用比较,标准库有 std::cmp::PartialOrd trait。要修复上面的示例代码,我们需要遵循帮助文本的建议,并将 T 的有效类型限制为仅实现 PartialOrd 的类型。然后这个例子就可以编译了,因为标准库在 i32 和 char 上都实现了 PartialOrd trait。

在结构体定义中使用泛型

还可以使用 <> 语法定义在一个或多个字段中使用泛型类型参数的结构。

struct Point<T> {
    x: T,
    y: T,
}

fn main() {
    let integer = Point { x: 5, y: 10 };
    let float = Point { x: 1.0, y: 4.0 };
}

在结构定义中使用泛型的语法类似于在函数定义中使用的语法。首先在结构体名称后面的尖括号内声明类型参数的名称,然后在结构定义中使用泛型类型。

注意,因为我们只使用了一个泛型来定义 Point<T>,所以这个定义表明 Point<T> 结构体在某种类型 T 上是泛型的,并且字段 x 和 y 都是相同的类型,无论该类型是什么。如果创建具有不同类型值的 Point<T> 实例,比如下面这段代码,代码将出现类型不匹配错误,无法编译。

struct Point<T> {
    x: T,
    y: T,
}

fn main() {
	// can not compiled
    let wont_work = Point { x: 5, y: 4.0 };
}

要定义一个 Point 结构体,其中 x 和 y 都是泛型,但可以具有不同的类型,可以使用多个泛型类型参数。

struct Point<T, U> {
    x: T,
    y: U,
}

fn main() {
    let both_integer = Point { x: 5, y: 10 };
    let both_float = Point { x: 1.0, y: 4.0 };
    let integer_and_float = Point { x: 5, y: 4.0 };
}

我们将 Point 的定义更改为类型 T 和 U 的泛型,其中 x 属于类型 T, y 属于类型 U。

使用过多泛型类型会使代码难以阅读。

在枚举定义中使用泛型

与处理结构体时一样,可以定义枚举以在其变体中保存泛型数据类型。

让我们再看一下标准库提供的枚举 Option<T>:

enum Option<T> {
    Some(T),
    None,
}

因为 Option<T> 是泛型的,所以无论可选值的类型是什么,我们都可以使用这个抽象。

枚举也可以使用多个泛型类型。枚举 Result 的定义就是一个例子:

enum Result<T, E> {
    Ok(T),
    Err(E),
}

Result 枚举在 T 和 E 两种类型上是泛型的,并且有两种变体:Ok 保存类型为 T 的值,Err 保存类型为 E 的值。

在方法定义中使用泛型

我们可以在结构体和枚举上实现方法,也可以在它们的定义中使用泛型类型。

struct Point<T> {
    x: T,
    y: T,
}

impl<T> Point<T> {
    fn x(&self) -> &T {
        &self.x
    }
}

fn main() {
    let p = Point { x: 5, y: 10 };

    println!("p.x = {}", p.x());
}

这里,我们在 Point<T> 上定义了一个名为 x 的方法,它返回对字段 x 中的数据的引用。

注意,我们必须在 impl 之后声明 T,这样我们就可以使用 T 来指定我们在类型 Point<T> 上实现方法。通过在 impl 之后将T声明为泛型类型,Rust 可以识别 Point 中尖括号中的类型是泛型类型,而不是具体类型。

如果在声明泛型类型的 impl 中编写方法,则该方法将在该类型的任何实例上定义,而不管用什么具体类型替代泛型类型。

在泛型类型上定义方法时,还可以指定对该类型的约束。例如,我们可以只在 Point<f32> 实例上实现方法,而不是在任何泛型类型的 Point<T> 实例上实现方法。

impl Point<f32> {
    fn distance_from_origin(&self) -> f32 {
        (self.x.powi(2) + self.y.powi(2)).sqrt()
    }
}

这段代码意味着类型 Point<f32> 将有一个 distance_from_origin 方法。Point<T> 的其他实例,如果 T 不是 f32 类型,则不会定义此方法。

结构定义中的泛型类型参数并不总是与您在同一结构的方法签名中使用的参数相同。

struct Point<X1, Y1> {
    x: X1,
    y: Y1,
}

impl<X1, Y1> Point<X1, Y1> {
    fn mixup<X2, Y2>(self, other: Point<X2, Y2>) -> Point<X1, Y2> {
        Point {
            x: self.x,
            y: other.y,
        }
    }
}

fn main() {
    let p1 = Point { x: 5, y: 10.4 };
    let p2 = Point { x: "Hello", y: 'c' };

    let p3 = p1.mixup(p2);

    println!("p3.x = {}, p3.y = {}", p3.x, p3.y);
}

将 X1 和 Y1 用于 Point 结构,将 X2、Y2 用于 mixup 方法签名,以使示例更清晰。

泛型参数 X1 和 Y1 在 impl 之后声明,因为它们与结构定义一致。泛型参数 X2 和 Y2 在 fn mixup 之后声明,因为它们只与方法相关。

使用泛型的代码性能

使用泛型类型不会使程序的运行速度比使用具体类型慢。

Rust 通过在编译时使用泛型执行代码的单态来实现这一点。单态化是通过填充编译时使用的具体类型将泛型代码转换为特定代码的过程。在这个过程中,编译器执行与创建泛型函数相反的步骤:编译器查看调用泛型代码的所有位置,并为调用泛型代码的具体类型生成代码。

让我们通过使用标准库的泛型枚举 Option<T> 来看看这是如何工作的:

let integer = Some(5);
let float = Some(5.0);

当 Rust 编译这些代码时,执行单态化。在此过程中,编译器读取 Option<T> 实例中使用的值,并识别两种 Option<T>:一种是 i32,另一种是 f64。因此,它将 Option<T> 的泛型定义扩展为两个专用于 i32 和 f64 的定义,从而用特定的定义替换泛型定义。

代码的单态版本看起来类似于下面(编译器使用的名称与我们在这里使用的名称不同):

enum Option_i32 {
    Some(i32),
    None,
}

enum Option_f64 {
    Some(f64),
    None,
}

fn main() {
    let integer = Option_i32::Some(5);
    let float = Option_f64::Some(5.0);
}

泛型选项 <T> 被编译器创建的特定定义取代。因为 Rust 将泛型代码编译成在每个实例中指定类型的代码,所以我们不用为使用泛型支付运行时成本。

单态化的过程使得 Rust 的泛型在运行时非常高效。

Rust学习教程24 - 泛型和const泛型 泛型Generics Go语言在2022年,就要正式引入泛型,被视为在1.0版本后,语言特性发展迈出的一大步,那么为什么泛型这么重要?到底什么是泛型?以及Rust的泛型又有几种? 本章将一一为你讲解。 我们在编程中,经常有这样的需求:用同一功能的函数处理不同类型的数据,例如两. 阅读详情

相关推荐

【Rust指南】泛型与特性

在上篇Rust 文章中涉及到了泛型的知识,那么今天就来详细介绍一下Rust 中的泛型与特性。泛型是一个编程语言不可或缺的机制,例如在C++ 语言中用模板来实现泛型。泛型机制是编程语言用于表达类型抽象的机制,一般用于功能确定、数据类型待定的类,如链表、映射表等。} i += 1;println!} //运行结果:max = 8这是一个简单的取最大值程序,可以用于处理i32数字类型的数据,但无法用于f64类型的数据。通过使用泛型} i += 1;实际上,并不是所有的数据类型都可以比大小。

叶落秋白的博客 2622

Rust学习:10.1_泛型和特征之泛型

为了学习Rust,阅读了github上的Rust By Practice电子书,本文章只是用来记录自己的学习过程,感兴趣的可以阅读[原书](https://zh.practice.rs/why-exercise.html),希望大家都能掌握Rust!

cacique111的博客 836

【Rust泛型】Rust泛型使用详解与应用场景

泛型(Generics)是一种编程语言特性,允许在编写代码时使用类型参数,这些参数可以在使用时被具体类型替换。Rust的泛型系统既强大又安全,能够在编译时检查所有类型约束。 泛型是一种参数化多态的形式,它允许你在定义函数、结构体、枚举和方法时使用类型参数,而不是具体的类型。

景天科技苑 4万+

Rust的泛型

文章目录Rust的泛型在函数中使用泛型特性与特性绑定在结构体中使用泛型 Rust的泛型 在函数中使用泛型 项目经理总是善变的,有一天项目经理告诉我,替客户计算一个圆形的面积。客户要求很简单,半径只会是u8类型。好,我写了如下代码: fn area_u8(r: u8) -> u8 { r * r } fn main() { println!("{}", area_u8(3)); } 可第二天项目经理又来了,说客户说的不对,半径某种情况下还会是u16。唉,客户就是上帝,项目经理也没有办

鸿鹄之志 4209

OBD诊断协议:OBDⅡ (SAE J1979) 和 OBDonUDS (SAE J1979-2) 和ZEV OBD技术架构的详细对比

摘要:文章对比了2025年最新OBD技术标准(SAEJ1979系列)的三大架构:传统OBD-II(已淘汰)、OBDonUDS(燃油/混动车)和ZEVOBD(新能源车)。核心发现:1)OBDonUDS与ZEVOBD共享UDS协议栈和DoIP通信标准,仅应用层数据(DID/DTC)不同;2)物理层统一为CAN+以太网,支持远程诊断和OTA;3)诊断工具需同时兼容J1979-2/3数据库。技术演进呈现"协议统一化、数据专用化"趋势,2027年后所有新车将强制采用新标准。

m0_56482679的博客 2383

华为昇腾Atlas 200I DK A2实战:从开箱到运行首个AI应用

本文详细介绍了华为昇腾Atlas 200I DK A2开发板从开箱到运行首个AI应用的全过程。包括硬件准备、系统烧录、开发板连接方案、AI应用运行及性能优化技巧,帮助开发者快速上手部署AI项目,提升开发效率。

weixin_27038245的博客 590

rust 泛型、多态

无论是c++ STL还是rust std,里面所有的数据结构都是泛型的,c++和rust的结构体也类似,可以是泛型的也可以是非泛型的。所以,泛型函数内部对T的约束条件,都通过指明T所包含的trait的方式进行说明。Ord特征中并没有eq函数,但是Ord特征间接继承了PartialOrd,所以有Ord特征的类型肯定是可以使用==的。对于绝大部分trait,模板类型都是默认不包含该trait的,需要特征约束才能说明该类型具有该trait。作为泛型参数的常数类型,可以是所有整数类型、bool类型、char类型。

nameofcsdn的博客 2347

SPSS回归分析(线性:一元(简单)和多重;非线性logistic)

SPSS线性回归分析回归分析一、线性模型(针对连续因变量,线性关系)(一)简单线性回归(一元线性回归)1、绘制散点图2、建立简单(一元)线性回归模型3、建立模型后,检查预测结果(二)多重回归分析1、绘制矩阵分布散点图(论文专用你懂的)2、建立多重回归模型point 1:自变量加入方法:逐步(步进)法3、建立模型后,检查预测结果二、非线性模型(将非线性问题转换为线性问题)1、logistic分析的回归模型1.1 建立回归模型1.2 利用回归模型进行预测 根据之前的学习,通过评价实验得到了主观数据, 通过 描述

weixin_44394352的博客 5万+

rust泛型

RHS=Self,Self就是泛型参数默认值,它表示实现Add的类型,在这里就是Point类型。如果实现Add时不指定RHS的具体类型,RHS的类型将是Self类型。方法mixup将一个Point点的x与Point点的y融合成一个类型为Point的新点。单态化是一个通过填充编译时使用的具体类型,将通用代码转换为特定代码的过程。在编译期,会根据指定的具体类型,生成一套特化代码,这叫单态化。展开为两个针对i32和f64的定义,接着将泛型定义替换为这两个具体的定义。

void的博客 1557

告别密码!用VScode+SSH一键连接树莓派,再也不用每次输密码了

本文详细介绍了如何通过VScode和SSH密钥实现树莓派的免密连接,告别繁琐的密码输入。从开发环境准备、SSH密钥生成与配置,到VScode远程连接优化和常见问题排查,提供了一套完整的解决方案,帮助开发者提升工作效率。

weixin_28831341的博客 172

模板匹配加速之金字塔分层搜索

图像金字塔是一种多分辨率图像表示方法,它通过一系列逐渐缩小或放大的图像来表示原始图像的不同尺度。高斯金字塔(Gaussian Pyramid):通过不断下采样(降采样)生成更小的图像。拉普拉斯金字塔(Laplacian Pyramid):通过高斯金字塔和差分操作生成一组残差图像。在模板匹配中,我们主要使用高斯金字塔来实现多尺度匹配。金字塔灰度模板匹配通过多尺度搜索策略,在保持较高准确率的同时显著提升匹配速度,尤其适用于:高分辨率图像处理实时检测系统移动端设备等资源受限场景。

weixin_44969144的博客 1732

Rust 学习笔记:关于泛型的练习题

Rust 学习笔记:关于泛型的练习题

ProgramNovice的博客 489

从零到一:Cadence AC仿真中的运放性能参数深度解析与实战避坑指南

本文深度解析Cadence AC仿真中运放性能参数的精确测量方法,包括开环增益、带宽和相位裕度等关键指标。通过实战案例分享常见设置错误的避坑技巧,帮助工程师提升设计成功率和仿真效率,特别针对全差分运放和工艺角分析提供专业指导。

www00的博客 293

Rust 学习笔记4

Rust学习笔记4

It_Ray的博客 1389

SillyTavern与Claude Code API集成:从零搭建AI聊天酒馆的完整指南

本文提供了一份从零搭建SillyTavern AI聊天前端的完整指南,重点讲解如何将其与Claude Code API集成。内容涵盖Node.js环境准备、SillyTavern部署、OpenAI兼容格式的API配置、模型选择与参数调校,以及角色扮演、扩展功能等高级玩法,帮助用户打造本地化、可定制的专属AI聊天体验。

assembly8low的博客 2606

主成分分析(PCA)简洁高效MATLAB实现详解

本文介绍了一个简洁高效的PCA算法实现。该实现通过SVD分解计算主成分,避免了显式协方差矩阵计算,支持两种降维方式:固定维度或按能量比例自动选择。核心步骤包括数据中心化、SVD分解和维度选择,代码量少但功能完整,适用于数据预处理、降维和特征提取等任务。实现中考虑了稀疏矩阵转换、默认参数处理等细节,可直接应用于MATLAB环境。

m0_62153576的博客 63

Rust泛型编程实践:编写灵活可复用的代码

最近在学习 Rust 的过程中,泛型编程给我留下了深刻的印象。作为一个从后端转 Rust 的萌新,我之前在 Java 和 Python 中也使用过泛型,但是 Rust 的泛型系统更加强大和灵活。它不仅可以用于函数和结构体,还可以用于 trait 和枚举,让代码更加简洁、可复用和类型安全。今天就来分享一下我学习 Rust 泛型编程的心得,希望能帮到和我一样的萌新们。泛型是一种编程范式,允许我们编写可以处理多种类型的代码,而不需要为每种类型单独编写实现。在 Rust 中,泛型使用尖括号<T>来表示,其中T。

no1coder的博客 1万+

深度学习工具包 DeepLearningToolbox

深度学习工具包Deprecation notice.-----This toolbox is outdated and no longer maintained.There are much better tools available for deep learning than this toolbox, e.g. [Theano](http://deeplearning.net/software/theano/), [torch](http://torch.ch/) or [tensorflow](http://www.tensorflow.org/)I would suggest you use one of the tools mentioned above rather than use this toolbox.Best, Rasmus.DeepLearnToolbox================A Matlab toolbox for Deep Learning.Deep Learning is a new subfield of machine learning that focuses on learning deep hierarchical models of data.It is inspired by the human brain's apparent deep (layered, hierarchical) architecture.A good overview of the theory of Deep Learning theory is[Learning Deep Architectures for AI](http://www.iro.umontreal.ca/~bengioy/papers/ftml_book.pdf)For a more informal introduction, see the following videos by Geoffrey Hinton and Andrew Ng.* [The Next Generation of Neural Networks](http://www.youtube.com/watch?v=AyzOUbkUf3M) (Hinton, 2007)* [Recent Developments in Deep Learning](http://www.youtube.com/watch?v=VdIURAu1-aU) (Hinton, 2010)* [Unsupervised Feature Learning and Deep Learning](http://www.youtube.com/watch?v=ZmNOAtZIgIk) (Ng, 2011)If you use this toolbox in your research please cite [Prediction as a candidate for learning deep hierarchical models of data](http://www2.imm.dtu.dk/pubdb/views/publication_details.php?id=6284)```@MASTERSTHESIS\{IMM2012-06284, author = "R. B. Palm", title = "Prediction as a candidate for learning deep hierarchical models of data", year = "2012",}```Contact: rasmusbergpalm at gmail dot comDirectories included in the toolbox-----------------------------------`NN/` - A library for Feedforward Backpropagation Neural Networks`CNN/` - A library for Convolutional Neural Networks`DBN/` - A library for Deep Belief Networks`SAE/` - A library for Stacked Auto-Encoders`CAE/` - A library for Convolutional Auto-Encoders`util/` - Utility functions used by the libraries`data/` - Data used by the examples`tests/` - unit tests to verify toolbox is workingFor references on each library check REFS.mdSetup-----1. Download.2. addpath(genpath('DeepLearnToolbox'));Example: Deep Belief Network---------------------```matlabfunction test_example_DBNload mnist_uint8;train_x = double(train_x) / 255;test_x = double(test_x) / 255;train_y = double(train_y);test_y = double(test_y);%% ex1 train a 100 hidden unit RBM and visualize its weightsrand('state',0)dbn.sizes = [100];opts.numepochs = 1;opts.batchsize = 100;opts.momentum = 0;opts.alpha = 1;dbn = dbnsetup(dbn, train_x, opts);dbn = dbntrain(dbn, train_x, opts);figure; visualize(dbn.rbm{1}.W'); % Visualize the RBM weights%% ex2 train a 100-100 hidden unit DBN and use its weights to initialize a NNrand('state',0)%train dbndbn.sizes = [100 100];opts.numepochs = 1;opts.batchsize = 100;opts.momentum = 0;opts.alpha = 1;dbn = dbnsetup(dbn, train_x, opts);dbn = dbntrain(dbn, train_x, opts);%unfold dbn to nnnn = dbnunfoldtonn(dbn, 10);nn.activation_function = 'sigm';%train nnopts.numepochs = 1;opts.batchsize = 100;nn = nntrain(nn, train_x, train_y, opts);[er, bad] = nntest(nn, test_x, test_y);assert(er < 0.10, 'Too big error');```Example: Stacked Auto-Encoders---------------------```matlabfunction test_example_SAEload mnist_uint8;train_x = double(train_x)/255;test_x = double(test_x)/255;train_y = double(train_y);test_y = double(test_y);%% ex1 train a 100 hidden unit SDAE and use it to initialize a FFNN% Setup and train a stacked denoising autoencoder (SDAE)rand('state',0)sae = saesetup([784 100]);sae.ae{1}.activation_function = 'sigm';sae.ae{1}.learningRate = 1;sae.ae{1}.inputZeroMaskedFraction = 0.5;opts.numepochs = 1;opts.batchsize = 100;sae = saetrain(sae, train_x, opts);visualize(sae.ae{1}.W{1}(:,2:end)')% Use the SDAE to initialize a FFNNnn = nnsetup([784 100 10]);nn.activation_function = 'sigm';nn.learningRate = 1;nn.W{1} = sae.ae{1}.W{1};% Train the FFNNopts.numepochs = 1;opts.batchsize = 100;nn = nntrain(nn, train_x, train_y, opts);[er, bad] = nntest(nn, test_x, test_y);assert(er < 0.16, 'Too big error');```Example: Convolutional Neural Nets---------------------```matlabfunction test_example_CNNload mnist_uint8;train_x = double(reshape(train_x',28,28,60000))/255;test_x = double(reshape(test_x',28,28,10000))/255;train_y = double(train_y');test_y = double(test_y');%% ex1 Train a 6c-2s-12c-2s Convolutional neural network %will run 1 epoch in about 200 second and get around 11% error. %With 100 epochs you'll get around 1.2% errorrand('state',0)cnn.layers = { struct('type', 'i') %input layer struct('type', 'c', 'outputmaps', 6, 'kernelsize', 5) %convolution layer struct('type', 's', 'scale', 2) %sub sampling layer struct('type', 'c', 'outputmaps', 12, 'kernelsize', 5) %convolution layer struct('type', 's', 'scale', 2) %subsampling layer};cnn = cnnsetup(cnn, train_x, train_y);opts.alpha = 1;opts.batchsize = 50;opts.numepochs = 1;cnn = cnntrain(cnn, train_x, train_y, opts);[er, bad] = cnntest(cnn, test_x, test_y);%plot mean squared errorfigure; plot(cnn.rL);assert(er<0.12, 'Too big error');```Example: Neural Networks---------------------```matlabfunction test_example_NNload mnist_uint8;train_x = double(train_x) / 255;test_x = double(test_x) / 255;train_y = double(train_y);test_y = double(test_y);% normalize[train_x, mu, sigma] = zscore(train_x);test_x = normalize(test_x, mu, sigma);%% ex1 vanilla neural netrand('state',0)nn = nnsetup([784 100 10]);opts.numepochs = 1; % Number of full sweeps through dataopts.batchsize = 100; % Take a mean gradient step over this many samples[nn, L] = nntrain(nn, train_x, train_y, opts);[er, bad] = nntest(nn, test_x, test_y);assert(er < 0.08, 'Too big error');%% ex2 neural net with L2 weight decayrand('state',0)nn = nnsetup([784 100 10]);nn.weightPenaltyL2 = 1e-4; % L2 weight decayopts.numepochs = 1; % Number of full sweeps through dataopts.batchsize = 100; % Take a mean gradient step over this many samplesnn = nntrain(nn, train_x, train_y, opts);[er, bad] = nntest(nn, test_x, test_y);assert(er < 0.1, 'Too big error');%% ex3 neural net with dropoutrand('state',0)nn = nnsetup([784 100 10]);nn.dropoutFraction = 0.5; % Dropout fraction opts.numepochs = 1; % Number of full sweeps through dataopts.batchsize = 100; % Take a mean gradient step over this many samplesnn = nntrain(nn, train_x, train_y, opts);[er, bad] = nntest(nn, test_x, test_y);assert(er < 0.1, 'Too big error');%% ex4 neural net with sigmoid activation functionrand('state',0)nn = nnsetup([784 100 10]);nn.activation_function = 'sigm'; % Sigmoid activation functionnn.learningRate = 1; % Sigm require a lower learning rateopts.numepochs = 1; % Number of full sweeps through dataopts.batchsize = 100; % Take a mean gradient step over this many samplesnn = nntrain(nn, train_x, train_y, opts);[er, bad] = nntest(nn, test_x, test_y);assert(er < 0.1, 'Too big error');%% ex5 plotting functionalityrand('state',0)nn = nnsetup([784 20 10]);opts.numepochs = 5; % Number of full sweeps through datann.output = 'softmax'; % use softmax outputopts.batchsize = 1000; % Take a mean gradient step over this many samplesopts.plot = 1; % enable plottingnn = nntrain(nn, train_x, train_y, opts);[er, bad] = nntest(nn, test_x, test_y);assert(er < 0.1, 'Too big error');%% ex6 neural net with sigmoid activation and plotting of validation and training error% split training data into training and validation datavx = train_x(1:10000,:);tx = train_x(10001:end,:);vy = train_y(1:10000,:);ty = train_y(10001:end,:);rand('state',0)nn = nnsetup([784 20 10]); nn.output = 'softmax'; % use softmax outputopts.numepochs = 5; % Number of full sweeps through dataopts.batchsize = 1000; % Take a mean gradient step over this many samplesopts.plot = 1; % enable plottingnn = nntrain(nn, tx, ty, opts, vx, vy); % nntrain takes validation set as last two arguments (optionally)[er, bad] = nntest(nn, test_x, test_y);assert(er < 0.1, 'Too big error');```[![Bitdeli Badge](https://d2weczhvl823v0.cloudfront.net/rasmusbergpalm/deeplearntoolbox/trend.png)](https://bitdeli.com/free "Bitdeli Badge")

Rust泛型参数的使用

Rust的泛型系统是类型理论与系统编程实践的精妙结合。通过单态化实现零成本抽象,通过特征约束保证类型安全,通过生命周期泛型消除内存错误,通过关联类型简化复杂签名。掌握泛型参数的使用,意味着能够设计出既抽象又高效的API,在保持代码复用性的同时不牺牲性能。这正是Rust能够在系统编程领域独树一帜的核心原因——它证明了高层抽象与底层性能并非不可兼得。

2401_88292786的博客 2016

汉书HE8,好用的汇编代码编写工具

汉书HE8,好用的汇编代码编写工具早期编写汇编代码所用功能强大

WINCC7.3破解文件

WINCC7.3硬件够破解文件,有需要的下载!WINCC7.3硬件够破解文件,有需要的下载!

【Rust】——提取函数消除重复代码和泛型

🎯提取函数消除重复代码 🎯泛型 🎃函数定义中的泛型 🎃Struct定义中的泛型 🎃Enum定义中的泛型 🎃方法定义中的泛型 🎃泛型代码的功能

shsjssnn的博客 2594

C# WinForm 基于DirectShow.dll编写的程序,可边预览边保存视频,音频和图片

基于微软的DirectShow.dll的二次开发1.自动识别连接的摄像头跟麦克风且可以对其进行选择(默认选中第一个)2.可录制wmv和avi两种格式的视频并且都带有音频,avi可以录制的分辨率和帧数进行选择,wmv默认进行了淸晰度优化如不喜欢可去除代码中有相关提示3.可在预览点开之后进行拍照,也可边录制视频边拍照4.添加了视频和音频的压缩功能(酌情使用)这次二次开发发现C#对DirectShow的相关信息太少,这次做完也不敢藏私共享出来,还望大家指正

Rust trait 与泛型

使用trait关键字定义特型。提供一个名字,并列出特型方法的类型签名即可。上面描述的特型都是独立的:特型是类型可以实现的一组方法。特型也可以用于多种类型必须协同工作的场景中。它们可以描述多个类型之间的关系。特型会为每个迭代器类型与其生成的值的类型建立联系。特型与可以相乘的类型有关。在表达式a * b中,值 a 和 b 可以是相同类型,也可是不同类型。randcrate 中包含随机数生成器的特型(rand::Rng)和可被随机生成的类型的特型。

编程回响 1682

详解Rust泛型用法

Rust是一种系统编程语言,它拥有强大的泛型支持,泛型是Rust中用于实现代码复用和类型安全的重要特性。通过泛型程序员可以编写能够操作不同类型数据的函数、结构体、枚举和方法,同时又能确保类型安全,避免类型错误。在Rust中泛型的使用不仅能够提升代码的复用性,还能使得代码更加灵活,尤其是在实现与数据类型无关的算法时。

yang1fei2的博客 2177

Rust 泛型详解

Rust泛型详解:强大灵活的抽象工具 Rust泛型允许编写类型无关的通用代码,提升复用性和安全性。核心特性包括:泛型函数/结构体/枚举,通过<T>声明类型参数;trait约束使用where子句限制类型行为;性能优化通过编译时单态化实现零开销。const泛型支持基于常量值的特化,适用于数组等场景。高级用法涵盖关联类型和生命周期参数。最佳实践建议合理使用trait约束,避免过度泛型化。文中通过算术运算和Arduino的map函数实现展示了泛型的实际应用,体现了Rust在编译期保障类型安全的同时提供高

本博客分享软硬件一体化开发实战。硬件涵盖 PCB 设计、STM32 等 MCU 底层开发;软件包含 C++、Rust,Qt/QML、PyQt、Slint、TouchGFX、LVGL 各类 GUI 框架。方便软硬件开发者查阅学习。欢迎关注! 1169

30天拿下Rust之泛型

在Rust语言中,泛型是一种强大的工具,它允许我们编写可复用且灵活的代码。通过泛型,我们可以创建适用于多种类型的数据结构和函数,而无需为每种类型都重复编写相同的逻辑。在Rust中,泛型通过指定类型参数来实现,这些类型参数会在编译时被具体类型所替换。

hope_wisdom的技术博客 1913

Rust 泛型与特性

泛型是一个编程语言不可或缺的机制。C++ 语言中用"模板"来实现泛型,而 C 语言中没有泛型的机制,这也导致 C 语言难以构建类型复杂的工程。泛型机制是编程语言用于表达类型抽象的机制,一般用于功能确定、数据类型待定的类,如链表、映射表等。这是一个对整型数字选择排序的方法:fn max(array: &[i32]) -> i32 { let mut max_index = 0; let mut i = 1; while i < array.len() { if arra

m0_65541699的博客 1708

【Rust自学】10.2. 泛型

泛型的主要功能是提高代码的复用能力,适用于处理重复代码的问题,也可以说是实现数据与算法的分离。泛型是具体类型或其它属性的抽象代替。它的意思是你写代码时写的泛型代码并不是最终的代码,而是一种模版,里面有一些“占位符”。

A Rookie in San Domenico School 1508

Rust编程的泛型

C/C++、Rust都是强类型语言,在对数据进行处理时,必须明确数据的数据类型。但是很多时候,比如链表这种数据结构,可以是整型数据的链表,也可以是其他类型,可能会写出重复的代码,只是数据类型不同而已。泛型编程是一种编程风格,其中的算法以尽可能抽象的方式编写,而不依赖于将在其上执行这些算法的数据形式。泛型这个词并不是通用的,在不同的语言实现中,具有不同的命名。

夏天又到了的专栏 1168
上一篇: Rust 学习笔记:关于错误处理的练习题
下一篇: Rust 学习笔记:关于泛型的练习题
UestcXiye
博客等级 码龄8年 9028粉丝 1306原创
评论
成就一亿技术人!
拼手气红包6.0元
还能输入1000个字符
 
 条评论被折叠 查看
添加红包

请填写红包祝福语或标题

个

红包个数最小为10个

元

红包金额最低5元

当前余额3.43元 前往充值 >
需支付:10.00元
成就一亿技术人!
领取后你会自动成为博主和红包主的粉丝 规则
hope_wisdom
发出的红包

打赏作者

UestcXiye

你的鼓励将是我创作的最大动力

¥1 ¥2 ¥4 ¥6 ¥10 ¥20
扫码支付:¥1
获取中
扫码支付

您的余额不足,请更换扫码支付或充值

打赏作者

实付元
使用余额支付
点击重新获取
扫码支付
钱包余额 0

抵扣说明:

1.余额是钱包充值的虚拟货币,按照1:1的比例进行支付金额的抵扣。
2.余额无法直接购买下载,可以购买VIP、付费专栏及课程。

余额充值