【问题标题】:Matlab file name with zero-padded numbers带有零填充数字的 Matlab 文件名
【发布时间】:2013-01-08 10:57:39
【问题描述】:

我有 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 文件。
有人可以帮忙吗?

【问题讨论】:

  • 您发布的代码没有问题?你遇到了什么错误?
  • 对于未来的故障排除:使用dbstop if error 找出问题所在,并非常仔细地检查该行上的所有变量。

标签: matlab string-formatting


【解决方案1】:

问题

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

几个cmets:

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

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

  3. 处理字符串时最好使用string formatting 工具。

  4. 在 matlab 中not to use i and j as loop counters 是一个更好的做法,因为它们在 matlab 中的默认值为 sqrt(-1)

【讨论】:

    【解决方案2】:

    这是另一种解决方案,请注意@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 
    

    【讨论】:

      【解决方案3】:

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

      num2str(1,'% 04.f')
      

      Ans = 001

      【讨论】:

        猜你喜欢
        • 2015-11-18
        • 1970-01-01
        • 1970-01-01
        • 1970-01-01
        • 1970-01-01
        • 2023-03-31
        • 1970-01-01
        • 2014-07-01
        • 2019-04-11
        相关资源
        最近更新 更多