Golang与Java各方面使用对比(上)

GoLang笔记—基础语法篇 我们从计算机系统的角度来讲,变量就是一段或者多段内存,用于存储数据 注意:变量声明以关键字var开头,变量类型后置,行尾无须分号如果你学过C语言,就会体会到这样声明的好处,比如C语言这样声明:int* a, b ,那么只有a是指针,b不是,这样会使人迷惑,如果想要两个变量都为指针,需要这样定义:。 在go语言中,我们使用这样的声明方式:,就可以轻松的将a,b都声明为指针。变量的命名规则遵循驼峰命名法,即首个单词小写,每个新单词的首字母大写,例如: startDate当一个变量被声明之后,系统自动赋予它该类型 阅读详情

其实两年前就接触过Golang,但是当时对Golang的理解仅停留在“基本语法”这一块,没有去比较Golang相对于Java的其他差异,后续也因为使用Java作为主力语言而没有再使用过Golang了。现在从几个角度来和Java进行对比,以便更好地使用及理解Golang,希望本文能对刚入门Golang的朋友有所帮助。如有其他疏漏或错误也望大家不吝赐教。

Golang基本的使用可以参考我之前写的笔记:《Golang核心知识总结》

本文只对比基本情况、基本使用、结构体函数及指针三块内容,下一篇文章会对比面向对象、异常处理、并发编程及垃圾回收的差异。

第二篇文章传送门:Golang与Java各方面使用对比(下)

一、基本情况

1.1、Golang基本介绍

在这里插入图片描述

Go语言(或 Golang)起源于 2007 年,并在 2009 年正式对外发布。Go 是非常年轻的一门语言,它的主要目标是“兼具 Python 等动态语言的开发速度和 C/C++ 等编译型语言的性能与安全性”。

Go语言的推出,旨在不损失应用程序性能的情况下降低代码的复杂性,具有“部署简单、并发性好、语言设计良好、执行性能好”等优势,目前国内诸多 IT 公司均已采用Go语言开发项目。

Go语言有时候被描述为“C 类似语言”,或者是“21 世纪的C语言”。Go 从C语言继承了相似的表达式语法、控制流结构、基础数据类型、调用参数传值、指针等很多思想,还有C语言一直所看中的编译后机器码的运行效率以及和现有操作系统的无缝适配。

因为Go语言没有类和继承的概念,所以它和 Java 或 C++ 看起来并不相同。但是它通过接口(interface)的概念来实现多态性。Go语言有一个清晰易懂的轻量级类型系统,在类型之间也没有层级之说。因此可以说Go语言是一门混合型的语言。

此外,很多重要的开源项目都是使用Go语言开发的,其中包括 Docker、Go-Ethereum、Thrraform 和 Kubernetes。

据最新的2020年9月Tiobe编程语言排行榜,目前Golang的使用率排名为第11:

在这里插入图片描述

1.2、Golang使用场景
  1. 服务端开发(配合gin、gorm等库就能够完成高性能的后端服务)
  2. 容器开发(譬如Docker、K8s都是基于Golang开发的)
  3. 脚本开发(由于Golang自身部署简单,并且与操作系统API交互方便,所以还可替代Python作为脚本开发)
  4. 底层工具的开发(可代替C或者C++开发操作系统底层工具)

二、基本语法

2.1、编码规约

Golang是一门严格的工程语言,主要体现在编码风格及可见域规则上。在Java中,允许多种编码风格共存,譬如以下两种方法声明,对于Java来说都是允许的:

public String getString(Integer num) {
    return num.toString();
}

public String getString(Integer num) 
{
    return num.toString();
}

1.左右花括号需要符合上下换行风格

在Golang中,只允许出现一种换行风格:

func getString(num int) string {
	return strconv.Itoa(num)
}

如果出现以下换行风格则会报错,无法通过编译:

在这里插入图片描述

2.变量声明后必须使用,不使用需要使用_来代替

在Java中,变量可以声明了却不使用,而Golang中声明的变量必须被使用,否则需要使用_来替代掉变量名,表明该变量不会比使用到:

func getString(num int) string {
	temp := num // 没有使用者,无法编译
	_ := num	// 正常编译
	return strconv.Itoa(num)
}

