将非均匀单元格数组转换为数字数组

时间:2011-12-22 19:03:43

标签: matlab

我在MATLAB中使用xlsread从excel文件中读取表格。我的目标是将Excel工作表的每一列读取为数字数组。其中一列有数字和数字+字符组合。例如,值可以是200,300A,450,500A,200A,100。这是我到目前为止:

[num, txt, raw] = xlsread(fileIn, sheets{ii});    % Reading in each sheet from a for loop
myCol = raw(:, 4)                             % I want all rows of column 4
for kk=1:numel(myCol)
       if iscellstr(myCol(kk))
           myCol(kk) = (cellfun(@(x)strrep(x, 'A', ''), myCol(kk), 'UniformOutput', false));
       end
end

myCol = cell2mat(myCol);

这可以从数字中删除字符,但是我留下了

myCol =

[200]

'300'

[450]

'500'

'200'

[100]

在cell2mat上出错:

  

cell2mat(myCol)

     

???使用==>时出错cell2mat at 46

     

输入单元格数组的所有内容必须具有相同的数据类型。

我觉得我可能在某处混淆了()和{}。有人可以帮我解决这个问题吗?

2 个答案:

答案 0 :(得分:7)

让我从阅读文件开始

[num, txt, raw] = xlsread('test.xlsx');
myCol = raw(:, 4);

idx = cellfun(@ischar,myCol ); %# find strings
data = zeros(size(myCol)); %# preallocate matrix for numeric data
data(~idx) = cell2mat(myCol(~idx)); %# convert numeric data
data(idx) = str2double(regexprep(myCol(idx),'\D','')); %# remove non-digits and convert to numeric

答案 1 :(得分:2)

变量myCol最初是一个包含数字和字符串的单元格数组,在您的示例中如下所示:

myCol = {200; '300A'; 450; '500A'; '200A'; 100};

将字符串条目转换为数值时必须遵循的步骤是:

  1. 标识myCol中字符串的单元格条目。您可以使用循环来执行此操作,如您的示例所示,或者您可以使用函数CELLFUN来获取logical index,如下所示:

    index = cellfun(@ischar,myCol);
    
  2. 删除字母。如果你知道要删除的字母总是'A',就像在你的例子中一样,你可以在所有索引单元格上使用像STRREP这样的简单函数,如下所示:

    strrep(myCol(index),'A','')
    

    如果您可以在字符串中包含各种其他字符和字母,那么像REGEXPREP这样的函数可能会更适合您。对于您的示例,您可以这样做:

    regexprep(myCol(index),'\D','')
    
  3. 将数字字符串转换为数字值。您可以使用函数STR2DOUBLE

    为所有索引单元格执行此操作
    str2double(regexprep(myCol(index),'\D',''))
    
  4. 然后,上述的最终结果可以与myCol中的原始数值组合。总而言之,您将获得以下内容:

    >> index = cellfun(@ischar,myCol);
    >> result(index,1) = str2double(regexprep(myCol(index),'\D',''));
    >> result(~index) = [myCol{~index}]
    
    result =
    
       200
       300
       450
       500
       200
       100