1

データセットを処理し、特定のエラー率未満のエントリの発生数をカウントし、各データセット(X)の棒グラフを発生(Y)でプロットしようとしています。count の出力は bar では認識されない cell 型に格納されているようです。セル型ではなく配列に格納するにはどうすればよいですか?


DATASET_SIZE = 100;
PRUN_MAX_ERROR = 2;
PRUN_MISSING_DATA = -1.000;
ERROR_RATE = 0.2;

for i=1:DATASET_SIZE
   fid = fopen(strcat('log',int2str(i),'.txt'),'r');
   C(i) = textscan(fid, '%.3f');            
   fclose(fid);
end

%% convert cell type to matrix & process data
for i=1:DATASET_SIZE   
   D = cell2mat(C(i));
   %     removing unwanted entries
   D(D == PRUN_MISSING_DATA) = [];      
   D(D > PRUN_MAX_ERROR) = [];       

   %     count number of occurence below certain error rate
   % E = [E sum(D <= ERROR_RATE)];
   E{i} = sum(D <= ERROR_RATE);
end 

figure;
bar(E);

しかし、私はこのエラーが発生します:

Undefined function 'real' for input arguments
of type 'cell'.

Error in xychk (line 42)
    x = real(y); y = imag(y);

Error in bar (line 54)
        [msg,x,y] =
        xychk(args{1:nargs},'plot');

Error in checkSeqEffects (line 53)
bar(E); 
4

2 に答える 2

2

ここにはかなりの問題があります。実際の問題に取り組む前に、まずそれぞれについて説明します。

まず、ライン

D = cell2mat(C(i));

で置き換えることができます

D = C{i};

丸括弧 ( ()) はcell 配列インデックスを参照し、中括弧 ( ) は指定された cell 配列インデックスでの cell 配列の内容{}を参照します。違いを学ぶことが重要です。

次に、セル配列Eをループ内で成長させます。これは、ループが必要以上に遅く実行されることを意味します。ループの前に宣言するだけ

E = cell(DATASET_SIZE,1);
for i=1:DATASET_SIZE
    ...
    E{i} = ...
end

物事をスピードアップします。

次に、i変数の名前は複雑な単位も示すため、避ける必要があります。についても同様ですjiiループ インデックスまたはを呼び出すjjと、Matlab が複雑な単位 (1iまたは1jMatlab で適切に記述されている) またはループ インデックスを意味するかどうかを調べる必要がなくなります。これにより、少し時間が節約され、何よりも混乱が回避されます。

さて、実際の問題: bar(E). Matlab コマンド プロンプトに入力help barすると、次のように表示されます。

BAR 棒グラフ。

BAR(X,Y) draws the columns of the M-by-N matrix Y as M groups of N
vertical bars.  The vector X must not have duplicate values.

これはbar()、 m 行 n列のmatrixが必要であり、それをcell-arrayに渡していることを示しています。一番手っ取り早いのは

bar([E{:}].')

しかし、これを説明するには時間がかかりすぎます :) それを行うためのより良い方法はE、セル配列をまったく作成しないことです (必要ありません)。

% convert cell type to matrix & process data
E = zeros(DATASET_SIZE,1);
for ii = 1:DATASET_SIZE   

   D = C{ii};

   % remove unwanted entries
   D(D == PRUN_MISSING_DATA) = [];      
   D(D > PRUN_MAX_ERROR) = [];       

   % count number of occurrences below certain error rate       
   E(ii) = sum(D <= ERROR_RATE);
end 

figure, clf, hold on
bar(E)

現在Eは通常の配列なので、bar(E)問題なく動作します。

セル配列をよく読んで、それらをいつ使用するか、さらに重要なことに、いつ使用しないかを学ぶことをお勧めします。スタック オーバーフロー (「matlab」タグ内) には、セル配列に対処する、またはセル配列に関連する質問がたくさんあります。その多くは、適切な (および不適切な) 使用法と適切な (および不適切な) ユース ケースについても説明しています。

于 2012-10-03T07:05:52.013 に答える
1

この2行を切り替えてみましたか?

   E = [E sum(D <= ERROR_RATE)];
   % E{i} = sum(D <= ERROR_RATE);

1 つ目は通常の配列を作成し、2 つ目はセル行列を作成します。多分行ったほうがいい

E(i) = sum(D <= ERROR_RATE)

つまり、中かっこの代わりに丸かっこを使用します。これは sum(D <= ERROR_RATE) が反復ごとに同じ次元を持つことを前提としていることを購入してください。そうですか?スカラーを期待していますか?もしあなたがそうであるなら、試してみてくださいsum(sum(D <= ERROR_RATE))(つまり、あなたは通常の 2D 棒グラフを作成していて、3D 棒グラフではありません)。

于 2012-10-03T06:38:35.643 に答える