Matlab:如何在现有单元格中分隔文本

时间:2015-02-12 19:42:07

标签: matlab

我对matlab世界有点新意,我遇到了一个我确信有一个简单解决方案的问题。

我从文本文件中导入了一些数据并解析出了标题,这导致了一个名为Data的1x35单元格。在每个单元格中(例如Data {1,1,1})是看起来像这样的数据:

'600000   -947.772827   -107.045776    -70.818062'
'600001   -920.431396    -86.098122    -56.485119'
'600002   -878.332886    -88.673630    -85.249130'
'600003   -851.637695    -68.546539    -96.691711'
'600004   -834.707642    -28.951260    -73.218872'
'600005   -783.431580     40.657402     24.242268'

问题是,每一行都包含在一个列中。我想解析它,以便我有4列而不是1列。

我尝试使用以下方法进一步解析数据单元格:

textscan(Data{1,1,1}, '%u%f10%f10%f10', 1)

但是它导致了以下错误:

Error using textscan
First input must be of type double or string.

我可以这样使用文本扫描,还是需要使用其他方法来突破文本?

1 个答案:

答案 0 :(得分:2)

使用textscan,您只能指定单个字符串或单个数字。根据您的输入,我怀疑它是一个6 x 1单元字符串数组。因此,您别无选择,只能遍历每个单元格,并使用textscan转换每个单元格数组内容。另外,摆脱%10间距,因为它实际上已经搞砸了您的位置&#39 ;解析出字符串。另外,设置标识符以标识您看到double%f)的第一个数字,而不是无符号整数(%u),以便更轻松地进行转换。

因此,做这样的事情:

>> Data{1,1,1} = {'600000   -947.772827   -107.045776    -70.818062'
'600001   -920.431396    -86.098122    -56.485119'
'600002   -878.332886    -88.673630    -85.249130'
'600003   -851.637695    -68.546539    -96.691711'
'600004   -834.707642    -28.951260    -73.218872'
'600005   -783.431580     40.657402     24.242268'};

>> format long g;
>> vals = cell2mat(cellfun(@(x) cell2mat(textscan(x, '%f%f%f%f', 1)), Data{1,1,1}, 'uni', 0))

vals =



Columns 1 through 3

                    600000               -947.772827               -107.045776
                    600001               -920.431396                -86.098122
                    600002               -878.332886                 -88.67363
                    600003               -851.637695                -68.546539
                    600004               -834.707642                 -28.95126
                    600005                -783.43158                 40.657402

  Column 4

                -70.818062
                -56.485119
                 -85.24913
                -96.691711
                -73.218872
                 24.242268

这句话vals = ...非常令人满意,但很容易解释。从这句话开始:

cell2mat(textscan(x, '%f%f%f%f', 1))

对于x中的给定单元格Data{1,1,1},我们要为x中存储的每个字符串解析出四个数字。 textscan会将这些数字作为单个单元格元素放入单元格数组中。我们希望将每个元素转换为数字数组,因此我们需要cell2mat

为了对Data{1,1,1}中的所有元素进行操作,我们需要使用cellfun来允许我们这样做:

cellfun(@(x) cell2mat(textscan(x, '%f%f%f%f', 1)), Data{1,1,1}, 'uni', 0)

第一个输入是对Data{1,1,1}(第二个输入)中存储的每个单元格进行操作的函数。我们基本上告诉cellfun我们想要按照我之前谈到的方式对Data{1,1,1}中存储的单元格数组中的每个单元格进行操作。此函数具有输入参数x,它是Data{1,1,1}中的一个单元格。现在,uni标志设置为0,因为cellfun的输出不是单个数字,而是数组数字 - 每行一个数组你的细胞阵列。该阶段的输出将是6个元素的单元阵列,其中每个位置是4个元素的数字数组。为了完成它,我们在此输出上调用cell2mat以最终将文本转换为2D矩阵,因此:

vals = cell2mat(cellfun(@(x) cell2mat(textscan(x, '%f%f%f%f', 1)), Data{1,1,1}, 'uni', 0))

format long g允许更好的显示格式,因此我们可以整齐地看到主导数和浮点数。