How can I add all subfolders to my MATLAB path?

1,819 次查看(过去 30 天)
For example, my matlab folder 'current_use' is under the directory user/example/matlab/current_use and under 'current_use' folder there are 6 subfolders and each contains data files I need to test, i.e., my matlab script under folder 'current_use' will call all data under the subfolders which are inside folder 'current_use'
What I am doing now is each time tell matlab the path of each my subfolder, i.e., inside my script I have a comment to tell matlab to look the path 'user/example/matlab/current_use'.
It works. However, now I need to upload my code to the school server to run it. But after I upload everything onto school server, the path 'user/example/matlab/current_use' will no longer by correct. i.e., the part 'user/example/matlab/' is changed.
So I am wondering, is there a way that I can let matlab to add all subfolders under current folder without tell it where is the current folder? or, is there a comment that matlab can use to obtain the path for the current folder?
Thank you!

采纳的回答

Image Analyst
Image Analyst 2015-10-7
This should work regardless if your current folder is the one that contains your m-file, or not.
% Determine where your m-file's folder is.
folder = fileparts(which(mfilename));
% Add that folder plus all subfolders to the path.
addpath(genpath(folder));
  6 个评论
Image Analyst
Image Analyst 2019-11-12
Change Folder does not add the folder to the path. It sets the current folder to the folder of the m-file you're running. It is added to the path only when you're in that folder, but if you changed the current folder to something completely different, it wouldn't find it since it is not on the official "path" variable. It was only on the search path temporarily while the current folder was that.
For example: current folder is c:\a, and m-file is in c:\b. If you "change folder", current folder will be c:\b. It will find that file because the current folder is on the search path. But the official path was not changed. So if you change folder to c:\c, then type your m-file name in the command window, it will no longer find your m-file in folder c:\b because it was not added to the path with savepath().
Orion Smedley
Orion Smedley 2022-6-27
Just adding a note for how to use this answer for live scripts:
simply replace mfilename with matlab.desktop.editor.getActiveFilename
as described here: https://www.mathworks.com/matlabcentral/answers/441522-determine-own-location-in-a-live-script#comment_1365606

请先登录,再进行评论。

更多回答(2 个)

Joseph Cheng
Joseph Cheng 2015-10-7
编辑:Joseph Cheng 2015-10-7
if you take a quick gander at the addpath documentation it'll show you
Add Folder and Its Subfolders to Search Path
Add c:/matlab/myfiles and its subfolders to the search path.
Call genpath inside of addpath to add all subfolders of c:/matlab/myfiles to the search path.
addpath(genpath('c:/matlab/myfiles'))
additional options can be found in the addpath documentation.
also use "pwd" to get the current path. in the end you probably are looking for:
addpath(genpath(pwd))
  6 个评论
Joseph Cheng
Joseph Cheng 2015-10-7
oh but it really all depends on the implementation. I was under the impression the person was moving the whole working directory on to the network and knew where it was located but had hardcoded the subfolder paths into the script thus pwd would suffice. What i didn't think of was that the person may call the script file from another directory without navigating to the directory first. which yes i'd agree this wouldn't work.
While addpath works, is it really wise to use it for data files instead of implementing something that uses dir to get folder/file paths?
Image Analyst
Image Analyst 2015-10-7
You're right. I never use addpath in an m-file except for my startup.m file where I need to setup some folders on the search path. It's much better to just specify the full path name (folder + base filename + extension) than to rely on cd or whatever may happen to be in the search path. The full path could even be relative paths, like '.\t1'. You could even do it in this case instead of using genpath. There is a related FAQ entry: http://matlab.wikia.com/wiki/FAQ#Where_did_my_file_go.3F_The_risks_of_using_the_cd_function.

请先登录,再进行评论。


Aasim
Aasim 2017-8-30
编辑:Aasim 2017-8-30
Its also useful if you add all the functions that are not strict part of your project but you want to use them. you can put them all in a folder, lets say 'extended functions' but you want them to be in separate folders for easy search in the future. you can add them all in this way.
it does solve problem for me and i can keep track of my functions easily. hugs
%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%
if(isunix) %just to use the right symbol for the path
symb='/';
else
symb='\';
end
baseFolder='path of the base folder /extendedFuntions';
addpath(baseFolder);
addingfolders=dir(baseFolder);
for folderid=3:size(addingfolders,1)
addpath([baseFolder,symb,addingfolders(folderid).name]);
end
%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%
  2 个评论
Brian
Brian 2020-2-26
I know this is later to the party, but I just came to point out that the function
filesep
returns the correct file separator for the current platform to hopefully save people time and lines in the future!
Image Analyst
Image Analyst 2020-2-26
Yes, but you really never need it if you use fullfile() since fullfile() builds the path using the proper file separator so there is no need for you to ever worry about it.
Anyway, all of that Aasim's code could be done much more simply in a single line of code using genpath():
addpath(genpath(baseFolder));

请先登录,再进行评论。

类别

Help CenterFile Exchange 中查找有关 Search Path 的更多信息

Community Treasure Hunt

Find the treasures in MATLAB Central and discover how the community can help you!

Start Hunting!

Translated by