2012-04-02 8 views
1

私は5899091の行と11の列を持つ大きなアレイ/マトリックスを持っています。私はテキストファイルに保存しています。 matlabでdlmread()メソッドを使用しています。私はそれが必要なたびに読んでいます。しかし、それは(1分以上)多くの時間がかかります。そして私は何度も何度もファイルを読む必要があります。私はこの状況で立ち往生した。私の質問は次のとおりです:Matlabで非常に大きなArrayを複数回読み取らないようにするにはどうすればよいですか?

1)ファイルを一度読み取ってそれをどのような種類のグローバル/永続的なマトリックスに保存する方法はありますか?

2)テキストファイルを読み込んでより効率的な方法でそれをマトリックスに変換する方法がありますか?

ありがとうございます。

答えて

0
  1. グローバル変数を使用します。グローバルを関数の先頭に宣言すると、宣言されている関数でグローバルが宣言されます。http://www.mit.edu/people/abbe/matlab/globals.html
  2. .matファイルを使用します。それは少し速くなります。また、マトリックスが作成しやすい(大きなアイデンティティまたはアイマトリックス)場合は、それを即座に生成する方が早いかもしれません。最後に、あなたの行列が疎であれば、疎行列演算を使います。
+0

プログラマが「あなたがグローバル変数を使用したい」という言葉を発するのを聞いたことは一度もありませんでした。"この場合、大丈夫ですが、グローバル変数を読み取り専用で使用することを確認してください。) –

1

メモリマップファイルから必要なパフォーマンスを得ることができます。 Matlab関数memmapfileを調べてください。私はずっと使っているものではないので、間違っている可能性のあるアドバイスはこれ以上提供されません。

1

ほとんどの場合、スクリプトや制御関数で一度ファイルを読み込んだ後、そのデータを必要とする後続の関数に変数として渡すことをお勧めします。これは、グローバル宣言を追加することと同じくらい手間がかかり、よりクリーンで、メンテナンス性が高く、柔軟性があります。

変数をMATファイルに保存することもできます。ファイル内の各要素のタイプがdoubleの場合は、サイズが4GBを超えている必要があります。 MAT形式は効率的ですが、主な利点は、数値をテキストではなく数値として保存することです。有効数字が5桁または8桁の場合、ASCIIの数字はそれぞれ6.2または9.3 GBです。

あなたが本当に変数としてデータを渡したくない何らかの理由で、私はグローバル変数の上にネストされた関数を推薦する場合:もちろん

function aResult = aFunction(var) 

    data = dlmread(...); 

    var4 = bFunction(var); 

    function bResult = bFunction(var) 

     var4 = cFunction(data); 

    end 

end 

この時点で、あなたはまだビジネス機能をラップしています何かにscoping rulesが役に立ちます。今

本当の問題は、このファイルのサイズだけであれば - つまり、それはメモリには大きすぎだとあなたはチャンク内のファイルにアクセスするためにdlmreadの範囲の引数を使用している - あなたはおそらく時間を取る必要がありますmemmapfileで使用する場合はdesign a formatにしてください。このWikipedia pageは潜在的な利点を説明しています。

次に、brute force solutionがあります。

+0

優れた火力で平和。私はあなたの草刈りが大好きです –

+0

私は以前に傷ついています。 –

0

ファイルを一度読み取ってMATLABのMATファイルに保存できます。 MATFILEを使用して、保存された変数に完全にまたは部分的に(基本的にはMATLABワークスペースの変数として)ファイルから直接アクセスできます。私はそれについて同様の質問に答えましたhere。見てください。

関連する問題