对数组进行预分配后,​反而严重降低了赋值的​速度,请问如何解决?

30 visualizaciones (últimos 30 días)
嘉俊
嘉俊 el 26 de Oct. de 2024 a las 7:26
Editada: 嘉俊 el 28 de Oct. de 2024 a las 2:24
数组预分配后,赋值操作反而需要更多的时间,矩阵的维度越大,预分配后进行赋值需要的时间更多。
注释掉预分配语句后,赋值时间减少
clearvars
test_h_matx_diag = zeros(1024,1024,360); % 预分配语句
h_matx = rand(1024,1,360);
h_matx = exp(-1j*2*pi*h_matx);
for ii = 1:size(h_matx,3)
temp1 = diag(h_matx(:,:,ii));
test_h_matx_diag(:,:,ii) = temp1; % 赋值的速度受预分配的影响
end

Respuesta aceptada

埃博拉酱
埃博拉酱 el 26 de Oct. de 2024 a las 14:21
Editada: 埃博拉酱 el 26 de Oct. de 2024 a las 14:31
我测试的结果是预分配7秒,不预分配11秒,并没有出现预分配反而更慢的问题。
你是否在进行不预分配的测试之前,忘记了清空上次预分配测试后残余的变量?
另外,这样做更快,只要2秒:
test_h_matx_diag = zeros(1024*1024,360); % 预分配语句
test_h_matx_diag(1:1025:end,:)=exp(-1j*2*pi*rand(1024,360));
test_h_matx_diag=reshape(test_h_matx_diag,1024,1024,360);
  3 comentarios
埃博拉酱
埃博拉酱 el 27 de Oct. de 2024 a las 6:54
Editada: 埃博拉酱 el 27 de Oct. de 2024 a las 6:55
据我猜测,预分配语句本身并不会立即向操作系统申请内存,而是延迟到第一次修改该数组时,因此第一次循环的时间实际上还包括了真正的预分配操作时间,但后续就不用再分配了。而不预分配的情况在第一次循环时申请的内存比预分配的少,所以会更快,但是后续循环每次都要分配更多内存,所以总体比预分配的慢。 你可以用任务管理器监控MATLAB的内存占用看看是否是这样。
嘉俊
嘉俊 el 28 de Oct. de 2024 a las 0:39
Editada: 嘉俊 el 28 de Oct. de 2024 a las 2:24
确实是这样的,使用预分配语句后,在第一次循环的赋值中,内存占用一直在上涨,我甚至以为哪里出错导致内存泄漏了(lll¬ω¬),吓坏我了(*Φ皿Φ*)。因为原代码中,第三维为2160,每次程序运行到这里就不动弹了,我一度以为死循环了。我重新写了个小测试维度采用360才发现原来不是卡死(也就是本问题题目代中的码),是赋值语句占用时间太多了(lll¬ω¬)

Iniciar sesión para comentar.

Más respuestas (0)

Categorías

Más información sobre Big Data Processing en Help Center y File Exchange.

Etiquetas

Productos


Versión

R2024a

Community Treasure Hunt

Find the treasures in MATLAB Central and discover how the community can help you!

Start Hunting!