textscan()读取结果是嵌套的单元格数组?

时间:2014-02-26 22:45:16

标签: arrays matlab textscan

我有一个包含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单元格数组?

2 个答案:

答案 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]