我对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.
我可以这样使用文本扫描,还是需要使用其他方法来突破文本?
答案 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
允许更好的显示格式,因此我们可以整齐地看到主导数和浮点数。