第4章 MATLAB编程基础——4.6 M文件中变量的检测与传递

简介: 第4章 MATLAB编程基础——4.6 M文件中变量的检测与传递

4.6  M文件中变量的检测与传递


M文件中不同文件之间数据的传递是以变量为载体来实现的,数据的保存和中转则是以空间为载体来实现的。因此,M文件中变量的检测与传递是检验运算关系和运算正确与否的有力保障。


4.6.1  输入/输出变量检测指令


MATLAB中内置了相关的输入/输出变量的检测指令,如表4-8所示。

4-8  输入/输出变量检测指令

指令名

功能

Nargin

在函数体内获得实际的输入变量

Nargout

在函数体内获得实际的输出变量

nargin('fun')

获取fun指定的函数的标称输入变量数量

nargout('fun')

获取fun指定的函数的标称输出变量数量

inputname(n)

在函数体内给出第n个输入变量的实际调用变量名


说明:

1)在函数体内使用NarginNargout的目的是与程序流控制指令配合,对于不同数目的输入/输出变量,函数可以完成不同的任务。

2narginnargoutinputname本身都是函数,而不是变量,因此不能使用赋值指令对其进行处理。


4.6.2  “可变数量输入/输出变量


MATLAB中的许多指令或函数具有输入变量可以是任意多个的特点。以MATLAB中的绘图函数plot(第6章中将会大量使用该函数)为例来说明MATLAB中的可变数量输入/输出变量现象。例如调用以下句式:

plot(a , b , 'PropertyName1' , 'PropertyName2' , 'PropertyValue1' , 'PropertyValue2' , )

在上述句式中,plot函数允许使用任意多的属性名/属性值来精确规定绘图的规范。

MATLAB中还有一些函数,它们也都具有可变数量输入/输出变量数量的性质。为了使得自主编写的程序也可以具备这条性质,MATLAB中内置了如表4-9所示的指令来实现这个功能。

4-9  “可变数量输入/输出变量指令

指令名

功能

varargin

“可变数量”输入变量列表

varargout

“可变数量”输出变量列表

说明:

1)在编写M函数文件时,函数声明行中的可变数量输入/输出变量必须被放置在正常变量之后。

2)在编写M函数文件时,varargin的每个元胞应当作为一个普通的输入变量来对待。

3vararginvarargout的工作机理类似,差别仅在于varargout承载的是输出变量和输入变量之间的配置关系。以varargin为例,该函数的工作机理如下:

avarargin本身的数据类型为一个元胞数组。

M文件函数被调用时,输入变量按先后顺序依次对应分配给M函数文件的输入变量的列表中那些被明确定义的普通输入变量,然后把剩余的输入变量依次分配到varargin元胞数组的元胞中。因此,varargin元胞数组的长度取决于分配到的输入变量数量。

所谓可变数量,指的是varargin的长度随着分配到的输入变量数量而改变。


4-25:可变长度数据量使用示例。

创建M文件并命名为spiral_length.m,利用M文件编辑器在M文件中输入:

function varargout = spiral_length(d , n , varargin)
% spiral画出螺旋线或螺旋条带
Nin = length(varargin) + 1;
if nargout > 1
    erroe('Too many output arguments!!!')
end
j = sqrt(-1);
phi = 0 : pi / 20 : n * 2 * pi;
amp = 0 : d / 40 : n * d;
spir = amp .* exp(j * phi);
if nargout == 0
    switch Nin
        case 1
            plot(spir , 'b')
        case 2
            d1 = varargin{1};
            amp1 = (0 : d / 40 : n * d) + d1;
            spir1 = amp1 .* exp(j * phi);
            plot(spir , 'b');
            hold on;
            plot(spir1 , 'b');
            hold off
        otherwise
            d1 = varargin{1};
            amp1 = (0 : d / 40 : n * d) + d1;
            spir1 = amp1 .* exp(j * phi);
            plot(spir , varargin{2 : end});
            hold on;
            plot(spir1 , varargin{2 : end});
    end
    axis('square')
else
    phi0 = 0 : pi / 1000 : n * 2 * pi;
    amp0 = 0 : d / 2000 : n * d;
    spir0 = amp0 .* exp(j * phi0);
    varargout{1} = sum(abs(diff(spir0)));
    if Nin > 1
        d1 = varargin{1};
        amp1 = (0 : d / 2000 : n * d) + d1;
        spir1 = amp1 .* exp(j * phi);
        varargout{2} = sum(abs(diff(spir1)));
    end
end

在命令行窗口中输入:

