繁体   English   中英

如何将以“ 0x”开头的混合双精度和十六进制单元格数组转换为二维双精度数组?

[英]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});

假设我们手头有第四列,并将其命名为dummyStr

dummyStr = {'0x218c0832','0x138c0832','0x518c0832','0x318c5832'};

您可以使用regexprepstrrep删除0x标签:

dummyStr = regexprep(dummyStr,'0x',''); 
floatNums = hex2num(dummyStr );

显然,这仅在八度中有效,但是如果您使用八度,那么您就很满意。 ;)


您可以执行此操作而无需使用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.

 
粤ICP备18138465号  © 2020-2024 STACKOOM.COM