光度立体涉及到多光源及其对应的多幅图像,在用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起来也是令人烦躁郁闷。上述程序,主要有四个值得注意和改进的部分:
所谓量变引起质变,对于一两个变量的不太复杂的函数程序,上述每一个环节平常都不是格外留意的对象,一旦变量批量化(>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
上述自定义CalcCell函数中,仅对变量进行简单的求和运算,如果涉及较复杂的操作运算,不可避免会出现其他意想不到的问题,请大家多多交流讨论,批评指正!