Мне было интересно, есть ли способ ускорить (возможно, посредством векторизации?) Условное заполнение огромных разреженных матриц (например, ~ 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
для сопоставления смежности с глобальным представлением.