4

我有 11x11 矩阵,我将它们保存为.mat文件,从F01_01F11_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 文件。
有人可以帮忙吗?

4

3 回答 3

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

几条评论:

  1. 请注意使用sprintf格式化双精度iijj使用前导零%02d

  2. 您可以使用 的第二个参数num2str来格式化其输出,例如:num2str(ii,'%02d').

  3. 在处理字符串时使用字符串格式化工具是一种很好的做法。

  4. 在 matlab 中最好不要使用ij作为循环计数器,因为它们在 matlab 中的默认值为sqrt(-1).

于 2013-01-08T11:33:02.337 回答
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 
于 2013-01-08T13:32:59.070 回答
1

num2str可以做零填充来填充该字段。在下面的示例中,4 是所需的字段宽度+1。

num2str(1,'% 04.f')

答案 =001

于 2014-05-27T14:12:36.843 回答