[英]How to convert cell array of mixed doubles and hexadecimals with leading “0x” to 2D array of doubles?
我的目标是将制表符分隔的数据集(包含数字列和十六进制列的混合)解析为一个双矩阵,其中所有值都已转换为浮点数。
我在Matlab工作。 我有一个制表符分隔的文件,其中包含数字列和十六进制列的混合,例如:
A | B | C | D
---|---|---|-----------
0x3| 1| 2| 0x118c0832
---|---|---|-----------
0x3| 3| 4| 0x118c0832
---|---|---|-----------
0x3| 5| 6| 0x118c0832
---|---|---|-----------
0x3| 7| 8| 0x118c0832
为了解析数据,我像这样利用textscan()
函数(为简单起见,我们将跳过头文件的提取,并假装文件从第2行开始):
fileID = fopen('data.dat');
formatString = '%s %f %f %s';
data = textscan(fileID,formatString);
注意: textscan()
不接受十六进制转换字符%x
。
此时,我剩下一个1x4的单元数组data
,其中data{1,3}
对应于包含C列内容的4x1单元数组,即: data{1,3} == {2; 4; 6; 8}
data{1,3} == {2; 4; 6; 8}
data{1,3} == {2; 4; 6; 8}
。
一旦所有值都为数值,则简单data = cell2mat(data)
将我的数据转换为所需的4x4数组; 但是,由于前导'0x'
,我正在努力寻找最简单,最快的方法将十六进制单元格转换为浮点数。
我尝试使用regexp()
和hex2dec()
的组合来组合某些东西,但这通常涉及创建越来越多的单元格数组,因此任何解决方案似乎都是令人费解的。
有任何想法吗?
您可以像这样在对textscan
的调用中删除0x
:
fileID = fopen('data.dat');
formatString = '0x%s %f %f 0x%s';
data = textscan(fileID,formatString);
然后使用hex2dec
(用于整数结果)或hex2num
(用于双精度浮点结果)转换列:
data{1} = hex2dec(data{1});
data{4} = hex2dec(data{4});
data = [data{:}];
结果:
data =
3 1 2 294389810
3 3 4 294389810
3 5 6 294389810
3 7 8 294389810
您可以简单地修剪掉所有0x值,并使用带有cellfun
的lambda表达式( 匿名函数 )转换为十六进制。
fileID = fopen('data.dat');
formatString = '%s %f %f %s';
data = textscan(fileID,formatString);
f = @(x) hex2num(x(3:end));
data{1} = cellfun(f, data{1});
data{4} = cellfun(f, data{4});
显然,这仅在八度中有效,但是如果您使用八度,那么您就很满意。 ;)
您可以执行此操作而无需使用regex
或删除0x
前缀。 str2double会将以0x
字符串解析为十六进制数字,并进行相应的转换:
fileID = fopen('data.dat');
formatString = '%s %f %f %s';
data = textscan(fileID,formatString)
fclose(fileID);
data =
{
[1,1] =
{
[1,1] = 0x3
[2,1] = 0x3
}
[1,2] =
1
3
[1,3] =
2
4
[1,4] =
{
[1,1] = 0x118c0832
[2,1] = 0x118c0832
}
}
data{1} = str2double(data{1});
data{4} = str2double(data{4});
结果:
data =
{
[1,1] =
3
3
[1,2] =
1
3
[1,3] =
2
4
[1,4] =
294389810
294389810
}
声明:本站的技术帖子网页,遵循CC BY-SA 4.0协议,如果您需要转载,请注明本站网址或者原文地址。任何问题请咨询:yoyou2525@163.com.