我有一个包含100行的数据文件,格式如下
0,device1,3 1,device2,33 2,device3,3 3,device4,34 ... 99,device100,36
现在我希望在MATLAB中将它们读入100x3
单元格数组。我做了以下事情:
allData = textscan(fID,'%s %s %f', 'delimiter', ',');
然后,我注意到allData
是一个1x3
单元格数组,每个项目是另一个100x1
单元格数组。 (前两列是字符串型单元格数组,而第三列是双字型单元格数组)
换句话说,读取结果是nested
数组,我不想要。
如何在阅读时直接获得100x3
单元格数组?
答案 0 :(得分:2)
使用textscan
,变量allData
看起来像(只有4行):
allData =
{4x1 cell} {4x1 cell} [4x1 double]
当所有数据具有相同类型时,您只能通过textscan
选项直接与'CollectOutput'
合并为单个单元格数组。
一种可能的解决方法,遗憾的是将所有数字数据转换为双倍(在您的情况下不是问题),
C = cell(numel(allData{1}),numel(allData));
areCells = cellfun(@iscell,allData);
C(:,areCells) = [allData{areCells}];
C(:,~areCells) = num2cell([allData{~areCells}])
C =
'0' 'device1' [ 3]
'1' 'device2' [33]
'2' 'device3' [ 3]
'3' 'device4' [34]
同样,这样做的缺点是最后一个语句会将所有非单元格类型(例如uint8,char等)转换为双精度数。为了避免这种可能的转换:
% after copying cell array data (areCells) as above, but before ~areCells data
Cn = arrayfun(@(ii)num2cell(allData{ii}),find(~areCells),'uni',0);
C(:,~areCells) = [Cn{:}];
答案 1 :(得分:1)
代码 -
sz = 100; % Line count
out=cell(sz,size(allData,2));
for k = 1:size(allData,2)
t1 = allData(k);
t2 = [t1{:}];
if isnumeric(t2) % Takes care of floats
out(:,k) = num2cell(t2);
else
out(:,k) = t2
end
end
因此,前四行将显示为 -
out =
'0' 'device1' [ 3]
'1' 'device2' [33]
'2' 'device3' [ 3]
'3' 'device4' [34]