gpt4 book ai didi

读取 24 位整数时 Matlab 变慢

转载 作者:太空宇宙 更新时间:2023-11-03 20:06:59 25 4
gpt4 key购买 nike

我发现使用带有“int24”选项的 Matlab“fread”读取以 24 位整数格式打包的数据需要花费大量时间。我发现,如果我读取“int32”或“int16”或“int8”中的数据,与“int24”相比,读取时间要快得多。有没有更好的方法来减少读取24位整数数据的时间?

为了了解问题所在,下面给出了示例代码。

clear all; close all; clc;

% generate some data and write it as a binary file
n=10000000;
x=randn(n,1);
fp=fopen('file1.bin', 'w');
fwrite(fp, x);
fclose(fp);

% read data in 24-bit format and measure the time
% please note that the data we get here will be different from 'x'.
% The sole purpose of the code is to demonstrate the delay in reading
% 'int24'

tic;
fp=fopen('file1.bin', 'r');
y1=fread(fp, n, 'int24');
fclose(fp);
toc;


% read data in 32-bit format and measure the time

% please note that the data we get here will be different from 'x'.
% The sole purpose of the code is to demonstrate the delay in reading
% 'int24'
tic;
fp=fopen('file1.bin', 'r');
y2=fread(fp, n, 'int32');
fclose(fp);
toc;

输出如下:耗时是 1.066489 秒。耗时是 0.047944 秒。

虽然 'int32' 版本读取更多数据(32*n 位),但它比 'int24' 读取速度快 25 倍。

最佳答案

通过将数据读取为无符号 8 位整数并将每组三个字节组合成等效的 24 位数字,我能够实现大约 4 倍的加速。请注意,这假定无符号的小端值,因此您必须修改它以说明有符号或大端数据:

>> tic;
>> fp = fopen('file1.bin', 'r');
>> y1 = fread(fp, n, 'bit24');
>> fclose(fp);
>> toc;
Elapsed time is 0.593552 seconds.

>> tic;
>> fp = fopen('file1.bin', 'r');
>> y2 = double(fread(fp, n, '*uint8')); % This is fastest, for some reason
>> y2 = [1 256 65536]*reshape([y2; zeros(3-rem(numel(y2), 3), 1)], 3, []);
>> fclose(fp);
>> toc;
Elapsed time is 0.143388 seconds.

>> isequal(y1,y2.') % Test for equality of the values

ans =

1

在上面的代码中,我只是用零填充了 y2 以匹配 y1 的大小。向量 y2 也最终成为行向量而不是列向量,如果需要,可以通过简单的转置来更改它。由于某些原因,fread 首先将值输出为 uint8,然后将它们转换为 double 比任何其他选项(即直接输出到 double 通过使最后一个参数 'uint8''uint8=>double')。

关于读取 24 位整数时 Matlab 变慢,我们在Stack Overflow上找到一个类似的问题: https://stackoverflow.com/questions/20817991/

25 4 0
Copyright 2021 - 2024 cfsdn All Rights Reserved 蜀ICP备2022000587号
广告合作:1813099741@qq.com 6ren.com