我正在尝试处理数据集,计算小于给定错误率的条目出现次数,使用出现(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);
答案 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
。调用循环索引ii
或jj
将避免Matlab必须查找是否表示复杂单元(在Matlab中正确编写为1i
或1j
)或循环索引,这将节省一点时间,最重要的是,避免任何混淆。
现在,实际问题是: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条形图)