make cd() work more efficiently or a better function to do what I am looking for

10 次查看(过去 30 天)
I am trying to set up a directory change at the beginning of this code such that it will simply go into the stated folder and run so I do not have to make many copies of the same code. So far I have tried the following code
date=input('Enter date of Inversion (date on folder) ==>','s');
site=input('Enter site of data analysis ==>','s');
layering=input('Enter layering ratio used with the number of layers (as named) ==>','s');
cd ('F:\SCG_JW_3\JacksonWilsonWest3PostInversion\',date,'\',site,'_',layering,'_reports');
This works if I just put the directory in straight but am trying to make it more interactive if I can. When I run this I am getting an "Error using cd; Too many arguments."
Is there a way to make this work like this or is a different function better? I have tried a uigetdir() but the file types are not being supported.
  1 个评论
Stephen23
Stephen23 2018-11-2
编辑:Stephen23 2018-11-2
"I have tried a uigetdir() but the file types are not being supported"
uigetdir does not "support" anything to do with files, or "file types", or indeed files at all.
And even uigetfile and uiputfile do not care about "file types", except indirectly through the filename filter (which is merely an artifact of the filename, and does not actually check the file format at all).
But as you did not show us what you tried, we have no idea what you did wrong in your code.
In any case, cd is slow and makes debugging hard. Just use fullfile.

请先登录,再进行评论。

回答(2 个)

Walter Roberson
Walter Roberson 2018-11-1
Use fullfile to construct the directory name.

Guillaume
Guillaume 2018-11-1
The most efficient way to make cd() more efficient is to not use cd() at all. There is never any need to use cd() in matlab code and it's actually a dangerous thing to do (if you cd() into a directory that has a sum.m file, you'll suddenly be using that function instead of matlab own sum and when you cd out of it again, you'll revert back to the normal sum).
All of matlab functions that deal with files (such as load, xlsread, fopen, etc.) can read files whereever they are without needing to change the current directory. So, instead of
cd(somewhere);
data = load(somefile);
you use
data = load(fullfile(somewhere, somefile));
This will be faster as well.
To build the path out of several bits, as Walter said, use fullfile. You don't even need to write the directory separator ('\' or '/'), fullfile will use the correct one for your OS.
As for building the folder name, you can use concatenation [], or sprintf, so:
folder = [site, '_', layering, '_reports'];
fullpath = fullfile('F:\SCG_JW_3\JacksonWilsonWest3PostInversion', date, folder);
%whatever IO you intended after that, e.g.
data = load(fullpath, 'somefile')
or using sprintf which I find cleaner:
folder = sprintf('site_%s_reports', layering);
fullpath = fullfile('F:\SCG_JW_3\JacksonWilsonWest3PostInversion', date, folder);
%whatever IO you intended after that, e.g.
data = load(fullpath, 'somefile')
  2 个评论
Walter Roberson
Walter Roberson 2018-11-2
编辑:Walter Roberson 2018-11-2
"There is never any need to use cd() in matlab code"
run() appears to need to cd to the directory the script is in, in order to be sure that it gets that particular file as the one executed when it eval's. It cannot just use addpath() because the current directory is always first on the path, and the current directory must might happen to have a .m file with the same name.
Guillaume
Guillaume 2018-11-2
Ok, then let's change it to There is never any need to use cd() in matlab code in a well designed program.
I would seriously question the robustness of any program that need to change directory in order to find the next piece of code to execute.
In any case, the common use case of cd is to access the data that is to be processed. There is never any reason to cd for that.

请先登录,再进行评论。

类别

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