Pré-alocação de matriz MATLAB mais lenta que a expansão de matriz dinâmica

Em cada iteração de um loop, estou calculando uma matriz MATLAB. Todas essas matrizes devem ser concatenadas juntas para criar uma matriz final. Conheço as dimensões dessa matriz final antes de entrar no loop, portanto, pré-alocar a matriz usando a função 'zeros' seria mais rápido do que inicializar uma matriz vazia e simplesmente anexar as sub-matrizes em cada iteração do meu loop. Estranhamente, meu programa roda MUITO mais devagar quando pré-aloco. Aqui está o código (apenas a primeira e a última linha diferem):

Isso é lento:

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

Isso é rápido:

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

Quanto a outras informações potencialmente úteis - minha matriz é 3D, e os números dentro dela são complexos. Como sempre, qualquer insight é apreciado.

questionAnswers(1)

yourAnswerToTheQuestion