MATLAB加速技巧

2023-05-16

1. 向量化

目的:减少for循环的使用

`
%nonVecl.m
clear all;
tic

A=0:0.000001:10;
B=0:0.000001:10;

Z=zeros(size(A));
y=0;
for i=1:10000001
    Z(i)=sin(0.5*A(i))*exp(B(i)^2);
    y=y+Z(i);
end
toc
y
`

nonVecl.m文件使用的是for循环求和。
下面是具有相同功能的Vecl.m文件:
%Vecl.m

clear all;
tic

A=0:0.000001:10;
B=0:0.000001:10;

Z=zeros(size(A));
y=0;

y=sin(0.5*A)*exp(B.^2)';

toc
y

计算结果

2.上下边界提取

当对每个元素设定上下边界时,用min和max代替if和elseif ,防止向量化被破坏。
% ifExample.m

clear all;
tic;

A=0:0.000001:10;
B=0:0.000001:10;

Z=zeros(size(A));
y=0;

for i=1:10000001

    if(A(i)<0.1) A(i)=0.1;
    elseif (A(i)>0.9) A(i)=0.9;
    end

    Z(i)=sin(0.5*A(i))*exp(B(i)^2);
    y=y+Z(i);    
end
toc
y

用min和max代替if(A<0.1)和if(A>0.9)

%nonifExample.m

clear all;
tic

A=0:0.000001:10;
B=0:0.000001:10;

Z=zeros(size(A));
y=0;

A=max(A,0.1);
%max(A,LowerBound)
%A>=LowerBound

A=min(A,0.9);
%min(A,UpperBound)
%A>=UpperBound

y=sin(0.5*A)*exp(B.^2)';

toc
y

加速结果如下:
这里写图片描述

用find代替if(A==0.5):

if(A(i)==0.5) A(i)=0;
end

find加速:

A(find(A==0.5))=0;

3.内存预分配

调整数组大小都涉及到内存的释放或分配、数值的复制,极浪费时间。可以通过预分配内存获得加速。

%preAlloc.m
%Resizing Array

tic

x=8;
x(2)=10;
x(3)=11;
x(4)=20;

toc

%pre-allocation
tic

y=zeros(4,1);
y(1)=8;
x(2)=10;
x(3)=11;
x(4)=20;

toc

实验结果:
这里写图片描述

4.列循环嵌套

不可避免的for-loop循环,优先用列循环嵌套
行读取:

%row_first.m

clear all;

A=rand(300,300,40,40);
B=zeros(300,300,40,40);

tic
for i=1:300
    for j=1:300
        B(i,j,:,:)=2.5*A(i,j,:,:);
    end
end
toc

列读取:

%col_first.m

clear all;

A=rand(300,300,40,40);
B=zeros(300,300,40,40);

tic
for j=1:300
    for i=1:300
        B(i,j,:,:)=2.5*A(i,j,:,:);
    end
end
toc

结果:
这里写图片描述
分析:可能跟列存储机制有关,同列数据在相邻的地址。

5.稀疏矩阵

对于数据稀疏的矩阵,矩阵类型转化为稀疏矩阵,矩阵越稀疏效率越高。密集矩阵转化为稀疏矩阵运算需要花费更多的时间。
密集矩阵:

%DenseSparse.m
%Dense matrix
A=rand(5000,2000);
b=rand(5000,1);

tic
x=A\b;
toc

%Convert to sparse form in MATLAB
sp_denseA=sparse(A);

tic 
x=sp_denseA\b;
toc

稀疏矩阵:

%RealSparse.m
%Sparse matrix
sp_A2=sprand(5000,2000,0.2);
b2=rand(5000,1);

%Convert sparse matrix to full matrix
full_A2=full(sp_A2);

tic
y=full_A2\b2;
toc

tic
y=sp_A2\b2;
toc

运算结果:
这里写图片描述
对于密集的矩阵,用密集矩阵运算更快,用稀疏矩阵反而慢;对于稀疏的矩阵,用稀疏矩阵运算更快。

6.减少文件读写、设置路径和改变变量类型

文件读写、设置路径、改变变量类型需要花费大量的时间,在循环中,最好放在循环之外

本文内容由网友自发贡献,版权归原作者所有,本站不承担相应法律责任。如您发现有涉嫌抄袭侵权的内容,请联系:hwhale#tublm.com(使用前将#替换为@)

MATLAB加速技巧 的相关文章