3.可见域规则

Java对方法、变量及类的可见域规则是通过private、protected、public关键字来控制的,而Golang中控制可见域的方式只有一个,当字段首字母开头是大写时说明其是对外可见的、小写时只对包内成员可见。

  • entity
package entity

type Person struct {
	Name string
	Age int
	id string
}

type student struct {
	detail Person
}

func test() {
	// 本包内可见
	person := &student{detail: Person{
		Name: "ARong",
		Age:  21,
		id:   "211",
	}}
	fmt.Println(person)
}
  • main
package main

import (
	"fmt"
	entity "others/scope"
)

func main() {
	// id字段不可见
	person := &entity.Person{
		Name: "ARong",
		Age:  21,
	}
	fmt.Println(person)
}
2.2、变量声明及初始化

1.变量声明及初始化的文法
在Java中,通常声明变量及初始化的文法为:

    // Object:要声明的类型、v:变量名称、new Object()变量初始化
    Object v = new Object();

而Golang使用var关键字来声明变量:

    // var:变量定义、v1:变量名称、int:变量类型
    var v1 int
	var v2 string
	var v3 [10]int  // 数组
	var v4 []int // 数组切片
	var v5 struct {
		f int
	}
	var v6 *int // 指针
	var v7 map[string]int  // map,key为string类型,value为int类型
	var v8 func(a int) int
	var v9,v10 int //v9和v10都声明为int型

也可以采用:=自动推测变量类型:

	var v1 int = 10 // 正确的使用方式1
	var v2 = 10  // 正确的使用方式2,编译器可以自动推导出v2的类型
	v3 := 10  // 正确的使用方式3,编译器可以自动推导出v3的类型

2.对于基本类型,声明即初始化;对于引用类型,声明则初始化为nil

在Java中,如果在方法内部声明一个变量但不初始化,在使用时会出现编译错误:

public void solve() {
    int num;
    Object object;
    System.out.println(num); // 编译错误
    System.out.println(object); // 编译错误
}

而在Golang中,对于基本类型来讲,声明即初始化;对于引用类型,声明则初始化为nil。这样可以极大地避免NPE的发生。

func main() {
	var num int
	var hashMap *map[string]int
	fmt.Println(num) // num = 0
	fmt.Println(hashMap) //  &hashMap== nil
}
2.3、值类型及引用类型

Golang的类型系统与Java相差不大,但是需要注意的是Java中的数组是属于引用类型,而Golang中的数组属于值类型,当向方法中传递数组时,Java可以直接通过该传入的数组修改原数组内部值(浅拷贝),但Golang则会完全复制出一份副本来进行修改(深拷贝):

  • Java
    public static void main(String[] args) {
        int[] array = {1, 2, 3};
        change(array);
        System.out.println(Arrays.toString(array)); // -1,2,3
    }

    private static void change(int[] array) {
        array[0] = -1;
    }
  • Golang
func main() {
	array := [...]int{1, 2, 3}
	change(array)
	fmt.Println(array) // 1,2,3
}

func change(array [3]int) {
	array[0] = -1
}

并且值得注意的是,在Golang中,只有同长度、同类型的数组才可视为“同一类型”,譬如[2]int和[3]int则会被视为不同的类型,这在参数传递的时候会造成编译错误。

所以在Golang中数组很少被直接使用,更多的是使用切片(基于数组指针)来代替数组。

在Golang中,只有切片、指针、channel、map及func属于引用类型,也就是在传递参数的时候,实质上复制的都是他们的指针,内部的修改会直接影响到外部:

func main() {
	slice := []int{1, 2, 3}
	changeSlice(slice)
	fmt.Println(slice) // -1,2,3

	mapper := map[string]int {
		"num": 0,
	}
	changeMap(mapper)
	fmt.Println(mapper) // num = -1

	array := [...]int{1, 2, 3}
	changePointer(&array)
	fmt.Println(array) // -1,2,3

	intChan := make(chan int, 1)
	intChan <- 1
	changeChannel(intChan)
	fmt.Println(<- intChan) // -1
}

func changeChannel(intChan chan int) {
	<- intChan
	intChan <- -1
}

