添加相对路径

在matlab中当代码很多时常常将结果存在不同的文件夹下面,常常使用相对路径对函数进行调用,但有时会存在问题。举个栗子:

代码结构如下:

/codes/A/AA/code1.m

/codes/A/lib_A/lib1.m

/codes/B/BB/code2.m

/codes/B/lib_B/lib2.m

代码的依赖关系如下:

code1.m 依赖lib1.m

code2.m 依赖lib2.m和code1.m

小麻雀栗子如下:

code1.m

function code1(a,b)
addpath('../lib_A/');
c=[a,b];
lib1(c);
end

lib1.m

function lib1(string_name)
print(string_name);
end

lib2.m

function str_name=lib2(number_name)
str_name=['00',num2str(number_name)];
end

code2.m

addpath('../lib_B/');
shot1=12345;
shot2=39045;
str1=lib2(shot1);
str2=lib2(shot2);
addpath('../../A/AA/');
code1(str1,str2);

测试运行结果:

意料之外的,会出现报错:

Undefined function or variable 'lib1'.

Error in code1 (line 5)
lib1(c);

出现这个错误的原因是运行的文件code2.m位于/code/B/BB/位置,这个是进行相对路径搜索的原点。

通过执行addpath('../lib_B/')可以正确的加载lib2.m,运行addpath('../../A/AA')也可以正确的地加载code1.m

但是在调用code1.m的过程,运行这句加载语句却出现了错误,addpath('../lib_A/');

这是因为虽然我们已经调用了code1.m但是此时的搜索原点仍然是以主调函数code2.m为基准的。相当于在/code/B/BB/的路径下addpath('../lib_A/'),这样自然找不到lib1.m。

要解决这个问题,可以在code2.m的文件中添加lib1.m所在的位置。addpath('../../A/lib_A/'),这样就可以正确的运行code2.m了。

当然,这个解决方法并不是很令人满意,因为每次从外部调用函数的时候,都要额外添加该函数所依赖的路径。如果可以使被叫函数自动根据自己的位置调用自身所依赖的路径,那么一定会方便很多。如果园子里的大神有什么解决方案,欢迎留言支招。

05-08 08:37