我有一个包含如下数据的大单元格:
'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函数失败了,我找不到转换的其他函数。最简单的方法是什么?
答案 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的双倍。我希望这就是你的意思。