我有一个简单的二进制文件,其中包含彼此相邻的32位浮点数。
[使用Julia,我想读取每个数字(即每个32位字),并将每个数字依次放入Float32
格式的数组中。
[通过查看the documentation,我尝试了一些不同的操作,但是所有操作都产生了不可能的值(我正在使用具有已知值的二进制文件作为伪输入)。似乎:
Julia一次读取一个字节的二进制文件。
Julia正在将每个字节放入Uint8
数组。
例如,readbytes(f, 4)
给出一个无符号8位整数的4元素数组。 read(f, Float32, DIM)
还会给出奇怪的值。
任何人都知道我应该如何进行吗?
我发现了问题。以单精度浮点格式导入二进制数据的正确方法是raw = rand(Uint8, 4*10) # i.e. a vector of Uint8 aka bytes
floats = reinterpret(Float32, raw) # now a vector of 10 Float32s
,其中julia> raw = rand(Uint8, 4*2)
8-element Array{Uint8,1}:
0xc8
0xa3
0xac
0x12
0xcd
0xa2
0xd3
0x51
julia> floats = reinterpret(Float32, raw)
2-element Array{Float32,1}:
1.08951e-27
1.13621e11
是文件流,read(f, Float32, NUM_VALS)
是数据类型,f
是字数(值或数据点)在二进制数据文件中。
事实证明,每次调用Float32
时,数据指针都会迭代到二进制文件中的下一项。
这使人们能够简单地逐行读取数据:
NUM_VALS
但是,我想在一行代码中加载所有数据。在调试时,我多次在同一文件指针上使用read(f, [...])
,而没有重新声明文件指针。结果,当我尝试正确的操作,即f = open("my_file.bin")
first_item = read(f, Float32)
second_item = read(f, Float32)
# etc ...
时,得到了意外的值。
Julia语言自5年前以来发生了很大变化。 read()
不再具有同时指定类型和长度的API。 read(f, Float32, NUM_VALS)
创建二进制数组的视图,而不是具有所需类型的数组。现在看来,执行此操作的最佳方法是预先分配所需的数组并用read()
填充它:
reinterpret()
这将用所需的浮点数填充read!
。