2017-08-17 8 views
1

大量のデータ(それぞれ20MB)を持つテーブルがいくつかあります。それらをTable_1、Table_2、Table_3などと呼ぶことにしましょう。これらのテーブルの構造は、同じ列ヘッダー(ただし行数は変わります)と似ています。 Attribute_A、Attribute_Bなどを考えてみましょう。eval関数を使用して生成された列ベクトルに苦労しています

私は各テーブルのAttribute_Bの計算を行うことに興味があります。これらの計算には、Attribute_Bをループします。

まず、すべてのテーブル名を持つマスターリストを作成します。

Table_List = [Table_1, Table_2, ... Table 10]; 

ここまで繰り返し、計算を実行できます。単一の計算を行うとCurrent_Tableの値の関数としてevalを、私の列ベクトル名のconcatentationを使用して正常に動作します:私は列ベクトルを反復処理が必要な計算を実行したときに、私はトラブルに実行

for Current_Table = Table_List 
    Peak_Value = max(eval(strcat(Current_Table,"Attribute_C"))); 

。例えば、以下のことは失敗する。

for Current_Table = Table_List 
    for i = 1:length(eval(strcat(Current_Table,".Attribute_B") 
     X = X + eval(strcat(Current_Table,".Attribute_B"))(i); 

評価された列とiの目的のインデックス値と結婚しようとすると、MATLABがハングアップします。これを行う方法はありますか?

すべてのデータを1つの構造にすると、これははるかに簡単になります(文字列リストを使用せずに実際にデータを組み合わせること)。データを書き直さずに各テーブルを繰り返し処理したい。

+1

これは当然、最初に「評価」を使用してはならない理由の1つです。コードをリファクタリングしてください。 – excaza

答えて

0

excassが指摘しているように、この種の問題でevalの使用は避けてください。より安全で洗練されたアプローチの1つは、構造を使用することです。ここでは配列のように - ここで

は、あなたが名前のリストを持っていて、ネストされた構造または何か他のいずれかを作成するためにそれらを使用した構造に

clear 
% Intialize the structure that will hold all the tables 
TABLES = struct; 

% List of table names 
table_names = {'Table_1' 'Table_2' 'Table_3'}; 

% Number of tables 
nTables = length(table_names); 

% Fill the tables with some data 
% TABLES can also be nested structures with more than one data item in them in 
% each substructure 
for itb=1:nTables 
    % TABLES.(table_names{itb}) = rand(3); 
    % Load from files with names Table_N.txt 
    TABLES.(table_names{itb}) = load([table_names{itb},'.txt']); 
end 

% Perform operations on the components 
for jtb=1:nTables 
    % Using a temporary array 
    %  temp = []; 
    %  temp = TABLES.(table_names{jtb}); 
    %  A(jtb) = max(max(temp)); 
    %  B(jtb) = temp(2,1); 
    % .. and such 
    % Or directly  
    A(jtb) = max(max(TABLES.(table_names{jtb}))); 
    B(jtb) = TABLES.(table_names{jtb})(2,1); 
end 

を使用しているあなたに有用であるプログラムの例です - メイン構造の内部にTABLESと呼ばれています。ファイルからこのデータを取り込むことができます。この場合は、単にrandを使用しました。データとその上の操作を収集することは、ループで行うことができます。 2番目のループでは、一時的な配列を使用して直接的または間接的にデータを操作する方法の例があります。

これは比較的幅広い話題ですので、質問を自由にしてください。回答に追加します。

+0

ご回答いただきありがとうございました。ここで私のハングアップです - あなたの構造を作成するときは、データを複製していませんか? 200MB以上のデータを別の変数に書き直したり、ワークスペースのサイズを2倍にしたりしないようにしたい。これは私の(間違いなく)騒々しいアプローチの動機です。 – MattM

+0

あなたのデータはファイルですか?一連のファイル?あなたは構造に直接ロードすることができます。私の知る限り、それを複製するべきではありません。あなたのデータはどのように読み込まれ、扱われますか? – atru

+0

ファイルオプションから単純な読み込みを追加しました。読み込みが複雑な場合は、最初に一時配列にロードしてから構造体にロードすることができます。あなたのデータは等しいサイズではないので、2回目のループでは 'temp = []'のように、たびに配列を空にしてください。私はあなたの積み込みが直接重複していないと言うでしょう。一時的な配列をロードしている場合は、一度に1つのテーブルの複製が1つになります。 – atru

関連する問題