【问题标题】:Convert nonuniform cell array to numeric array将非均匀元胞数组转换为数值数组
【发布时间】:2011-12-22 19:03:43
【问题描述】:

我在 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)

???在 46 处使用 ==> cell2mat 时出错

输入元胞数组的所有内容必须是相同的数据类型。

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

【问题讨论】:

  • 变量alt是什么?应该是myCol
  • 哎呀抱歉。是的,应该是。我编辑了它。

标签: matlab


【解决方案1】:

让我从阅读文件开始

[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

【讨论】:

    【解决方案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',''))
      

    然后可以将上面的最终结果与myCol 中的原始数值组合。将它们放在一起,您会得到以下结果:

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

    【讨论】:

      猜你喜欢
      • 1970-01-01
      • 1970-01-01
      • 1970-01-01
      • 1970-01-01
      • 1970-01-01
      • 1970-01-01
      • 2011-02-07
      • 1970-01-01
      • 2015-03-15
      相关资源
      最近更新 更多