未定义的函数'real'用于'cell'类型的输入参数

时间:2012-10-03 06:19:09

标签: matlab

我正在尝试处理数据集,计算小于给定错误率的条目出现次数,使用出现(Y)绘制每个数据集(X)的条形图。似乎count的输出存储在单元格类型中,而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); 

2 个答案:

答案 0 :(得分:2)

你这里有很多问题。在解决真正的问题之前,我先讨论每一个问题。

首先,行

D = cell2mat(C(i));

可以替换为

D = C{i};

圆括号(())指的是单元格数组索引,而花括号({})指的是单元格的内容给定单元格数组索引处的数组。了解差异非常重要。

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

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

会加快速度。

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

现在,实际问题是: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-by-n 矩阵,并且您传递的是 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'标签中)有很多问题可以解决或涉及单元阵列,其中许多也讨论了它们的正确(和不正确)用法以及正确(和不正确)的用例。

答案 1 :(得分:1)

您是否尝试过切换这两行?

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

第一个是正常数组,第二个是单元矩阵。可能更好去

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

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