Matlab:编写输入参数数目不确定的函数

Matlab如何编写一个输入参数数目不确定的函数

背景

在绘制一个负荷功率平衡柱状图的时候,使用到了bar,plot等一些函数绘图,但是总是需要重新复制粘贴一些代码,代码显得比较繁杂,不简洁美观,故想要调用函数来批量绘制图片,但是一般函数定义的格式为

function [C,D] = myfunction(a,b)
    C=a+b;
    D=a-b;
end

但是如果参数需要多增加至4个

function [C,D] = myfunction(a,b,c,d)
    C=a+b+c+d;
    D=a-b-c-d;
end

显得非常不方便,需要重新去定义一个函数,那么有没有一种方法可以随意输入任意数目的参数?有人可能想到了传入一个cell,这个cell包含了所有你想要输入的参数,传入进入函数再进行分解。当然可以,但是这样的操作就必须在主函数中把相关数据转化为一个cell并进行拼接,比较麻烦,那么有没有一种方法让函数按照一定的逻辑去识别处理对应的内容呢?


解决方法:

方法肯定是有的,类似于plot函数可以输入很多"组"参数

plot(X1,Y1,…,Xn,Yn)

varargin则可以代替X1,Y1,…Xn,Yn这一些列的输入参数
根据matlab官方手册

varargin 是函数定义语句中的一个输入变量,允许函数接受任意数量的输入参数。使用小写字符指定 varargin。在任何显式声明的输入项后,附加varargin作为最后一个输入参数。

在执行函数时,varargin 是一个1×N 元胞数组,其中 N 是函数在显式声明的输入后收到的输入项数。如果该函数在显式声明的输入后未收到任何输入,则 varargin 是空元胞数组。

简单的来说就是如果你将函数如下设置:

function [C,D] = myfunction(varargin)
	C = size(varargin,2);
	D = size(varargin,1);
end

输入:

[C,D]=myfunction([1,2,3],'Hello',{3.1415},true)

输出:

C = 
		4
D = 
		1

如果我们进入到函数中去打一个断点可以发现
在这里插入图片描述
上面这个例子说明你随心所欲输入的四个参数被打包成了一个 1 × 4 1\times4 1×4cell传入函数中,那么我们可以通过对varargin进行引用从而处理传入的参数


nargin的意义与使用注意事项

根据官方文档说明:

nargin 针对当前正在执行的函数,返回函数调用中给定函数输入参数的数目。该语法仅可在函数体内使用。

可以理解为nargin这个变量保存了系统输入参数的个数
在这里我使用 size(varargin,2)函数去获取了对应的参数的数目,那么是否和系统预设变量nargin一致呢?
我们这里更新一下代码:

function [C,D] = myfunction(arg1,arg2,varargin)
	C = size(varargin,2);
	D = nargin;
    varargin
    E = arg1;
    F = arg2;
end

结果如下:

>> [C,D]=myfunction([1,2,3],'Hello',{3.1415},true)

varargin =
  1×2 cell 数组
    {1×1 cell}    {[1]}
C =
     2
D =
     4

比较可以发现:第二个代码中的arg1,arg2占用了部分的位置,使得varargin 中只有两个数据使得数据变少了。
因此我们可以得出结论:

如果函数输入只有varargin 例如:myfunction(varargin)
size(varargin,2) nargin是等效的


如果函数输入还有其他的接受参数例如:myfunction(arg1,agr2,varargin)
size(varargin,2) 代表varargin所代表的输入参数的数目
nargin代表算上arg1,arg2以后总的输入参数的数目


示例

绘制一个功率平衡图:
在这里插入图片描述
示例代码:

function bf = plotBalanceFigure(varargin)
%输入格式:(data1,'+','lengend name1',...,dataN,'+','lengend nameN')
%'+'表示将在上方,'-'表示将陈列在下方   
%返回数据:figure对象

%检查输入格式是否完整
if rem(nargin,3) ~= 0
    warning('参数格式错误');
    return ;
end
upnum = 0;
downnum = 0;
legend_text={};
%数据处理
for i=1:nargin
    if rem(i,3) ==1
        if strcmp(varargin{i+1},'+')
            upnum = upnum+1;
            balance_energy(:,upnum) = varargin{i};
        elseif strcmp(varargin{i+1},'-')
            downnum = downnum +1;
            balance_load(:,downnum) = varargin{i};
        else
            warning('参数+/-设置错误');
            return;
        end
    elseif rem(i,3) == 0
        legend_text{floor(i/3)} = varargin{i};
    end
end
bf = figure;

