matlab 批量定义变量及批量传入函数参数

光度立体涉及到多光源及其对应的多幅图像,在用matlab进行编程时,遇到批量定义变量和自定义函数的批量传入参数的问题。现总结如下,欢迎大家批评指正。

  • 传统定义和传输方式
clc
clear all
close all

var1 = randn(3,3);
var2 = randn(3,3);
var3 = randn(3,3);
var4 = randn(3,3);
var5 = randn(3,3);
var6 = randn(3,3);
var7 = randn(3,3);

res = Add(var1,var2,var3,var4,var5,var6,var7)

function res = Add(p1,p2,p3,p4,p5,p6,p7)
    res = p1+p2+p3+p4+p5+p6+p7;
end

如果需要定义更多的变量,则这种方式是繁琐费时费力,容易出错,debug起来也是令人烦躁郁闷。上述程序,主要有四个值得注意和改进的部分:
matlab 批量定义变量及批量传入函数参数_第1张图片
所谓量变引起质变,对于一两个变量的不太复杂的函数程序,上述每一个环节平常都不是格外留意的对象,一旦变量批量化(>10个),原本习以为常司空见惯的也变为问题而棘手的了。针对上述四个问题,下面给出相应的改进方案:

  • 批量定义和传输方式
clc
clear all
close all

nums = 20;  % 变量个数
height = 100; % 矩阵尺寸
width = 60;
VarCell = {}; % 存储变量
for i = 1:nums
    eval(['Var',num2str(i),'=','i']);  % 批量定义变量,并赋初值
    VarCell{i} = eval(['Var',num2str(i)]); % 将变量实值保存到cell中
end

res = CalcCell(VarCell);  % varcell包含所有实参变量值,只需传入varcell即可
disp(['sum(1:' num2str(nums) ')=' num2str(res)]);

function res = CalcCell(varargin)  % 利用varargin传入可变数量的参数
    res = 0;
    for i = 1:nargin  % 得到输入参数的个数
        lens = length(varargin{i});
        for j = 1:lens
            res = res + varargin{i}{j}; % 得到varcell中每个变量值
        end
    end
end

matlab 批量定义变量及批量传入函数参数_第2张图片
上述自定义CalcCell函数中,仅对变量进行简单的求和运算,如果涉及较复杂的操作运算,不可避免会出现其他意想不到的问题,请大家多多交流讨论,批评指正!

你可能感兴趣的:(matlab,matlab,开发语言)