func changePointer(array *[3]int) {
	array[0] = -1
}

func changeMap(mapper map[string]int) {
	mapper["num"] = -1
}

func changeSlice(array []int) {
	array[0] = -1
}

三、结构体、函数及指针

3.1、结构体声明及使用

在Golang中区别与Java最显著的一点是,Golang不存在“类”这个概念,组织数据实体的结构在Golang中被称为结构体。函数可以脱离“类”而存在,函数可以依赖于结构体来调用或者依赖于包名调用。

Golang中的结构体放弃了继承、实现等多态概念,结构体之间可使用组合来达到复用方法或者字段的效果。

要声明一个结构体只需使用type + struct关键字即可:

type Person struct {
	Name string
	Age  int
	id   string
}

要使用一个结构体也很简单,一般有以下几种方式去创建结构体:

    personPoint := new(entity.Person) // 通过new方法创建结构体指针
	person1 := entity.Person{} // 通过Person{}创建默认字段的结构体
	person2 := entity.Person{ // 通过Person{Name:x,Age:x}创建结构体并初始化特定字段
		Name: "ARong",
		Age:  21,
	}
	fmt.Println(personPoint) // &{ 0 }
	fmt.Println(person1)     // { 0 }
	fmt.Println(person2)	 // {ARong 21 }
3.2、函数和方法的区别

使用Java的朋友应该很少使用“函数”这个词,因为对于Java来说,所有的“函数”都是基于“类”这个概念构建的,也就是只有在“类”中才会包含所谓的“函数”,这里的“函数”被称为“方法”。

而“函数”这个词源于面向过程的语言,所以在Golang中,“函数”和“方法”的最基本区别是:

函数不基于结构体而是基于包名调用,方法基于结构体调用。

下面是一个例子,可以直观地看出方法和函数的区别:

  • entity
package entity

import "fmt"

type Person struct {
	Name string
	Age  int
	id   string
}

// Person结构体/指针可调用的"方法",属于Person结构体
func (p *Person) Solve() {
	fmt.Println(p)
}

// 任何地方都可调用的"函数",不属于任何结构体,可通过entity.Solve调用
func Solve(p *Person) {
	fmt.Println(p)
}
  • main
func main() {
	personPoint := new(entity.Person) // 通过new方法创建结构体指针

	entity.Solve(personPoint) // 函数调用
	
	personPoint.Solve() 	  // 方法调用
}
3.3、指针的使用

在Java中不存在显式的指针操作,而Golang中存在显式的指针操作,但是Golang的指针不像C那么复杂,不能进行指针运算。

下面从一个例子来看Java的隐式指针转化和Golang的显式指针转换:Java和Golang方法传参时传递的都是值类型,在Java中如果传递了引用类型(对象、数组等)会复制其指针进行传递, 而在Golang中必须要显式传递Person的指针,不然只是传递了该对象的一个副本。

Golang使用 * 来定义和声明指针,通过&来取得对象的指针。

func main() {
	p1 := entity.Person{
		Name: "ARong1",
		Age:  21,
	}
	changePerson(p1)
	fmt.Println(p1.Name) // ARong1
	changePersonByPointer(&p1)
	fmt.Println(p1.Name) // ARong2
}

func changePersonByPointer(person *entity.Person) {
	person.Name = "ARong2"
}

func changePerson(person entity.Person) {
	person.Name = "ARong2"
}

注意,如果结构体中需要组合其他结构体,那么建议采用指针的方式去声明,否则会出现更新丢失问题。

以下是Golang方法的一个隐式指针转换,结构体调用方法时,如果传递的是对象,那么会被自动转化为指针调用:


type Person struct {
	Name string
	Age  int
}

// Person结构体/指针可调用的"方法",属于Person结构体
func (p *Person) Solve() {
	fmt.Println(p)
}