b1=bar(balance_energy,"stacked",'EdgeColor',[153,153,153]./255);
maxdata =max(sum(balance_energy,2));
ylim([-1.2*maxdata,1.2*maxdata]);
hold on
b2=bar(-balance_load,"stacked",'EdgeColor',[153,153,153]./255);
title('负荷平衡功率条形图');
xlabel('时间');
ylabel('负荷功率(MW)');
set(gca, 'XTick', 1:length(varargin{1}), 'XTickLabels', 1:length(varargin{1}));
grid on;
legend(legend_text, 'Location', 'northwest');
end

调用函数格式:

plotBalanceFigure(...
    sum(ThermalPower),'+','火电功率',...
    sum(HydroPower),'+','水电功率',...
    WindPower,'+','风电功率',...
    SolarPower,'+','光伏功率',...
    [power_load.Load],'-','负荷功率'...
    )

得到绘制的图样式
得到绘制的结果图
当然上面的代码可能会有一些bug比如输入数据是行向量还是列向量的判断等等。

### 解决MATLAB遗传算法函数调用时输入参数不足的问题 在处理MATLAB中遗传算法(genetic algorithm, GA)函数`ga`的调用过程中,如果遇到输入参数不足的情况,通常是因为未提供足够的必要参数给该函数。为了确保GA能够正常运行并获得预期的结果,必须向其传递一系列必要的配置选项。 #### 输入参数说明 对于`ga`函数而言,最基本的语法形式如下: ```matlab [x,fval] = ga(fun,nvars,A,b,Aeq,beq,lb,ub,nonlcon,options) ``` 其中各个变量代表不同的约束条件以及优化设置[^1]: - `fun`: 被最小化的适应度函数句柄。 - `nvars`: 变量的数量。 - `A`, `b`: 不等式线性约束矩阵及其右侧常数项。 - `Aeq`, `beq`: 等式线性约束矩阵及其右侧常数项。 - `lb`, `ub`: 下界和上界的向量。 - `nonlcon`: 非线性的不等式或等式的约束函数名字符串或函数句柄。 - `options`: 控制求解器行为的各种参数组成的结构体。 当缺少某些可选参数时,默认情况下这些缺失的部分会被视为不存在相应的约束。然而,在很多应用场景下,合理的边界限制(`lb`,`ub`)和其他特定于问题的要求可能是必需的。因此,建议总是显式指定尽可能多的相关参数来指导搜索过程。 #### 设置默认值的方法 为了避免因忘记传入某个重要参数而导致程序报错,可以在编写代码之前先创建一个包含所有可能需要调整属性的对象——即通过`optimoptions`命令初始化一组预设好的`options`。这不仅有助于防止遗漏关键设定,还能提高代码重用性和维护便利性。 下面是一个简单的例子展示如何定义完整的输入参数列表,并为那些容易被忽视但又重要的字段赋予合理初始值: ```matlab % 定义目标函数 fitnessfcn = @(x) myFitnessFunction(x); % 设定决策变量数目 numberOfVariables = 2; % 构建上下限范围 lowerBounds = [-5,-5]; upperBounds = [5,5]; % 创建非空约束条件(如果有),这里假设无特殊需求则为空[] linearInequalityConstraintsMatrix = []; linearInequalityVector = []; linearEqualityConstraintsMatrix = []; linearEqualityVector = []; nonLinearConstraintFcn = []; % 或者指向具体的非线性约束实现 % 初始化优化选项 defaultOptions = optimoptions('ga',... 'Display','iter',... % 显示迭代信息 'PlotFcn',{@gaplotbestf}, ... % 绘制最佳个体适应度变化图 'MaxGenerations',200,... % 最大进化代数 'PopulationSize',100); % 种群规模大小 % 执行遗传算法寻优操作 [solution,optimalValue] = ga(fitnessfcn,... numberOfVariables,... linearInequalityConstraintsMatrix,... linearInequalityVector,... linearEqualityConstraintsMatrix,... linearEqualityVector,... lowerBounds,... upperBounds,... nonLinearConstraintFcn,... defaultOptions); ``` 此段脚本展示了怎样构建一套全面而灵活的参数集合作为基础框架,从而有效规避由于输入参数数量不够引发的一系列潜在错误。
评论
添加红包

请填写红包祝福语或标题

红包个数最小为10个

红包金额最低5元

当前余额3.43前往充值 >
需支付:10.00
成就一亿技术人!
领取后你会自动成为博主和红包主的粉丝 规则
hope_wisdom
发出的红包
实付
使用余额支付
点击重新获取
扫码支付
钱包余额 0

抵扣说明:

1.余额是钱包充值的虚拟货币,按照1:1的比例进行支付金额的抵扣。
2.余额无法直接购买下载,可以购买VIP、付费专栏及课程。

余额充值