Matlab 将字符数组拆分为单元格数组和矩阵
我有一个文本文件 文件中大约有20000行数据。每行有一列&包含256个字符(都是数字) 我需要将每一行分割成一个单元格数组或矩阵。因此,每8个字符都是“一条”信息。我想将前3个字符分割成一个单元格数组,然后将接下来的5个字符分割成一个双精度数组,然后对接下来的8个字符进行同样的分割Matlab 将字符数组拆分为单元格数组和矩阵,matlab,Matlab,我有一个文本文件 文件中大约有20000行数据。每行有一列&包含256个字符(都是数字) 我需要将每一行分割成一个单元格数组或矩阵。因此,每8个字符都是“一条”信息。我想将前3个字符分割成一个单元格数组,然后将接下来的5个字符分割成一个双精度数组,然后对接下来的8个字符进行同样的分割 example 1653256719812345 myCellArray (1 x 2) myDoubleArray (1 x 2) [165, 198] [32567
example
1653256719812345
myCellArray (1 x 2) myDoubleArray (1 x 2)
[165, 198] [32567, 12345]
执行此操作的最佳方法是什么?逐个迭代您的行,然后运行以下代码
k=int2str(1653256719812345);
> myCellArray{1}=k(1:3)
myCellArray =
'165'
>> mydoublearray(1)=str2num(k(4:9))
mydoublearray =
325671
如果有一些公式化的模式,你应该合并它,而不是手动硬编码。使用
测试:
% Test with string of 256 random digits that all happen to be 1:8 repeated 32 times
x = '1234567812345678123456781234567812345678123456781234567812345678123456781234567812345678123456781234567812345678123456781234567812345678123456781234567812345678123456781234567812345678123456781234567812345678123456781234567812345678123456781234567812345678';
>> y = textscan(x, '%3d%5d', 'Delimiter', '')
y =
[32x1 int32] [32x1 int32]
>> y{1}
ans =
123
123
123
123
...
我不知道文件的确切格式,因此您可能必须在循环中逐行执行此操作(在这种情况下,您将使用fgetl
获取每一行,然后用fgetl
的输出替换textscan
语句中的fid
)
通常,当您发现自己必须读入由FORTRAN代码(固定字段宽度文本文件)生成的数据时,
textscan
的'Delimiter'、
和'Whitespace',“
参数是您的朋友 使用regexp
。如果文件data.txt
包含
1653256719812345
1563256719812345
1233256719812345
1463256719812345
然后,以下MATLAB语句将读取这些数字
>> txt = fileread('data.txt') % Read entire file in txt
>> out = regexp(txt,'(\d{3})(\d{5})(\d{3})(\d{5})','tokens') % Match regex capturing groups
out =
{1x4 cell} {1x4 cell} {1x4 cell} {1x4 cell}
out
中的每个单元格都是文件中的一行,包含解析后的数字作为字符串。您可以使用str2double
在MATLAB中将数字转换为数字数据类型
>> nums = cellfun(@str2double,out,'uni',0)
nums =
[1x4 double] [1x4 double] [1x4 double] [1x4 double]
您提供的示例显示了16个字符,但您只提供了8个字符的外观。预期的输出格式是什么?它是一个二维矩阵还是一个由数字组成的单元数组,我们看到3个数字,然后是5个数字,然后是3个数字,然后是5个数字……等等?抱歉,我刚刚意识到我的输出不是很清楚。因此,在上面的示例更新中,您可以看到有两个数组,1 x 2和另一个1 x 2。如果有50行,每列16个字符长,则两个矩阵将为50 x 2。如果列增加到32个字符,则矩阵将为50 x 4使用
regexp
可以避免迭代。提供的数据实际上是作为20000 x 1单元格输入的。当我做下一行时,它返回一个1 x 2的空单元格,假设我做错了什么?x=文本扫描(y,“%3d%5d”);有两种可能。首先,您跳过了“分隔符”部分。在这里的例子中,MATLAB只取前8个字符,然后转到下一个分隔符字符,即行的末尾。第二,你需要传递文本。所以如果你进入一个牢房,你将一无所获。您需要传入y{1}
以获取文本数组。如果单元格数组的元素已经是数字,那么这根本不起作用,您需要重写您的问题,因为这是一个完全不同的问题。只是添加了“分隔符”,“部分仍然相同”。数据来自一个20000 x 1的单元格。然后我将单元格数组转换为20000 x 256的字符数组。然后我尝试x=textscan(geo,'%3d%5d','Delimiter','';这仍然是错误的吗?我们正在进入这样一个领域:我没有你的数据,这使得我很难调试你的代码。您必须阅读texscan
帮助页面,然后自己尝试一些不同的方法。例如,doesx=textscan(geo(1,:),'%3d%5d','Delimiter',''代码>工作以仅读取第一行?如果是这样的话,那么换行符会把你搞得一团糟,你可能需要做一个循环,分别阅读每一行。你确定你的数据都是数字吗?如果有任何字母或无法打印的字符,那也会把事情搞得一团糟代码>来自我上面的代码,它应该模拟数据的前4行,并将其插入textscan
中,工作正常。唯一的诀窍是它按行读取数据,因此如果我插入X
或X'
,我会得到不同的答案。一定要确保你的答案是正确的。
>> nums = cellfun(@str2double,out,'uni',0)
nums =
[1x4 double] [1x4 double] [1x4 double] [1x4 double]