在循環的每次迭代中,我正在計算一個MATLAB矩陣。這些矩陣必須連接在一起以創建一個最終矩陣。我在進入循環之前知道這個最終矩陣的維數,所以我通過使用'零'函數預分配矩陣比初始化一個空數組要快,然後在我的循環的每次迭代中簡單地追加子陣列。奇怪的是,當我預先分配時,我的程序運行速度很慢。下面是代碼(只有第一個和最後一個行不同):MATLAB矩陣預分配比動態矩陣擴展慢
這是慢:
w_cuda = zeros(w_rows, w_cols, f_cols);
for j=0:num_groups-1
% gets # of rows & cols in W. The last group is a special
% case because it may have fewer than max_row_size rows
if (j == num_groups-1 && mod(w_rows, max_row_size) ~= 0)
num_rows_sub = w_rows - (max_row_size * j);
else
num_rows_sub = max_row_size;
end;
% calculate correct W and f matrices
start_index = (max_row_size * j) + 1;
end_index = start_index + num_rows_sub - 1;
w_sub = W(start_index:end_index,:);
f_sub = filterBank(start_index:end_index,:);
% Obtain sub-matrix
w_cuda_sub = nopack_cu(w_sub,f_sub);
% Incorporate sub-matrix into final matrix
w_cuda(start_index:end_index,:,:) = w_cuda_sub;
end
這是快:
w_cuda = [];
for j=0:num_groups-1
% gets # of rows & cols in W. The last group is a special
% case because it may have fewer than max_row_size rows
if (j == num_groups-1 && mod(w_rows, max_row_size) ~= 0)
num_rows_sub = w_rows - (max_row_size * j);
else
num_rows_sub = max_row_size;
end;
% calculate correct W and f matrices
start_index = (max_row_size * j) + 1;
end_index = start_index + num_rows_sub - 1;
w_sub = W(start_index:end_index,:);
f_sub = filterBank(start_index:end_index,:);
% Obtain sub-matrix
w_cuda_sub = nopack_cu(w_sub,f_sub);
% Incorporate sub-matrix into final matrix
w_cuda = [w_cuda; w_cuda_sub];
end
至於其他潛在有用的信息 - 我矩陣是3D的,其中的數字很複雜。一如往常,任何見解都被讚賞。
部分似乎缺少。矩陣或函數「W」和「filterBank」沒有定義。 – Miebster 2011-03-02 17:52:44
是的,這只是我認爲相關的代碼的一部分。謝謝。 – nedblorf 2011-03-02 18:08:30
不知道你的代碼在做什麼,或者至少有一些可執行的類比你的代碼在做什麼,如何能告訴你爲什麼它很慢?從你的代碼來看,如果W,filterBank和nopack_cu都是函數或函數,就不清楚了。似乎w_rows,w_cols,f_cols,num_groups,max_row_size以某種方式相互關聯,但不清楚。 如果你可以提供一個可執行的例子,我可以進一步看看它。我懷疑在我的機器上,頂部的例子會比底部例子執行得更快。 – Miebster 2011-03-02 18:27:07