Borrar filtros
Borrar filtros

How can I add all subfolders to my MATLAB path?

1.724 visualizaciones (últimos 30 días)
dragoon el 7 de Oct. de 2015
Editada: Stefanie Schwarz el 15 de Sept. de 2022
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!

Respuesta aceptada

Image Analyst
Image Analyst el 7 de Oct. de 2015
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.
  6 comentarios
Image Analyst
Image Analyst el 12 de Nov. de 2019
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 el 27 de Jun. de 2022
Just adding a note for how to use this answer for live scripts:
simply replace mfilename with matlab.desktop.editor.getActiveFilename
as described here:

Iniciar sesión para comentar.

Más respuestas (2)

Joseph Cheng
Joseph Cheng el 7 de Oct. de 2015
Editada: Joseph Cheng el 7 de Oct. de 2015
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.
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:
  6 comentarios
Joseph Cheng
Joseph Cheng el 7 de Oct. de 2015
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 el 7 de Oct. de 2015
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:

Iniciar sesión para comentar.

Aasim el 30 de Ag. de 2017
Editada: Aasim el 30 de Ag. de 2017
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
baseFolder='path of the base folder /extendedFuntions';
for folderid=3:size(addingfolders,1)
  2 comentarios
Brian el 26 de Feb. de 2020
I know this is later to the party, but I just came to point out that the function
returns the correct file separator for the current platform to hopefully save people time and lines in the future!
Image Analyst
Image Analyst el 26 de Feb. de 2020
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():

Iniciar sesión para comentar.


Más información sobre Search Path en Help Center y File Exchange.


Community Treasure Hunt

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

Start Hunting!

Translated by