tag 标签: matlab

相关帖子

版块 作者 回复/查看 最后发表
请教matlab无放回随机抽样 MATLAB 数学、统计与优化 wqp89324 2012-1-31 8 11260 zega15 2014-4-17 15:39
matlab求最大值问题 MATLAB 基础讨论 lancelot9234 2012-1-26 2 3205 WHUT小王 2012-2-2 19:38
【请教】数据保存问题——带括号,数据列数不一样 attach_img MATLAB 基础讨论 欧拉 2012-1-26 0 2452 欧拉 2012-1-26 11:51
matlab编程中遇到问题,请求解 MATLAB 并行计算 annylsxy 2012-1-26 5 2986 meatbird 2012-2-6 11:45
求助:matlab三维图像怎么保存成tiff图片 MATLAB 图像处理与计算机视觉 sc527 2012-1-27 2 2965 xinyangq 2013-1-1 23:25
求助mac下如何安装matlab MATLAB 基础讨论 lyastc 2012-1-27 2 4603 blueskyjiangzhe 2012-4-15 19:21
转向的matlab的最小二乘优化 MATLAB 数学、统计与优化 sn4187189 2012-1-27 1 3136 sn4187189 2012-1-27 15:02
菜鸟求助:这个方程能用matlab解么 MATLAB 数学、统计与优化 sc527 2012-1-28 1 2911 WHUT小王 2012-2-2 19:30
跪求改进的FCM算法,用于彩图和灰度图像的matlab源代码。 会议&论文 pli210 2012-1-28 2 4376 余胜威 2016-3-6 11:54
matlab中如何实现用图像显示读取的数据? MATLAB/Simulink 项目外包 huangminbigc 2012-1-28 5 4458 简单吟唱 2013-6-13 16:56
求matlab滤波器设计中衰减和波纹的含义 attach_img MATLAB 信号处理与通信 nimingzhe2008 2012-1-29 1 3385 baiwei19890914 2013-3-10 01:14
matlab 2010b版本64位的ActiveX控件和书上不同? attach_img 《MATLAB GUI设计学习手记》含第二、三版 wuqian4139 2012-1-29 3 4270 dongshaofeng 2012-8-28 10:14
求助matlab球转换面 MATLAB 数学、统计与优化 hemiro 2012-1-29 0 1921 hemiro 2012-1-29 21:44
请教matlab向量化问题 MATLAB 基础讨论 lqshera 2012-1-30 2 4242 lqshera 2012-1-30 13:54
如何减少Matlab通过采集卡输入输出的耗时 MATLAB 测试&测量 alberich 2012-1-30 1 2680 雪_真落 2012-12-7 08:21
信号采样,滤波器设计用matlab如何编程 MATLAB 信号处理与通信 Apirl 2012-1-30 6 3920 1831249703qaz 2014-5-5 22:19
在用matlab做com组建出错 MATLAB 基础讨论 omig001 2012-1-30 0 1597 omig001 2012-1-30 21:57
请教matlab如何从网络接收文件 MATLAB 基础讨论 lqshera 2012-1-31 3 3194 爱问功夫 2013-3-9 13:17
matlab真奇了怪了,a quick question MATLAB 基础讨论 台风眼 2012-1-31 5 2686 gxtzhuxi 2012-2-6 00:44
急征高人解matlab积分 MATLAB 基础讨论 hola11 2012-1-31 1 2082 hola11 2012-1-31 15:01

相关日志

