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

30 ビュー (過去 30 日間)
嘉俊
嘉俊 2024 年 10 月 26 日 7:26
編集済み: 嘉俊 2024 年 10 月 28 日 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

採用された回答

埃博拉酱
埃博拉酱 2024 年 10 月 26 日 14:21
編集済み: 埃博拉酱 2024 年 10 月 26 日 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 件のコメント
埃博拉酱
埃博拉酱 2024 年 10 月 27 日 6:54
編集済み: 埃博拉酱 2024 年 10 月 27 日 6:55
据我猜测,预分配语句本身并不会立即向操作系统申请内存,而是延迟到第一次修改该数组时,因此第一次循环的时间实际上还包括了真正的预分配操作时间,但后续就不用再分配了。而不预分配的情况在第一次循环时申请的内存比预分配的少,所以会更快,但是后续循环每次都要分配更多内存,所以总体比预分配的慢。 你可以用任务管理器监控MATLAB的内存占用看看是否是这样。
嘉俊
嘉俊 2024 年 10 月 28 日 0:39
編集済み: 嘉俊 2024 年 10 月 28 日 2:24
确实是这样的,使用预分配语句后,在第一次循环的赋值中,内存占用一直在上涨,我甚至以为哪里出错导致内存泄漏了(lll¬ω¬),吓坏我了(*Φ皿Φ*)。因为原代码中,第三维为2160,每次程序运行到这里就不动弹了,我一度以为死循环了。我重新写了个小测试维度采用360才发现原来不是卡死(也就是本问题题目代中的码),是赋值语句占用时间太多了(lll¬ω¬)

サインインしてコメントする。

その他の回答 (0 件)

カテゴリ

Help Center および File ExchangeBig Data Processing についてさらに検索

タグ

製品


リリース

R2024a

Community Treasure Hunt

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

Start Hunting!