我正在尝试在循环中按顺序加载文件以获得长函数。我的文件格式为var1_var2.mat
我的循环结构形式为:
directory = place
for var= 1 : somebound
for var2= 1: someotherbound
curFname = [directory in2str(var1) '_' in2str(var2) '.mat'];
load files and do stuff
end
end
但是,我已将命名约定更改为一组文件可以具有第三个下划线的位置,可以是1,2或3,具体取决于从中获取数据的某些条件。
所以现在我的文件格式从1_1.mat格式化为1_1_3.mat
如何在我的curFname = [...]代码行中创建第三个字符,可以使用不同的第三项1,2或3?它需要定义为变量,因为没有1_1_1.mat,1_1_2.mat和1_1_3.mat,可能只是1_1_1.mat
示例,可能有1_2_3.mat。但不是1_2_1.mat或1_1_1.mat
答案 0 :(得分:1)
你可以通过try / catch这样做:
success = false;
for it1 = 1:range1
for it2 = 1:range2
for it3 = 1:3
filename = strcat(int2str(it1), '_', int2str(it2), '_', int2str(it3), '.mat');
try
load(filename);
success = true;
catch
continue;
success = false;
end
if success
%do some amazing stuff
end
end
end
end
另一种方法是获取所有.mat文件并加载它们
files = dir('*.mat');
for file = 1:length(files)
load(files(file).name);
%do some even more amazing stuff
end
如果目录中还有其他.mat文件,并且您不想加载它们,那么您可以使用正则表达式:
files = dir('*.mat');
for file = 1:length(files)
filename = files(file).name;
if regexp(filename, '[1-9][0-9]*_[1-9][0-9]*_[1-3].mat')
load(filename);
%do some even more amazing stuff
end
end
如果您不知道regexp
,它与另一个字符串上的字符串模式匹配,您会在MATLAB Doc上找到更多信息。在我的例子中,
[1-9]
是1到9之间的任何数字相同
[1-3]
与3
*
表示前一个字符可以出现一次或多次。因此[0-9]*
为nothing
[0-9]
或[0-9][0-9]
或[0-9][0-9][0-9]
等。您可以找到有关MATLAB正则表达式here
的更多信息
编辑:
由于正则表达式的特定语法,我没有[1-n]
。这有点难以解释,但会尽我所能:
regexp
匹配字符,输入[1-x]
,我基本上对MATLAB说“我想要一个字符代码在字符代码1和字符代码之间的字符of x“。因此输入[1-9]
是有道理的。
另一方面10或25或任何高于9的数字。让我们以 39 为例。 39不是字符,它由2个字符组成。因此,正则表达式中的匹配39匹配3,然后是9.因此[1-39]
将不起作用,但[1-3][0-9]|[1-9]
将会起作用。
答案 1 :(得分:0)
dir命令对于这些事情很有价值 - 你会在某个文件夹中得到一个充满字符串的单元格数组。与操作系统非常相似,您可以获得文件名,修改的最后日期等信息。
鉴于此,我相信你的问题的答案在于控制流程,即使用条件语句if,while或者任何适合你需要的语句。例如:
for var = 1 : somebound
variable = dir('foldername');
if (check your strings and process) ...
等等。从本质上讲,您将需要许多有用的MATLAB字符串命令,如strfind,strcmp和strlen。安排你的逻辑以满足你的格式。