因为第九章讲了一个益智游戏,没有课程内容;所以直接开启第十章。
%% 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);
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中的元素
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);
M = rand(3,4);
sz = size(M); % 3 4 的向量
[r,c] = size(M); % r = 3 c = 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);
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函数句柄
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'
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(% 测试的函数); % 也会给出具体时间
fac = prod(1:n); % 计算n!;n的阶乘
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
m = [0,0,0;0,0,0;1,1,1];
any(m); % 1 1 1按列为主轴,看是否这列有为1
all(m); % 0 0 0按列为主轴,看是否这列都为1