Matlab循环:从目录加载东西时忽略变量定义

LaN*_*Neu 0 variables matlab loops

我是MATLAB的新手并尝试在循环中运行循环.ID例如,我事先定义了一个变量ID={'100'}.在我的循环中,然后我想转到ID的目录,然后在那里加载matfile.但是,每当我加载matfile时,突然ID定义会被所有可能的ID(目录中ID 100所有的所有文件夹)覆盖.这是我的代码 - 我也试过fullfile,但到目前为止没有运气:

ID={'100'}

for subno=1:length(ID)     % first loop
  try         
   for sessno=1:length(Session) %  second loop, for each ID there are two sessions   
    subj_name =  ([ID{subno} '_' Session{sessno} '_vectors_SC.mat']);
    cd(['C:\' ID{subno} '\' Session{sessno}]);
    load(subj_vec_name) % the problem occurs here, when loading, not before
    end
  end
end
Run Code Online (Sandbox Code Playgroud)

然后,当我检查ID的长度时,它现在不是1(一个ID,即100),但是目录中的所有可能ID都是100,并且循环再次针对所有其他可能的ID进行迭代(尽管它应该在ID 100之后停止).

Sue*_*ver 5

您应始终指定输出以load防止在工作区中覆盖变量并使用文件的所有内容污染工作区.在这里没有做到这一点的一些奇怪的潜在副作用有广泛的讨论 .

有可能,你有一个ID在.mat文件中命名的变量,它会ID在工作区中覆盖变量.使用输出可以避免这种情况load.

输出load将包含一个可用于访问数据的结构.

data = load(subj_vec_name);

%// Access variables from file
id_from_file = data.ID;

%// Can still access ID from your workspace!
ID
Run Code Online (Sandbox Code Playgroud)

边注

更改目录以访问数据通常并不理想.这是因为如果用户运行您的脚本,他们可能会在他们想要的目录中启动,但是当您的程序返回时,它会将它们转储到意外的位置.

相反,您可以使用fullfile构建文件的路径而不必更改文件夹.这也允许您的代码在*nix和Windows系统上运行.

subj_name =  ([ID{subno} '_' Session{sessno} '_vectors_SC.mat']);

%// Construct the file path
filepath = fullfile('C:', ID{subno}, Session{sessno}, subj_name);

%// Load the data without changing directories
data = load(filepath);
Run Code Online (Sandbox Code Playgroud)