我有11x11矩阵,我将其保存为.mat
F01_01
个F11_11
个文件。
我必须在每个文件上运行一个函数Func
。由于需要很长时间,我想编写一个脚本来自动运行该功能:
for i=01:11
for j=01:11
filename=['F',num2str(i), '_', num2str(j),'.mat'];
load(filename);
Func(Fi_j); % run the function for each file Fi_j
end
end
但它不起作用,Matlab无法找到mat文件 有人可以帮忙吗?
答案 0 :(得分:10)
i=01;
j=01;
['F',num2str(i), '_', num2str(j),'.mat']
评估为
F1_1.mat
而不是
F01_01.mat
正如所料。
原因是i=01
是双重类型赋值,i
等于1
- 这些类型的变量没有前导零。
问题的可能解决方案是
for ii = 1:11
for jj= 1:11
filename = sprintf('F_%02d_%02d.mat', ii, jj );
load(filename);
Func(Fi_j); % run the function for each file Fi_j
end
end
请注意使用sprintf
格式化双ii
和jj
使用%02d
的前导零。
您可以使用num2str
的第二个参数来格式化其输出,例如:num2str(ii,'%02d')
。
在处理字符串时,最好使用string formatting工具。
这是matlab not to use i
and j
as loop counters中的一种更好的做法,因为它们在matlab中的默认值是sqrt(-1)
。
答案 1 :(得分:1)
这是一个替代解决方案,请注意@ Shai的解决方案更容易扩展到多个数字,但这一点需要较少了解字符串格式。
for i=1:11
for j=1:11
filename=['F',num2str(floor(i/10)),num2str(mod(i,10)) '_', num2str(floor(j/10)),num2str(mod(j,10)),'.mat'];
load(filename);
Func(Fi_j); % run the function for each file Fi_j
end
end
答案 2 :(得分:1)
num2str
可以执行zeropadding来填充字段。在下面的示例中,4是所需的字段宽度+ 1。
num2str(1,'% 04.f')
Ans = 001