过滤单元阵列 - MatLab

时间:2013-04-17 17:56:23

标签: matlab filter

我遇到了一个问题,我想我已经回答了,但它没有用。这是交易:

我有一个大的单元格数组(大约300000x60),包含一些数字数据,一些日期,一些空白,一些字符串,我必须过滤(如在Excel中): 例如:

m = ...
{   'date '    'code' 'number'  'market'  'max'     'min'    
 '01/01/2000'   'tsa'    1          0      0.9       0.0008
 '01/01/2000'   'sje'    2          0      1.8       1.5
 '01/02/2000'   'koi'    1          1      5.5       1.8
 '02/01/2000'   'sjk'    2          0      5.8       3.5
 '05/02/2000'   'kkj'    5          7      5.5       3.8 };  

我可以使用:

过滤字符串('code'列)
b = m(strcmp('tsa',m(:,2)),:);

结果:

b =
'01/01/2000'   'tsa'    1          0      0.9       0.0008

(这很完美)。

但是当我尝试使用c=m([m{:,3}] == 1,:);过滤数字时 我在“c”中得到了一些奇怪的答案(我在第3列中得到了一个包含所有可能值的单元格数组,而不仅仅是对应于数字“1”的数组)!

我想要的答案如下:

    c = m([m{:,3}] == 1,:)
    c =
    '01/01/2000'   'tsa'    1          0      0.9       0.0008
    '01/02/2000'   'koi'    1          1      5.5       1.8

任何人都可以帮助我吗?

提前致谢!

1 个答案:

答案 0 :(得分:0)

问题是m单元格数组中的标题。

您必须退出标题:

c = m([m{2:end,3}] == 1,:)

如果您选择整个第三列,您将获得:

>> m{:,3}
ans =
number
ans =
     1
ans =
     2
ans =
     1
ans =
     2
ans =
     5

请注意,该列中的第一个单元格为char,而其他单元格为double

如果你连接它们:

>> [m{:,3}]
ans =
number     

这里要小心,因为数字并没有消失,但实际上它们被转换为char

>> double(ans)
ans =
   110   117   109    98   101   114     1     2     1     2     5

现在发生的事情是,对这个放大的数组进行比较:

>> [m{:,3}] == 1
ans =
     0     0     0     0     0     0     1     0     1     0     0

这可能不是你想要的索引。

要测试代码,您可以选择其中的一部分并按F9。只会执行突出显示的代码。因此,您无需在cmd窗口中键入这些命令即可查看代码的一部分内容。