У меня есть приблизительно 5000 матриц с таким же количеством строк и разным количеством столбцов (20 x 200). Каждая из этих матриц должна сравниваться друг с другом в динамическом алгоритме программирования.Распараллеливать или векторизовать операцию all-to-all на большом числе матриц?
В вопросе this я спросил, как быстро выполнить сравнение и получил отличный ответ, включающий двумерную свертку. Поочередно, итерационно применяя этот метод, как и
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 миллионов вызовов.
Я также попытался использовать сделку(), чтобы сделать массив ячеек, состоящий полностью из следующего элемента данных, так что я мог бы использовать 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
К сожалению, это на самом деле не любой быстрее, потому что все время находится в compare(). Оба этих примера кода выглядят плохо подходящими для распараллеливания. Мне трудно понять, как сделать мои переменные нарезанными.
Спрятать() полностью в векторном формате; он использует только матричное умножение и conv2() (у меня создается впечатление, что все эти операции, включая cellfun(), должны быть многопоточными в MATLAB?).
Кто-нибудь видит (явно) параллелизированное решение или лучшую векторизацию проблемы?
Примечание
Я понимаю, что оба мои примеры неэффективны - первый будет в два раза быстрее, если он вычислил массив треугольной ячейки, а второй по-прежнему вычисления самостоятельно сравнений, а также. Но экономия времени для хорошей распараллеливания больше похожа на коэффициент 16 (или 72, если я устанавливаю MATLAB на все машины).
Адрес
Существует также проблема с памятью. Я использовал пару оценок, чтобы добавить каждый столбец H в файл с именами, такими как H1, H2 и т. Д., А затем очистить H i. К сожалению, экономия происходит очень медленно ...
Что делает «сравнение»? Какова строка примера в списке? – Jonas
Для матриц данных A и B он вычисляет A '* B и свертывает произведение с единичной матрицей. Матрицы нормированы; строки и столбцы содержат значения от 0 до 1, сумма которых равна 1. . Матрица, полученная в результате сравнения, содержит значения от -30 до 30, которые примерно соответствуют распределению экстремальных значений. –
В чем причина использования 'eval'? – Jonas