func main() {
	p := entity.Person{
		Name: "ARong",
		Age:  21,
	}
	
	pp := &p
	pp.Solve() // 显式
	
	p.Solve    // 隐式,自动将p转化为&p
}
【Golang】:入门基础 本文介绍了Go语言的基础知识、开发环境搭建和基本语法。Go语言由Google开发,具有简洁、高效、并发友好等特点,广泛应用于后端开发、云计算等领域。文章详细说明了Go的发展历程、优势特性及典型应用场景。在开发环境搭建部分,指导读者下载安装Go SDK。基本语法章节涵盖变量声明、标识符命名规则、输入输出操作以及各类运算符的使用方法,包括算术、关系、逻辑、赋值和位运算符等。通过示例代码展示了Go语言的基本语法规则和编程范式,为初学者提供了入门指南。 阅读详情

相关推荐

golang基础学习以及代码实例

这是我亲手整理非常全的go语言基础知识点以及代码实例,对GO有情趣的同学可以通过这个总结以及代码实例快速入门!加油同学们!

qq_42746084的博客 2891

golang学习笔记——基础01

golang学习笔记——基础01

mirana的专栏 4055

golang中使用泛型

golang支持泛型函数和泛型类型。//泛型函数}[Tany]为类型约束,any表示任意类型,(argsT)为参数。如果只想支持特定的几个类型可以这样写。}如果类型太多了,可以这样表示}}有时候需要类型可以进行算数运算,但是any中有些类型又是不支持的,因此需要用到编译器内置的约束comparable,该类型必须支持==方法。}如果使用了自定义的类型}如果只想支持一个类型,那就不需要使用泛型了。最终改造为}else{}}多个参数多个类型}指的是复合类型,它包含了泛型。...

m0_67401382的博客 394

Golang基础语法

golang又称go language简称golang, go语言是谷歌推出的一中编程语言,可以在不损失应用程序性能的情况下降低代码的复杂性。谷歌首席软件工程师罗勃派克说:‘’我们之所以开发go,是因为过去十年间软件开发的难度令人沮丧‘’。派克表示,和今天C和C++一样,go是一种系统语言。使用它可以快速开发,同时它还是一个真正的编译语言,我们之所以将它开源,原因是我们认为它已经非常有用和强大。1)计算机硬件更新频繁,性能提高很快。

qq_45553775的博客 1万+

使用 Go 构建高可用的分布式系统:微服务架构及其与 Java 对比

微服务架构已成为现代软件开发的主流范式。在微服务中,一个应用被拆分为多个独立的服务,每个服务负责一部分功能。这种架构可以提高系统的可伸缩性、可维护性和可靠性。本文将探讨如何使用 Go 语言构建微服务架构,并通过实际案例分析 Go 在微服务中的应用。我们还将对比 Go 和 Java 在微服务方面的差异,以帮助您更好地了解两者的优缺点。

斌擎科技 631

Go与Java数据库操作对比:使用Go连接和操作数据库

数据库操作是Web开发中的一个重要组成部分。在本文中,我们将介绍如何在Go中连接和操作关系型和非关系型数据库,并将其与Java在数据库操作方面进行对比。我们将介绍Go的流行数据库驱动,并提供Go和Java的示例代码,帮助您了解两者在数据库操作方面的差异和优劣。

斌擎科技 296

Golang与Java各方面使用对比(下)

本文是Golang与Java对比的第二篇,主要对比Golang与Java在面向对象、异常处理、并发编程及垃圾回收方面的差异。

BoringError的博客 6525

综合能源系统多时间尺度优化调度!诸多创新点让你抓住审稿人的心!

主要介绍综合能源系统的设备组成结构,并针对屋顶光伏系统、冷-热-电联供系统中的燃气轮机、燃气锅炉、光伏溴化锂制冷机、卡琳娜余热发电、中央空调系统,以及外网交互系统的配电网与天然气管网交互关系进行数学建模。1) 源-荷-储协同调度:研究屋顶光伏、燃气轮机、燃气锅炉等源侧设备,中央空调、电-热-冷负荷、可平移电负荷、可削减温控负荷等负荷侧资源,以及储能系统、电动汽车等储能侧设备的协同调度,以提高风光消纳能力,满足社会能源需求。通过电转热、电转冷、电转气等多能耦合方式,可进一步促进可再生能源的应用与发展。

weixin_48747334的博客 1490

GO中使用protobuf,性能和java、rust、c++对比

GO中使用protobuf 性能对比java劣势 rust protobuf

cention168的专栏 1316

