2011-08-10 15 views
7

Matlabはファイルから指定された数の要素を読み込めません。私は、2つのファイルを読み込み、データに対して線形演算を行い、結合された結果を第3のファイルに書き込む単純なプログラムを持っています。MATLABがバイナリファイルを正常に読み込めないのはなぜですか?

私の質問は次のとおりです:1)Matlabが指定された数の要素を読み込めないのはなぜですか?2)これには回避策がありますか? あなたの考えはです。

入力ファイルのいくつかの詳細:

  • 彼らは同じ大きさ(正確に)手続き上の

詳細(2-4ともに大(〜18ギガバイト)

  • です

    1. 読み込み用と出力用のファイルを開きます。両方のファイルのチェックはfeofです。書くと(それぞれ)入力のそれぞれからNフロート(N * 4バイト)で
    2. 読む
    3. がに結果を書き込むデータ(例えば0.5 *(datin1 + datin2))上で操作を実行ファイル出力ファイル。

    これはすべて非常に簡単で、ほとんどの場合、これはうまくいきました。残念ながら、サイクルの中でいくつかの点で、MATLABは、ファイルの1からすべてのN山車を取得していないと、手順3

    CODEのSNIP上の行列寸法誤差を与える:

    N = 2048; 
    fidin1 = fopen('file1.dat','r','l'); 
    fidin2 = fopen('file2.dat','r','l'); 
    fidout = fopen('outfile.dat','w','l'); 
    
    %# I could do some assertions on the file sizes, 
    %# but I know they are the same size (w/o question). 
    
    while(~feof(fidin1) && ~feof(fidin2)) 
        datin1 = fread(fidin1,N,'float=>single',0,'l'); 
        datin2 = fread(fidin2,N,'float=>single',0,'l'); 
    
        %# the following line produces an error after 100 
        %# or more iterations in to the procedure 
        datout = 0.5*(datin1+datin2); 
        fwrite(fidout,datout,'float',0,'l'); 
    end 
    

    UPDATE 1を私が受けてる エラーメッセージは次のとおりです。

    ???Error using ==> plus 
    Matrix dimension must agree. 
    

    UPDATE 2 私が提案aを続きますそれぞれの読み取り後にferrorが含まれており、が魔法のように問題がなくなった。 それでは、私の質問への変更:ここで問題の根源は何か?これは単にタイミングの問題かバグでしょうか?

    ここには、更新されたコードの一部が抜粋されています(コードの一部のみを示しています)。私はこれを行うより良い方法があると確信しています。いずれにしても、これらのチェックを追加することで、Matlabは各ファイルからのすべての読み取りを正常に完了させることができました。

    [datin1 count1]= fread(fidin1,N,'float=>single',0,'l'); 
        [msg errn1]=ferror(fidin1); 
        if errn1 
         pos1 = ftell(fidin1); 
         error('Error at Position %d in file. %d bytes were read.',... 
          pos1,count1); 
        end 
    
        [datin2 count2]= fread(fidin2,N,'float=>single',0,'l'); 
        [msg errn2]=ferror(fidin2); 
        if errn2 
         pos2 = ftell(fidin2); 
         error('Error at Position %d in file. %d bytes were read.',... 
          pos2,count2); 
        end 
    
        %# the following line produces an error after 100 
        %# or more iterations in to the procedure 
        datout = 0.5*(datin1+datin2); 
        fwrite(fidout,datout,'float',0,'l'); 
    
  • +1

    正確なエラーメッセージを表示できますか? –

    +0

    両方のファイルは内蔵ハードディスクにありますか?どのOSがあなたですか? 32または64ビットのmatlab? –

    +0

    @ Andrew、 'Error using ==> plus ...行列の次元は一致しなければならない。 – ephsmith

    答えて

    1

    エラーが発生したときにdatin1とdatin2変数を調べましたか? 「デバッグ - >エラー/警告の場合は停止」に進み、「エラーの場合は常に停止する(エラーの場合はdstop)」を選択します。あなたのプログラムを実行し、それがクラッシュしたら、datin1とdatin2を見てください。うまくいけば、なぜそれらを一緒に追加するのが今働いているのかを説明します。

    +0

    これは私にとって初めてのことです。このアプローチを指摘してくれてありがとう。判明したように、エラーは大きなファイルで断続的です。たぶん、このアプローチは私が理由を理解するのに役立ちます。 私の現在の解決策は、はるかに小さいファイルセグメントを書き出すことでした。この変更を行ったので、エラーは発生しませんでした。これはファイルサイズの問題だと私に思います。 – ephsmith

    関連する問題