【C# LINQ聚合精华】:深入掌握Aggregate函数的5种高阶用法

数组与矩阵实战指南:从概念到应用,解决游戏开发与算法难题 数组和矩阵是计算机科学中基础且核心的数据结构,广泛应用于数据处理、算法设计和游戏开发等领域。数组作为线性存储容器,支持高效的随机访问和顺序遍历,而矩阵则是一种二维结构化数据模型,常用于表示网格、图像和状态表。理解其内存布局和索引计算原理,是进行高效编程的关键。在工程实践中,数组操作常涉及差一错误、越界访问和缓存优化等典型问题。通过掌握前缀和、滑动窗口、双指针等算法思想,可以显著提升数据处理效率。本文聚焦于将抽象问题转化为具体的数组操作,提供从数据结构选型到性能优化的实战套路,帮助开发者避开常见陷阱,在游戏地 阅读详情

第一章:C# LINQ Aggregate函数核心概念解析

LINQ 的 Aggregate 函数是序列聚合操作的核心方法之一,它允许开发者通过自定义的累积逻辑对集合中的元素进行逐个处理,最终返回单一结果。该方法适用于需要将多个值“折叠”为一个值的场景,如求和、拼接字符串、计算加权平均等。

基本用法与执行逻辑

Aggregate 提供多个重载版本,最常用的接受一个 Func 类型的委托,表示如何将前一个累积结果与当前元素结合。
// 示例:使用 Aggregate 计算整数列表的总和
var numbers = new List { 1, 2, 3, 4, 5 };
int sum = numbers.Aggregate((acc, next) => acc + next);
// 执行过程:
// acc = 1, next = 2 → 结果为 3
// acc = 3, next = 3 → 结果为 6
// acc = 6, next = 4 → 结果为 10
// acc = 10, next = 5 → 结果为 15
Console.WriteLine(sum); // 输出: 15

指定种子值的聚合操作

当需要指定初始累积值(种子)时,可使用带种子参数的重载。这在处理空集合或需要偏移计算时非常有用。
// 示例:以 10 为起始值,累加所有数字
int seededSum = numbers.Aggregate(10, (acc, next) => acc + next);
Console.WriteLine(seededSum); // 输出: 25

常见应用场景对比

场景代码示例输出结果
字符串拼接new []{"A","B","C"}.Aggregate((a,n) => a + "-" + n)A-B-C
查找最大值new[]{3,9,1}.Aggregate((a,n) => a > n ? a : n)9
  • Aggregate 操作从序列第二个元素开始迭代
  • 第一个元素作为初始累积值(无种子时)
  • 若序列为空且未提供种子,将抛出异常

第二章:基础到进阶的Aggregate典型应用场景

2.1 理解Aggregate方法的工作机制与执行流程

Aggregate方法是LINQ中用于序列累积计算的核心操作,它通过迭代将上一阶段的结果传递至下一阶段,最终返回单一值。

基本执行逻辑

该方法从序列的第二个元素开始,将第一个元素作为种子值,依次应用指定的累积函数。

int[] numbers = { 1, 2, 3, 4 };
int result = numbers.Aggregate((acc, next) => acc + next);
// acc: 累积值,next: 当前元素
// 执行过程:((1 + 2) + 3) + 4 = 10

上述代码中,acc为累积器,初始为第一个元素1,逐次与后续元素相加。

带种子值的重载形式
  • 允许自定义初始值,避免依赖序列首项
  • 适用于累加、拼接字符串等场景
string[] words = { "a", "b", "c" };
string result = words.Aggregate("start", (acc, next) => acc + "-" + next);
// 输出:start-a-b-c

2.2 使用Aggregate实现数值累加与乘积计算

在数据处理中,`Aggregate` 是一种强大的函数式操作,可用于对序列执行累积计算。它从初始值开始,逐个将元素合并到累加结果中。
基础累加操作
int[] numbers = { 1, 2, 3, 4 };
int sum = numbers.Aggregate((acc, n) => acc + n);
// 结果:10
上述代码中,`acc` 是累积器,初始为第一个元素 `1`,随后依次与后续元素相加。
带初始值的乘积计算
int product = numbers.Aggregate(1, (acc, n) => acc * n);
// 结果:24
此处指定初始值为 `1`,确保从乘法单位元开始,避免空序列异常。
应用场景对比
场景初始值操作符
累加求和0 或省略+
连乘积1*

2.3 基于字符串集合的拼接与格式化聚合操作

