是否可以用Matlab识别数据类型?
情况如下:我使用Matlab读取光谱仪创建的文件。为此,我使用以下简单代码:是否可以用Matlab识别数据类型?,matlab,Matlab,情况如下:我使用Matlab读取光谱仪创建的文件。为此,我使用以下简单代码: id=fopen(filename, 'r', 'l'); [realimag, ~] = fread(id, 'int32'); fclose(id); 我的问题是,现在我有了第二个光谱仪,它生成的文件需要使用fread函数中的“double”来读取。所以每次我都要修改代码。。。有没有办法知道什么是数据类型,这样我就不必每次都更改代码 提前谢谢。fread是读取文件,将其解释为二进制文件,即位序列。因
id=fopen(filename, 'r', 'l');
[realimag, ~] = fread(id, 'int32');
fclose(id);
我的问题是,现在我有了第二个光谱仪,它生成的文件需要使用fread函数中的“double”来读取。所以每次我都要修改代码。。。有没有办法知道什么是数据类型,这样我就不必每次都更改代码
提前谢谢。
fread
是读取文件,将其解释为二进制文件,即位序列。因此,您可以读取二进制数据流并根据自己的喜好对其进行解释,除非有人告诉您如何读取,否则您无法知道如何读取
尝试使用这些命令读取包含以下内容的文件
àéèìòù
它会起作用的,你会得到的
>> realimag
realimag =
-320280096
168491506
这毫无意义
如果你读得很认真
[realimag, ~] = fread(id, 'char');
然后你会得到
realimag =
224
233
232
236
242
249
10
10
你猜怎么着
>> int32('àéèìòù')
ans =
1×6 int32 row vector
224 233 232 236 242 249
那那两个十是什么?那么
>> char(10)
ans =
'
'
一条新路线
这只是说,当您读取二进制文件时,如何读取它是您的选择
显然,如果有人告诉您前n个字节包含一个字符串,该字符串告诉您如何读取文件的其余部分,那么情况就不同了。但是,同样,您必须知道,或者必须有人告诉您。一个填充了
双
值的文件只是一个位序列,它将与两倍于int32
值的正确序列相同。这真的是你需要回答的问题吗?相反,您可以通过依赖过程中的用户输入来解决问题,但这是一种比“每次都更改代码”更方便的输入,或者您可以使用文件名中的线索来确定文件来自何处。否则,您将不得不根据数字的大小进行有根据的猜测,精度
值将产生最可信的结果。记住,double
值和一对int32
值中的最低有效位位于完全不同的位置,因此除非第二个光谱仪的值可能具有大于int32
范围的量级(±2^31)然后,如果文件有足够的值,经过教育的猜测应该很容易,因为使用错误的精度读取的文件几乎肯定包含不可行的值。谢谢您的评论。这些文件与由同一软件创建的文件同名(只是版本不同),我希望避免用户输入,因为我以外的其他人会使用这些代码,而且他们可能不知道如何做正确的选择。但你让我觉得我可能有办法知道“realimag”的大小。因此,我将读取文件两次,并选择一个有良好的大小。谢谢你的主意!谢谢你的回答。不幸的是,文件开头没有字符串告诉我如何读取它。我知道我必须以我自己的方式阅读它,因为创建这些文件的软件文档(两个版本的软件相同,但版本不同…)。但是Will的评论让我认为我可能有办法知道“realimag”应该有多长,我将尝试从两种方式读取文件,并选择一个大小正确的文件。@Ronicent,我从来没有说过您的文件中有/应该有字符串或任何特殊的内容。我的观点是,“当按位读取文件时,是否有可能识别文件中的数据类型?”的答案是“否”,无论使用何种语言,原因很简单,即任何数据类型的值最终都只是一个位序列。因此,除非您能够判断将其解释为double
s序列是否比将其解释为char
s序列(或unit8
,或…)更好,否则您不知道如何读取它。