J'essaie de traiter un très grand ensemble de données. J'ai k = ~ 4200 matrices (tailles variables) qui doivent être comparées de manière combinatoire, en sautant des comparaisons non-uniques et auto. Chacune des comparaisons k (k-1)/2 produit une matrice, qui doit être indexée par rapport à ses parents (c'est-à-dire qui peut trouver d'où elle vient). Le moyen pratique de le faire est de remplir (triangulairement) un tableau de cellules k par k avec le résultat de chaque comparaison. Ce sont en moyenne ~ 100 X ~ 100 matrices. En utilisant des flotteurs de précision simple, il fonctionne à 400 Go globalement.
Je dois 1) générer le tableau de cellules ou des morceaux de celui-ci sans essayer de placer le tout en mémoire et 2) accéder à ses éléments (et leurs éléments) de la même manière. Mes tentatives ont été inefficaces en raison de la dépendance sur MATLAB eval()
ainsi que save
et clear
survenant dans les boucles.Algorithmes de mémoire insuffisante pour l'adressage de grandes baies
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
L'autre chose que je l'ai fait est d'effectuer la scission quand mod((i+j-1)/2,max(factor(k(k-1)/2))) == 0
. Cela divise le résultat en le plus grand nombre de pièces de même taille, ce qui semble logique. L'indexation est un peu plus compliquée, mais pas trop mauvaise car un index linéaire pourrait être utilisé.
Est-ce que quelqu'un sait/voit un meilleur moyen?
Dans cette question, je/nous essayons de faire une version en mémoire/fast /: http://stackoverflow.com/questions/2872249/parallelize-or-vectorize-all-against-all-operation-on-a-large-number-of-matrices –
C'est une mauvaise pratique d'utiliser 'EVAL Pour créer des variables avec des noms générés dynamiquement, utilisez à la place 'STRUCT' avec des références de champs dynamiques: http://matlabwiki.mathworks.com/MATLAB_FAQ#How_can_I_create_variables_A1.2C_A2.2C....2CA10_in_a_loop.3F – Amro