Я пытаюсь иметь дело с очень большим набором данных. У меня есть k = ~ 4200 матриц (разных размеров), которые нужно сравнивать комбинаторно, пропуская неуникальные и самостоятельные сравнения. Каждое из k (k-1) / 2 сравнений создает матрицу, которую необходимо индексировать по отношению к своим родителям (то есть можно узнать, откуда она взялась). Удобный способ сделать это - (треугольно) заполнить массив ячеек размером k на k результатом каждого сравнения. Это в среднем ~ 100 X ~ 100 матриц. Используя поплавки одинарной точности, он в целом обрабатывает до 400 ГБ.
Мне нужно 1) сгенерировать массив ячеек или его части, не пытаясь поместить все это в память, и 2) получить доступ к его элементам (и их элементам) таким же образом. Мои попытки оказались неэффективными из-за зависимости от eval()
MATLAB, а также от save
и clear
, встречающихся в циклах.
for i=1:k
[~,m] = size(data{i});
cur_var = ['H' int2str(i)];
%# if i == 1; save('FileName'); end; %# If using a single MAT file and need to create it.
eval([cur_var ' = cell(1,k-i);']);
for j=i+1:k
[~,n] = size(data{j});
eval([cur_var '{i,j} = zeros(m,n,''single'');']);
eval([cur_var '{i,j} = compare(data{i},data{j});']);
end
save(cur_var,cur_var); %# Add '-append' when using a single MAT file.
clear(cur_var);
end
Другая вещь, которую я сделал, - это выполнить разбиение, когда mod((i+j-1)/2,max(factor(k(k-1)/2))) == 0
. Это делит результат на наибольшее количество кусков одинакового размера, что кажется логичным. Индексация немного сложнее, но не так уж и плоха, потому что можно использовать линейный индекс.
Кто-нибудь знает / видит лучший способ?