随机推荐

  • c# 接口

    1 接口的特点 接口的定义是指定一组函数成员而不实现成员的引用类型 xff0c 其它类型和接口可以继承接口 定义还是很好理解的 xff0c 但是没有反映特点 xff0c 接口主要有以下特点 xff1a span class token pu
  • 在linux上增加swap交换空间

    在虚拟机里面安装oracle11g grid时 发现之前分配的swap交换空间不满足oracke gi安装的最低要求 xff0c 因为我分配的物理内存是8G xff0c 那么就按照要求需要8 12G的swap交换空间 xff0c 而我分配的
  • Elasticsearch7.6.1安装报错及解决过程

    Windows环境Elasticsearch7 6 1安装报错及解决过程 Elasticsearch是一个基于Lucene的搜索服务器 第一次安装ES7 6 1 xff0c 过程中遇到了一些报错 xff0c 把解决方法列出来 xff0c 总
  • 我的 Ubuntu 装机必备软件

    文章目录 我的 Ubuntu 装机必备软件Ubuntu的安装u盘制作添加中科大镜像源NVIDIA显卡驱动的安装卸载旧显卡驱动 安装sogou输入法下载安装配置 安装gitROS kinetic installationgoogle chro
  • GCC源码分析(十三) — 机器描述文件

    版权声明 xff1a 本文为CSDN博主 ashimida 64 的原创文章 xff0c 遵循CC 4 0 BY SA版权协议 xff0c 转载请附上原文出处链接及本声明 原文链接 xff1a https blog csdn net lid
  • VNC登录报错too many security failures解决方法

    桌面进程编号为1 xff0c 可以通过使用 sudo vncserver kill 1 sudo vncserver 1 杀掉并重启解决
  • tensorflow模型保存、读取与可训练参数提取

    一 保存 读取说明 我们创建好模型之后需要保存模型 xff0c 以方便后续对模型的读取与调用 xff0c 保存模型我们可能有下面三种需求 xff1a 1 只保存模型权重参数 xff1b 2 同时保存模型图结构与权重参数 xff1b 3 在训
  • pytorch------cpu与gpu load时相互转化 torch.load(map_location=)

    将gpu改为cpu时 xff0c 遇到一个报错 xff1a RuntimeError Attempting to deserialize object on a CUDA device but torch cuda is available
  • 优化OpenCV视频的读取速度

    我们使用Opencv读取视频时 xff0c 常规的做法是使用read 函数逐帧读取 xff0c 如 code import cv2 cap 61 cv2 VideoCapture 34 test mp4 34 while True read
  • 图像信噪比SNR求解

    xff08 xff08 通常也采用图像信号与噪声的方差之比来近似估计图像的信噪比 xff09 xff09 利用OpenCV计算灰度图像的峰值信噪比 xff08 PSNR xff09 计算两灰度图像之间的峰值信噪比 cpp view plai
  • Jetson TX1启动自带的摄像头

    最近在使用NVIDIA的Jetson TX1开发板 xff0c 并对开发板上自带的摄像头进行了测试 xff0c 下面将测试过程中所使用的一些指令做一些记录 xff0c 在终端上输入 xff1a nvgstcapture 1 0即可打开板子上
  • 判断用new申请内存是否成功

    c 43 43 申请大的内存空间 xff08 如何判断失败 xff09 我想用new申请一个特别大的空间 xff08 多大都可以 xff09 xff0c 主要是我不能判断到底是成功还是失败 假如我这样写 int p i 61 new int
  • 图像对比度计算

    matlab中求解方式 xff1a 计算图像对比度 方法一 xff1a 中心像素灰度值与周围4近邻像素灰度值之差的平方之和 xff0c 除以以上平方项的个数 functioncg 61 duibidu4 f f为输入图像 xff0c cg为
  • 图片占内存容量计算公式

    1 图片占内存容量计算公式为 xff1a 图片所占内存大小 61 图片长度 xff08 像素 xff09 图片宽度 xff08 像素 xff09 一个像素所占内存空间 xff08 单位 xff1a 字节 xff09 一般地 xff0c 一个
  • OpenCV学习:fastAtan2函数解密

    OpenCV学习 xff1a fastAtan2函数解密 高中数学中各种正弦函数 xff0c 余弦函数总是把人搞得头大 xff0c 但是具体应用时你会发现 xff0c 其实你只需要搞清楚一个2 空间内函数分布即可 下面分析OpenCV中fa
  • ubuntu 下安装NVIDIA显卡驱动出现X service error问题解决方法

    34 You appear to be running an X server 34 的解决方法 xff1a 在安装过程中出现了这个问题 xff0c 我在刚刚看到的教程 xff08 http wenku baidu com link url
  • 移动硬盘提示磁盘结构损坏且无法读取怎么办

    移动硬盘出现 磁盘结构损坏且无法读取 xff0c 1 突然关机 xff1b 2 硬盘没有正常通过系统卸载 xff1b 3 病毒破坏 xff1b 4 有可能是usb供电不足 xff1b 5 也可能是文件丢失 xff1b 6 还可能是盘片损坏
  • windows下pycharm中安装和使用tensorflow

    配置 xff1a win7 43 cuda8 0 43 vs2015 43 cudnn6 0 43 python3 5 43 tensorflow1 4 43 pycharm 大体思路是 xff1a 先安装vs2015 再将cudnn6 0
  • 程序员常用网站

    1J2me 开发网 http www j2medev com bbs index asp 2J2me 社区 http www j2meforums com forum 3csdn http www csdn net 4Vc 知识库 http
  • MATLAB加速技巧

    1 向量化 目的 xff1a 减少for循环的使用 96 nonVecl m clear all tic A 61 0 0 000001 10 B 61 0 0 000001 10 Z 61 zeros size A y 61 0 for