4

11x11 の行列があり、それらをからまでの.matファイルとして保存しました。各ファイルで関数を実行する必要があります。時間がかかるので、関数を自動的に実行するスクリプトを書きたいと思います。F01_01F11_11Func

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はマットファイルを見つけることができません.
誰か助けてくれませんか?

4

3 に答える 3

10

問題

i=01; 
j=01; 
['F',num2str(i), '_', num2str(j),'.mat']

に評価されます

F1_1.mat

そしてしない

F01_01.mat

予想通り。

この理由i=01は、double 型の割り当てであり、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. doubleをsprintfフォーマットするために を使用し、 を使用して先行ゼロを使用していることに注意してください。iijj%02d

  2. の 2 番目の引数を使用して、num2strその出力をフォーマットできますnum2str(ii,'%02d')

  3. 文字列を扱うときは、文字列書式設定ツールを使用することをお勧めします。

  4. matlabでの既定値は であるため、ループ カウンターとしておよびを使用しないijsqrt(-1)ことをお勧めします。

于 2013-01-08T11:33:02.337 に答える
1

num2str、フィールドを埋めるためにゼロパディングを行うことができます。以下の例では、4 が目的のフィールド幅 +1 です。

num2str(1,'% 04.f')

答え=001

于 2014-05-27T14:12:36.843 に答える
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 に答える