【问题标题】:MATLAB preallocating space to a while loopMATLAB将空间预分配给while循环
【发布时间】:2015-10-07 08:17:33
【问题描述】:

我无法找到足够的示例来帮助我解决为循环预分配空间的问题。

我的 while 循环有以下代码:

Time = [];
Pressure = [];

ii = 1;

while ii<=20000

Pressure_Data = fread(fileID, 2);
Pressure = [Pressure;Pressure_Data];
Time_Data = fread(fileID, 8);
Time = [Time;Time_Data];

ii = ii + 1;

end

然后我在 Pressure_Data 和 Time-Data "Appears to change size on every loop iteration. Consider preallocating for speed." 下看到警告曲线

所以我想预先分配空间,因为目前读取文件和存储数据需要一些时间。

到目前为止我的尝试:

Time = zeros(160000,1);
Pressure = zeros(40000,1);

但是我只得到一个零数组,而不是我需要的读取和存储值

【问题讨论】:

  • 除了变量 jj 之外,循环内部发生了什么变化?
  • @freude fread 从文件 fileID 中读取更多信息。
  • 嗯嗯,从数据文件中读取 2 个字节,然后读取 8 个字节,并重复此操作,直到达到“20000”所述的数字。因此,每次读取 2 个字节和 8 个字节时,都会产生不同的结果......或者正如@Shai 刚刚提到的那样:)

标签: arrays matlab loops memory


【解决方案1】:

当前的压力和时间值被附加到现有的数组中:

Pressure = [Pressure;Pressure_Data];
Time = [Time;Time_Data];

您真正想要的是将当前值写入数组中的正确位置。这是由

完成的
Pressure(2*ii-1 : 2*ii) = Pressure_Data;
Time(8*ii-7 : 8*ii) = Time_Data;

索引组成如下:在第一次迭代(ii=1)中,我们写入Pressure(1 : 2)Time(1 : 8)。在第二次迭代(ii=2)中,我们写信给Pressure(3 : 4)Time(9 : 16),以此类推。

另一个小输入:当您让 ii 从 1 变为 20000 时,您也可以使用 for 循环:

for ii=1:20000
    Pressure(2*ii-1 : 2*ii) = fread(fileID, 2);
    Time(8*ii-7 : 8*ii) = fread(fileID, 8);
end

【讨论】:

    猜你喜欢
    • 2016-07-23
    • 2022-01-25
    • 1970-01-01
    • 1970-01-01
    • 2013-01-12
    • 2011-03-07
    • 1970-01-01
    • 2016-08-30
    • 1970-01-01
    相关资源
    最近更新 更多