分享 matlab中for循环改矢量运算的技巧
热度 1 halleyhit 2018-7-5 14:17
前言:这是一个很有matlab特色的事情,matlab的for循环实在很慢,而矢量(矩阵)运算又很快,因此很多时候,可以对代码进行优化,尽可能去掉for循环。本篇将讨论for循环能否去掉,以及如何去掉。 1.概念 for循环:语法在最基础教程中已经说过,这里仅举一例 for i=1:3 a(1,i)=i^2; end 最后获得一个向量a= 矢量运算:语法见最基础教材中的赋值和数值型变量运算部分,这里同样举一例 a= .^2 获得同样的计算结果a= 2.去掉for循环的前提 如果需要的结果(一个矩阵或向量),每个元素有通项公式,则可以去掉for循环。反之,若每个元素只有递推公式,则不可以去掉for循环。 这里结合几个通项公式的例子进行说明: 1)向量,a(i)=i^2 与上一部分的例子一样,可以矢量运算去掉for循环 2)向量,a(i)=i^2*(i2)+i*(i=2) 这个是if的矢量化,只要if判据可以写成通项公式,则依然可以用矢量运算 a0= a=a0.^2.*(a02)+a0.*(a0=2) 这里a02的逻辑运算,语法规则是:a0是矩阵,与1*1元素进行比较,则返回结果是与a0同维度矩阵,元素为a0元素单独逻辑计算的结果。 3)向量,a0=1:n,a(i)=a0(i)-a0(i-1) 这里,a0是一个已知的向量,需要基于a0,计算一个向量a,而a的通项公式是与a0有关的。更特别的是,a(i)的计算中,不仅与a0(i)有关,还与前一项有关,当然这里仅计算a(2)到a(n),a(1)我们强制定义成0。则这样的算法可以去for循环,写成 n=3 a0=1:n a= 当然,对数值运算熟悉的用户,也可以直接写成a= 4)矩阵,灰度图像均值5格滤波 简单说,灰度图像可以表示为一个矩阵,矩阵中每个点表示一个像素的灰度,然后这些像素排列在一起就是一副图像了。有一种简单的滤波,其算法是将图像中的每一个像素,与该像素相邻的上下左右四个像素,一共五个像素的灰度取平均值,然后作为滤波后图像在该位置的灰度。当然,对图像最靠边的一行或列,因为相邻像素不足4个,所以可以不进行滤波计算。这样的算法当然可以写成for循环: n=5 A=rand(n,n) %假定图片A的大小是n*n B=A %假定滤波后的图片为B,由于边缘无需滤波,所以直接赋值,后续for循环修改非边缘值 for i=2:n-1 for j=2:n-1 B(i,j)=0.2*(A(i,j)+A(i-1,j)+A(i,j-1)+A(i+1,j)+A(i,j+1)) end end 而此时,我们注意到B(i,j)=那行,其实正是通项公式,于是就可以进行矢量化 B(2:n-1,2:n-1)=0.2*(A(2:n-1,2:n-1)+A(1:n-2,2:n-1)+A(2:n-1,1:n-2)+A(3:n,2:n-1)+A(2:n-1,3:n)) 3.去掉for循环的方法 从上述例子中,我们也可以总结出去掉for循环的方法,大概的步骤如下: 1)写出通项公式 2)将通项公式中的循环变量i或j等,替换成1:end 3)如果通项公式中有循环变量i,使用等差数列赋值1:n代替,比如例子1。对于多个循环变量,代替时需要repmat。 4)由于matlab矩阵索引中,1:end可以直接写成冒号,尤其是,如果被索引的是向量,则只有一个维度,有没有冒号都一样,所以此时就成了例子2的情况。 5)对于通项公式中,索引中有类似i+1这类的情况,则计算结果不可能全部用通项,肯定有边缘部分是另外的,如例3的情况。 6)对于通项公式中,索引中有类似i+1这类的情况,则通项公式中,左侧需要新的索引,右侧的索引也同样变更,如例4的情况。 4.不能去掉for循环的情况 很明显,不能写成通项公式,即不满足前提条件,那么就只能for循环了。这里需要对“没有通项公式”做一点说明,没有的意思,一种是真的没有,另一种是很难获得。比如斐波那契数列,递推公式很容易写成for循环,但通项公式就很复杂了,所以有时会选择用for循环而放弃矢量运算。还有一种情况是if的条件非常复杂,如果写成通项公式会很麻烦,也会考虑用for循环去做。对于真的没有通项公式的,那就不必多言了。 5.后序 去掉for循环,需要用户对matlab的矩阵运算非常熟悉,这或许才是真正的“前提”吧
个人分类: 新分类|801 次阅读|1 个评论
分享 MATLAB算法加速技术
热度 4 柚籽 2014-7-14 16:12
算法加速方法很多,看你的编程经验如何了,或者是你用了怎样的算法,硬件。 文章: http://www.mathworks.cn/discovery/matlab-acceleration.html?s_v1=804elq_cid=1591528 Top 5 使用高效的编程方式 - 预定义存储空间与向量化编程 It’s a good practice to optimize your serial code for performance before considering other approaches. Two effective programming techniques for MATLAB acceleration are preallocation and vectorization . 使用优化的算法版本 - 如专门工具箱 MATLAB and related toolboxes have already been optimized for performance. For example, System objects are object-oriented implementations of MATLAB algorithms that can accelerate MATLAB code, particularly for signal processing and communications applications. 使用并行运算 Multicore CPUs, GPUs , and clusters can accelerate MATLAB code. High-level parallel constructs in Parallel Computing Toolbox let you take advantage of high-performance hardware with minimal programming effort. The toolbox also enables the parallel computing support found in many functions and algorithms in MATLAB products. MATLAB代码生成C代码 - 运行速度更快 To accelerate some MATLAB algorithms, you can generate readable and portable C code and compile it into a MATLAB executable. Much of the MATLAB language and several toolboxes support code generation through MATLAB Coder . 以上结合 For some applications, you can combine these methods for additional MATLAB acceleration . 详情包括案例点击: http://www.mathworks.cn/discovery/matlab-acceleration.html?s_v1=804elq_cid=1591528 推荐案例: http://www.mathworks.cn/company/newsletters/articles/accelerating-matlab-algorithms-and-applications.html
个人分类: MATLAB|1498 次阅读|0 个评论
分享 matlab如何生成dll文件
热度 3 柚籽 2014-5-12 17:08
matlab如何生成dll文件
1. m脚本,保存为addmatrix.m文件: function a = addmatrix(a1, a2) a = a1 + a2; 2. 打开MATLAB Compiler: 从APP列表里找到,或者deploytool,选择shared library 3. 编译结束之后,在 \for_redistribution_files_only下 新建一个cpp文件: #include "addmatrix.h" int run_main(int argc, char **argv) { if (!mclInitializeApplication(NULL,0)) //初始化MCR运行环境 { std::cerr "could not initialize the application properly" std::endl; return -1; } if( !addmatrixInitialize() ) //初始化程序 { std::cerr "could not initialize the library properly" std::endl; return -1; } try { // 定义输入变量 double data[] = {1,2,3,4,5,6,7,8,9}; mwArray in1(3, 3, mxDOUBLE_CLASS, mxREAL); mwArray in2(3, 3, mxDOUBLE_CLASS, mxREAL); in1.SetData(data, 9); in2.SetData(data, 9); // 定义输出变量 mwArray out; // mwArray,是MATLAB所编译的代码所使用的类 // 作为MATLAB编译出来的代码的函数数据交换接口 // 调用dll函数 addmatrix(1, out, in1, in2); std::cout "The value of added matrix is:" std::endl; std::cout out std::endl; } catch (const mwException e) { std::cerr e.what() std::endl; return -2; } catch (...) { std::cerr "Unexpected error thrown" std::endl; return -3; } addmatrixTerminate(); //释放程序所使用的资源 mclTerminateApplication(); //释放MCR环境所使用的资源 return 0; } int main() { mclmcrInitialize(); //初始化MCR环境 return mclRunMain((mclMainFcnType)run_main,0,NULL); //新建一个线程运行程序 } 4. mbuild addmatrix.cpp addmatrix.lib Building with 'Microsoft Visual C++ 2010'. MEX completed successfully. 5. 运行addmatrix.exe
个人分类: MATLAB|1779 次阅读|0 个评论
分享 Matlab plot函数用法
热度 6 藤~~~ 2013-8-21 16:48
1 plot ( x ): x 为长度为 n 的数值向量,坐标的纵坐标是向量 x ,横坐标为 matlab 系统根据 x 向量的元素序号自动生成的从 1 开始的向量。 2 plot ( x , y ): 纵坐标是 y ,横坐标是 x 。 x , y 向量的数目必须相等。 3 axis ( ) :设定坐标轴的范围。 4 plot ( x ): x 为 m*n 的矩阵, plot(x) 命令为矩阵的每一列画出一条线,共 n 条,曲线的横坐标为向量 1 : m , m 是矩阵的行数。 5 plot(z): 可以复制复向量曲线它与( plot(real(z),imag(z)) 等效,以实部为横坐标,虚部为纵坐标。 6 plot(x1,y1,x2,y2...) : 绘制多条曲线 绘制图形的一般步骤: 1 曲线数据备份 对于二维曲线,横坐标和纵坐标数据变量; 对于三维曲面,矩阵参变量和对应的函数值 2 指定图形窗口和子图位置: 默认时,打开 Figure No.1 窗口或当前窗口,当前子图; 也可以打开指定的图形窗口和子图 3 设置曲线的绘制方式: 线型,色彩,数据点形 4 设置坐标轴: 坐标的范围,刻度和坐标分格 5 图形注释 图名,坐标名,图例,文字说明 6 着色,明暗,灯光,材质处理(仅对三维图形处理) 7 视点,三度(横,纵,高)比(仅对三维图形处理) 8 图形的精细修饰 (图形句柄操作): 利用对象属性值设置 利用图形窗工具条进行设置 说明: 1 ) 步骤 1 和 3 是最基本的绘图步骤, matlab 一般只需要这 2 步就可以绘制出图形。 2 )步骤 2 一般在图形较多的情况下,需要制定图形窗口,子图时使用。 3 ) 除了 1 2 3 的其他步骤,用户可以根据自己的需要改变前后次序。 多个图形绘制的方法: 1 指定图形窗口 需要多个图形窗口同时打开时,可以使用 figure 语句: figure ( n ): figure ( 1 ), figure ( 2 ) ... 2 同一个窗口多个子图 可以通过在 plot 命令前加上 subplot 命令来实现 subplot ( m,n,k) % 使 m*n 幅子图中的第 k 幅成为当前图 说明:将图形窗口划分为 m*n 幅子图, k 是当前子图的编号。 同一个窗口多次叠绘 为了在一个坐标系中增加新的图形对象,可以使用 hold 命令来保留原图形对象 hold on % 使用当前坐标系和图形保留 hold off % 使用当前坐标系和图形不保留 hold % 在以上 2 个命令中切换 说明:在设置了 hold on 后,如果画多个图形对象,则在生成新的图象时保留当前坐标系中已经存在的图象, matlab 会根据新图形的大小,重新改变坐标系的比例。 双坐标轴图 plotyy :实现同一图形中使用左,右双坐标来绘制曲线 plotyy ( x1,y1,x2,y2) % 以左右不同纵轴绘制 2 条曲线 说明:左纵轴用于( x1,y1) 的数据,右纵轴用于 (x2,y2) 数据来绘制 2 条曲线,坐标轴的范围可刻度都自动产生 曲线的线形,颜色和数据点形 颜色 数据点间连线 数据点形 类型 符号 类型 符号 类型 符号 黄色 y ( yellow ) 实线 — 实点标记 . 紫色 m ( magenta ) 点线 : 圆圈标记 o 青色 c ( cyan ) 点画线 _. 叉号形 x 红色 r ( red ) 虚线 —— 十字形 + + 绿色 g ( green ) 星号 * 蓝色 b ( blue ) 方块 s 白色 w ( white ) 钻石形 d 黑色 k ( black ) 向下三角形 v 向上三角形 ^ 向左 向右 五角星标记 p 六连形标记 h 语法为: plot(x,y,s) 说明: x 为横坐标矩阵, y 为纵坐标矩阵, s 为类型说明字符串参数。 设置坐标轴和文字标注 1 坐标轴的控制( axis ) axis auto :默认设置 axis manual :使当前坐标范围不变 axis off :取消轴背景 axis on :使用轴背景 axis ij : 矩阵式坐标,原点在左上方 axis xy :普通直角坐标,原点在左下方 axis ( ):设定坐标的范围,可以取 inf , -inf axis equal 纵坐标采用等长刻度 axis fill : 在 manual 方式下起作用,使坐标充满整个绘图区 axis image :纵横坐标采用等长刻度,且坐标框紧贴数据范围 axis normal :默认矩形坐标系 axis square : 产生正方形坐标系 axis tight :把数据范围直接设为坐标范围 axis vis3d : 保持高 宽比不变,用于三维旋转时避免图形大小变化 2 分格线和坐标框 1 )使用 grid 命令显示分格线 grid on % 显示分格线 grid off % 不显示分格线 grid % 在以上 2 个命令间切换 2 )使用 box 命令显示坐标框 box on % 使当前坐标框呈封闭形式 (默认) box off % 使当前坐标框呈开启形式 box % 在以上 2 个命令间切换 文字标注 图名( Title ),坐标轴名( label ),文字注释( text ),图例( legend ) 1 )添加图名 title ( s ) % 书写图名 2 )添加坐标轴名 xlabel ( s ) ylabel ( s ) 3 )添加图例 legend ( s , pos ) % 在指定位置建立图例 legend off % 擦除当前图中的图例 说明: s 是图例中的文字注释,如果多个注释可以用 's1','s2',... 的方式; pos 是图例在图上位置的指定符: pos 取值 0 1 2 3 4 -1 图例位置 自动最佳位置 右上角 ( 默认) 左上角 左下角 右下角 图右侧 4 )添加文字注释 text ( xt,yt,s) % 在图形的 (xt,yt) 坐标处书写文字注释 在图形中的文字中可以用特殊字符 希腊字母或者数学符号都有特殊的命令,这个可以查到 需要对文字进行上下设置,或者字体大小的设置,必须在文字标示前先使用文字设置值: fontname{s} 字体的名称 s 为 Times New Roman 、 Courier 、宋体等 fontsize{n} 字号大小, n 为整数,默认为 10 ( points ) s 字体风格, s 可为 bf (黑体), it (斜体一)、 s1 (斜体二)、 rm (正体)等 ^{s} 将 s 变为上标 _{s} 将 s 变为下标 如 figure(1) title('fontsize{16}y(omega)=int^{infty}_{0}y(t)e^{-jomegat}dt') 交互式图形命令 在 matlab 中还可以通过鼠标进行图形操作,主要有 ginput 和 gtext 命令 1 ginput 仅使用于二维图形 =ginput(n) % 用鼠标从图形上获取 n 个点的坐标( x,y) 2 gtext 把字符串放置到图形中鼠标所指定的位置上,对二维,三维图形都使用 gtext('s') % 用鼠标把字符串放置到图形上
个人分类: 常用函数|9285 次阅读|1 个评论
返回顶部