我想在调用函数q
时在下面提到的代码中保留变量gm
的值。
demo.m
是:
for q=1:Nqueries
disp(['Matching query ' db.queries{q}]);
qPath=[db.folder '/' db.fqueryFolder '/' db.queries{q} '_' featMethod '_' num2str(PeakThreshold) '.mat'];
fq=load(qPath);
query_path=[db.folder '/' db.queryFolder '/' db.queries{q} '.jpg'];
matches=cell(1,Nrefs);
fr=cell(1,Nrefs);
ref_paths=cell(1,Nrefs);
for r=1:Nrefs
rPath=[db.folder '/' db.frefFolder '/' db.references{r} '_' featMethod '_' num2str(PeakThreshold) '.mat'];
ref_paths{r}=[db.folder '/' db.refFolder '/' db.references{r} '.jpg'];
fr{r}=load(rPath);
%Matching things
[idx, dists] = vl_ubcmatch(fq.d,fr{r}.d,thRatio);
matches{r}.idx=idx;
matches{r}.dists=dists;
end
%We run the Generative Model
sim(q,:)=gm(query_path,ref_paths,fq,fr,matches,K);
end
并且此代码生成以下错误:
Matching query 1
??? Undefined function or variable 'q'.
Error in ==> gm at 86
Iq=imread(sprintf('db/queries/%d.jpg',q));
Error in ==> demo at 65
sim(q,:)=gm(query_path,ref_paths,fq,fr,matches,K);
gm
函数使用q
,如下所示:
Iq=imread(sprintf('db/queries/%d.jpg',q));
答案 0 :(得分:1)
当然,在函数调用中添加更多变量是解决此问题最简洁的方法。但是,如果修改被调用函数太痛苦,例如因为在到达要使用变量的函数之前必须更改许多函数,您可能需要考虑将此变量设为全局变量:
HexaObserver
现在可以从任何其他函数的工作区访问 global YOURVARIABLE %choose a good name here to avoid
%overwriting existing global variables
,尽管您必须分别在每个函数中声明它,请参阅:
Declaring a global variable in MATLAB
另外,使用它们时应该非常小心:
http://www.mathworks.com/help/matlab/matlab_prog/share-data-between-workspaces.html
如文档中所述,全局变量存在风险,因为它们有自己的工作区,可以从任何地方进行编辑,因此如果多个函数使用相同的变量,您可能会得到意外的结果。因此,只有在必要时才能使用它们。
答案 1 :(得分:0)
我将for
循环中的代码修改为
sim(q,:)=gm(query_path,ref_paths,fq,fr,matches,K,q);
和被调用函数gm
的定义为
gm(query_path,ref_paths,fq,fr,matches,K,q);