MATLAB将单元格转换为矢量

时间:2015-11-18 22:27:52

标签: matlab

我有一个包含如下数据的大单元格:

    '40.30000, 0.'
    '40.32000, 0.'
    '40.34000, 0.'
    '40.36000, 0.'
    '40.38000, 0.'
    '40.40000, 0.'
    '40.42000, 0.'
    '40.44000, 0.'
    '40.46000, 0.'
    '40.48000, 0.'
    '40.50000, 0.'
    '40.52000, 0.'
    '40.54000, 0.'

我想将其转换为以下矢量:

   40.30,0
   40.32,0
   40.34,0
   ..

但是cell2mat函数失败了,我找不到转换的其他函数。最简单的方法是什么?

5 个答案:

答案 0 :(得分:4)

这个怎么样:

cell2mat(cellfun(@(x) str2num(x), YourCell, 'UniformOutput', false))

说明: 您无法使用cell2mat将字符串解析为数字。我刚刚发现str2num实际上是用逗号分隔的字符串创建矢量,这样才很幸运。使用cellfun()我然后使用str2num对所有单元格项执行此操作。需要UniformOutput作为参数,因为输出数据大小(x乘2)与输入数据大小不匹配。最后,使用实际上可以在结果单元格上使用cell2mat()

顺便说一下,@符号后面的东西是一个匿名函数声明,它们对这些东西非常有用。把它们想象成函数指针或lambda函数。 Documentation

答案 1 :(得分:2)

您无法使用cell2mat转换此单元格数组,因为您的单元格数组包含字符串,而不是您在数组中预期的双重值。

您必须首先解析字符串以将单元格转换为double,为此您必须使用for循环或cellfun

答案 2 :(得分:2)

@Adriaan所述,如果您的数据保证具有相同数量的字符,则有一个解决方案(否则请参阅下面的更一般版本)。在这种情况下,您可以先转换为字符数组,然后让str2num完成其工作:

mycell={  '40.30000, 0.'
          '40.32000, 0.'
          '40.34000, 0.'
          '40.36000, 0.'};
mymat=str2num(cell2mat(mycell));

结果:

mymat =

  40.299999999999997                   0
  40.320000000000000                   0
  40.340000000000003                   0
  40.359999999999999                   0

一般(对于任意字符串长度),更多kludgy解决方案是将您的字符串单元转换为对应于有效的matlab矩阵语法,并再次让str2num解析它:

tmpstr=cell2mat(strcat(mycell,';').'); %'
mymat2=str2num(tmpstr(1:end-1)); %needed to remove last semicolon

结果:

mymat2 =

  40.299999999999997                   0
  40.320000000000000                   0
  40.340000000000003                   0
  40.359999999999999                   0

如果您的字符串长度不同,则第二种解决方案也可以使用,但对于非常大的单元格,这可能对内存效率非常低。

答案 3 :(得分:2)

这是一个远景,但如果你使用的文件有某种标准格式,这将有效。然后,您可以在解析数据时使用其他方法。您可以使用函数importData

,而不是逐行阅读

在test.txt中:

40.30000, 0.
40.32000, 0.
40.34000, 0.
40.36000, 0.
40.38000, 0.
40.40000, 0.
40.42000, 0.
40.44000, 0.
40.46000, 0.
40.48000, 0.
40.50000, 0.
40.52000, 0.
40.54000, 0.

在Matlab中:

importdata('test.txt')
ans =
40.3000         0
40.3200         0
40.3400         0
40.3600         0
40.3800         0
40.4000         0
40.4200         0
40.4400         0
40.4600         0
40.4800         0
40.5000         0
40.5200         0
40.5400         0

答案 4 :(得分:1)

您是否在每行中寻找两个值?如果是这样,这是一个矩阵而不是一个向量。此代码获取单元格并生成一个矩阵,其中每行是单元格数组的一行转换为双精度数。我希望这有助于作为一个例子。

cellthing = {'40.30000, 0.';
             '40.32000, 0.';
             '40.34000, 0.';
             '40.36000, 0.';
             '40.38000, 0.';
             '40.40000, 0.';
             '40.42000, 0.';
             '40.44000, 0.';
             '40.46000, 0.';
             '40.48000, 0.';
             '40.50000, 0.';
             '40.52000, 0.';
             '40.54000, 0.'};

tempcell={};
scell = {};
for i=1:length(cellthing)
    tempcell = strsplit(cellthing{i},', ');
    scell{end+1,1} = tempcell{1};
    scell{end,2} = tempcell{2};
end
smat = str2double(scell);

smat是一个13x2的双倍。我希望这就是你的意思。