У меня примерно 5000 матриц с одинаковым количеством строк и разным количеством столбцов (20 x ~ 200). Каждая из этих матриц должна сравниваться друг с другом в алгоритме динамического программирования.
В этом вопросе я спросил, как быстро выполнить сравнение, и получил превосходный ответ, включающий двухмерную свертку. Поочередно, итеративно применяя этот метод, вот так
list = who('data_matrix_prefix*')
H = cell(numel(list),numel(list));
for i=1:numel(list)
for j=1:numel(list)
if i ~= j
eval([ 'H{i,j} = compare(' char(list(i)) ',' char(list(j)) ');']);
end
end
end
быстро для небольших подмножеств данных (например, для 9 матриц, 9 * 9 - 9 = 72 вызова выполняются за ~ 1 с, 870 вызовов за ~ 2,5 с).
Однако для обработки всех данных требуется почти 25 миллионов вызовов.
Я также попытался с помощью метода deal () создать массив ячеек, состоящий полностью из следующего элемента данных, чтобы я мог использовать cellfun () в одном цикле:
# who(), load() and struct2cell() calls place k data matrices in a 1D cell array called data.
nextData = cell(k,1);
for i=1:k
[nextData{:}] = deal(data{i});
H{:,i} = cellfun(@compare,data,nextData,'UniformOutput',false);
end
К сожалению, на самом деле это не так быстро, потому что все время в сравнении (). Оба этих примера кода кажутся неподходящими для распараллеливания. У меня проблемы с выяснением, как сделать мои переменные нарезанными.
сравнение () полностью векторизовано; он использует только умножение матриц и conv2 () (у меня сложилось впечатление, что все эти операции, включая cellfun (), должны быть многопоточными в MATLAB?).
Кто-нибудь видит (явно) распараллеленное решение или лучшую векторизацию проблемы?
Примечание
Я понимаю, что оба моих примера неэффективны - первый будет в два раза быстрее, если он вычислит массив треугольных ячеек, а второй все еще будет вычислять и самосравнения. Но экономия времени для хорошего распараллеливания больше в 16 раз (или 72, если я установлю MATLAB на всех машинах).
Помимо
Существует также проблема с памятью. Я использовал пару уловок, чтобы добавить каждый столбец H в файл с такими именами, как H1, H2 и т. Д., А затем очистить H i . К сожалению, сохранения очень медленные ...