a preasignación de matriz de MATLAB es más lenta que la expansión de matriz dinámica

En cada iteración de un bucle, estoy calculando una matriz MATLAB. Todas estas matrices se deben concatenar juntas para crear una matriz final. Conozco las dimensiones de esta matriz final antes de ingresar al bucle, por lo que pensé que la asignación previa de la matriz usando la función 'ceros' sería más rápida que inicializar una matriz vacía y luego simplemente agregar las submatrices en cada iteración de mi bucle. Curiosamente, mi programa se ejecuta MUCHO más lento cuando preasigno. Aquí está el código (solo la primera y la última línea difieren):

Esto es 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

Esto es 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

En cuanto a otra información potencialmente útil: mi matriz es 3D y los números que contiene son complejos. Como siempre, cualquier idea es apreciada.

Respuestas a la pregunta(1)

Su respuesta a la pregunta