Ускорение условного заполнения огромных разреженных матриц

Мне было интересно, есть ли способ ускорить (возможно, посредством векторизации?) Условное заполнение огромных разреженных матриц (например, ~ 1e10 x 1e10). Вот пример кода, в котором у меня есть вложенный цикл, и я заполняю разреженную матрицу только при соблюдении определенного условия:

% We are given the following cell arrays of the same size:
% all_arrays_1
% all_arrays_2
% all_mapping_arrays

N = 1e10; 

% The number of nnz (non-zeros) is unknown until the loop finishes
huge_sparse_matrix = sparse([],[],[],N,N);

n_iterations = numel(all_arrays_1);

for iteration=1:n_iterations

  array_1 = all_arrays_1{iteration};
  array_2 = all_arrays_2{iteration};

  mapping_array = all_mapping_arrays{iteration};

  n_elements_in_array_1 = numel(array_1);
  n_elements_in_array_2 = numel(array_2);

  for element_1 = 1:n_elements_in_array_1

    element_2     = mapping_array(element_1);

    % Sanity check:
    if element_2 <= n_elements_in_array_2
       item_1 = array_1(element_1);
       item_2 = array_2(element_2);      

       huge_sparse_matrix(item_1,item_2) = 1;
    end     
  end   
end

Я изо всех сил пытаюсь векторизовать вложенный цикл. Насколько я понимаю, заполнение разреженной матрицы элемент за элементом происходит очень медленно, когда количество записей для заполнения велико (~ 100M). Мне нужно работать с разреженной матрицей, поскольку она имеет размеры в диапазоне 10,000M x 10,000M. Однако этот способ заполнения разреженной матрицы в MATLAB очень медленный.

Редактирование:

Я обновил имена переменных, чтобы лучше отразить их природу. Вызовов функций нет.

Приложение:

Этот код строит матричную смежность для огромного графа. Переменная all_mapping_arrays содержит массивы сопоставления (~ отношение смежности) между узлами графа в локальном представлении , поэтому мне нужны array_1 и array_2 для сопоставления смежности с глобальным представлением.

5
задан Andrey Rubshtein 25 January 2012 в 21:18
поделиться