bsxfun
强大的、万能的、不同维数的矩阵扩展混合运算,从此告别矩阵运算中的for循环
另,matlab里所有以fun为后缀的命令都很好用,arrayfun,cellfun,structfun,等等
@() 匿名函数
使用函数式编程,在编写以数学公式为主的程序中比传统编程方法好得多
set(gca,...)等
所有与画图相关的命令都包含了千奇百怪的属性和参数,非常实用,如著名的 set(gca,...)
$ $
画图中的标题、注释等文字内容是可以直接使用latex格式的,只须在包含latex命令的部分前后用$框起来即可
slice
高维切片,要在三维空间中表现三个以上变量的函数关系,必备此命令
强大的、万能的、不同维数的矩阵扩展混合运算,从此告别矩阵运算中的for循环
另,matlab里所有以fun为后缀的命令都很好用,arrayfun,cellfun,structfun,等等
@() 匿名函数
使用函数式编程,在编写以数学公式为主的程序中比传统编程方法好得多
set(gca,...)等
所有与画图相关的命令都包含了千奇百怪的属性和参数,非常实用,如著名的 set(gca,...)
$ $
画图中的标题、注释等文字内容是可以直接使用latex格式的,只须在包含latex命令的部分前后用$框起来即可
slice
高维切片,要在三维空间中表现三个以上变量的函数关系,必备此命令
Matlab里面应该多用向量运算,把循环语句转变为向量运算会省很多时间,程序也更简洁易读。
比方说,一个名叫array数组里面,你要将里面大于1的都变成0,就不必用到循环:
array(array>1)=0;
把大于1小于3的变成0。
array(and(array>1,array<3))=0;
当然,还可以使用find,这个也很好用。
——————————————————————————————
另一个重要的技巧是delete/clf-plot-pause
用plot可以画图(注意记录句柄),然后用delete删掉特定图象,或用clf清图,再绘制,这可以在figure窗口产生动画。但是如果只plot,往往只会在全部程序执行结束时显示,这时候需要用pause让figure完成图像的更新。drawnow貌似也可以,但是我比较喜欢用pause,能够简单地控制动画的速度。
这会方便调试和展示。这个技巧尤其适合使用matlab的图形用户界面设计功能时构造一个显示运行状态等信息的figure。
——————————————————————————————
mathworks 有一个fig函数(不是系统自带的,是别人编写的),可以很容易地调整字体、尺寸以及绘图是否有边框等等,不必画出来再自己手动调整。这对于写论文的人来说会很方便。
——————————————————————————————
善用eval,可以让你的程序的灵活度大大加强。尤其是在变量名的问题上。当然,这可能会对代码维护和调试带来麻烦。很多情况可以用其他方法代替。 @王备 指出了一个链接,值得一读Alternatives to the eval Function
——————————————————————————————
save、load可以将部分或全部变量、结构体等存入mat文件或从mat导入workspace
global可以将变量变为全局变量,在各函数之间共享。不过这不太好用,尽量慎用吧。
——————————————————————————————
exist可以检测某目标(如变量)是否存在,减少一些麻烦。
——————————————————————————————
surf、mesh都很漂亮,不过surf之后记得用shading interp,看起来更漂亮。
——————————————————————————————
对于一些重复性的矩阵赋值,比如:1、2、3、4、1、2、3、4
可以使用repmat,将一个矩阵重复扩展为更大的矩阵。
——————————————————————————————
很多函数都有高级的用法,当使用到了,但又觉得有点麻烦的时候,不妨help一下,看看其他的用法。
总而言之,还是多上网搜索,一般问题总有很好的答案。
比方说,一个名叫array数组里面,你要将里面大于1的都变成0,就不必用到循环:
array(array>1)=0;
把大于1小于3的变成0。
array(and(array>1,array<3))=0;
当然,还可以使用find,这个也很好用。
——————————————————————————————
另一个重要的技巧是delete/clf-plot-pause
用plot可以画图(注意记录句柄),然后用delete删掉特定图象,或用clf清图,再绘制,这可以在figure窗口产生动画。但是如果只plot,往往只会在全部程序执行结束时显示,这时候需要用pause让figure完成图像的更新。drawnow貌似也可以,但是我比较喜欢用pause,能够简单地控制动画的速度。
这会方便调试和展示。这个技巧尤其适合使用matlab的图形用户界面设计功能时构造一个显示运行状态等信息的figure。
——————————————————————————————
mathworks 有一个fig函数(不是系统自带的,是别人编写的),可以很容易地调整字体、尺寸以及绘图是否有边框等等,不必画出来再自己手动调整。这对于写论文的人来说会很方便。
——————————————————————————————
善用eval,可以让你的程序的灵活度大大加强。尤其是在变量名的问题上。当然,这可能会对代码维护和调试带来麻烦。很多情况可以用其他方法代替。 @王备 指出了一个链接,值得一读Alternatives to the eval Function
——————————————————————————————
save、load可以将部分或全部变量、结构体等存入mat文件或从mat导入workspace
global可以将变量变为全局变量,在各函数之间共享。不过这不太好用,尽量慎用吧。
——————————————————————————————
exist可以检测某目标(如变量)是否存在,减少一些麻烦。
——————————————————————————————
surf、mesh都很漂亮,不过surf之后记得用shading interp,看起来更漂亮。
——————————————————————————————
对于一些重复性的矩阵赋值,比如:1、2、3、4、1、2、3、4
可以使用repmat,将一个矩阵重复扩展为更大的矩阵。
——————————————————————————————
很多函数都有高级的用法,当使用到了,但又觉得有点麻烦的时候,不妨help一下,看看其他的用法。
总而言之,还是多上网搜索,一般问题总有很好的答案。
1. 可以用nohup matlab <script.m> result.out &把程序丢到linux服务器上后台跑,然后exit即可安全退出,第二天在result.out中查看结果;
2. matlab -nojvm -nodisplay -nodesktop 不启动图形界面跑matlab,比有图形界面要快一些;
3. 没有图形界面调程序的时候,cd/pwd/cd ../ls等doc命令就很有用了;
4. clear all,clc,ctrl+C中断正在跑的程序(比如死循环了)什么的;
5. find (查找矩阵元素不需要循环遍历);
6. cmd = sprint ('command'); system(cmd); 在服务器上跑Linux指令;
7. 第二句改成eval(cmd)也有相似效果,没研究过区别。
2. matlab -nojvm -nodisplay -nodesktop 不启动图形界面跑matlab,比有图形界面要快一些;
3. 没有图形界面调程序的时候,cd/pwd/cd ../ls等doc命令就很有用了;
4. clear all,clc,ctrl+C中断正在跑的程序(比如死循环了)什么的;
5. find (查找矩阵元素不需要循环遍历);
6. cmd = sprint ('command'); system(cmd); 在服务器上跑Linux指令;
7. 第二句改成eval(cmd)也有相似效果,没研究过区别。
说几个很常用但容易被初学者忽略的吧。
1. 转置但不共轭
2. 得到列向量
相应的,得到行向量就是
3. 清除并更新所有 class 的定义
当你修改了某些 class 的定义时,需要调用此命令——仅仅 clear all 是不够的。
4. 忽略某些返回参数
忽略最大值,只返回最大值的索引。
【注】
这种语法是在 Matlab 7.9 (2009b) 中引入的,在此之前的版本不支持这种用法。如果你使用早期版本,可以使用如下写法:
或者一句话搞定
不过第二种写法不见得每个人都会喜欢。
5. 去除长度为 1 的维度(常用于 3D 矩阵转为 2D)
Simulink 的 save to workspace 模块经常得到一个 [m x 1 x n] 的三维矩阵,直接使用非常不便。使用 squeeze 后,会将其转换为 [m x n] 的二维矩阵。
6. 代码运行耗时显示
tic/toc 会在 Matlab 命令行中打印出两条命令之间的代码的运行耗时。更详细的代码效率分析,可以使用 profile 命令。
7. 电脑跑分
只能用于相同版本的 Matlab 下电脑之间的比较。
8. 记录命令行命令
使用 diary 好处是运行结果也会被记录下来,并且以纯文本方式存储,方便编辑。更正式的报告,则推荐使用 publish。
9. 反转向量
10. 去除数据中的 NaN
对于 inf 和 -inf,使用 isinf 命令。
1. 转置但不共轭
b = a.'
2. 得到列向量
b = a(:)
b = a(:).'
3. 清除并更新所有 class 的定义
clear classes
4. 忽略某些返回参数
[~, idx] = max(a)
【注】
这种语法是在 Matlab 7.9 (2009b) 中引入的,在此之前的版本不支持这种用法。如果你使用早期版本,可以使用如下写法:
[tmp, idx] = max(a); clear tmp
[idx, idx] = max(a)
5. 去除长度为 1 的维度(常用于 3D 矩阵转为 2D)
b = squeeze(a)
6. 代码运行耗时显示
tic; some_code_to_run(); toc
7. 电脑跑分
bench
8. 记录命令行命令
diary on
% Lots of my Matlab commands here.
diary off
9. 反转向量
b = fliplr(a) % For row-vector a.
b = flipud(a) % For column-vector a.
b = wrev(a) % For any vector a.
b = a(end:-1:1); % This is the implementation of function wrev.
10. 去除数据中的 NaN
a(isnan(a)) = []
跑个题先,help 是真神器啊。。。当初读help读了几个通宵。。。当然,这个属于个人癖好,就像高中喜欢读牛津高阶和现代汉语词典一样,可能效率不高,看完能有个印象就不错了,要用时还得翻,主要是图个乐子。我没正经学过matlab教材,需要用就翻出help的相关模块,冷哲讲的用向量代替循环来写语句是自己翻到的。不知道还有没有人一样癖好的。
1. 关于向量化
大家都知道,如果用一个函数对一个矩阵中的每一个元素进行求值,那么就要用到 .*, ./之类
上面这样就可以做到用fmat对A每一个元素分别求值。但不是所有的函数都像fmat这样,下面这种情况就不行:
可以看到,因为上面fmat2 里面有判断语句,就不能把整个矩阵作为输入参数。我知道的解决方法有3种:
值得说一说的是第二种和第三种。arrayfun只是比用for更加简洁,速度上没有太大差别。但是,用逻辑矩阵的话,就比前两种快10倍。逻辑矩阵是向量化的利器。比如 A>0 就会返回一个逻辑矩阵,里面全是1, 0 。并且, 逻辑矩阵可以当作索引, A(A>0) 就把所有A>0 的数返回。
2. 类型转换
matlab中一共有4种类型:func(函数句柄), num(数值), sym(符号), str(字符)
- 在数值运算中,使用func, num
- 需要输入输出出,要用到str
- 进行符号运算(符号微分,积分)时,用sym
我们使用matlab,一般有这么个过程:
- 先进行公式推导,这时要用sym, symfun类型
- 再进行数值计算,这里要用普通的func, 和num 类型
- 最后与GUI界面交互的时候,要用str类型
这里介绍几个用于转换的函数
3. 三维画图
大家都晓得,作图第一步,对 x, y 划分网格,用的是 meshgrid 。这样画出来的图在一个立方体的范围内,但是有时候我们要显示一个圆柱体内的三维图形这时候画网格可以用 cylinder
4. 学无止境
学matlab,还是要去论坛,看看大神们的说法,大神们的做法。比如说1中的向量化
论坛中的大神的做法是这样的
极其简洁!!!我看到后非常佩服
先这些吧
大家都知道,如果用一个函数对一个矩阵中的每一个元素进行求值,那么就要用到 .*, ./之类
function r = fmat(x)
r = x.^2 + 1./x;
end
A = [1 2 3 4];
fmat(A)
function r = fmat2(x)
if x > 0
r = x.^2;
else
r = 1./x;
end
fmat2(A) % 会出错
% 法1
for i = 1:length(A)
r(i) = fmat2(A(i));
end
% 法2 用arrayfun
r = arrayfun(@fmat2, A)
% 法3 用逻辑矩阵
r = zeros(1,length(A));
l1 = (A>0);
l2 = ~l1;
r(l1) = A(l1).^2;
r(l2) = 1./A(l2);
2. 类型转换
matlab中一共有4种类型:func(函数句柄), num(数值), sym(符号), str(字符)
- 在数值运算中,使用func, num
- 需要输入输出出,要用到str
- 进行符号运算(符号微分,积分)时,用sym
我们使用matlab,一般有这么个过程:
- 先进行公式推导,这时要用sym, symfun类型
- 再进行数值计算,这里要用普通的func, 和num 类型
- 最后与GUI界面交互的时候,要用str类型
这里介绍几个用于转换的函数
str2func('@(x,y)sin(x*y)') % str -> @func 返回一个函数句柄
syms x y
fs(x,y) = x^2+sin(x*y);
fh=matlabFunction(fs); % symfun -> @func 返回一个函数句柄 !!!强烈推荐
fh = @(x)x.^2+sin(x);
fun2str(fh) % @func ->str 函数句柄变为字符
3. 三维画图
大家都晓得,作图第一步,对 x, y 划分网格,用的是 meshgrid 。这样画出来的图在一个立方体的范围内,但是有时候我们要显示一个圆柱体内的三维图形这时候画网格可以用 cylinder
[x, y] = cylinder(linspace(0,10,100),200) % linspace(0,10,100)指在半径[0, 10]上划分为100份,参数200指的是在圆周方向上 200等分
z = sin(x) + cos(y);
mesh(x, y, z);
4. 学无止境
学matlab,还是要去论坛,看看大神们的说法,大神们的做法。比如说1中的向量化
function r = fmat2(x)
if x > 0
r = x.^2;
else
r = 1./x;
end
fmat2(A) % 会出错
fmat3 = @(x)x.^2.*(x>0) + 1./x.*(x<=0);
fmat3(A)
先这些吧
uigetfile, uiputfile
find
is*** 系列函数。
str2num num2str strcat + eval
open
winopen
! start ****.exe
timer
uiwait uiresume
analoginput
find
is*** 系列函数。
str2num num2str strcat + eval
open
winopen
! start ****.exe
timer
uiwait uiresume
analoginput
1.freqz
2.fir1,fir2等一系列示波器构造相关函数
3.用text函数直接在figure中写出latex风格公式;(有时Matlab/C风格的文本格式公式咋看之下太难懂)
比如说:
4.我写过一个主要用dir,system,zip这几个函数管理打包下载好的漫画的小脚本。
5.其实工具也算是命令的封装,常用并觉得好用的一般有拟合工具,小波等时频分析工具,神经网络,还有射频相关的小工具
6.快捷键ctrl+i,不算命令,我觉得不少人不知道这个
7. 开着电脑,matlab和音箱,然后在办公室有人的时候远程自己的电脑,让自己电脑突然说话。。。【我觉得还是Mathematica的某个函数好使一些~】
8.eval,比如可以轻易批量生成m1到m8这些具有规律的变量名
2.fir1,fir2等一系列示波器构造相关函数
3.用text函数直接在figure中写出latex风格公式;(有时Matlab/C风格的文本格式公式咋看之下太难懂)
比如说:
syms x;
text(.5,.5,['$',latex(x^(2*x^x+x/3)),'$'],'interpreter','latex','HorizontalAlignment','center','fontsize',18)
5.其实工具也算是命令的封装,常用并觉得好用的一般有拟合工具,小波等时频分析工具,神经网络,还有射频相关的小工具
6.快捷键ctrl+i,不算命令,我觉得不少人不知道这个
7. 开着电脑,matlab和音箱,然后在办公室有人的时候远程自己的电脑,让自己电脑突然说话。。。【我觉得还是Mathematica的某个函数好使一些~】
sp=actxserver('SAPI.SpVoice');
sp.Speak('hello')
bsxfun:non-for-loop的究极体验
发几段代码感受下bsxfun,broadcasting操作才是向量化编程语言的归属:
1.
源代码
broadcasting化:
2.
源代码
broadcasting化:
3.
源代码
broadcasting化:
4.
源代码
broadcasting化:
效率大约提高了20倍。
就是这样。
发几段代码感受下bsxfun,broadcasting操作才是向量化编程语言的归属:
1.
源代码
function x = calcuProjOfPQ(CPs,VSPs)
x = zeros(size(CPs,1),size(VSPs,1),3);
for k = 1 : size(CPs,1)
for h = 1 : size(VSPs,1)
for i = 1 : 3
x(k,h,i) = CPs(k, i+1) - VSPs(h, i+1);
end
end
end
end
function x = revised_calcuProjOfPQ(CPs,VSPs)
x = bsxfun(@minus, reshape(CPs(:, 2:end), [], 1, 3), reshape(VSPs(:, 2:end), 1, [], 3));
end
源代码
function reTheta = calcuTheta(X,R,Nor)
[m,n,~] = size(X);
reTheta = zeros(m,n);
for i = 1 : m
for j = 1 : n
reTheta(i,j) = X(i,j,1)/R(i,j) * Nor(i,1) + ...
X(i,j,2)/R(i,j) * Nor(i,2) + ...
X(i,j,3)/R(i,j) * Nor(i,3);
end
end
end
function reTheta = revised_calcuTheta(X,R,Nor)
reTheta = sum(bsxfun(@times, bsxfun(@rdivide, X, R), reshape(Nor, [], 1, 3)), 3);
end
源代码
function [Uij,Tij] = calcuUijTij(shearM, poisson, R, X, Nor, cosTheta)
Uij = zeros(size(X,1)*3,size(X,2)*3);
Tij = zeros(size(X,1)*3,size(X,2)*3);
elementUij = zeros(3,3);
elementTij = zeros(3,3);
% ganerate Uij and Tij
for a = 1 : size(X,1)
for b = 1 : size(X,2)
for i = 1 : size(X,3)
for j = 1 : size(X,3)
if i == j
detaij = 1;
else
detaij = 0;
end
elementUij(i,j) = 1 / (16*pi*shearM*(1-poisson) * R(a,b)) * ...
((3-4*poisson) * detaij +X(a,b,i)*X(a,b,j)/(R(a,b))^2);
elementTij(i,j) = -1/(8*pi*(1-poisson)*R(a,b)^2) * (((1-2 * ...
poisson) * detaij + 3*X(a,b,i) * X(a,b,j)/R(a,b)^2) * ...
cosTheta(a,b) - (1-2*poisson) * (( X(a,b,i) * Nor(a,j)) ...
/ R(a,b)- X(a,b,j) * Nor(a,i) / R(a,b)));
end
end
Uij(a*3-2:a*3,b*3-2:b*3) = elementUij;%Uij(a*3-2:a*3,b*3-2:b*3) +
Tij(a*3-2:a*3,b*3-2:b*3) = elementTij;%Tij(a*3-2:a*3,b*3-2:b*3) +
end
end
end
function [Uij, Tij] = revised_calcuUijTij(shearM, poisson, R, X, Nor, cosTheta)
[ir, jr] = size(R); [ix, jx, kx] = size(X);
R = reshape(R, 1,1,ir,jr); cosTheta = reshape(cosTheta, 1,1,ir,jr);
X1 = reshape(permute(X, [3,1,2]), [],1,ix,jx); X2 = reshape(permute(X, [3,1,2]), 1,[],ix,jx);
tmp = bsxfun(@rdivide, bsxfun(@times, X1, X2), R.^2);
Uij = reshape(permute(reshape(permute(bsxfun(@rdivide, bsxfun(@plus, tmp, (3-4*poisson)*eye(kx)), R) / (16*pi*shearM*(1-poisson)), [1,2,4,3]), 3,[],ix), [2,1,3]), [],3*ix).';
Tij = bsxfun(@times, 3*tmp, cosTheta) - (1-2*poisson) * bsxfun(@rdivide, (bsxfun(@times, X1, reshape(Nor.', 1,3,[])) - bsxfun(@times, X2, reshape(Nor.', 3,1,[]))), R);
Tij = reshape(permute(reshape(permute(bsxfun(@rdivide, bsxfun(@plus, Tij, bsxfun(@times, (1-2*poisson)*eye(kx), cosTheta)), R.^2) / (8*pi*(poisson-1)), [1,2,4,3]), 3,[],ix), [2,1,3]), [],3*ix).';
end
源代码
function [ul, pl] = calcuUlPl(~) %alpha, Uij, Tij
global m n Uij Tij alpha
disp = zeros(size(Uij,1),1);
fors = zeros(size(Uij,1),1);
ulData1 = 0;
ulData2 = 0;
ulData3 = 0;
plData1 = 0;
plData2 = 0;
plData3 = 0;
for j = 1 : m
for i = 1 : n
ulData1 = ulData1 + alpha(i,:) * Uij(j*3-2:j*3,i*3-2);
ulData2 = ulData2 + alpha(i,:) * Uij(j*3-2:j*3,i*3-1);
ulData3 = ulData3 + alpha(i,:) * Uij(j*3-2:j*3,i*3-0);
% =========================================================================
plData1 = plData1 + alpha(i,:) * Tij(j*3-2:j*3,i*3-2);
plData2 = plData2 + alpha(i,:) * Tij(j*3-2:j*3,i*3-1);
plData3 = plData3 + alpha(i,:) * Tij(j*3-2:j*3,i*3-0);
end
disp(j*3-2:j*3,1) =[ulData1;
ulData2;
ulData3];
% =========================================================================
fors(j*3-2:j*3,1) =[plData1;
plData2;
plData3];
%% ==================================================================
% Forget to zero the accumulation variable, I spent nearly half a month of
% time to debug the code
ulData1 = 0;
ulData2 = 0;
ulData3 = 0;
plData1 = 0;
plData2 = 0;
plData3 = 0;
%% ==================================================================
end
sum(disp)
sum(fors)
% reshape the ul and pl to 2 mx3 martices respectively
ul = zeros(m,3);pl = zeros(m,3);
ul = reshape(disp,[3,numel(disp)/3])';
pl = reshape(fors,[3,numel(fors)/3])';
end
function [ul, pl] = revised_calcuUlPl(Uij,Tij,alpha)
n = size(Uij, 2);
alpha = reshape(alpha.',3,1,[]);
ul = reshape(sum(sum(bsxfun(@times, alpha, reshape(permute(reshape(Uij.', n,3,[]), [2,1,3]), 3,3,n/3,[])), 3), 1), 3, []).';
pl = reshape(sum(sum(bsxfun(@times, alpha, reshape(permute(reshape(Tij.', n,3,[]), [2,1,3]), 3,3,n/3,[])), 3), 1), 3, []).';
end
效率大约提高了20倍。
就是这样。
这里有几个没被提到但也很实用的:
1、sparse,生成稀疏矩阵函数。
节省时间空间小能手,尤其是面对很多带有对角阵,三对角阵的算法。
2、root(a),求多项式的根。(这里a是系数数组)
3、type,显示指定m文件的内容。
4、grid on,给画的图像加网格。(没有网格的散点图逼死强迫症ಠ_ಠ)
5、clf,既然clc出现了,那么clf也来凑下热闹吧(O_O)[clf,hold on],一图多线流起手式。
1、sparse,生成稀疏矩阵函数。
节省时间空间小能手,尤其是面对很多带有对角阵,三对角阵的算法。
2、root(a),求多项式的根。(这里a是系数数组)
3、type,显示指定m文件的内容。
4、grid on,给画的图像加网格。(没有网格的散点图逼死强迫症ಠ_ಠ)
5、clf,既然clc出现了,那么clf也来凑下热闹吧(O_O)[clf,hold on],一图多线流起手式。
补充
accumarray()
附件是一个针对整数的unique(),运行速度比原生 unique() 快60%
accumarray()
附件是一个针对整数的unique(),运行速度比原生 unique() 快60%
function [elements, counts] = intUnique(a)
a = a(:);
if sum((a)~=round(a))>0
error('a must be int!');
end
offsetA = min(a)-1;
a = a-offsetA;
counts = accumarray(a, 1);
elements = find(counts);
counts = counts(elements);
elements = elements+offsetA;
end
1. 牛逼哄哄的notebook功能:
Notebook--matlab_了凡春秋
2. 高端大气上档次的GUIDE,老板再也不用担心我不会用uicontrol拼GUI了。
3. doc命令,我灰常喜欢。(help给的东西不太详细)
4. type可以查看很多函数/命令的source code。
5. matlab.exe -regserver
6. 昨天用textread解析一个特定格式的文本文件,headerline参数可以让我们跳过文件开头指定行数,真是考虑得周到。有了textread,就不用fopen、fread、fscanf……这么费劲了。
Notebook--matlab_了凡春秋
2. 高端大气上档次的GUIDE,老板再也不用担心我不会用uicontrol拼GUI了。
3. doc命令,我灰常喜欢。(help给的东西不太详细)
4. type可以查看很多函数/命令的source code。
5. matlab.exe -regserver
6. 昨天用textread解析一个特定格式的文本文件,headerline参数可以让我们跳过文件开头指定行数,真是考虑得周到。有了textread,就不用fopen、fread、fscanf……这么费劲了。
必然是各种傻瓜工具箱还有工具箱附带的命令。
还有matlab coder和类似的工具箱。之前还用了一个类似的免费工具包,可以直接similink拖框框后直接烧写到stm32里,再也不担心出错了,当时惊艳的不行不行的,结果一查人家早就在搞了。浙大也有个教授在做这方面的工作。真是懒人的福利!而且听说很多国防方面的工程就是用这种方法做的。有知道详情的同学请继续。如果想起来再上各种链接吧……手机不方便
还有matlab coder和类似的工具箱。之前还用了一个类似的免费工具包,可以直接similink拖框框后直接烧写到stm32里,再也不担心出错了,当时惊艳的不行不行的,结果一查人家早就在搞了。浙大也有个教授在做这方面的工作。真是懒人的福利!而且听说很多国防方面的工程就是用这种方法做的。有知道详情的同学请继续。如果想起来再上各种链接吧……手机不方便
把自己学matlab时的遇到的常见问题笔记贴过来一段:
1,which命令,可以找到命令所在的具体路径
例如:
另外,新版的matlab在命令行双击tab能自动补全。
2,获得一个变量的类型,用class函数
例如:
3,画直方图。(看看导入是多么方便,直方图也一句搞定)
一般成绩统计是用excel来统计的,就把那一列复制成一个文本文件,比如score.txt
1)Matlab先把数据导入myscore变量:
成绩一个N*1的列向量myscore,N是学生人数。
2)然后用这些成绩做个直方图:
这句就画出直方图(histogram)了。所谓直方图,就是把各成绩段,按照落入各个区间的数量,画出柱状图。(横坐标为成绩分布区间,纵坐标为落入对应区间的成绩个数)。
4,在matlab里使用LaTeX
图的标题或标记中可以用LaTeX书写公式。
例如:为图加标题时,用
这里title函数的格式是 title(...,'PropertyName',PropertyValue),
后面两个参数表示使用latex语法处理字符串(经测试,否则会当做普通字符串处理),其他命令有类似选项。
LaTeX表示的数学公式的前后用$ $, 或$$ $$或 \( \),三种形式中的任意一个。
5,画多幅图
1)叠加多幅图时,可以用hold on命令保持住,然后可以继续往上面叠加图(如plot等命令),最后hold off。
2)画多个子图,用subplot命令,例如subplot( 2, 4, 1) 是2行4列的第1幅子图,接着用plot等命令画图,下一个subplot命令切换到下一子图 ......。
1,which命令,可以找到命令所在的具体路径
例如:
>> which fft
built-in (D:\MATLAB\R2008b\toolbox\matlab\datafun\@logical\fft) % logical method
2,获得一个变量的类型,用class函数
例如:
>> class([0 1]) % double
>> class('test') % char
3,画直方图。(看看导入是多么方便,直方图也一句搞定)
一般成绩统计是用excel来统计的,就把那一列复制成一个文本文件,比如score.txt
79
82
65
94
...
1)Matlab先把数据导入myscore变量:
>> myscore=importdata('score.txt');
2)然后用这些成绩做个直方图:
>> hist(myscore);
4,在matlab里使用LaTeX
图的标题或标记中可以用LaTeX书写公式。
例如:为图加标题时,用
title('$$f(x)=cos(x)$$', 'interpreter','latex' );
这里title函数的格式是 title(...,'PropertyName',PropertyValue),
后面两个参数表示使用latex语法处理字符串(经测试,否则会当做普通字符串处理),其他命令有类似选项。
LaTeX表示的数学公式的前后用$ $, 或$$ $$或 \( \),三种形式中的任意一个。
5,画多幅图
1)叠加多幅图时,可以用hold on命令保持住,然后可以继续往上面叠加图(如plot等命令),最后hold off。
2)画多个子图,用subplot命令,例如subplot( 2, 4, 1) 是2行4列的第1幅子图,接着用plot等命令画图,下一个subplot命令切换到下一子图 ......。
谢不邀
提问都说了是命令,大家回答那么多函数干什么... 我来给一个超级大杀器
在命令行敲入 dbstop if error
如果运行出现错误,matlab会自动停在出错的那行,并且保存所有相关变量。再也不用设断点了有没有!!!
提问都说了是命令,大家回答那么多函数干什么... 我来给一个超级大杀器
在命令行敲入 dbstop if error
如果运行出现错误,matlab会自动停在出错的那行,并且保存所有相关变量。再也不用设断点了有没有!!!
>> why
The bald and not excessively bald and not excessively smart hamster obeyed a terrified and not excessively terrified hamster.
>> why
To fool the tall good and smart system manager.
>> why
The rich rich and tall and good system manager suggested it.
>> why
He wanted it that way.
>> why
The programmer suggested it.
>> why
Mara suggested it.
>> why
To please a very terrified and smart and tall engineer.
>> why
The tall system manager obeyed some engineer.
>> why
To satisfy some programmer.
>> why
Mary Ann wanted it that way.
>> why
Can you rephrase that?
>> why
Because Mary Ann wanted it that way.
>> why
How should I know?
>> why
Because they asked the terrified and smart and tall and tall programmer.
>> why
To fool a young tall hamster.
>> why
For the love of a bald and terrified mathematician.
>> why
It's your karma.
>> why
Some terrified and rich system manager knew it was a good idea.
>> why
Don't you have something better to do?
>> why
He suggested it.
>> why
A terrified and good and not very rich engineer helped the bald programmer.
>> why
To fool some kid.
>> why
I obeyed the tall and young system manager.
edit FunctionName.m 可以查看自由编辑和使用任何toolbox中build in function的源代码。知道的那一刻仿佛拥有了全世界..........好怂哦..........
赵武休息一下 赞同
1) eval, feval,很多人提到了。
2) cellfun,对cell数组进行函数操作,因为很多函数不直接支持cell的。
3) varargin, nargin,变长度输入变量
4) movie及相关绘图函数,得查看一下help了,记不太清了,能做demo动画,很酷
2) cellfun,对cell数组进行函数操作,因为很多函数不直接支持cell的。
3) varargin, nargin,变长度输入变量
4) movie及相关绘图函数,得查看一下help了,记不太清了,能做demo动画,很酷
松松 赞同
不是命令行
以前一直各种read
cvsread
xlsread
textread
自从发现了右键其他第三方文件import data以后
麻麻再也不用担心我的数据载入了
import data可选各行载入,整体矩阵载入,等等...甚至能根据header命名变量,挺好用的感觉
这个算是因为版本更迭而产生的相见恨晚
以前一直各种read
cvsread
xlsread
textread
自从发现了右键其他第三方文件import data以后
麻麻再也不用担心我的数据载入了
import data可选各行载入,整体矩阵载入,等等...甚至能根据header命名变量,挺好用的感觉
这个算是因为版本更迭而产生的相见恨晚
repmat 函数可以很好的用于代替循环,比如要计算一个样本集A中各个行向量之间的欧氏距离时,第一反应就是写循环如下。
for i=1:m
for j=i+1:m
result(i,j) = sqrt( (A(i,:)-A(j,:))*(A(i,:)-A(j,:))' ) ;
end
end
但是通过repmat可以直接代替之,如下。
aa = repmat(sum(A.^2,2), 1, m) ;
bb = repmat(sum(A.^2,2)', m, 1) ;
ab = A*A' ;
result = aa + bb - 2*ab ;
思想是这样,程序可能有些小错误还需要根据具体情况而言,基本上两端代码的时间比是,在A的样本个数是1000的时候,第一段需要10秒左右,第二段需要0.1秒左右。
for i=1:m
for j=i+1:m
result(i,j) = sqrt( (A(i,:)-A(j,:))*(A(i,:)-A(j,:))' ) ;
end
end
但是通过repmat可以直接代替之,如下。
aa = repmat(sum(A.^2,2), 1, m) ;
bb = repmat(sum(A.^2,2)', m, 1) ;
ab = A*A' ;
result = aa + bb - 2*ab ;
思想是这样,程序可能有些小错误还需要根据具体情况而言,基本上两端代码的时间比是,在A的样本个数是1000的时候,第一段需要10秒左右,第二段需要0.1秒左右。
eval,最近编程时发现的,和for循环结合使用,批量处理诸如N1,N2,....N100这种,简直是编程小白的福音。
matlab是一座无比丰富的宝库,就像R语一样,使用他们本身就已经是站在巨人的肩膀上了。
matlab是一座无比丰富的宝库,就像R语一样,使用他们本身就已经是站在巨人的肩膀上了。
1. convn函数用于连续的分析数据的时候很有效
2. functions函数可以调试程序,返回当时的一些有效信息
3. inmem返回内存中正在执行的函数等
4. setenv设置环境变量
这些函数都有相关的see also, 很有帮助
2. functions函数可以调试程序,返回当时的一些有效信息
3. inmem返回内存中正在执行的函数等
4. setenv设置环境变量
这些函数都有相关的see also, 很有帮助
跑个题说一下,MATLAB2014b让人相见恨晚,大家用之前的版本想必都会被MATLAB中作图的锯齿和生硬的颜色所困扰,为啥MATLAB做出来的图就是没有R和Python做出来的图好看呢?MATLAB2014b基本解决了这个问题,MATLAB2014b对绘图部分做了很大改善,做出来的图完全没有锯齿状了,而且色彩柔和协调了很多很多,所以如果大家在使用MATLAB旧版本并且因为发论文绘图的而纠结的筒子们可以考虑换MATLAB2014b了。总而言之,也算给MATLAB打个广告哈哈。
MATLAB2014b的绘图真心不错,谁用谁知道!
MATLAB2014b的绘图真心不错,谁用谁知道!
FFT
为了在科学计算和数字信号处理等领域使用计算机进行Fourier变换,必须将函数定义在离散点上而非连续域内,这一点非常符合所给的波函数的数据,数据点之间同样也存在着定义在离散点上而不是连续域内,且须满足有限性或周期性条件。这种情况下,序列
的离散傅里叶变换为:
FFT(Fast Fourier Transformation),即为快速Fourier变换,是离散Fourier变换的快速算法,它是根据离散Fourier变换的奇偶虚实等特性,对离散Fourier变换的算法进行改进获得的,而Fourier变换则是能将满足一条件的某个函数表示成三角函数(正弦、余弦)或者他们的组合形式。另f(t)为t的周期函数,如果t满足条件:在一个周期内具有有限个极值;绝对可积。则有下式成立。称为积分运算f(t)的Fourier变换。
利用这一方法可以将原先时域的数据改成了频域的图方便后面处理。 这只是我编的MATLAB将DTMF信号的解码程序中的部分程序= =听说FFT用得好几行就没了。。。笔拙,献丑了。。。