1

我正在尝试处理数据集,计算小于给定错误率的条目的出现次数,为每个数据集(X)绘制一个条形图和出现(Y)。看来count的输出是存储在cell类型中的,bar无法识别。如何将其存储在数组中,而不是单元格类型中?


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};

圆括号 ( ()) 指的是元胞数组索引,而花括号 ( {}) 指的是给定元胞数组索引处的元胞数组的内容。重要的是你要学会区别。

然后,您正在E循环内增长单元阵列。这意味着循环将运行得比它需要的慢。只是在循环之前声明它

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

会加快速度。

然后,i应该避免变量的名称,因为它也表示复杂的单元。同样适用于j。调用循环索引iiorjj将避免 Matlab 必须查找您的意思是复杂单元(正确编写为Matlab1i1j在 Matlab 中编写)或循环索引,这将节省一些时间,最重要的是,避免任何混淆。

现在,实际问题: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)可以正常工作。

我建议您阅读元胞数组,了解何时使用它们,更重要的是,何时不使用。Stack Overflow(在“matlab”标签中)有大量问题涉及或涉及元胞数组,其中许多还讨论了它们的正确(和不正确)用法和正确(和不正确)用例。

于 2012-10-03T07:05:52.013 回答
1

您是否尝试过切换这两条线?

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

第一个将制作一个普通数组,第二个将制作一个单元矩阵。可能更好走

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

即使用圆括号代替大括号。购买这假设 sum(D <= ERROR_RATE) 每次迭代都具有相同的维度。可以?你期待一个标量吗?如果您是,您可能想尝试sum(sum(D <= ERROR_RATE))(即您正在制作普通的 2D 条形图,而不是 3D 条形图)

于 2012-10-03T06:38:35.643 回答