【Matlab小技巧整理篇】-matlab怎样

2023-04-10 14:42:29

 

Matlab 编程知识点,温故而知新······

1. 随机数、随机噪声

% 产生 m 个属于 [1, n] 的随机整数 randperm(n, m) % 产生指定数值(默认 -1 和 1)分布的随机数,可指定元素分布概率 randsrc(10, 10, [-3 -1 1 3; 0.1 0.4 0.4 0.1]) % 产生指定范围的随机数 unifrnd(0, 1:5) % 产生均值为 0.1 方差为 0.1 的随机数 x = 0.1 + sqrt(0.1)*randn(100001); % 产生 3 个和为 1 的随机数 r = rand(3, 1)r = r / sum(r) % 生成相同的随机数 s = rng; x = rand(1,5) rng(s); y = rand(1,5) % 每次运行得到相同的结果 % 在使用随机数之前设置 rng(default); % 添加噪声 y = x + rand(length(x), 1); y = x + randn(length(x), 1);

2. 字符串分割

% 直接分割 regexp(Numbers = 2500, =, split) % 分割得到 cell,需要二次处理 textscan(Numbers = 2500, %s %d, Delimiter, =)

3. 数据标准化

y = (x - mean(x)) ./ std(x); [y, mu, sigma] = zscore(x);

4. R2 计算

x = 1:10; y1 = x + rand(1, 10); p = polyfit(x, y1, 1); y2 = polyval(p, x); R2 = sumsqr(y2 - mean(y1)) / sumsqr(y1 - mean(y1))

5. 鼠标位置、按键

% 相对 Figure 位置 % Button down function: UIFigure functionUIFigureButtonDown(app, event)pos = get(app.UIFigure, CurrentPoint) pos app.UIFigure.CurrentPoint end % 相对 Axes 位置 % Button down function: UIAxes functionUIAxesButtonDown(app, event)pt = app.UIAxes.CurrentPoint; x = pt(1, 1) y = pt(1, 2) end % 鼠标按键 % normal:左键;alt:右键;extend:中键;open:双击,会触发两次单击 % Button down function: UIFigure functionUIFigureButtonDown(app, event)button = get(app.UIFigure, SelectionType) end

6. 剪切板操作

clear; clc; x = linspace(0, 2*pi, 20); y = sin(x); plot(x, y); % 把 y 值复制到剪切板 clipboard(copy, y); % 获取剪切板内容 str = clipboard(paste) % 把当前 figure 复制到剪切板 hgexport(gcf, -clipboard)

7.打开网址