PTPX功耗分析实战——从脚本配置到报告解读

本文详细介绍了PTPX功耗分析的全流程,从脚本配置到报告解读,帮助工程师快速掌握芯片设计中的功耗估算技术。文章涵盖了环境搭建、波形文件处理、功耗报告解析等关键环节,并提供了实战经验和优化建议,特别适合需要提升PTPX功耗分析效率的开发者。

weixin_29248313的博客 279

MSP430开发入门:手把手教你用IAR EW430从建工程到烧录调试(附F5529配置)

本文详细介绍了如何使用IAR Embedded Workbench(EW430)进行MSP430F5529开发板的嵌入式开发,从环境搭建、工程配置到硬件调试全流程。通过实战示例和关键配置技巧,帮助开发者快速掌握MSP430开发的核心要点,包括LED控制、定时器使用和低功耗优化等实用技术。

weixin_30240349的博客 392

【Go语言学习笔记】深入理解 Go map:使用、底层原理与 Java Map 全面对比

从入门到深入剖析,一文读懂 Go 语言中的 map —— 从基本语法到底层结构,从内存管理到与 Java HashMap 的差异。

往者之不谏 来者犹可追 1103

CANape快速上手

文章帮助记录CANape学习过程。

小弱鸡的博客 1万+

C/C++、Java、Go、Python总结对比16-public、protect和private使用总结对比

想了解这3个修饰符的使用请查看专栏的前几篇文章。 根据c++、java和Python的使用总结如下: 1. java比c++多了default修饰的类成员,并引入了包的概念,default在当前包内可被访问; 2. 为了简化记忆,可以这样理解,public和private不用记忆,一个可以在任何地方被访问,一个只能在类内被访问; 3. c和java的protect的用法有所区别,ja...

aeoob的博客 331

从晶体管到触发器:为什么芯片设计必须区分同步/异步复位?

本文深入探讨了芯片设计中同步复位与异步复位的物理本质与工程权衡。从晶体管级的CMOS结构出发,剖析了两种复位方式在物理实现、时序可靠性(如建立/保持时间、恢复/移除时间)上的根本差异,并分析了在不同应用场景下的选择策略。文章强调,理解复位信号的底层机制对于确保芯片时序收敛、系统上电确定性及整体鲁棒性至关重要。

time3的博客 221

CCC数字钥匙3.0标准解读(22)

介绍设备制造商服务器和车辆制造商服务器之间的通信协议.

weixin_41738640的博客 1748

论“单例模式”三种语言(PHP、Golang、Java)对比及使用

单例模式(Singleton Pattern) 这种类型的设计模式属于创建型模式,它提供了一种创建对象的最佳方式。 这种模式涉及到一个单一的类,该类负责创建自己的对象,同时确保只有单个对象被创建。这个类提供了一种访问其唯一的对象的方式,可以直接访问,不需要实例化该类的对象。 注意: 1、单例类只能有一个实例。 2、单例类必须自己创建自己的唯一实例。 3、单例类必须给所有其他对象提供这一实例。 介绍 意图:保证一个类仅有一个实例,并提供一个访问它的全局访问点。 主要解决:一个全局使用的类频繁地

578

用SimaPro做碳足迹分析:手把手教你完成产品生命周期评估报告

本文详细介绍了如何使用SimaPro进行碳足迹分析,从软件安装到生命周期评估报告的完整流程。通过实战案例演示,帮助制造业企业、咨询机构和科研团队掌握产品生命周期评估(LCA)的核心技术,精准识别环境热点并优化决策,为可持续发展转型提供科学依据。

yhn45678901的博客 715

Go vs JAVA

https://www.educba.com/go-vs-java/ Difference Between Go vs Java Go, also known as Golang, is a programming language. Being an open-source language for programming, Go makes it easy to build reliable,...

michaelforgood的博客 521

算法 | 基于MATLAB的增量式SVD技术综述:实现方法、代码示例与应用实践

效率提升:较传统SVD降低计算复杂度从On3O(n^3)On3至On2O(n^2)On2实时性:支持毫秒级动态数据更新资源友好:内存占用降低60%-80%[5]

尘世冰封的专栏 487

NTscan扫描工具