在处理批量字符串数据时,高效的拼接与格式化是提升性能的关键。传统逐个连接方式(如 `+` 操作)在大规模数据下效率低下,推荐使用内置聚合方法。
使用 join 进行高效拼接

# 将字符串列表用指定分隔符连接
parts = ["Hello", "World", "Python"]
result = ", ".join(parts)
# 输出: Hello, World, Python
str.join(iterable) 方法一次性分配内存,避免多次复制,显著提升性能。参数必须为可迭代的字符串序列。
格式化聚合:模板与映射结合
  • 利用 format() 支持位置与关键字替换;
  • 结合字典实现动态内容注入;
  • 适用于日志生成、SQL 拼接等场景。
例如:

template = "用户 {name} 的登录次数为 {count}"
data = [{"name": "Alice", "count": 5}, {"name": "Bob", "count": 3}]
messages = [template.format(**item) for item in data]
该方式实现结构化文本批量生成,逻辑清晰且易于维护。

2.4 利用种子值控制初始状态的聚合运算

在流处理系统中,聚合运算常用于对数据流进行累加、计数或统计。通过引入种子值(seed),可显式定义聚合的初始状态,从而增强计算的可控性与一致性。
种子值的作用机制
种子值作为聚合函数的初始输入,确保在无前置数据时仍能返回有意义结果。例如,在累计销售额场景中,初始值设为0可避免空状态异常。
stream.Reduce(func(acc, elem int) int {
    return acc + elem
}, 0) // 种子值为0
上述代码中,Reduce 函数以0为初始值开始累加。参数 acc 表示累积值,elem 为当前元素,每次迭代将当前值合并至累积状态。
适用场景对比
场景种子值说明
计数0从零开始递增
乘积1避免结果归零

2.5 处理空集合时的安全聚合策略

在数据聚合操作中,空集合的处理极易引发运行时异常或逻辑错误。为确保系统稳定性,需采用安全的默认值机制与条件判断策略。
防御性编程实践
通过预判数据集状态,避免对空集执行非法操作。例如,在 Go 中可结合指针与零值检查:

func safeSum(values []int) int {
    if len(values) == 0 {
        return 0 // 安全默认值
    }
    sum := 0
    for _, v := range values {
        sum += v
    }
    return sum
}
该函数在输入为空切片时返回 0,防止后续计算中断。参数 values 为待聚合整数切片,返回值为非负整数,确保调用方无需额外判空。
常见安全策略对比
策略适用场景风险等级
返回默认值求和、计数低
抛出异常关键业务校验中
返回 nil 指针对象聚合高

第三章:复杂数据结构中的聚合实战技巧

3.1 对象列表中提取并聚合特定属性值

在处理对象集合时,常需提取特定字段并进行聚合计算。JavaScript 提供了简洁高效的语法实现该功能。
属性提取与映射
使用 map() 方法可从对象数组中提取指定属性值:

const users = [
  { name: 'Alice', age: 25 },
  { name: 'Bob', age: 30 },
  { name: 'Charlie', age: 35 }
];

const ages = users.map(user => user.age);
// 结果: [25, 30, 35]
上述代码通过箭头函数访问每个对象的 age 属性,生成新数组。
数值聚合操作
结合 reduce() 可对提取值进行求和、平均等聚合:

const totalAge = ages.reduce((sum, age) => sum + age, 0);
const avgAge = totalAge / ages.length;
// totalAge: 90, avgAge: 30
reduce() 接收累加器函数与初始值,逐元素累积计算结果,适用于统计场景。

3.2 使用Aggregate进行分组统计与汇总计算

在MongoDB中,`aggregate`管道操作是执行复杂数据聚合的核心工具。它通过一系列阶段(stage)对数据进行逐层处理,实现分组、过滤、排序和计算等操作。
常用聚合阶段
  • $match:筛选符合条件的文档
  • $group:按指定字段分组并进行统计计算
  • $project:重塑输出文档结构
  • $sort:对结果进行排序
分组统计示例

db.orders.aggregate([
  { $group: {
    _id: "$category",
    totalSales: { $sum: "$amount" },
    avgPrice: { $avg: "$price" },
    count: { $count: {} }
  }}
])
该代码按category字段分组,计算每组的销售总额($sum)、平均价格($avg)和订单数量($count)。每个累加器操作符作用于当前分组内的所有文档,实现高效的汇总分析。

3.3 在嵌套对象结构中实现多层聚合逻辑

