Matlab笔记-第十章

Matlab笔记-第十章

  • 语句
    • 动态输入varargin+nargin和多变量输出varargout
    • 嵌套函数
    • 匿名函数
    • 递归函数
    • 其他补充
  • matlab编译器功能

语句

因为第九章讲了一个益智游戏,没有课程内容;所以直接开启第十章。

动态输入varargin+nargin和多变量输出varargout

  • 例子1-dynamic input 动态输入变量的varargin就有隐藏变量nargin
%% varargin想要动态输入就是使用varargin+nargin
function [area, circum] = areacirc_d(varargin)
    rad = varargin{1};
    
    % nargin是function中的隐藏变量,是输入变量的总个数;
    % 当varargin(1),nargin为1;varargin(1,'i'),nargin为2
    if nargin == 2
        unit = varargin{2};
        if unit == 'i'
            rad = rad / 12;
        end
    end
    
    area = pi * rad .^ 2;
    circum = 2 * pi * rad;
end

%% 调用
areacirc_d(1,'i');
areacirc_d(1);
  • 例子2-多个动态输入变量
function [area, circum] = areacirc_d2(rad,varargin)

    if nargin == 2 % 这个时候的输入变量还是两个
        unit = varargin{1};
        if unit == 'i'
            rad = rad / 12;
        end
    end
    
    area = pi * rad .^ 2;
    circum = 2 * pi * rad;
end

%% 调用
areacirc_d2(1,'i');
areacirc_d2(1,'i',3,5,8); % 'i',3,5,8是varargin中的元素
  • 例子3

Matlab笔记-第十章_第1张图片

function sersum = geomser(r,varargin)

    if nargin == 1
        n = randi([5,30]);
    elseif nargin == 2
        n = varargin(1);
    else
        error('expecting 1 or 2 input variable(s).');
    end
    
    sersum = 1 * sum(r .^ (1:n));
end

%% 调用
geomser(1);
geomser(2,4);
  • size函数
M = rand(3,4);
sz = size(M); % 3 4 的向量
[r,c] = size(M); % r = 3 c = 4 的两个标量
  • 例子4-多输出变量

在这里插入图片描述

function [type,varargout] = typesize(M)
    [r,c] = size(M);
    
    if r == 1 && c == 1
        type = 's'; % 标量
    elseif r == 1 || c == 1
        type = 'v'; % 向量
    else
        type = 'm'; % 矩阵
    end
    
    if nargout == 1
        return; 
    elseif nargout == 2
        varargout{1} = max(r,c);
    elseif nargout == 3
        varargout{1} = r;
        varargout{2} = c;
    else
        error('expecting 1, 2 or 3 output variable(s).');
    end
    
end

%% 调用
s = 1;
v = 1:3;
m = rand(3,4);

t = threeNote1(v);
[t,l] = threeNote1(m);
[t,l,c] = threeNote1(m);
[t,l,c] = threeNote1(v);
  • 例子5-多输入和多输出
function varargout = example(x,varargin)

    if nargin >= 1
        varargout{1} = x;
    end
    
    if nargin >= 2
        varargout{2} = 2*x;
    end
    
    if nargin >= 3
        varargout{3} = 3*x;
    end
    
end

%% 调用
[a,b] = example(1,2,3) % a = 1 b = 2

嵌套函数

  • 跨域多个作用域的变量
function outvol = nestedvolume(len,wid,ht)
    
    outvol = base() * ht;
    
    function outbase = base() % inner function
    	%所有在 outer function的变量在inner function都可以使用
        outbase = len * wid; % 作用域跨多个函数;
        innerx = 1;% 现在已经支持了 inner function也可以在outer function使用;会报警告
    end
	disp(innerx); % 也可以使用
end

匿名函数

  • @()
cir2 = @(ridus) pi * ridus .^ 2; % 匿名函数
cir2(1); % 3.14;调用
class(cir2); % function_handle;handle函数句柄的意思

volAndBase = @(len,wid,ht) [len * wid * ht,len * vid];
volAndBase(1,2,3); % 6 2;调用

print123 = @() fprintf('%.2f\n',rand); % 打印一个随机数
print123(); % 调用

save 'print123' 'print123.mat'; % 保存打印的函数
load 'print123.mat'; % 也可以加载
  • 函数句柄,相当于将函数作为一个参数进行调用
factorical(10); % 函数句柄 10! 10 的阶乘

facth = @factorical;
class(facth); % function_handle函数句柄
  • 例子1-函数句柄将函数作为一个参数进行输入输出
function fnfnexamp(funh)

    x = 1:0.25:6;
    y = funh(x);
    plot(x,y,'ko');
    title(func2str(funh));
    
end

%% 调用
fn = @sin; % 将函数转化为一个变量
fnfnexamp(fn); % 画出图像

fnfnexamp(@cos);

fnfnexamp(@(x) x.^2); % 画出x^2的函数

%% 打印函数的信息
func2str(fn); % 'sin'
  • 例子2
function Practice_10dot3(x,fnhandle)
    
    y = fnhandle(x); % 比如 y = sin(x)
    plot(x,y);
    
    xlabel('x');
    ylabel('y');
    title(sprintf('y = %s(x)',func2str(fnhandle)));
    
end

%% 调用
Practice_10dot3(0:0.01:1,@sin); % 画出sin的图像
  • 系统自带的匿名函数
fplot(@sin,[0,2*pi]); % 0到2pi的sin函数图像
fevla(@sin,3.4); % 直接算出sin在3.4的值
fevla(@sin,0:0.1:4); % 直接算出sin在0:0.1:4的值
  • 计时函数
%% 第一种
tic;
% 测试的函数
toc;

%% 第二种
timeit(% 测试的函数); % 也会给出具体时间

递归函数

  • prod
fac = prod(1:n); % 计算n!;n的阶乘
  • 例子1-倒输出字符
    过程

Matlab笔记-第十章_第2张图片

function threeNote1(sent)
    %{
    'what are you' %调用strtok后变成
    word = 'what'
    rest = ' are you'
    %}
    [word,rest] = strtok(sent); % strtok 是第一个空格截断
    
    if ~isempty(rest) % 不等于空就输出最后一个字母
        threeNote1(rest);
    end
    
    disp(word);
    
end

%% 调用
threeNote1('what are you'); % you are what

其他补充

  • any和all
m = [0,0,0;0,0,0;1,1,1];
any(m); % 1 1 1按列为主轴,看是否这列有为1
all(m); % 0 0 0按列为主轴,看是否这列都为1

matlab编译器功能

  • 运行并计算时长
    Matlab笔记-第十章_第3张图片

Matlab笔记-第十章_第4张图片

你可能感兴趣的:(matlab,线性代数,矩阵)