ntscan是一个扫描器,可以扫描没有密码和弱密码的共享,先到配置文件中填写猜测的用户名和密码,扫描过程中右侧出现的是扫描日志。

Go 语言 入门 && 基于 GoLand 2023.1 创建第一个Go程序

Go 语言 入门 && 基于 GoLand 2023.1 创建第一个Go程序Go 语言 入门 && 基于 GoLand 2023.1 创建第一个Go程序Go 语言 入门 && 基于 GoLand 2023.1 创建第一个Go程序Go 语言 入门 && 基于 GoLand 2023.1 创建第一个Go程序Go 语言 入门 && 基于 GoLand 2023.1 创建第一个Go程序Go 语言 入门 && 基于 GoLand 2023.1 创建第一个Go程序Go 语言 入门 && 基于 GoLand 2023.1

猫头虎技术团队:授渔优于赠鱼,兴趣引领智慧,探索之乐尤显珍贵。商务合作+:Libin9iOak ,万粉变现+:优快云WF,猫头虎承诺每年免费为100名C站创作者做账号流量诊断服务!全网搜:猫头虎技术团队,点击文章底部名片或直接私信我一切皆可谈,快找虎哥! 5万+

Probability and Statistics - 4th edition

Probability and Statistics - 4th edition

Why not Go ? Golang入门笔记1

各位狗(Go)年大吉~这是我的Golang入门笔记开篇之作(PS:重点是笔记,用来记录一些细节上的注意点而非入门教程)接下来就开始我的表演~0x00 我看Golang第一次听说Golang,还是在学Python爬虫的时候,看到也有人用Golang写爬虫,但苦于只会一点Python和C,并不能完全看懂Go语言。如今来正式学习Golang,心情难免激动。看了一些Go语言的示例代码和语言特性,竟然有种似...

cossack9989的博客 727

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

假人有限元模型

假人模型,车辆碰撞假人有限元模型,适合做乘员安全的研究者利用

项目中要不要使用 Go?我是这么思考的

我最近决定在一个新项目中使用 GoLang 来实现一组增删改查的 API。在此之前,我较为熟悉 Java,Groovy,了解一些 Python。 我大部分的经验都是使用 Java 或者 Groovy 加上 Spring Boot。这让我感到有些无聊,所以为什么不来学点儿东西找找乐子呢? 要求 以下是一些要求。 设计并实现领域数据模型 实现增删改查 API 在后...

请叫我开发专家 619

C/C++、Java、Go、Python总结对比12-指针的定义和使用

指针是c、c++和go这些需要动态分配内存等功能的语言用到的,笔者在刚开始使用的时候,经常混淆指针的定义和使用,下面总结一下。 c/c++的写法 void pointDemo() { int normalVar = 1; //定义普通变量 int *pointVar1 = &normalVar; //定义指针变量 int *pointVar2 = 2; ...

aeoob的博客 330

274-golang多态浅析

golang多态浅析 首先我们说一下什么是多态 接口的多种不同的实现方式就是多态 比如在java中,两个类实现同一个接口 比如这样 public interface Person{ public void SayHello(); } public class Student implements Person{ public void SayHello()...

Lich Howger 544

C/C++、Java、Go、Python总结对比3-字符串的定义及使用

字符串是大家一定会使用到的,因为经常会被用来将结果输出到控制台来查看结果是否正确。 下面来看下5种语言不同的写法: c的写法 #include <stdio.h> int main() { char strVar[] = "hello"; printf(strVar); } c++的写法 #include <iostream> #inclu...

aeoob的博客 308
上一篇: 操作系统精髓-内存管理、调度及其他基础总结
下一篇: Golang与Java各方面使用对比(下)
BoringRong
BoringRong 领域专家: 后端开发技术领域 领域专家: 后端开发技术领域
博客等级 码龄9年 2万+粉丝 386原创
评论 8
成就一亿技术人!
拼手气红包6.0元
还能输入1000个字符
 
 条评论被折叠 查看
添加红包

请填写红包祝福语或标题

个

红包个数最小为10个

元

红包金额最低5元

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

打赏作者

BoringRong

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

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

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

打赏作者

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

抵扣说明:

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

余额充值