Bonsoir
je veux afficher les résultats de mon code Matlab vers un fichier .mat pour les réutiliser ultérieurement
je sais pas comment utiliser les fichier .mat, est ce qu'il y a qq'un peut m'aider?
merci d'avance
Bonsoir
je veux afficher les résultats de mon code Matlab vers un fichier .mat pour les réutiliser ultérieurement
je sais pas comment utiliser les fichier .mat, est ce qu'il y a qq'un peut m'aider?
merci d'avance
Bonjours,
Qu'est-ce que tu entends par "afficher"?
Les fichiers .mat sont fait pour stocker des variables.
Pour les utiliser:
Code : Sélectionner tout - Visualiser dans une fenêtre à part
1
2 doc save doc load
je veux dire sauvegarder les résultats.voila le pb:
j'ai un problème au niveau de la saturation de la mémoire.
j'ai 3 parties dans mon programme; chacune contient des calcules lourds.
je peux exécuter la partie 1 et puis je fais 'save' pour sauver les résultats.
puis au début de la partie 2, je fais load des résultats de la partie 1.....
comme ça est ce que l'utilisation de save et load peut être une solution pour résoudre le problème de la saturation de la mémoire?
par exemple si j'ai une matrice M comme résultats de la partie 1
je dois alors mettre a la fin de la partie 1:
puis juste au debut de la partie 2 je dois mettre:
Code : Sélectionner tout - Visualiser dans une fenêtre à part
1
2 save(nom fichier.mat, 'M');
est ce que c'est juste?
Code : Sélectionner tout - Visualiser dans une fenêtre à part
1
2 x=load(nom fichier.mat, 'M');
a+
Oui c'est juste, avec le nom du fichier entre guillemets comme M
mais ça ne résout pas encore le pb de saturation de la mémoire , j’obtiens encore l'erreur:
qu'est ce que vous me proposez???? Out of memory. Type HELP MEMORY for your options.
Et pourrait-on savoir quel est le code qui produit cette erreur?
Un peu de lecture: Out of memory. Type HELP MEMORY for your options.
bonjour
oui j'ai bien lu ce FAQ. mais j'ai pas trouver une solution a mon pb.
comme j'ai mentionner en haut, mon code contient des parties pour chaque partie j'ai des traitements sur mes vidéos.
les résultats de traitement 1 vont être utiliser par le traitement2, les résultats de traitement 2 utiliser pour le traitement 3....
juste au niveau de traitement 2 l’exécution s’arrête et l'erreur apparait.
je sais pas comment je peux vous montrer le code car c très long.
des idées SVP
Monter nous ton code.
Sans ça, nous ne pourrons pas t'aider efficacement.
le code est le suivant:
l'erreur provient au cours de traitement de vidéo au niveau de l'instruction suivante: (ligne 93)
Code : Sélectionner tout - Visualiser dans une fenêtre à part
1
2
3
4
5
6
7
8
9
10
11
12
13
14
15
16
17
18
19
20
21
22
23
24
25
26
27
28
29
30
31
32
33
34
35
36
37
38
39
40
41
42
43
44
45
46
47
48
49
50
51
52
53
54
55
56
57
58
59
60
61
62
63
64
65
66
67
68
69
70
71
72
73
74
75
76
77
78
79
80
81
82
83
84
85
86
87
88
89
90
91
92
93
94
95
96
97
98
99
100
101
102
103
104
105
106
107
108
109
110
111
112
113 clc; clear all; disp (' Creation de la structure du travail pour la reconnaissance d"actions en vidéo...') conf.calDir = 'C:\code\dataset\KTH' ; conf.dataDir = 'C:\data\' ; %conf.dataDir = 'data\' ; conf.numTrain = 1 ; conf.numTest = 2 ; conf.numClasses = 3; conf.numWords = 1000 ; conf.quantizer = 'kdtree' ; conf.svm.C = 10 ; conf.svm.solver = 'pegasos' ; conf.svm.biasMultiplier = 1 ; % PREFIX conf.prefix = 'baseline' ; % creation des fichiers .mat conf.vocabTPath = fullfile(conf.dataDir, [conf.prefix '-vocabT.mat']) ; conf.vocabSPath = fullfile(conf.dataDir, [conf.prefix '-vocabS.mat']) ; conf.BOWTPath = fullfile(conf.dataDir, [conf.prefix '-BOWTApp.mat']) ; conf.BOWSPath = fullfile(conf.dataDir, [conf.prefix '-BOWSApp.mat']) ; conf.histsTPath=fullfile(conf.dataDir, [conf.prefix '-BOWTT.mat']) ; conf.histsSPath=fullfile(conf.dataDir, [conf.prefix '-BOWTS.mat']) ; conf.modelPath = fullfile(conf.dataDir, [conf.prefix '-model.mat']) ; conf.TrajAppPath = fullfile(conf.dataDir, [conf.prefix 'trajectoriesApp']) ; conf.siftaccAppPath = fullfile(conf.dataDir, [conf.prefix '-siftaccApp']) ; conf.TrajtotPath = fullfile(conf.dataDir, [conf.prefix 'trajectories']) ; conf.siftacctotPath = fullfile(conf.dataDir, [conf.prefix '-siftacc']) ; % Model trained: model.mat conf.modelPath = fullfile(conf.dataDir, [conf.prefix '-model.mat']) ; conf.resultPath = fullfile(conf.dataDir, [conf.prefix '-result.mat']) ; % -------------------------------------------------------------------- % création de la structure des classes % -------------------------------------------------------------------- classes = dir(conf.calDir) ; classes = classes([classes.isdir]) ; classes = {classes(3:conf.numClasses+2).name}; videos = {} ; videoClass = {} ; for ci = 1:length(classes) vids = dir(fullfile(conf.calDir, classes{ci}, '*.avi'))' ; vids = vl_colsubset(vids, conf.numTrain + conf.numTest) ; vids = cellfun(@(x)fullfile(classes{ci},x),{vids.name},'UniformOutput',false) ; videos = {videos{:}, vids{:}} ; videoClass{end+1} = ci * ones(1,length(vids)) ; end selTrain = find(mod(0:length(videos)-1, conf.numTrain+conf.numTest) < conf.numTrain) ; selTest = setdiff(1:length(videos), selTrain) ; videoClass = cat(2, videoClass{:}) ; model.classes = classes ; model.quantizer = conf.quantizer ; model.vocab = [] ; model.w = [] ; model.b = [] ; model.classify = @classify ; %------------------------ traitement------------------% disp('extraction des descripteurs de la base d"apprentissage: training...'); selTrainFeats = vl_colsubset(selTrain,5*10) ; trajectoriesApp = {} ; siftaccApp= {}; siftspatialApp={}; X={}; Y={}; for ii = 1:length(selTrainFeats) video =fullfile(conf.calDir, videos{selTrainFeats(ii)}) ; [X{ii} Y{ii}]= calcultrajectoires(video); close all; siftaccApp{ii}=calculsiftacc(video, X{ii} ,Y{ii} ); siftspatialApp{ii}=siftspatial(video, X{ii} ,Y{ii}); end disp('creartion de vocabulaire par kmeans pour la base d"apprentissage ...'); %------------ traitement 1----------------------------------% siftaccAp=cat(1,siftaccApp{:}); siftspaApp=cat(1, siftspatialApp{:}); [dommy3 vocabSS]= k_means(siftspaApp, 300); [domy2 vocabS] = k_means(siftaccAp, 1000); %------------------------ traitement2----------------------------- % disp ('calcul des descripteurs pour toute la base...') nbp=0; for ii = 1:length(videos) length(videos)) ; video= fullfile(conf.calDir, videos{ii}) ; [ X{ii} Y{ii} ]= calcultrajectoires(video); close all; [n m]=size(X{ii}); nbp=nbp+n*m; %code s'arrete iciiiiii: siftacc{ii}=calculsiftacc(video, X{ii} ,Y{ii} ); siftspa{ii}=siftspatial(video, X{ii} ,Y{ii}); end % -------------------------------------------------------------------- % traitement 3 % -------------------------------------------------------------------- BOWTT={}; BOWTS={}; BOWTSP={}; for ii = 1:length(videos) [BOWTS{ii}] = calcVisualWordHist (siftacc{ii},vocabS); [BOWTSP{ii}] = calcVisualWordHist (siftspa{ii},vocabSS); end BOWTTM = cat(2, BOWTT{:}) ; BOWTSM = cat(2, BOWTS{:}) ; BOWTSPM = cat(2, BOWTSP{:}) ; save(conf.histsTPath, 'BOWTTM') ; save(conf.histsSPath, 'BOWTSM') ; BOW=[ BOWTSM ;BOWTSPM];
Code : Sélectionner tout - Visualiser dans une fenêtre à part siftacc{ii}=calculsiftacc(video, X{ii} ,Y{ii} );
Première remarque, pourquoi stocker les valeurs de X et Y dans des tableaux de cellules alors que tu n'en t'en sert qu'une seule fois ?
Remplace [ X{ii} Y{ii} ]= calcultrajectoires(video); par [ X Y ]= calcultrajectoires(video); et X{ii} par X dans la suite du code (idem pour Y)
Ensuite, à la fin du traitement 1, nettoie les variables devenues inutiles :
Dis nous si cela résout ton problème.
Code : Sélectionner tout - Visualiser dans une fenêtre à part clear siftaccApp siftspatialApp dommy3 domy2
bonjour
comment je fais ce changement alors que j'ai une boucle for??
cette boucle va traiter tt mes vidéo, vidéo par vidéo. a la fin de cette boucle "siftaccApp" et "siftspatialApp" sont les résultats de traitement de tt ma base vidéo.
Code : Sélectionner tout - Visualiser dans une fenêtre à part
1
2
3
4
5
6
7
8
9
10
11
12 for ii = 1:length(selTrainFeats) video =fullfile(conf.calDir, videos{selTrainFeats(ii)}) ; [X{ii} Y{ii}]= calcultrajectoires(video); close all; siftaccApp{ii}=calculsiftacc(video, X{ii} ,Y{ii} ); siftspatialApp{ii}=siftspatial(video, X{ii} ,Y{ii}); end
Code : Sélectionner tout - Visualiser dans une fenêtre à part
1
2
3
4
5
6
7
8
9
10
11
12
13
14
15
16
17
18
19
20
21 for ii = 1:length(selTrainFeats) video =fullfile(conf.calDir, videos{selTrainFeats(ii)}) ; [X Y]= calcultrajectoires(video); close all; siftaccApp{ii}=calculsiftacc(video, X, Y); siftspatialApp{ii}=siftspatial(video, X, Y); end disp('creartion de vocabulaire par kmeans pour la base d"apprentissage ...'); %------------ traitement 1----------------------------------% siftaccAp=cat(1,siftaccApp{:}); siftspaApp=cat(1, siftspatialApp{:}); [dommy3 vocabSS]= k_means(siftspaApp, 300); [domy2 vocabS] = k_means(siftaccAp, 1000); clear siftaccApp siftspatialApp dommy3 domy2
Bonsoir
même avec cette correction j'obtiens la même erreur.
l’exécution ne dépasse pas le premier traitement.
je sais que mon calcule est lourd puisque je traite une base vidéo (chaque vidéo a peu prés 360 images), mais je peux pas changer le traitement. déjà le code fonctionne correctement avec seulement 20 images.
aidez moi !
La technique est toujours la même. Il faut diminuer la quantité de mémoire nécessaire à chaque étape en divisant les tâches en sous-tâches :
Il faut que tu analyses chaque ligne de ton code à la main.
Code : Sélectionner tout - Visualiser dans une fenêtre à part
1
2
3
4
5
6
7
8
9
10
11
12
13
14
15
16
17
18
19
20
21
22
23
24
25
26
27
28
29
30
31
32
33
34
35 for ii = 1:length(selTrainFeats) video = fullfile(conf.calDir, videos{selTrainFeats(ii)}) ; [X Y] = calcultrajectoires(video); close all; siftaccApp{ii} = calculsiftacc(video, X, Y); end clear X Y siftaccAp = cat(1,siftaccApp{:}); clear siftaccApp [domy2 vocabS] = k_means(siftaccAp, 1000); clear domy2 siftaccAp for ii = 1:length(selTrainFeats) video = fullfile(conf.calDir, videos{selTrainFeats(ii)}) ; [X Y] = calcultrajectoires(video); close all; siftspatialApp{ii} = siftspatial(video, X, Y); end clear X Y siftspaApp = cat(1, siftspatialApp{:}); clear siftspatialApp [dommy3 vocabSS] = k_means(siftspaApp, 300); clear siftspaApp dommy3
Essaie d'évaluer la taille maximale de chaque variable (voir Comment déterminer approximativement la quantité de mémoire nécessaire pour le stockage d'une variable ?). Cela te donnera une idée de la quantité de mémoire (RAM+virtuelle) minimale nécessaire pour effectuer ton calcul.
Sur quel type de machine travailles-tu ? 32bits ou 64bits ?
Il serait peut être préférable d'envisager la migration du code sur une machine 64bits avec beaucoup de RAM.
BONSOIR
Merci pour la reponse
32 Bits avec Ram 1GO
bonne solution, mais est ce que vous pouvez me dire comment je peux exécuter la premier boucle pour 10 vidéo seulement puis je sauvegarde les résultats. ensuite exécuter la même boucle pour 10 autres vidéos. puis je concatène les deux résultats pour l'utiliser au traitement suivant.
Le code fonctionne pour 10 vidéo seulement(j'ai 24 vidéos au total selTrainFeats=24) puis s'affiche l'erreur:
est ce que cette solution peut réduire le nombre de variable en mémoire.Out of memory. Type Help Memory for your options
Tu peux toujours essayer comme ceci :
Mais tu retrouveras très certainement le même message d'erreur lorsque tu essayeras d'assembler tous les fichiers mat :
Code : Sélectionner tout - Visualiser dans une fenêtre à part
1
2
3
4
5
6
7
8
9
10
11
12
13
14
15
16
17 for ii = 1:length(selTrainFeats) video = fullfile(conf.calDir, videos{selTrainFeats(ii)}) ; [X Y] = calcultrajectoires(video); close all; siftaccApp = calculsiftacc(video, X, Y); clear X Y filename = sprintf('siftaccApp%02d.mat',ii); save(filename,'siftaccApp','-mat') clear siftaccApp end
D'ailleurs, quelles sont les dimensions de la variable siftaccApp dans la première boucle ?
Code : Sélectionner tout - Visualiser dans une fenêtre à part
1
2
3
4
5
6
7
8
9 siftaccAp = []; for ii = 1:length(selTrainFeats) filename = sprintf('siftaccApp%02d.mat',ii); siftaccAp = [siftaccAp ; load(filename,'-mat')]; end
Sinon, quelle est la marque et le modèle de ta machine ?
Tu devrais normalement pouvoir assez facilement ajouter au moins 1Go de RAM. Le prix des barrettes a bien chuté ces derniers temps.
Bonsoir
je reviens à l'utilisation de fichier .mat.
J'utilise les fonctions "save et load" pour mettre les vecteurs[X Y] résultats dans un fichier.mat à fin de libérer la mémoire.
j'ai fais une boucle qui exécute le calcule 3 fois, et à chaque fois je dois enregistrer les vecteurs résultats dans le fichier.mat
Alors je dois sauver les vecteurs (qui sont des doubles) successivement pour les utilisés ultérieurement.
je n'ai pas obtenu la concaténation de touts les vecteurs résultats lorsque j'affiche le contenu de fichier.mat ( il y a des vecteurs manquantes).
Code : Sélectionner tout - Visualiser dans une fenêtre à part
1
2
3
4
5
6 for ii = 1:length(selTrainFeats) video =fullfile(conf.calDir, videos{selTrainFeats(ii)}) ; [X Y]= versionTrajectoir(video); save('descripteurs.mat', 'X', 'Y','-append'); clear X Y
Autre question:
on suppose que les vecteurs résultats finaux sont bien placés dans le fichier.mat, maintenant je veux récupérer 100000 Vecteurs aléatoirement on appliquant la fonction rand.
Pouvez vous m'aider?
Vous avez un bloqueur de publicités installé.
Le Club Developpez.com n'affiche que des publicités IT, discrètes et non intrusives.
Afin que nous puissions continuer à vous fournir gratuitement du contenu de qualité, merci de nous soutenir en désactivant votre bloqueur de publicités sur Developpez.com.
Partager