在复杂业务场景中,嵌套对象的聚合操作需跨越多个层级进行数据整合。通过递归遍历与路径追踪机制,可精准定位子节点并执行聚合计算。
递归聚合策略
采用深度优先遍历处理嵌套结构,对每个叶节点执行预定义的聚合函数:

func aggregate(node *TreeNode) float64 {
    if node.IsLeaf {
        return node.Value
    }
    var sum float64
    for _, child := range node.Children {
        sum += aggregate(child) // 递归累加子节点
    }
    return sum
}
上述代码实现基础求和聚合,IsLeaf 标识是否为终端节点,Value 存储实际数值。
聚合类型对照表
层级深度支持聚合类型说明
1sum, avg根层支持基础统计
>1sum, max深层仅允许幂等操作
该设计确保跨层级聚合的一致性与可预测性。

第四章:高阶函数结合与性能优化实践

4.1 结合Where与Select实现条件聚合过滤

在数据查询中,常需对特定条件下的记录进行聚合计算。通过结合 WHERE 子句与 SELECT 中的聚合函数,可实现精准的条件过滤与统计。
基本语法结构
SELECT COUNT(*), AVG(salary)
FROM employees
WHERE department = 'Engineering';
该语句仅统计“Engineering”部门员工的数量与平均薪资。WHERE 在聚合前过滤行,确保后续的 COUNT、AVG 等函数仅作用于符合条件的数据集。
多条件聚合示例
  • 使用逻辑运算符组合多个条件(如 AND、OR)
  • 支持范围筛选(如 salary BETWEEN 5000 AND 10000)
  • 可配合 GROUP BY 实现分组内条件聚合

4.2 利用Aggregate替代多重循环提升代码可读性

在处理集合数据时,多重嵌套循环容易导致逻辑复杂、可读性差。通过使用聚合操作(如 `map`、`reduce`、`filter`),可以将复杂的迭代逻辑转化为声明式表达。
传统循环的痛点
多重循环往往隐藏了数据处理的真实意图,例如统计订单中某用户的总金额:

let total = 0;
for (let i = 0; i < orders.length; i++) {
  if (orders[i].userId === targetId) {
    for (let j = 0; j < orders[i].items.length; j++) {
      total += orders[i].items[j].price;
    }
  }
}
该代码嵌套层级深,关注点分散。
使用Aggregate优化
采用 `filter` 和 `reduce` 组合重构:

const total = orders
  .filter(order => order.userId === targetId)
  .flatMap(order => order.items)
  .reduce((sum, item) => sum + item.price, 0);
逻辑清晰分为三步:筛选目标订单、展开商品项、累加价格。函数式风格更贴近业务语义,显著提升可维护性。

4.3 与Func委托和Lambda表达式协同构建动态聚合

在LINQ中,`Func`委托与Lambda表达式结合,为集合的动态聚合提供了强大支持。通过定义灵活的内联函数,开发者可在运行时决定聚合逻辑。
Func委托的角色
`Func` 封装接收参数并返回值的方法。在聚合操作中,常用于指定选择或转换规则。
Lambda表达式简化语法
使用Lambda可简洁表达匿名函数。例如:
var total = products.Sum(p => p.Price * p.Quantity);
该代码计算商品总价,p => p.Price * p.Quantity 是 Func<Product, decimal> 的实例,将每个对象映射为数值。
动态条件聚合
结合Where与Sum,实现条件聚合:
var discountedTotal = products
    .Where(p => p.Category == "Electronics")
    .Sum(p => p.Price * 0.9);
仅对电子产品应用九折后求和,体现Lambda在过滤与计算中的协同能力。

4.4 聚合操作中的性能考量与避免装箱技巧

在高频率的聚合计算中,频繁的对象装箱与拆箱会显著影响性能,尤其是在处理基础类型集合时。为减少GC压力与内存开销,应优先使用值类型传递。
避免装箱的实践方法
  • 使用泛型约束确保操作基于值类型
  • 借助in关键字传递只读引用,减少复制开销
  • 优先选用Span<T>或Memory<T>进行高效内存访问
public static T Max<T>(this Span<T> span) where T : IComparable<T>
{
    var max = span[0];
    for (int i = 1; i < span.Length; i++)
        if (span[i].CompareTo(max) > 0)
            max = span[i];
    return max;
}
上述代码通过Span<T>避免数组装箱,并利用泛型约束实现类型安全的比较逻辑,循环中仅维护一个值类型变量,极大降低堆分配。

第五章:Aggregate在实际项目架构中的最佳实践与总结