web(https://www.zhihu.com/people/1105936347)

8. 选择颜色

% 单颜色 c = uisetcolor([0.6 0.8 1]) % 色条 cmap = uisetcolormap

9. 符号方程、符号转数值

syms u f = sym(3); Eq = sin(f)*u^2 + u + f; sol = solve(Eq, u) sol_num = double(sol) sol_num = vpa(sol) % 符号替换数字 sol = subs(sol, f, 3)

10. 公式格式化输出到公式编辑器

% 动态脚本输出,直接复制到公式编辑器

syms x f = taylor(x*exp(x), x, order, 9) % 复制输出字符串到公式编辑器 latex(f)

11. 文件读写函数汇总

load、save

dlmread、dlmwrite

csvread、csvwrite

importdata

textscan

fprintf

readtable、writetable
Taosy.W:【001】文件读写完全版45 赞同 · 6 评论文章
Taosy.W:【039】超好用的文件读写函数readtable和writetable22 赞同 · 10 评论文章

12. 函数可视化

fplot

fimplicit

fimplicit3

fsurf

isosurface
Taosy.W:【027】函数可视化15 赞同 · 7 评论文章

13. 绘图字体、坐标轴属性设置

clear; clc; t = 6*pi*(0 : 100) / 100; y = 1 - exp(- 0.3*t) .* cos(0.7*t); plot(t, y, r-, LineWidth, 3) hold on tt = t(abs(y - 1) > 0.05); ts = max(tt); plot(ts, 0.95, bo, MarkerSize, 10) hold off axis([-inf, 6*pi, 0.6, inf]) set(gca, Xtick, [2*pi, 4*pi, 6*pi], Ytick, [0.95, 1, 1.05, max(y)]) set(gca, XtickLabel, {2*pi; 4*pi; 6*pi}) set(gca, YtickLabel, {0.95; 1; 1.05; max(y)}) grid on text(13.5, 1.2, \fontsize{12}{\alpha} = 0.3) text(13.5, 1.1, \fontsize{12}{\omega} = 0.7) cell_string{1} = \fontsize{12}\uparrow; cell_string{2} = \fontsize{16} \fontname{隶书}镇定时间; cell_string{3} = \fontsize{6} ; cell_string{4} = [\fontsize{14}\rmt_{s} = num2str(ts)]; text(ts, 0.85, cell_string, Color, b, HorizontalAlignment, Center) title(\fontsize{14}\it y = 1 - e^{ -\alpha t}cos{\omegat}) xlabel(\fontsize{14} \bft \rightarrow) ylabel(\fontsize{14} \bfy \rightarrow)

14. 三维曲面属性设置

% 光照 clear; clc; [X, Y, Z] = sphere(40); colormap(jet) subplot(1, 2, 1) surf(X, Y, Z) axis equal off shading interp light (position, [0 -10 1.5], style, infinite) lighting phong material shiny subplot(1, 2, 2) surf(X, Y, Z, -Z) axis equal off shading flat light lighting flat light(position, [-1, -1, -2], color, y) light(position, [-1, 0.5, 1], style, local, color, w) set(gcf, Color, w) % 镂空 clear; clc; [X0, Y0, Z0] = sphere(30); X = 2*X0; Y = 2*Y0; Z = 2*Z0; surf(X0, Y0, Z0); shading interp hold on mesh(X,Y,Z) colormap(hot) hold off hidden off axis equal axis off

15. 获取坐标轴范围

limit = axis xlim = get(gca, xLim) ylim = get(gca, YLim)

16. 查找绘图对象

% 查找 figure clear; clc; close all; x = linspace(0, 2*pi, 20); y = sin(x); figure(1) plot(x, y); figure(2) plot(x, y, x, y + 1, --); figs = findobj(Type, figure) % 查找线型为 -- 的线 lines = findobj(Type, line, LineStyle, --)

17. 格式化显示

fprintf(%07.4f\n, 2.334) % 02.3340 fprintf(%07d\n, 2) % 0000002 num2str(5.5, %07.4f) % ans = 05.5000 num2str(5.5, %06.4f) % ans = 5.5000 num2str(2, %06d) % ans = 000002

18. 刻度显示为 10^4 形式

set(gca, xlim, [0 10e4]); set(gca, xlim, [0 10e5]);

19. colorbar 设置指数上标

clear;clc; [x, y, z] = peaks(30); z = z / 1000; surf(x, y, z); cb = colorbar; cb.Ruler.Exponent = -3;

20. 坐标轴铺满 figure

clear;clc;close all; x = 0 : 0.1 : 5; y1 = sin(2*x); y2 = cos(3*x); figure plot(x, y1, o:, LineWidth, 2) xlabel(x); ylabel(y); set(gca, looseInset, [0 0 0 0]); figure plot(x, y2, o:, LineWidth, 2) xlabel(x); ylabel(y); set(gca, Position, [0.1 0.1 0.85 0.85]);

21. 设置多种 colormap

clear;clc; [x, y, z] = peaks(30); figure; plot1 = subplot(1,2,1); surf(x, y, z); % 获取第一幅图的 colormap,默认为 parula cMap = colormap; plot2 = subplot(1,2,2); surf(x, y, z); % 下面设置的是第二幅图的颜色,默认是整个 figure 的 colormap(hot); % 设置第一幅图颜色显示为 parula set(plot1, Colormap, cMap);

22. 制作 GIF 动图

clear; clc; x = 0:0.01:1; n = 1:9; len = length(n); im = cell(1, len); % 单独显示每个图 figure; for idx = 1:len subplot(3, 3, idx) plot(x, x.^idx, LineWidth,3) title([y = x^, num2str(idx)]) end % 获取绘制对象 fig = figure; for idx = 1:len y = x.^idx; plot(x, y, LineWidth, 3) title([y = x^, num2str(n(idx))]) % drawnow % pause(0.1); frame = getframe(fig); im{idx} = frame2im(frame); end % 输出文件名 filename = testAnimated.gif; for idx = 1:len % 制作gif文件,图像必须是index索引图像 [A, map] = rgb2ind(im{idx}, 256); if idx == 1 imwrite(A, map, filename, gif, LoopCount, Inf, DelayTime, 0.3); else imwrite(A, map, filename, gif, WriteMode, append, DelayTime, 0.3); end end % 读取图像 clear;clc; % 保存文件名 filename = Model.gif; % 4张图 for i = 1:4 % 图片路径 fileName = [num2str(i), .jpg]; img = imread(fileName); % 重定义尺寸 img = imresize(img, [256, 256]); imshow(img); % 不显示窗口 set(gcf, visible, off); % 获取位置 q = get(gca, position); % 设置左边距离值为零 q(1) = 0; % 设置右边距离值为零 q(2) = 0; % 重新设置位置 set(gca, position, q); frame = getframe(gcf, [0, 0, 200, 200]); im = frame2im(frame); imshow(im); [I, map] = rgb2ind(im, 256); if i == 1 imwrite(I, map, filename, gif, Loopcount, inf, DelayTime, 0.3); else imwrite(I, map, filename, gif, WriteMode, append, DelayTime, 0.3); end end

23. 绘制带有误差线的柱状图

clear;clc;close all; % 获取到颜色 [all_themes, all_colors] = GetColors(); % 生成示例数据 m = 5; n = 3; x = 1:m; y = rand(m, n) + 2; % 误差限 neg = rand(m, n); pos = rand(m, n); % 单系列带有误差线的柱状图 figure; bar(x, y(:, 1)); hold on errorbar(x, y(:, 1), neg(:, 1), pos(:, 1), LineStyle, none, Color, k, LineWidth, 2); hold off % 多系列带有误差线的柱状图 figure; % 绘制柱状图 h = bar(x, y); % 设置每个系列颜色 for i = 1:length(h) h(1, i).FaceColor = all_colors(i, :); end % 单独设置第二个系列第二个柱子颜色 % 这行代码少不了 h(1, 2).FaceColor = flat; h(1, 2).CData(2,:) = all_colors(6, :); % 获取误差线 x 值 % 也就是 XEndPoints 的值 xx = zeros(m, n); for i = 1 : n xx(:, i) = h(1, i).XEndPoints; end % 绘制误差线 hold on errorbar(xx, y, neg, pos, LineStyle, none, Color, k, LineWidth, 2); hold off % 绘制图例 legend({A1, A2, A3}); % 设置 x 轴标签 set(gca, XTickLabel, {label1, label2, label3, label4, label5}); % 试试 barweb figure; barweb(y, neg, 1, {label1, label2, label3, label4, label5});

24. OLE 方式写入 Excel

clear;clc; % 设置文件保存路径 filepath = [pwd, \test.xlsx]; % 检查 Excel 是否已经打开 try % 若 Excel 服务器已经打开,返回其句柄 excel = actxGetRunningServer(Excel.Application); catch % 创建一个Microsoft Excel 服务器 excel = actxserver(Excel.Application); end % 设置 excel 属性为可见,0表示不可见 % set(excel, Visible, 1); excel.Visible = 0; % 取消保存提示 excel.DisplayAlerts = false; % 检查文件是否存在 if exist(filepath, file) workbook = excel.Workbooks.Open(filepath); % workbook = invoke(excel.Workbooks, Open, filepath); else workbook = excel.Workbooks.Add; % workbook = invoke(excel.Workbooks, Add); workbook.SaveAs(filepath); end % 当前工作表句柄 sheets = excel.ActiveWorkbook.Sheets; % sheets = workbook.Sheets; % 返回第1个Sheet句柄 sheet1 = sheets.Item(1); % 激活第1个表格 sheet1.Activate; % 修改第1个Sheet的名字 sheet1.Name = test sheet1; % 页面设置 % 上边距5磅 sheet1.PageSetup.TopMargin = 5; % 下边距10磅 sheet1.PageSetup.BottomMargin = 10; % 左边距15磅 sheet1.PageSetup.LeftMargin = 15; % 右边距20磅 sheet1.PageSetup.RightMargin = 20; % 设置行高和列宽 % 定义行高向量RowHeight sheet1.Range(A1:A4).RowHeight = [40, 20, 40, 20]; sheet1.Range(A1:C1).ColumnWidth = [30, 10, 40, 20]; % 合并单元格 sheet1.Range(A1:C1).MergeCells = 1; sheet1.Range(A3:C3).MergeCells = 1; % 设置单元格的边框 sheet1.Range(A1:B1).Borders.Weight = 3; sheet1.Range(A4:C4).Borders.Item(3).Linestyle = 0; sheet1.Range(A4:C4).Borders.Item(4).Linestyle = 0; % 设置单元格对齐方式 sheet1.Range(A1:B3).HorizontalAlignment = 3; sheet1.Range(C1:C3).VerticalAlignment = 1; % 写入单元格内容 sheet1.Range(A1).Value = 写入内容1; sheet1.Range(A3).Value = 写入内容2; % 设置字号 sheet1.Range(A1:B3).Font.size = 11; sheet1.Range(A1).Font.size = 16; sheet1.Range(A1).Font.bold = 2; % 如果当前工作文档中有图形存在,通过循环将图形全部删除 shape = sheet1.Shapes; % 返回文档中Shape对象的个数 shapeCount = shape.Count; % while shapeCount > 0 % shape.Item(1).Delete; % end if shapeCount ~= 0 for i = 1 : shapeCount shape.Item(1).Delete; end end % 插入图形 % 生成一个Figure fig = figure; % 设置 fig 尺寸且不可见 set(fig, Position, [400, 400, 300, 300], visible, off) % z = peaks(40); % 这么写图片空白 peaks(40); % 图形复制 hgexport(fig, -clipboard); % 图形粘贴 % 选中 sheet1 的 D3 单元格,插入直方图 sheet1.Range(D3).Select; sheet1.Paste; % sheet1.PasteSpecial; % 删除图形句柄 delete(fig); % 保存文档 workbook.Save; workbook.Close; excel.Quit;

25. OLE 方式写入 Word

clear;clc; % Matlab 操作 Word 文档 % 设置文件保存路径 filepath = [pwd, \test.docx]; % 检查 Word 是否已经打开 try % 若 Word 服务器已经打开,返回其句柄 word = actxGetRunningServer(Word.Application); catch % 创建一个Microsoft Word服务器 word = actxserver(Word.Application); end % 设置 word 属性为可见,0表示不可见 % set(word, Visible, 1); word.Visible = 1; % 检查文件是否存在 if exist(filepath, file) document = word.Documents.Open(filepath); else document = word.Documents.Add; document.SaveAs2(filepath); end % 句柄获取 content = document.Content; selection = word.Selection; paragraphFormat = selection.ParagraphFormat; % 页面设置 % 上边距60磅 document.PageSetup.TopMargin = 60; % 下边距45磅 document.PageSetup.BottomMargin = 45; % 左边距45磅 document.PageSetup.LeftMargin = 45; % 右边距45磅 document.PageSetup.RightMargin = 45; % 标题 content.Text = test word; % 设置文档内容的起始位置 content.Start = 0; % 设置字号为16 content.Font.Size = 16 ; % 字体加粗 content.Font.Bold = 4 ; % 居中对齐 content.Paragraphs.Alignment = wdAlignParagraphCenter; % 设置下面内容的起始位置 selection.Start = content.end; % 回车,另起一段 selection.TypeParagraph; % 在当前位置输入文字内容 selection.Text = 文字内容1; % 设置字号为12 selection.Font.Size = 12; % 字体不加粗 selection.Font.Bold = 0; % 光标下移(取消选中) selection.MoveDown; % 居中对齐 paragraphFormat.Alignment = wdAlignParagraphCenter; selection.TypeParagraph; selection.TypeParagraph; selection.Font.Size = 11; % 在光标所在位置插入一个 4 行 3 列的表格 tables = document.Tables.Add(selection.Range, 4, 3); % 返回第1个表格的句柄 table = tables; % table = document.Tables.Item(1); % 设置表格边框 table.Borders.OutsideLineStyle = wdLineStyleSingle; table.Borders.OutsideLineWidth = wdLineWidth150pt; table.Borders.InsideLineStyle = wdLineStyleSingle; table.Borders.InsideLineWidth = wdLineWidth150pt; table.Rows.Alignment = wdAlignRowCenter; table.Rows.Item(2).Borders.Item(1).LineStyle = wdLineStyleNone; % 设置表格列宽和行高 columnWidth = [50, 50, 200]; rowHeight = [20, 25, 20, 200]; for i = 1 : 3 table.Columns.Item(i).Width = columnWidth(i); end % 设置表格的行高 for i = 1 : 4 table.Rows.Item(i).Height = rowHeight(i); end % 设置每个单元格的垂直对齐方式 for i = 1 : 4 for j = 1 : 3 table.Cell(i,j).VerticalAlignment = wdCellAlignVerticalCenter; end end % 合并单元格 table.Cell(1, 2).Merge(table.Cell(1, 3)); table.Cell(2, 2).Merge(table.Cell(3, 3)); table.Cell(4, 1).Merge(table.Cell(4, 3)); selection.Start = content.end; selection.TypeParagraph; selection.Text = 文字内容2; % 右对齐 paragraphFormat.Alignment = wdAlignParagraphRight; selection.MoveDown; % 写入表格内容 table.Cell(1, 1).Range.Text = 内容1; table.Cell(3, 1).Range.Text = 内容2; table.Cell(1, 1).Range.ParagraphFormat.Alignment = wdAlignParagraphLeft; table.Cell(3, 1).VerticalAlignment = wdCellAlignVerticalTop; table.Cell(1, 1).Borders.Item(2).LineStyle = wdLineStyleNone; table.Cell(1, 1).Borders.Item(4).LineStyle = wdLineStyleNone; % 如果当前工作文档中有图形存在,通过循环将图形全部删除 shape = document.Shapes; % 返回文档中Shape对象的个数 shapeCount = shape.Count; if shapeCount ~= 0 for i = 1 : shapeCount shape.Item(1).Delete; end end fig = figure; % 设置 fig 尺寸且不可见 set(fig, Position, [400, 400, 300, 300], visible, off) % z = peaks(40); % 这么写图片空白 peaks(40); % 图形复制 hgexport(fig, -clipboard); % 图形粘贴 % Selection.Range.PasteSpecial; table.Cell(8,1).Range.Paragraphs.Item(1).Range.Paste; % 删除图形句柄 delete(fig); % 设置视图方式为页面 document.ActiveWindow.ActivePane.View.Type = wdPrintView; % 保存文档 document.Save; document.Close; word.Quit;

26. SVD 解病态线性方程组

clear;clc; % 创建一个典型的病态矩阵:Hilbert矩阵 N = 15; a = repmat(1:N, N, 1); A = 1 ./ (a + a - 1); cd = cond(A); % 输出条件数 disp(cd); rng(default); % 随机生成一组解 x = rand(N,1); % 生成常数项 y = A*x; % 左除 x0 = A\y; y0 = A*x0; % SVD分解 [u,s,v] = svd(A); % 方法一:去掉极小奇异值 lemt = 1e-7; s1 = diag(1 ./ s(s > lemt)); s1(N,N) = 0; x1 = v*s1*u*y; y1 = A*x1; % 方法二:添加正则项 s2 = diag(1./(diag(s)+lemt*ones(N,1))); x2 = v*s2*u*y; y2 = A*x2; % 结果比较: disp([x, x0, x1, x2]); disp([y, y0, y1, y2]);

27. 绘制旋转多边形

clear;clc;close all; m = 3; n = 41; d_angle = 2.25; rotate = 45; shift = [0, 0]; figure SpiralPolygon(m, n, d_angle, rotate, shift); m = 4; figure SpiralPolygon(m, n, d_angle, rotate, shift); figure; V = SpiralPolygon(m, n, -d_angle, rotate, shift); hold on dx = max(V(1, :)) - min(V(1, :)); dy = max(V(2, :)) - min(V(2, :)); shift = [dx, 0]; SpiralPolygon(m, n, d_angle, rotate, shift); shift = [dx, dy]; SpiralPolygon(m, n, -d_angle, rotate, shift); shift = [0, dy]; SpiralPolygon(m, n, d_angle, rotate, shift); hold off functionV =SpiralPolygon(m, n, d_angle, rotate, shift)th = linspace(0, 360, m + 1) + rotate; V = [cosd(th); sind(th)]; C = colormap(hsv(n)); scale = sind(150 - abs(d_angle))/sind(30); R = Rot2(d_angle); % hold off for i = 1:n if i > 1 V = scale * R * V; end plot(V(1,:) + shift(1), V(2,:) + shift(2), Color, C(i,:)); hold on end set(gcf, Color, w); axis equal axis off end functionR =Rot2(theta)theta = theta*pi/180; R = [cos(theta), -sin(theta); sin(theta), cos(theta)]; end

28. 梯度下降法

案例:梯度下降 clear;clc; %% 一元函数梯度下降法 % 示例:f(x) = min{(x - 1)^2} % 梯度:g(x) = 2 * (x - 1) yita = 0.25; % 学习率,一般设置小一点,否则容易在最小值附近震荡或者不收敛 x1 = -5 : 0.1 : 5; y1 = (x1 - 1).^2; iteMax = 1000; xInit = 4; yInit = (xInit - 1)^2; err = 1e-6; figure(Position, [50, 50, 900, 400]); subplot(1, 2, 1) plot(x1, y1, b, LineWidth, 2) xlim([-5, 5]) ylim([-1, 25]) hold on plot(xInit, yInit, or, MarkerFaceColor, r) for i = 1 : iteMax % x = x + yita * grad; xNew = xInit - yita * 2 * (xInit - 1); yNew = (xNew - 1)^2; % 退出条件 if abs(xNew - xInit) < err break; else PlotLineArrow(gca, [xInit, xNew], [yInit, yNew], r, k) xInit = xNew; yInit = yNew; disp([, num2str(i), 次迭代结果:, num2str(xInit)]); plot(xNew, yNew, or, MarkerFaceColor, r) end end hold off title(梯度下降); %% 多元函数梯度下降法 % 示例:f(x) = min{x1^2 + x2^2} % 梯度:g(x) = [2 * x1; 2 * x2] [x, y] = meshgrid(-5:0.5:5, -5:0.5:5); z = x.^2 + y.^2; initX = 4; initY = 3; initZ = initX^2 + initY^2; initValue = [initX; initY]; subplot(1, 2, 2) contourf(x, y, z, 20); shading interp hold on grad = zeros(1, 2); e = 0.1; yita = 5; % Adagrad 更快收敛 for i = 1 : iteMax % 标准的梯度法 x = x + yita * grad; % newValue = initValue - yita * [2 * initX; 2 * initY]; % Adagrad 法 x = x + yita * inv(G) * grad; grad = grad + [(2 * initX)^2, (2 * initY)^2]; newValue = initValue - yita * diag(1 ./ sqrt(grad + e)) * [2 * initX; 2 * initY]; % 退出条件 if norm(newValue - initValue) < err break; else newX = newValue(1); newY = newValue(2); newZ = newX^2 + newY^2; % plot([initX, newX], [initY, newY], -ok, MarkerFaceColor, r) PlotLineArrow(gca, [initX, newX], [initY, newY], r, k) initValue = newValue; initX = newX; initY = newY; initZ = newZ; disp([, num2str(i), 次迭代结果:, num2str(newValue)]); end end hold off title(梯度下降); functionPlotLineArrow(obj, x, y, markerColor, lineColor)% 绘制带箭头的曲线 % 绘制散点图 plot(x, y, o, Color, markerColor, MarkerFaceColor, markerColor); % 获取 Axes 位置 posAxes = get(obj, Position); posX = posAxes(1); posY = posAxes(2); width = posAxes(3); height = posAxes(4); % 获取 Axes 范围 limX = get(obj, Xlim); limY = get(obj, Ylim); minX = limX(1); maxX = limX(2); minY = limY(1); maxY = limY(2); % 转换坐标 xNew = posX + (x - minX) / (maxX - minX) * width; yNew = posY + (y - minY) / (maxY - minY) * height; % 画箭头 annotation(arrow, xNew, yNew, color, lineColor); end

29. Adagrad 多元非线性回归模型

clear; clc; % z = w1 * exp(-x / w2) + w3 * y + w4 % z = 900 * exp(-x / 2) + 50 * y + 10 len = 40; rng(default); x = randi(len + 1, len, 1) / 5; y = randi(len + 1, len, 1) / 5; z = 900 * exp(-x / 2) + 50 * y + 10; maxi = max(z); z = z / maxi; ratio = 0.0; z = z + ratio * max(z) * rand(len, 1); X = [x, y]; fun = @(var, X)var(1) * exp(-X(:, 1) / var(2)) + var(3) * X(:, 2) + var(4); w = lsqcurvefit(fun, [1, 1, 1, 1], X, z); w([1, 3, 4]) = maxi * w([1, 3, 4]); disp([lsqcurvefit 计算结果:, num2str(w)]); % 梯度下降法学习 % obj = 1 / (2 * len) * (w1 * exp(-x / w2) + w3 * y + w4 - z) * (w1 * exp(-x / w2) + w3 * y + w4 - z) alpha = 1; % 学习率大收敛快,可能有震荡 iteMax = 10000; w1 = 1; w2 = 1; w3 = 1; w4 = 1; initW = [w1; w2; w3; w4]; err = 1e-6; J = zeros(iteMax, 1); G = zeros(size(initW)); e = 0.1; for i = 1 : iteMax % gradW1 = 1 / len * (exp(-x / w2)) * (w1 * exp(-x / w2) + w3 * y - z); % gradW2 = 1 / len * (w1 * x .* exp(-x / w2) / w2^2) * (w1 * exp(-x / w2) + w3 * y - z); % gradW3 = 1 / len * y * (w1 * exp(-x / w2) + w3 * y - z); % grad = [gradW1; gradW2; gradW3]; gradW1 = exp(-x / w2); gradW2 = w1 * x .* exp(-x / w2) / w2^2; gradW3 = y; gradW4 = ones(len, 1); grad = 1 / len * [gradW1, gradW2, gradW3, gradW4] * (w1 * exp(-x / w2) + w3 * y + w4 - z); % Adagrad 法 x = x + yita * inv(G) * grad; G = G + grad.^2; newW = initW - alpha * diag(1 ./ sqrt(G + e)) * grad; if norm(newW - initW) < err J(i + 1 : end) = []; disp([梯度下降法迭代次数:, num2str(i)]); newW([1, 3, 4]) = maxi * newW([1, 3, 4]); disp([梯度下降法迭代结果:, num2str(newW)]); break; else initW = newW; w1 = newW(1); w2 = newW(2); w3 = newW(3); w4 = newW(4); J(i) = 1 / (2 * len) * (w1 * exp(-x / w2) + w3 * y + w4 - z) * (w1 * exp(-x / w2) + w3 * y + w4 - z); end end % 绘图 figure(Position, [50, 50, 900, 400]); subplot(1, 2, 1) loglog(J, LineWidth, 2) legend([alpha = , num2str(alpha)]); xFit1 = linspace(min(x), max(x), 30); yFit1 = linspace(min(y), max(y), 30); [xFit2, yFit2] = meshgrid(xFit1, yFit1); zFit = w1 * exp(-xFit2 / w2) + w3 * yFit2 + w4; zFit = maxi * zFit; z = maxi * z; subplot(1, 2, 2) scatter3(x, y, z, r, filled); hold on surf(xFit2, yFit2, zFit); hold off title(Adagrad 多元非线性回归模型);

30. 积分问题

clear; clc; format long; %% 数值积分 % sample 1 fun1 = @(x) sin(x); result = integral(fun1, 0, pi) result = 2.000000000000000 % sample 2 fun2 = @(x) sin(x) ./ x; result = integral(fun2, 0, 1) result = 0.946083070367183 %% 解析解 syms x t % sample 3 y1 = sin(x); f1 = int(y1, x, 0, t) f1 = % sample 4 y2 = sin(x) / x; f2 = int(y2, x, 0, t) f2 = f2_val = double(subs(f2, t, 1)) f2_val = 0.946083070367183 f3 = MyIntegral1(fun2, 0, 1, 10000) f3 = 0.946083070492669 functionresult =MyIntegral1(fun, minX, maxX, intervalCount)% fun: 函数句柄 % minX: 积分下限 % maxX: 积分上限 % intervalCount: 积分区间份数 % 利用积分的定义来求面积 result = 0; h = (maxX - minX) / intervalCount; % 步长 for i = 1 : intervalCount result = result + h * fun(minX + (i - 0.5) * h); % 采用简单矩形公式:面积 = 底 × 高 end end

31. 批量导入文件

clear;clc; % 获取路径下所有 png 文件信息 all_images = dir(D:\MyPrograms\DataSet\halcon\*.png) % 图片数量 image_num = size(all_images, 1) % 遍历图像 for i = 1 : image_num folder = all_images(i).folder name = all_images(i).name fullname = fullfile(folder, name) end

32. 浮点数判断相等

编程过程中经常遇到判断两个浮点数是否相等的情况,此时如果直接用 a == b 来做判断,会导致意想不到的错误,肉眼可见判断为 true,但是程序给你判断为 false,原因在于浮点数在计算机里存储会有一定的精度误差,可采用简单方法:
% 判定为相等 if abs(a - b) < eps end

33. 科研绘图必备的60套颜色模板

34. 标题、标签、注释换行

% 用 cell 类型 ylabel({Normalized; optical intensity});


以上就是关于《【Matlab小技巧整理篇】-matlab怎样》的全部内容,本文网址:https://www.7ca.cn/baike/15322.shtml,如对您有帮助可以分享给好友,谢谢。
标签:
声明

排行榜