精华内容
下载资源
问答
  • 超级实用的matlab学习过程中的个人经验分享.doc
  • Matlab学习过程(一)

    千次阅读 2018-05-23 14:44:35
    之前选修过matlab这门课,但是由于刚上大学比较贪玩,结果还听过课最后还挂了课,知道最近在学习吴恩达的ML课程的时候接触到了octave(学习... 我学习过程中是使用MATLAB R2016a 这个版本,电脑系统为windows10 ...

           之前选修过matlab这门课,但是由于刚上大学比较贪玩,结果还听过课最后还挂了课,知道最近在学习吴恩达的ML课程的时候接触到了octave(学习过的小伙伴应该都知道),才了解到matlab好像并不是特别难,因此从图书馆借了本书《MATLAB程序设计与应用(第3版)》打算捡起来重新学。

           我学习的过程中是使用MATLAB R2016a 这个版本,电脑系统为windows10 专业版,此为前提。

          早期的matlab是用FORTRAN语言编写,当时是免费版本。知道1984年MathWorks公司推出了MATLAB1.0版(dos版),其核心采用C语言编写,除原有的数值计算功能之外新增了图形处理功能。现在使用的版本是2016年3月,MathWorks公司推出的MATLAB R2016a(9.0版)。软件下载与破解安装可以看这个帖子:

    MATLAB R2016a的安装与破解

    1、 matlab的主要功能:

        数值计算功能,符号计算功能,绘图功能,程序设计语言功能和工具箱的 扩展功能。matlab具有很强的开放性,处理内部函数之外,所有基本文件和各个工具箱都是可读、可改的源文件,用户可以通过对源文件的修改或者加入自己编写的文件去构成新的专用的工具箱。

    2、matlab的操作界面

    如下图:


    包括MATLAB主窗口(最上面一行),其中有主页、绘图和应用程序等三个选项卡;命令行窗口,用于输入命令并显示除了图形以外的所有执行结果;当前文件夹窗口,可以通过cd....命令来进入需要的文件夹;工作区窗口,也称为工作空间,是matlab用于存储更重变量和结果的内存空间;命令历史记录窗口;

    在matlab中编写函数之后的文件格式为.m格式,当matlab执行.m文件时,都是在当前文件夹和设定好的搜索路径下进行搜索。

    使用path命令将文件夹加入到搜索路径中命令如下:>>path(path,'e:\math\work');或者使用对话框设置搜索路径,“主页”》“环境”》“设置路径”,或者pathtool命令,将出现“设置路径”的对话框。然后通过“添加文件夹”或“添加并包含子文件夹”按钮来将指定路径添加到搜索路径列表中。并且可以通过“上移1”和“下移”来改变顺序。“删除”命令可以将其从搜索路径中删除。;修改完成之后点击“保存”即可完成。

    3、基本操作

    3.1 交互式命令操作

         交互式命令操作是在MATLAB命令行窗口中输入并执行命令,这是最基本的操作。

         1、续行符:如果一个命令行很长,需要分成多行来输入,则可以在第一个物理行之后加上三个小黑点并按enter键,接着在下一个物理行继续输入其他部分。即是 把下一行看作是上一行的逻辑继续。

         2、命令行的编辑:当需要输入之前已经输入过的命令时可以使用方向键的向上符即可,反复使用上移光标键,可以回调以前输入的而所有命令行。

         3、 注释:注释以%开头,后面是注释内容,采用单行注释。

    3.2、matlab的帮助命令

         1、 help命令:在命令行窗口中直接输入help加函数名来显示该函数的帮助说明。

         2、lookfor命令:help命令只搜索出那些关键字完全匹配的结果,lookfor命令对搜索范围内的M文件进行关键字搜索。

         3、模糊查询:只需要输入命令的前几个字母,然后按Tab键,系统就会列出所有以这几个字母开头的命令。

    展开全文
  • 2.27-快捷键 自信地以为删除注释是Ctrl shift R,结果出来了下图所示,MATLAB界面键盘都不能输入了,软键盘也不能用;解决方法是关了重新开。 快捷键积累:加注释Ctrl R,取消注释Ctrl T ...
    1. 2.27-快捷键
      自信地以为删除注释是Ctrl shift R,结果出来了下图所示,MATLAB界面键盘都不能输入了,软键盘也不能用;解决方法是关了重新开。
      快捷键积累:加注释Ctrl R,取消注释Ctrl T在这里插入图片描述
    展开全文
  • 高斯过程回归及分类的代码,内容全,有实例,注释清晰。包括分类系列和预测回归系列,值得感兴趣的同学学习借鉴。里面有对应的数据和demo程序,程序可运行,MATLAB2014a下测试通过,其他版本没有测试。(网页版的0
  • 强化学习matlab源代码

    2018-12-15 03:34:01
    强化学习matlab源代码很少见的源代码,详细介绍Q学习的编程过程
  • MATLAB深度学习入门之旅

    万次阅读 多人点赞 2018-12-18 23:21:24
    因此,使用按比例分配的方式主要在数据多的类上进行学习,在数据少的类少学习很少。 为了避免这种情况,可以对数据进行分割,使每个类的训练图像具有相等的数量。 [ds1,ds2] = splitEachLabel(imds, n, '...

    目录

    1. 简介

    2. 使用预训练网络:使用已创建和训练后的网络进行分类

    2.1 课程示例-识别一些图像中的对象

    2.1.1  任务1:读取图像

    2.1.2  任务2:显示图像

    2.2 进行预测

    2.2.1  任务1:定义网络

    2.2.2  任务2:进行分类

    2.3 CNN结构

    2.3.1  任务1:提取网络的层

    2.3.2  任务2:提取某一层

    2.3.3  任务3:提取某一层的某个属性

    2.3.4  任务4:图像维度

    2.3.5  任务5:提取输出层的类属性

    2.4 调查预测

    2.4.1  任务1:预测分数

    2.4.2  任务2:创建预测分类的条形图

    2.4.3  任务3:挑出主要分数

    2.4.4  任务4:显示挑选预测分数后的条形图

    2.4.4  任务5:为x轴增加类别标签

    3 管理数据集:使用已创建和训练后的网络执行分类

    3.1 图像数据集

    3.1.1  任务1:使用imageDatastore创建数据存储(DataStore)

    3.1.2  任务2:获取文件名

    3.1.3  任务3:从数据存储(DataStore)中导入某幅图像

    3.1.4  任务4:预测数据存储(DataStore)中的所有图像

    3.2 准备输入图像

    3.2.1  任务1:查看图像大小

    3.2.2  任务2:查看网络输入层的输入图像大小

    3.2.3  任务3:将输入图像调整至要求大小并显示

    3.3 在数据存储(DataStore)中处理图像

    3.3.1  创建增强图像数据存储(DataStore)

    3.3.2  使用增强的图像数据存储(DataStore)进行颜色预处理

    3.4 使用子文件夹创建一个数据存储(DataStore)

    3.4.1  任务1:创建数据存储(Data Store)

    3.4.2  任务2:分类

    4 迁移学习:修改预训练网络对图像分类

    4.1 什么是迁移学习?

    4.2 迁移学习所需的组件

    4.3 准备训练数据

    4.3.1  标记图像

    4.3.2  分割数据以用于训练和测试

    4.4 修改网络层

    4.4.1  任务1:使用fullyConnectedLayer函数创建一个新的全连接层

    4.4.2  任务2:对层的数组通过索引进行修改

    4.4.3  任务3:将输出层与前面的层(第23层)进行匹配

    4.5 设置训练选项

    4.5.1  任务1:使用trainingOptions设置训练算法的一些选项(一定要查看帮助手册)

    4.5.2  任务2:设置初始学习率

    4.6 训练网络

    4.6.1  mini-batch

    4.6.2  使用GPUs

    4.6.3  迁移学习示例(脚本)

    4.7 评估性能

    4.7.1  评估训练和测试性能

    4.7.2  调查测试性能


    1. 简介

    该课程为MATLAB官网免费课程(英文),此笔记只对该课程进行一定的翻译和记录,方便日后复习,如有错误,还请大佬批评指正。官网链接为https://ww2.mathworks.cn/learn/tutorials/deep-learning-onramp.html(深度学习入门之旅)。

    2. 使用预训练网络:使用已创建和训练后的网络进行分类

    2.1 课程示例-识别一些图像中的对象

    本节将学习如何使用预先制作的深度神经网络来分类下面12幅图像的内容。理想的分类应该是“海滩”、“猫”、“纸杯蛋糕”、“湖泊”、“鱼”等等。

    2.1.1  任务1:读取图像

    I = imread('filename.png');  % 以分号结束将不会打印出结果

    2.1.2  任务2:显示图像

    imshow(I)

    2.2 进行预测

    2.2.1  任务1:定义网络

    net = alexnet  % 这里的网络模型使用Alexnet

    2.2.2  任务2:进行分类

    [pred, score] = classify(net,img)  % 将网络和输入图像传入分类函数,将得到输入图像的类别preds以及它在每一类中的预测分数score

    2.3 CNN结构

    MATLAB将CNN表示为一个层的数组,数组的第一个元素为输入层,最后一个元素为输出层。

    2.3.1  任务1:提取网络的层

    ly = net.Layers  % 由下图可以看出Alexnet是一个具有25层的数组

    2.3.2  任务2:提取某一层

    inlayer = ly(1)  % 输入层

    layer2 = ly(2)  % 第二层

    outlayer = ly(end)  % 分类输出层

    2.3.3  任务3:提取某一层的某个属性

    insz = inlayer.InputSize  % 输入层的输入图像大小

    2.3.4  任务4:图像维度

    输入图像是彩色图像,尺寸为:227×227×3。灰度图像的尺寸为227×227。

    2.3.5  任务5:提取输出层的类属性

    categorynames = outlayer.Classes  % 得到一个列向量,表示Alexnet的1000个类的名字

    2.4 调查预测

    2.4.1  任务1:预测分数

    上面的分类函数classify只是将输入图像预测为某一类,并不知道输入图像是该类的概率。该任务不仅会得到预测分类,还会得出预测分数。

    [pred,scrs] = classify(net,img)  % 得到的分数是一个行向量,表示1000个类的预测分数

    2.4.2  任务2:创建预测分类的条形图

    bar(scrs)

    2.4.3  任务3:挑出主要分数

    由上图可知,1000个分类中大部分的值为0,仅有少数预测分数不等于0,本任务旨在将主要分数挑选出来,可以创建一个逻辑数组,返回scrs中大于0.01的值

    highscores = scrs > 0.01  % 将scrs数组中大于0.01的元素赋为1,其他为0

    2.4.4  任务4:显示挑选预测分数后的条形图

    bar(scores(highscores))  % scores(highscores)返回大于0.01的类别的预测分数

    2.4.5  任务5:为x轴增加类别标签

    xticklabels(categorynames(highscores))  % categorynames(highscores) 返回大于0.01的类别的名字

    3 管理数据集:使用已创建和训练后的网络执行分类

    3.1 图像数据集

    3.1.1  任务1:使用imageDatastore创建数据存储(DataStore)

    ls *.jpg  % list列出工作空间里与.jpg相关的文件,工作空间中文件夹里的无法列出

    net = alexnet;

    imds = imageDatastore('*.jpg')  % 使用通配符*指定多个文件。

    3.1.2  任务2:获取文件名

    fname = imds.Files  % 使用数据存储(DataStore)Files属性获取包含路径的文件名

    3.1.3  任务3:从数据存储(DataStore)中导入某幅图像

    使用函数:read, readimage, readall可以手动地从数据存储(DataStore)中导入图像

    for i = 1:3

        img = read(imds)  % 按顺序依次读取图像,每次仅返回一张图像

    end

    img = readimage(imds, 7)  % 读取并返回数据存储(DataStore)中的某张(7)图像

    img = readall(imds)  % 一次性读取数据存储(DataStore)中的所有图像,返回的并不是图像数据

    3.1.4  任务4:预测数据存储(DataStore)中的所有图像

    preds = classify(net, imds)

    3.2 准备输入图像

    由于不同的网络对输入图像的要求不同,所以需要对输入图像进行预处理后再输入网络。

    3.2.1  任务1:查看图像大小

    img = imread('filename.jpg');

    imshow(img)

    sz = size(img)  % 返回图像的高度、宽度、通道数

    3.2.2  任务2:查看网络输入层的输入图像大小

    net = alexnet

    ly = net.Layers

    insz = ly(1).InputSize

    3.2.3  任务3:将输入图像调整至要求大小并显示

    img = imresize(img, [r, c]);  % r为行(高度),c为列(宽度)

    imshow(img)

    3.3 在数据存储(DataStore)中处理图像

    上面是对单个图像进行预处理,但平常的数据集中的图像数量相当之大。因此,直接对整个图像数据集进行处理就显得很有必要了。

    3.3.1  创建增强图像数据存储(DataStore)

    3.3.3.1  任务1:创建数据存储(DataStore)

    ls *.jpg

    net = alexnet

    imds = imageDatastore('*.jpg')

    3.3.3.2  任务2:创建增强的图像数据存储(DataStore)

    auds = augmentedImageDatastore([r c],imds)  % 数据存储(DataStore)中所有图像的大小统一调整到[r c]大小,特别强调rc没有逗号

    3.3.3.3  任务3:对预处理后的图像数据存储(DataStore)进行分类

    preds = classify(net, auds)

    3.3.2  使用增强的图像数据存储(DataStore)进行颜色预处理

    3.3.2.1  任务1:蒙太奇(montage)

    ls *.jpg

    net = alexnet

    montage(imds)  % 使用蒙太奇手法显示数据存储(DataStore)中的所有图像

    3.3.2.2  任务2:创建增强图像数据存储(DataStore)

    这里做的增强除了调整大小之外,还有灰色图像转换为彩色图像

    auds = augmentedImageDatastore([227 227], imds, 'ColorPreprocessing', 'gray2rgb')

    3.3.2.3  任务3:对预处理后的图像数据存储(DataStore)进行分类

    preds = classify(net, auds)

    3.4 使用子文件夹创建一个数据存储(DataStore)

    将每一类的图像放在一个子文件夹下,图像已经按照这种格式放置,而非按照这种方式去创建。

    3.4.1  任务1:创建数据存储(Data Store)

    net = alexnet;

    ds = imageDatastore('folder', 'IncludeSubfolders', true)  % folder为图像数据集的路径,使用“IncludeSubfolders”选项在给定文件夹的子文件夹中查找图像。

    3.4.2  任务2:分类

    preds = classify(net, ds)

    4 迁移学习:修改预训练网络对图像分类

    4.1 什么是迁移学习?

    如果从网络架构和随机权重开始,自己构建和训练网络。但要达到合理的结果需要付出很多努力:(1)网络架构的知识和经验,(2)大量的训练数据,(3)大量的计算机时间。

    迁移学习是解决许多问题的有效方法。训练需要一些数据和计算机时间,但比从零开始的培训要少得多,其结果是形成了适合您的特定问题的网络。

    4.2 迁移学习所需的组件

    三大件:

    修改后的网络Network layers

    知道标签的训练数据Training data

    训练算法Algorithm options

    4.3 准备训练数据

    将训练数据按照类别数分为一定的子文件夹进行存放,每个子文件夹的名字为相应类别的标签。如下图,花的数据集,包含12个类,所以有12个子文件夹,每个子文件夹的名字为每类花的名字。

    4.3.1  标记图像

    4.3.1.1  任务1:创建带标签的数据集

    load pathToImages  % 加载数据集文件pathToImages.mat

    flwrds = imageDatastore(pathToImages,'IncludeSubfolders', true);

    flowernames = flwrds.Labels

    训练所需的标签可以存储在图像数据存储库的标签属性中。默认情况下,标签属性为空。

    通过指定“LabelSource”选项,可以让数据存储自动确定文件夹名称中的标签。如果指定了 'foldernames',将根据文件夹名称分配标签并存储在 Labels 属性中。您以后可以通过直接访问 Labels 属性来修改标签。

    flwrds = imageDatastore(pathToImages, 'IncludeSubfolders',true, 'LabelSource', 'foldernames')

    4.3.1.2  任务2:提取新的标签

    flowernames = flwrds.Labels

    4.3.2  分割数据以用于训练和测试

    4.3.2.1  任务1:使用splitEachLabel函数分割数据集

    [ds1,ds2] = splitEachLabel(imds,p)  % imds是创建的数据存储,p是零一之间的一个比例,返回的ds1imdsp倍,剩下的imds分配给ds2,即ds2imds(1-p)

    4.3.2.2  任务2:随机分割分割

    [ds1,ds2] = splitEachLabel(imds,p,'randomized')

    4.3.2.3  任务3:处理不平衡的训练数据

    由于某些数据集在类别上是不平衡的,也即是说,可能有些类的数据多一些,有些类的数据少一些,它们的数目并不是相等的。因此,使用按比例分配的方式主要在数据多的类上进行学习,在数据少的类少学习很少。为了避免这种情况,可以对数据进行分割,使每个类的训练图像具有相等的数量。

    [ds1,ds2] = splitEachLabel(imds, n, 'randomized')  % 确保ds1中的每一类都有n个数据,剩下的数据分给ds2, 'randomized'可选

    4.4 修改网络层

    不同的数据集往往类别数也不同,因此,需要对网络中的某些层进行修改,比如输出层的神经元个数应该修改为数据集的类别数。

    4.4.1  任务1:使用fullyConnectedLayer函数创建一个新的全连接层

    anet = alexnet;

    layers = anet.Layers

    fc = fullyConnectedLayer(n)  % n是新建全连接层的神经元个数

    4.4.2  任务2:对层的数组通过索引进行修改

    layers(23) = fc  % Alexnet的第23层修改为上述新建的全连接层

    4.4.3  任务3:将输出层与前面的层(23)进行匹配

    layers(end) = classificationLayer  % 使用classificationLayer函数新建一个分类层,并赋给最后一层(输出层),该函数将自动确定输出层的神经元个数

    4.5 设置训练选项

    4.5.1  任务1:使用trainingOptions设置训练算法的一些选项(一定要查看帮助手册)

    opts = trainingOptions(solverName)  % 返回一个由solverName指定的优化器的选项,solverName默认为'sgdm'

    还可以设置

    options = trainingOptions('sgdm', ...
        'LearnRateSchedule','piecewise', ...  % 学习率减少方案
        'LearnRateDropFactor',0.2, ...
        'LearnRateDropPeriod',5, ...  % 每5个epoch减少0.2倍的学习率
        'MaxEpochs',20, ...  % 最多迭代的epoch数
        'MiniBatchSize',64, ...  % 每个epoch迭代的batchsize

             'Plots','training-progress')

    'Plots'设置为'training-progress'时有下图

    4.5.2  任务2:设置初始学习率

    学习率控制算法改变网络权重的幅度。迁移学习的目标是对现有的网络进行微调,因此通常希望更改权重,而不是像从头开始训练时那样大刀阔斧。

    opts = trainingOptions('sgdm','Name', value)  % 指定训练选项的名称'Name'和值value(相当于字典的键值对)

    opts = trainingOptions('sgdm', 'InitialLearnRate', 0.001)

    4.6 训练网络

    4.6.1  mini-batch

    mini-batch是指在每一次迭代过程中,用到的部分训练集。每次迭代都会使用不同的mini-batch。当整个数据集都被使用过一次后,这样的一个周期称为epoch。训练多少个周期可以通过设置'MaxEpochs'来实现。

    值得注意的是,损失和准确率是针对当前的mini-batch而言的,而非整个训练集的平均

    默认在划分mini-batch之前,通常会对数据集进行洗牌,你可以通过shuffle选项来设置。

    4.6.2  使用GPUs

    GPU可以显著提高深度学习的计算性能。如果你的计算机不支持GPU的话,MATLAB将会在CPU上执行训练过程,不过这会花费大量的时间。

    4.6.3  迁移学习示例(脚本)

    • 获取训练图像

    flower_ds = imageDatastore('Flowers','IncludeSubfolders',true,'LabelSource','foldernames');

    [trainImgs,testImgs] = splitEachLabel(flower_ds,0.6);

    numClasses = numel(categories(flower_ds.Labels));  % 这句话是前面没有的,目的是取类别数。numel表示取数组的元素数目,categories返回一个字符向量元胞数组,其中包含分类数组的类别。

    • 创建一个修改后的Alexnet

    net = alexnet;

    layers = net.Layers;

    layers(end-2) = fullyConnectedLayer(numClasses);

    layers(end) = classificationLayer;

    • 设置训练算法选项

    options = trainingOptions('sgdm','InitialLearnRate', 0.001);

    • 执行训练

    [flowernet,info] = trainNetwork(trainImgs, layers, options);  % flowernet是训练后的网络(具有新的参数)info是训练信息(包含训练损失、准确率等信息)

    • 使用训练网络去分类测试图像

    testpreds = classify(flowernet,testImgs);

    4.7 评估性能

    4.7.1  评估训练和测试性能

    4.7.1.1  任务1:画出训练损失(位于info的TrainingLoss中)

    load pathToImages

    load trainedFlowerNetwork flowernet info

    plot(info.TrainingLoss)

    4.7.1.2  任务2:分类图像

    dsflowers =imageDatastore(pathToImages,'IncludeSubfolders',true,'LabelSource', 'foldernames');

    [trainImgs,testImgs] = splitEachLabel(dsflowers,0.98);

    flwrPreds = classify(flowernet,testImgs)

    4.7.2  调查测试性能

    4.7.2.1  任务1:提取测试数据集的标签

    load pathToImages.mat

    pathToImages

    flwrds = imageDatastore(pathToImages,'IncludeSubfolders',true,'LabelSource', 'foldernames');

    [trainImgs,testImgs] = splitEachLabel(flwrds,0.98);

    load trainedFlowerNetwork flwrPreds

    flwrActual = testImgs.Labels  % trainImgs,testImgs是对数据存储进行划分得到的,所以它们具有数据存储的相关属性

    4.7.2.2  任务2:计算正确个数

    numCorrect = nnz(flwrActual == flwrPreds)  % nnz函数返回的是矩阵非零元素的数目,flwrActual == flwrPreds将得到一个0-1矩阵

    4.7.2.3  任务3:计算正确率

    fracCorrect = numCorrect/numel(flwrPreds)  % 就是正确个数除以测试数据的个数

    上面的计算有些麻烦,先改写为:

    mean(flwrActual == flwrPreds)

    4.7.2.4  任务4:显示预测分类的混淆矩阵

    混淆矩阵又称误差矩阵,矩阵中的元素(j,k)表示第j个类被预测为第k个类的数目,主对角线的元素表示正确预测,其余元素表示误分类。

    confusionchart(knownclass,predictedclass)  % 第一个参数为已知类,即flwrActual;第二个参数为预测类,即flwrPreds

     

     

     

     

     

     

     

     

     

     

     

     

    展开全文
  • 高斯过程(GP)模型是非参数贝叶斯回归的一种灵活方法。然而,在大数据中使用GP模型的大多数现有工作都是为单变量输出时间序列定义的,称为单任务GPs (single-task ...多任务高斯过程模型 Matlab工具箱 (包括多个例子)
  • 用高斯过程实现贝叶斯分类中描述的拉普拉斯近似,用于二元和多类分类。
  • 介绍matlab如何实现机器学习及深度学习过程,pdf内有连接的学习代码示例
  • 高斯过程模拟器 (GPE) 是一种机器学习方法,它使用该模型的训练运行来复制计算要求高的模型。 构建这样的代理非常具有挑战性,在贝叶斯推理的背景下,训练运行应该得到很好的投资。 当前的论文提供了对伴随贝叶斯...
  • 为了说明训练过程,本示例将训练SegNet,一种用于图像语义分割的卷积神经网络(CNN)。用于语义分割的其他类型网络包括全卷积网络(FCN)和U-Net。以下所示训练过程也可应用于这些网络。本示例使用来自剑桥大学的CamVid...
  • matlab官方中文进行深度学习指导说明书,讲述了整个搭建过程及基本的概念逻辑等,图文并茂,讲述的比较详细
  • 该资源可直接在MATLAB上运行,实例文件是MDP_main.m,子文件包括基于策略和基于价值的方法,供各位参考学习
  • Matlab示例:Matlab各种学习案例
  • 精选答疑筛选出读者在学习过程中经常遇到的问题,配合习题进行解答。本书包含大量的例题,建议读者先自行完成例题,然后参考例题解析,配合代码的注释,分析比较程序代码。这样边学边练,可以进一步牢固地掌握GUI...
  • mdp(马尔科夫过程)的MATLAB代码,马尔可夫决策过程(Markov decision processes)matlab程序,m文件,从工具箱中调用,有英文说明。本人亲测,程序可用,结果正确。
  • MATLAB学习心得~

    千次阅读 多人点赞 2014-08-17 00:16:13
    Matlab是一个基于矩阵运算的软件,这恐怕是众所周知的事情了,但是,真正在运用的时候(就是在编程的时候),许多人(特别是初学者)往往没有注意到这个问题,因此,for循环(包括while循环)满天飞………….....

    Matlab是一个基于矩阵运算的软件,这恐怕是众所周知的事情了,但是,真正在运用的时候(就是在编程的时候),许多人(特别是初学者)往往没有注意到这个问题,因此,for循环(包括while循环)满天飞…………..这不仅是暴殄天物(没有发挥matlab所长),还浪费了你宝贵的时间。对此,版友MVH在他的“MATLAB 小技巧”一文中也有所涉及,雷同的东西我也就不重复了,matlab的“帮助”里面也有相关的指示。我这里想说的一点是,初学者往往在初始化矩阵的时候注意到这个问题,懂得了使用矩阵而不是循环来赋值,但是,在其他环节上,就很容易疏忽,或者说,仍然没有摆脱C++的思想。举个例子吧,下面的代码是我的一个师弟写的,我想他接触matlab也有2、3年时间了(在此说明一下,接触2、3年并不是表示每天都会跟matlab打交道,我本人也不是,只是在一年某几个时间段里面连续使用),但是仍然会出现类似的问题:

    J = 0;

    lt = size(imf1,2);

    for (i = 1:lt)

         if (abs(imf1(i)) > 1)

             J = 1;

             break

         end

    end

    上面的代码实现了一个目的――检查信号imf1(一个向量)是否存在绝对值大于1的点,这显然是基于C++的思想写出来的。如果在matlab下面,其实用两个语句就足够了(当然,可以合并为一个):

    q = find(imf1>1);

    J = ~isempty(q);

    这样的修改带来的好处是很可观的。

    又如:

    for j = 1:num

         imf1(start1+j) = 2*li1(j+1) - imf1(start1+j);

    end

    这是一个对称翻折的问题,它完全可以用以下这个语句简洁表示:

    imf1(start1+1:start1+num) = 2*li1(2:num+1) - imf1(start1+1:start1+num);

    因此,如果是新手,可以先用循环(基于C++的思想)来编写代码,然后看看能否用matlab的语言(基于矩阵的思想)来改进。当然,这样做的前提是你对matlab提供的一些函数比较熟悉才行,这些函数在matlab的“帮助”那里搜索“Functions Used in Vectorizing”就可以找到一些,其他的也可以找相关的书籍(没找到?不可能,电子版总可以下载到的)

    对提高matlab编程能力的方法,我想主要有以下三个:

    1. 查help

    2. 多上上论坛,搜索帖子、发帖子问人

    3. 阅读别人、特别是牛人的程序

    当然了,正如所有的程序语言一样,“3分课本7分上机”,一定要动手才行,不能光看。多想、多思考、多尝试,才是正路。以下技巧就是平日动手编程、阅读别人的帖子后整理出来的(不断添加中):

    1. matlab的运算是基于矩阵的,但是也提供了对应元素的运算,即在运算符前面加上“点”。例如:

    >> a = [1,2;3,4]

    a =

          1      2

          3      4

    >> b = [-1,-2;-3,0]

    b =

         -1     -2

         -3      0

    >> a * b

    ans =

         -7     -2

        -15     -6

    >> a .* b

    ans =

         -1     -4

         -9      0

    也就是说,没有加“点”的运算是对整个矩阵而言的,称为矩阵运算(整体运算),而加了“点”的运算是对每个元素而言的,称为点运算(局部运算)。另外,一般情况下,matlab作点运算(理解为左右两个对象(矩阵)的对应元素参与该运算)时,两个矩阵的维数和长度都要求是同大小的,且此时要在运算法前面添加“点”,但是在某些情况下该“点”可以省略,例如一个标量a和一个向量b(或者矩阵)相加、相减、相乘、b/a时都可以不需要加点,表示b中每个元素都和a进行运算(即点运算的效果)

    2. 强烈建议大家在命名自己的函数名(更加准确应该说m文件名)时,在名称前面加上 my 等个人专用标识,即假如你要把你的函数命名为conv,则最好写成 myConv,否则容易与matlab自带的函数(m文件)名字重复而导致“Attempt to execute SCRIPT conv as a function”的错误!当你碰到这个错误时,可以在命令窗口中输入 which conv all 来看看到底有否重复命名了该函数,有的话,建议把自己命名的文件改名,保留 matlab 自带的文件。

    3. 条件判断中,y==0, a-b==0这类语句应该尽量减少使用,除非你可以保证y、a、b在整个计算过程中是整数,否则两个浮点数相减、或者一个浮点数不可能完全等于0

    4. 循环变量递减时必须显式给出步长,即 i = 5:-1:-5 (假设步长为-1),如果递增时且步长为1,则可以省略,简写作 i = -5:5

    5. 在引号环境下的语句中,如果需要使用单引号,则要写成两个单引号的形式,不能用一个双引号代替!例如: ...'callback','[imp,Fs,bits]=wavread(''temp.wav'');'   文件名 temp.wav 外面的是两个单引号

    6. 如果你编写的函数带有输入参数(例如 x ),则跟其他语言一样,这只是形式参数,所以不能通过直接运行该函数(或者m文件)来测试,这样会出现 ??? Input argument "x" is undefined. 的错误。一定要从其他地方(如命令窗口或者其他函数对其调用)来传递真实值,此时 x 才是实际参数。如果你有C语言的编程经验,命令窗口就相当于main函数;如果没有,以下是举例:

    myPlus.m:

    [Copy to clipboard] [ - ]CODE:

    function d = myPlus(a,b)

    d = a + b;

    命令窗口:

    [Copy to clipboard] [ - ]CODE:

    >> x = 2;

    >> y = 5;

    >> z = myPlus(x,y)

    此外,和每一种编程语言一样,所有定义的变量都有一定的作用域。虽然matlab 宣称变量不需要定义即可以直接使用,但是,事实上一个简单的赋值语句便包含定义+初始化了,因此,如果直接使用未定义的变量(最常用的是在“=”右边首次出现),则会出现“Undefined function or variable” 的错误!例如:

    [Copy to clipboard] [ - ]CODE:

    function y = myTest(x)

    z = x * 2;

    z = t + z;

    则运行时 matlab 会报错:Undefined function or variable t !

    因此,强烈建议在使用变量之前(特别是循环中使用数组),先预分配空间,这样容易减少很多莫名其妙的错误,具体做法参见以下图片:

    preallocate.bmp (222.48 KB)

    2007-5-18 10:55

    7. 如何调试程序:编好程序,设置断点(m文件编辑窗口中菜单 Debug 有 Set/Clear breakpoint),运行程序(菜单 Debug 有 Run 或 Save & Run)

    8. 对于matlab自带函数(命令)的问题,请多利用matlab的帮助功能。即在命令窗口中输入: help eval 或者 doc eval。更多的帮助指令请参阅以下链接的帖子:[转帖]MATLAB中的帮助指令

    9. 对于 mat 文件的读取,由于存放的是结构体数组,因此调用 A = load('*.mat') 后,得到的 A 并非原始数据,而是一个结构体,此时需要使用".域名" 才能正确得到数据,例如:

    [Copy to clipboard] [ - ]CODE:

    A =load('*.mat');

    后得到:

         A =

               Signal: [85x7794x64 single]

           TargetChar: [1x85 char]

             Flashing: [85x7794 single]

         StimulusCode: [85x7794 single]

         StimulusType: [85x7794 single]

    则用:

    [Copy to clipboard] [ - ]CODE:

    B = fieldnames(A);

    可得到各结构体的域名。

    如果要获得各域中(下以 Signal 为例)的数据,必须用:

    [Copy to clipboard] [ - ]CODE:

    S = A.(B{1});

    此外,不建议使用 load *; 这种方式读取 mat 文件(读取 dat 等其他格式的文件也是类似),因为此时读取后的变量名是存储时设定的,假若文件并非您本人存储,则无法获悉这个变量名,通过这种方式是无法在读取时候指定数据存放在哪个变量中的,这样将会导致下文不知道使用哪个变量名,甚至会导致出错!因此,强烈建议采用A = load('*.mat'); 方式进行读取,当然了,如果文件是您本人存储的,则用前面的方式比较简便,这另当别论。下面以 dat 文件作为例子说明:

    clear all

    >> a = magic(4);   b = ones(2, 4) * -5.7;   c = [8 6 4 2];

    >> save -ascii 1_data.dat

    >> load 1_data.dat

    因为这种方式的读取是把数据默认存放在以“不含后缀的文件名”命名的变量中(这里为 1_data),但是由于 1_data 不是合法的标识符,因此 matlab 自动改成 X1_data(不同版本的matlab可能不同),即读取出来的数据事实上是存放在 X1_data 变量中。如果使用 m 文件方式编程(即 load 1_data.dat 后有分号),则这个变量名根本不会显示出来,也就是说,对它的改名你是毫不知情的,这时候下文继续使用 1_data 的话,就会产生错误。

    10. matlab 对中文的文件路径(不光是文件名)不太支持,特别是 6.5 版本。

    最后,整理一下常用的快捷键(用【】表示)或命令:

    1. 在命令窗口(Command Window)中:

    1) 【上、下键】――切换到之前、之后的命令,可以重复按多次来达到你想要的命令

    2) clc――清除命令窗口显示的语句,此命令并不清空当前工作区的变量,仅仅是把屏幕上显示出来的语句清除掉

    3) clear――这个才是清空当前工作区的变量命令,常用语句clear all来完成

    4) 【Tab】键――(转自版友心灯)在matlab@hit.edu.cn看到的:在command窗口,输入一个命令的前几个字符,然后按tab键,会弹出前面含这几个字符的所有命令,找到你要的命令,回车,就可以自动完成。目前讨论结果是:matlab6.5版本中,如果候选命令超过100个,则不显示。而在matlab7以后版本中,则没有这个限制,均可正常提示

    5) 【Ctrl+C】(或【Ctrl+Break】)――(转自版友yangjin_ren)在matlab程序运行过程中,可能由于程序编写的失误,导致程序不停的运行,在命令窗口输入“Ctrl+C”可以将运行的程序停下来,而不需要将整个Matlab程序关掉。不过进行此操作的前提是能够激活切换到命令窗口才行,呵呵。

    2. 在编辑器(Editor)中:

    1) 【Tab】(或【Ctrl+]】)――增加缩进(对多行有效)

    2) 【Ctrl+[】--减少缩进(对多行有效)

    3) 【Ctrl+I】--自动缩进(即自动排版,对多行有效)

    4) 【Ctrl+R】――注释(对多行有效)

    5) 【Ctrl+T】――去掉注释(对多行有效)

    6) 【Ctrl+B】――括号配对检查(对版本6.5有效,但版本7.0以上无效,matlab把这项功能自动集成到编辑器里面了,即在m文件编辑窗口中会自动进行括号配对检查,并在窗口右侧有红橙绿三灯提示,具体请参考以下帖子:http://www.simwe.com/forum/thread-746722-1-4.html

    7) 【F12】――设置或取消断点

    8) 【F5】――运行程序

    其余的例如在Debug状态下的快捷键就不多说了,自己看菜单Debug吧

    展开全文
  • a)Rasmussen和Williams的书:“高斯机器学习过程”,麻省理工学院出版社,2006年 b)Nickisch和Rasmussen的文章:“二元高斯过程分类的近似”,JMLR 2008 c)Candela和Rasmussen的文章:“稀疏近似高斯过程回归的...
  • 多任务高斯过程matlab代码多任务高斯过程 (MTGP) 实现了 Bonilla 等人的多任务模型 [1] 作者 埃德温诉博尼利亚 要求 你需要在你的 matlab 路径中有 gpml matlab 包。 您可以在以下位置下载它 请注意,这是 gpml ...
  • Matlab软件在高中数学圆锥曲线学习过程中的应用.pdf
  • 经典蝙蝠算法MATLAB实现

    万次阅读 多人点赞 2019-02-24 21:19:42
    BA算法的仿生原理将种群数量为的蝙蝠个体映射为D维问题空间中的NP个可行解,将优化过程和搜索模拟成种群蝙蝠个体移动过程和搜寻猎物利用求解问题的适应度函数值来衡量蝙蝠所处位置的优劣,将个体的优胜劣汰过程类比为...
  • 主要介绍了基于python实现matlab filter函数过程详解,文中通过示例代码介绍的非常详细,对大家的学习或者工作具有一定的参考学习价值,需要的朋友可以参考下
  • Matlab实现人脸识别

    万次阅读 多人点赞 2018-06-13 21:35:23
    最近在学习matlab图像处理部分,发现人脸识别这一块非常好玩,在这里做个总结。人脸识别之一:查找图片中的人脸并用方框圈出 这种类似于智能手机拍照时,屏幕里那个框任务头部的红框。大致步骤为:获取RGB图片---&...
  • 基于matlab的深度学习的视觉场景识别,本实验选择经典的Corel图像库,基于注明的matconvnet工具箱进行深度学习实验,包括工具箱配置、训练集制作、模型设计、训练和识别验证等过程,可应用于视觉场景分类识别,仿真...
  • 深度学习matlab源码

    2016-01-27 20:24:29
    本资源是深度学习autoencoder模型基于matlab的实现代码,该模型前半部分是数据编码(即数据的降维过程),后半部分是解码(即原始数据的恢复过程,用来计算重构误差),在网络初始化阶段采用RBM,参数调优过程采用的...

空空如也

空空如也

1 2 3 4 5 ... 20
收藏数 39,866
精华内容 15,946
关键字:

matlab学习过程

matlab 订阅