合理划分聚合边界以保障业务一致性
在电商系统中,订单(Order)作为核心聚合根,应包含订单项(OrderItem)、支付状态等子实体与值对象。避免将用户地址或商品库存纳入同一聚合,防止并发更新冲突。
  • 聚合内部强一致性,通过领域事件实现最终一致性
  • 避免跨聚合的数据库事务操作
  • 使用唯一标识引用其他聚合,而非直接嵌入
聚合设计需配合仓储与工厂模式
以下为Go语言示例,展示订单聚合的创建逻辑:

type Order struct {
    ID        OrderID
    Items     []OrderItem
    Status    OrderStatus
    CreatedAt time.Time
}

func NewOrder(customerID CustomerID, items []ItemInfo) (*Order, error) {
    if len(items) == 0 {
        return nil, ErrEmptyOrderItems
    }
    
    order := &Order{
        ID:        GenerateOrderID(),
        Items:     make([]OrderItem, 0),
        Status:    StatusPending,
        CreatedAt: time.Now(),
    }
    
    for _, info := range items {
        item, err := NewOrderItem(info)
        if err != nil {
            return nil, err
        }
        order.Items = append(order.Items, *item)
    }
    
    order.AddEvent(&OrderCreated{OrderID: order.ID})
    return order, nil
}
性能优化与查询分离的实际策略
采用CQRS模式,写模型维护聚合完整性,读模型使用物化视图提升查询效率。下表展示某金融系统中聚合操作频率与响应时间要求:
聚合类型日均操作次数写入延迟要求数据一致性级别
交易单(TradeOrder)120,000<200ms强一致
对账记录(Reconciliation)8,000<2s最终一致
监控与重构支持

聚合生命周期管理流程:

命令 → 聚合重建(从事件溯源)→ 业务规则校验 → 状态变更 → 生成事件 → 持久化至事件存储

使用C#编写的LINQ Aggregate方法示例 在上述示例中,我们展示了如何使用LINQ的Aggregate方法来计算数组中元素的总和。Lambda表达式的结果将成为下一次迭代的累加器的值。在这个例子中,初始累加器的值为数组中的第一个元素,然后我们依次将累加器与数组中的每个元素相加,直到完成所有的元素。这个示例展示了LINQ的Aggregate方法的基本用法,它可以用于执行各种聚合操作,如求和、求积、字符串连接等。通过提供不同的Lambda表达式,我们可以根据需求来定义不同的聚合逻辑。在这个例子中,数组元素的和为15。将数组中的所有元素累加起来。 阅读详情

相关推荐

C#中累加器函数Aggregate用法实例

主要介绍了C#中累加器函数Aggregate用法,实例分析了C#中累加器的实现与使用技巧,具有一定参考借鉴价值,需要的朋友可以参考下

c#编码技巧(十六):Aggregate妙用

Aggregate妙用

foolishsunday的博客 2024

c#笔记之mes上传Http协议版

HTTP(超文本传输协议) 是一种典型的协议。

qq_61441787的博客 344

C# Linq源码解析之Aggregate

