0

次の形式の 100 行を含むデータ ファイルがあります。

0,device1,3
1,device2,33
2,device3,3
3,device4,34
...
99,device100,36

100x3ここで、それらをMATLAB のセル配列に読み込みたいと思います。私は次のことをしました:

allData = textscan(fID,'%s %s %f', 'delimiter', ',');

次に、各アイテムが別のセル配列でallDataあるセル配列であることに気付きました。(最初の 2 列は string 型の cell 配列ですが、3 列目は double 型の cell 配列です)1x3100x1

つまり、読み取り結果はnested配列であり、これは望ましくありません。

100x3読み取り中にセル配列を直接取得するにはどうすればよい ですか?

4

2 に答える 2

2

これによりtextscan、変数allDataは次のようになります (わずか 4 行)。

allData = 
    {4x1 cell}    {4x1 cell}    [4x1 double]

すべてのデータが同じ型である場合にのみtextscan、オプションを使用して単一の cell 配列に直接マージできます。'CollectOutput'

残念ながらすべての数値データをdoubleに変換する1つの可能な回避策(あなたの場合は問題ではありません)、

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 など) を double に変換することです。この可能な変換を回避するには:

% 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{:}];
于 2014-02-26T23:42:39.077 に答える