即使在循环中调用另一个函数时,也保留循环变量的值

时间:2015-05-06 05:02:28

标签: matlab

我想在调用函数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));

2 个答案:

答案 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);