前言在Dotnet开发过程中,Aggregate作为IEnumerable的扩展方法,十分常用。本文对Aggregate方法的关键源码进行简要分析,以方便大家日后更好的使用该方法。使用Aggregate是对序列应用累加器的函数。看下面一段代码:List<string>lst=newList<string>(){"张三","李四","...

dotNET跨平台 924

Unity工业数据可视化:基于ModbusTCP的实时数据通信实战

本文详细介绍了在Unity中实现工业数据可视化的核心方法,重点讲解了基于ModbusTCP协议与PLC等工业设备进行实时数据通信的实战流程。内容涵盖NModbus库的集成、Modbus Slave模拟器的使用、TCP连接的建立与多线程安全通信、数据读写与解析,以及如何将实时数据驱动3D场景,为构建工业数字孪生与监控系统提供完整解决方案。

ol7890123的博客 554

手把手教你用RC桥式振荡器生成1Hz-1MHz正弦波(附完整电路图)

本文详细介绍了如何从零构建RC桥式振荡器,实现1Hz-1MHz正弦波的生成。通过核心元件选型、参数设计、电路搭建与优化等步骤,帮助读者掌握振荡器的工作原理和实战技巧。特别适合电子实验和信号处理领域的初学者和工程师,附完整电路图和常见问题解决方案。

weixin_30338481的博客 467

C#编程,Linq累加器函数Aggregate用法

就是这么easy,让我眼前一亮,对C#又充满了信心,正如上述而言,作为有工作经验的人,可能这个方法确实没有怎么用过,用的大多数是常见的Linq,当然了那么多Linq哪能全部都会用啊,但是,但是至少得了解这个Linq是做什么的吧(别往心里去,说的没见识的我)。该Linq字面意思为聚合,例如可用来对集合进行筛选以及上述的求和等等,它有三个重载,它是对列表上的每个元素执行操作,也就是说对第一个和第二个上的元素执行操作,将执行的结果继续携带进行操作。看看下面的代码,有了Sum,谁还会用Aggregate呢!

君一席 1851

华为数通---配置风暴控制案例

风暴控制可以通过阻塞报文或关闭端口来阻断广播、未知组播和未知单播报文的流量。

2301_77081516的博客 1624

c# Linq Aggregate()累加函数的用法

c# Linq Aggregate

xiaososa的博客 2955

基于YOLO26深度学习框架的文档表格识别系统的算法研究实现方法

本文研究了基于YOLO26深度学习框架的文档表格识别系统实现方法。系统采用YOLO26网络架构,通过数据预处理、模型训练、检测推理和表格分析四个模块实现高效表格识别。研究详细阐述了数据归一化、增强等技术处理,以及采用迁移学习策略优化模型训练过程。实验表明,该系统能有效识别多种表格结构并生成结构化数据,为文档自动化处理提供了可靠解决方案。

一键难忘的博客 972

自然语言处理6 -- 情感分析

1 概述 情感分析是自然语言处理中常见的场景,比如淘宝商品评价,饿了么外卖评价等,对于指导产品更新迭代具有关键性作用。通过情感分析,可以挖掘产品在各个维度的优劣,从而明确如何改进产品。比如对外卖评价,可以分析菜品口味、送达时间、送餐态度、菜品丰富度等多个维度的用户情感指数,从而从各个维度上改进外卖服务。 情感分析可以采用基于情感词典的传统方法,也可以采用基于深度学习的方法,下面详细讲解 ...

谢杨易的博客 5万+

20231211 LINQ中的Aggregate用法总结

它接受2个参数,一般第一个参数是称为累积数(默认情况下等于第一个值),而第二个代表了下一个值。第一次计算之后,计算的结果会替换掉第一个参数,继续参与下一次计算。Aggregate它接受2个参数,一般第一个参数是称为累积数(默认情况下等于第一个值),而第二个代表了下一个值。下例使用linq的Aggregate方法找出数组中大于"banana", 长度最长的字符串,并把它转换大写。下例使用linq的Aggregate方法统计一个数组中偶数的个数。一、Aggregate用于集合的简单的累加、阶乘。

qq_39753664的博客 856

基于OpenCV实现暗通道先验去雾算法及改进,效果惊人

深度技术文,前方高能

公号:一条coding 2万+

Linq (三) 之 Aggregate

linq的Aggregate函数真的非常惊艳! 1 案例 有1个string数组,我要把它们用空格连接起来,连接起来之前我要判断字符串是否为空的,于是有2种思路。 思路一:先判断数组种字符串是否为空,然后通过stirng.jion连接起来; 思路二:遍历字符串,一边判断一边拼接; string[] inputArguments = new string[]{"arg1", "arg2", "arg3", "arg4"}; string argus = ""; foreach (string arg i

RandyOliver's House 730

精雕软件(JDpaint) 5.5 绿色版

精雕软件(JDpaint) 5.5 绿色版精雕软件(JDpaint) 5.5 绿色版精雕软件(JDpaint) 5.5 绿色版

深度学习工具包 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")

LINQ中Aggregate的用法

本文导读:LINQ中的Aggregate可用于集合的简单的累加、阶乘和一些更加复杂的运算,Aggregate配合lambda让原来需要很多行代码才能实现的功只要很少的代码就搞定。下面介绍LINQ中Aggregate的简单用法 LINQ中的Aggregate可以做一些复杂的聚合运算,例如累计求和,累计求乘积。 Aggregate接受2个参数,一般第一个参数是称为累积数(默认情况下等于

daiyan_csdn的博客 1490

蓝牙模块HM-10手册

蓝牙模块HM-10手册,该手册对蓝牙模块HM-10进行了详细的介绍和使用方法以及一些AT指令。

C# Aggregate 累加器

C# Aggregate 累加器,从需求出发

寒博K 2866

Devexpress16.2.6破解工具

Devexpress16.2.6破解工具Devexpress16.2.6破解工具Devexpress16.2.6破解工具Devexpress16.2.6破解工具

C#种Lambda奇技淫巧之Aggregate

回字的4种写法: Enumerable.Aggregate 扩展方法在System.Linq命名空间中,是Enumerable类的第一个方法(按字母顺序排名),但确是Enumerable里面相对复杂的方法。 1. Aggregate 累加器函数 1.1. 值类型实现 int Sum = listItem.Aggregate((i, j) => i + j); Console.WriteLine($"Sum:{Sum}"); Console.WriteLine($"值列表:{string.Join(",

XiaoCai 1650

split(String regex,int limit)两个参数的用法

split public String[] split(String regex,int limit)根据匹配给定的正则表达式来拆分此字符串。 此方法返回的数组包含此字符串的子字符串,每个子字符串都由另一个匹配给定表达式的子字符串终止,或者由此字符串末尾终止。数组中的子字符串按它们在此字符串中出现的顺序排列。如果表达式不匹配输入的任何部分,那么所得数组只具有一个元素,即此字符串。 limit 参数控制模式应用的次数,因此影响所得数组的长度。如果该限制 n 大于 0,则模式将被最多应用 n - 1 次,

weixin_47681855的博客 2158

c# 扩展方法奇思妙用高级篇二:Aggregate 扩展及其改进

Enumerable.Aggregate 扩展方法在System.Linq命名空间中,是Enumerable类的第一个方法(按字母顺序排名),但确是Enumerable里面相对复杂的方法。MSDN对它的说明是:对序列应用累加器函数。备注中还有一些说明,大意是这个方法比较复杂,一般情况下用Sum、Max、Min、Average就可以了。看看下面的代码,有了Sum,谁还会用Aggregate呢!  ...

weixin_34176694的博客 472

C# LINQ Aggregate 方法详解

LINQ的Aggregate方法是一个强大的聚合操作符,用于对序列执行累积操作。

XIOA小记 1583

C#中,如何对集合进行聚合操作?

Aggregate方法允许你进行更复杂的聚合操作,通过提供一个自定义的聚合函数。在这个例子中,Aggregate方法将集合中的元素相乘,返回一个单一的值(乘积)。

学习和分享 612

揭秘C# LINQ中的神秘聚合:Aggregate到底能做什么?

掌握C# LINQ聚合函数Aggregate的核心技巧,解决复杂数据累积计算难题。通过实际示例解析其在字符串拼接、数值运算等场景的应用,展现代码简洁性与灵活性优势。附详细Aggregate示例说明,值得收藏。

FuncTide的博客 894

LINQ之Aggregate

返回LINQ大全首页 Aggregate() 可以对数组或列表中的每个元素执行聚合处理。 MSDN 在以下代码中,通过lambda表达式描述了将数组中所有元素相加而获得的总值的过程。 using System.Linq; using System.Collections; using System.Collections.Generic; public static class Program { static void Main( string[] args ) { in

lcy的博客 1555

C#开发者必看:Aggregate方法的4种进阶技巧与避坑指南

掌握C# LINQ聚合函数Aggregate方法的高效用法,解决复杂数据合并难题。通过4个实用Aggregate示例,详解累加、字符串拼接、条件聚合与对象合并场景,提升代码可读性与性能。C#开发者必学技巧,值得收藏

QuickSolve的博客 1118

C# Linq增强扩展MoreLinq之Aggregate(对序列应用累加器)

MoreLINQ项目的主要目标是为LINQ提供更多的功能和灵活性,以满足不同场景下的需求。该项目由一些微软的工程师创建和维护,他们利用自己的业余时间开发并分享这个开源项目。

What If... 684
上一篇: 为什么你的WinUI 3窗口总是居中失败?揭秘Window.Position底层机制
下一篇: 为什么顶尖C#程序员都在用自动属性:背后的技术优势全曝光
CompiShoal
博客等级 码龄1年 130粉丝 1955原创
评论
成就一亿技术人!
拼手气红包6.0元
还能输入1000个字符  | 博主筛选后可见
 
 条评论被折叠 查看
添加红包

请填写红包祝福语或标题

个

红包个数最小为10个

元

红包金额最低5元

当前余额3.43元 前往充值 >
需支付:10.00元
成就一亿技术人!
领取后你会自动成为博主和红包主的粉丝 规则
hope_wisdom
发出的红包
实付元
使用余额支付
点击重新获取
扫码支付
钱包余额 0

抵扣说明:

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

余额充值