subplot(1,3,1),spiral_length(2,2,1)
subplot(1,3,2),spiral_length(2,2,1, 'Marker', 'o')
subplot(1,3,3),spiral_length(2,2,1, 'r-- ' , 'LineWidth',2)

输出结果如图4-8所示。

f0ed3746ae3a83a88cb51fc2d3a064c5_640_wx_fmt=jpeg&wxfrom=5&wx_lazy=1&wx_co=1.jpg

4-8  输出结果


4.6.3  跨空间变量传递和赋值


1.跨空间变量传递


MATLAB中,不同工作区之间的数据传递是通过变量来实现的,主要形式有两种:函数的输入/输出变量和全局变量。本节将对除此之外的第3种数据传递渠道——跨空间计算表达式的值进行介绍。其具体的调用格式如下。

● evalin('工作区','expression'):该指令的功能为跨空间计算字符串表达式的值。

说明:

1工作区的可取值有两个,分别是“base”“caller”

2)工作机理为:工作区“base”,表达式计算eval("expression")时,将从基本工作区获得变量值;工作区“caller”,表达式计算eval("expression")时,将从主调函数基本工作区获得变量值。主调函数是相对于被调函数而言的,被调函数是指evalin所在的函数。

● evalin('工作区','expression1','expression2'):该指令的功能为跨空间计算替代字符串表达式的值。

说明:

1工作区的可取值有两个,分别是“base”“caller”

2)工作机理为先从所在函数空间获取变量值,用eval("expression1")计算原字符串表达式,如果该计算失败,则从工作区指定的基本工作区或主调函数工作区获得变量值,再通过eval("expression2")计算替代字符串表达式的值。


4-26:跨空间变量传递示例。

创建M文件并命名为ex4_26.m,利用M文件编辑器在M文件中输入:

clear all;close all;
n = 6;              % n = 6 , 作出的图片为6瓣的花
j = sqrt(-1);
phi = 0 : pi / (20 * n) : 2 * pi;
amp = 0;
for i = 1 : n
    amp = [amp 1 / 20 : 1 / 20 : 1 19 / 20 : -1 / 20 : 0];
end
string = {'base' , 'caller' , 'self'};
% 在本例中,当字符串为"base"时,调用基本工作区
% 当字符串为"caller"时,调用函数空间
% 当字符串为"self"时,调用子函数空间
for i = 1 : 3
    y = Flower(5 , string{i});      % n = 5,作出的图片为5瓣的花
    subplot(1 , 3 , i)
    plot(y , 'r' , 'LineWidth' , 4)
    axis('square')
end

创建M文件并命名为Flower.m,利用M文件编辑器在M文件中输入:

function y1 = Flower (n,s)
j = sqrt(-1);
phi = 0 : pi / (20 * n) : 2 * pi;
amp = 0;
for i = 1 : n
    amp = [amp 1 / 20 : 1 / 20 : 1 19 / 20 : -1 / 20 : 0];
end
y1 = subflower (4,s);
% n=4,作出的图片为4瓣的花
% -------------- subfunction -----------------
function y2 = subflower(n, s)
j = sqrt(-1);
phi = 0 : pi / (20 * n) : 2 * pi;
amp = 0;
for i = 1 : n
    amp = [amp 1 / 20 : 1 / 20 : 1 19 / 20 : -1 / 20 : 0];
end
func= 'amp .* exp(j * phi)';
switch s
    case { 'base' , 'caller'}
        y2=evalin (s, func) ;
    case 'self'
        y2=eval (func) ;
end

运行文件,输出图像如图4-9所示。

014ab110b128d72dab0c569cc79f817d_640_wx_fmt=png&wxfrom=5&wx_lazy=1&wx_co=1.png

4-9  输出图像


2.跨空间变量赋值


实现不同工作区之间变量传递的第4种方式是跨空间变量赋值,其具体的调用格式如下。

● assignin('工作区','VN',x):该指令的功能是为跨空间变量VN赋值,把当前工作区中的变量x的值赋给指定的工作区中的指定变量VNassignin的使用机理与跨空间变量传递的机理相同,因此此处不再举例说明,只举例说明使用assignin指令的注意事项。


4-27assignin运作机理示例。

在命令行窗口中输入:

assignin('base' , 'Num' , 0)
Num

输出结果:

Num =
     0


在命令行窗口中输入:

Array = 1 : 10;
assignin('base' , 'Array(4 : 7)' , Num)

输出结果:

错误使用 assignin
ASSIGNIN 中的变量名称 "Array(4 : 7)" 无效。


在命令行窗口中输入:

evalin('base' , 'Array(4 : 7) = Num')

输出结果:

Array =
     1     2     3     0     0     0     0     8     9    10

相关文章
|
2月前
|
机器学习/深度学习 算法 数据安全/隐私保护
基于MSER和HOG特征提取的SVM交通标志检测和识别算法matlab仿真
### 算法简介 1. **算法运行效果图预览**:展示算法效果,完整程序运行后无水印。 2. **算法运行软件版本**:Matlab 2017b。 3. **部分核心程序**:完整版代码包含中文注释及操作步骤视频。 4. **算法理论概述**: - **MSER**:用于检测显著区域,提取图像中稳定区域,适用于光照变化下的交通标志检测。 - **HOG特征提取**:通过计算图像小区域的梯度直方图捕捉局部纹理信息,用于物体检测。 - **SVM**:寻找最大化间隔的超平面以分类样本。 整个算法流程图见下图。
|
2月前
|
存储 数据处理 索引
MATLAB中的基本数据类型与变量操作
【10月更文挑战第1天】 MATLAB 是一种广泛应用于数学计算和科学研究的编程语言,其核心是矩阵运算。本文详细介绍了 MATLAB 中的基本数据类型,包括数值类型(如 `double` 和 `int`)、字符数组、逻辑类型、结构体、单元数组和函数句柄,并通过代码示例展示了变量操作方法。
201 0
|
4月前
|
JSON 数据格式 Python
【2023最新】Matlab 保存JSON数据集文件,并用Python读取
本文介绍了如何使用MATLAB生成包含数据和标签的JSON格式数据集文件,并展示了用Python读取该JSON文件作为训练集的方法。
148 1
|
1月前
|
运维 算法
基于Lipschitz李式指数的随机信号特征识别和故障检测matlab仿真
本程序基于Lipschitz李式指数进行随机信号特征识别和故障检测。使用MATLAB2013B版本运行,核心功能包括计算Lipschitz指数、绘制指数曲线、检测故障信号并标记异常区域。Lipschitz指数能够反映信号的局部动态行为,适用于机械振动分析等领域的故障诊断。
|
1月前
|
机器学习/深度学习 算法 数据安全/隐私保护
基于GA-PSO-SVM算法的混沌背景下微弱信号检测matlab仿真
本项目基于MATLAB 2022a,展示了SVM、PSO、GA-PSO-SVM在混沌背景下微弱信号检测中的性能对比。核心程序包含详细中文注释和操作步骤视频。GA-PSO-SVM算法通过遗传算法和粒子群优化算法优化SVM参数,提高信号检测的准确性和鲁棒性,尤其适用于低信噪比环境。
|
3月前
|
监控 算法 数据安全/隐私保护
基于视觉工具箱和背景差法的行人检测,行走轨迹跟踪,人员行走习惯统计matlab仿真
该算法基于Matlab 2022a,利用视觉工具箱和背景差法实现行人检测与轨迹跟踪,通过构建背景模型(如GMM),对比当前帧与模型差异,识别运动物体并统计行走习惯,包括轨迹、速度及停留时间等特征。演示三维图中幅度越大代表更常走的路线。完整代码含中文注释及操作视频。
|
4月前
Matlab批量修改指定文件下文件名
Matlab批量修改指定文件下文件名
201 1
|
4月前
|
存储 算法 Serverless
【matlab】matlab基于DTW和HMM方法数字语音识别系统(源码+音频文件+GUI界面)【独一无二】
【matlab】matlab基于DTW和HMM方法数字语音识别系统(源码+音频文件+GUI界面)【独一无二】
|
4月前
|
机器学习/深度学习 数据采集 算法
基于深度学习网络的USB摄像头实时视频采集与火焰检测matlab仿真
本项目使用MATLAB2022a实现基于YOLOv2的火焰检测系统。通过USB摄像头捕捉火焰视频,系统实时识别并标出火焰位置。核心流程包括:视频采集、火焰检测及数据预处理(图像标准化与增强)。YOLOv2模型经特定火焰数据集训练,能快速准确地识别火焰。系统含详细中文注释与操作指南,助力快速上手。
|
4月前
|
机器学习/深度学习 监控 算法
基于深度学习网络的人员行为视频检测系统matlab仿真,带GUI界面
本仿真展示了基于GoogLeNet的人员行为检测系统在Matlab 2022a上的实现效果,无水印。GoogLeNet采用创新的Inception模块,高效地提取视频中人员行为特征并进行分类。核心程序循环读取视频帧,每十帧执行一次分类,最终输出最频繁的行为类别如“乐队”、“乒乓球”等。此技术适用于智能监控等多个领域。
75 4