Bonjour à tous et toutes,

Je me permets d'ouvrir une discussion afin de demander de l'aide concernant l'écriture d'un script pour la conduite d'une analyse de données. En effet, étant étudiant en cours de rédaction de mon mémoire de Master 2, je dois réaliser de la cartographie statistique paramétrique (SPM) en 1D sur des data contenues dans 76 fichiers. Seulement, la conduite de SMP ne devrait se faire que sur des data de longueurs égales, et les data servant pour cette analyse possèdent des longueurs variables d'un fichier à l'autre.

Après avoir échanger avec mon professeur de programmation, il a été décidé de lisser les données au moyen de moyennes ponctuelles sur un intervalles de data dont la longueur est égale à l'arrondi du rapport entre la longueur de la ligne enregistrant les data d'un fichier avec celle de la ligne contenant les data du fichier le plus court. Cependant, cette méthode visant à lisser le signal pour arriver à un nombre de data égal d'une ligne à l'autre n'a pas permis de réduire le nombre de données dans cette finalité, mais plus à reproduire les valeurs des moyennes ponctuelles sur un nombre de cases égales à la valeur du rapport précédemment déterminé. C'est pourquoi je sollicite votre aide pour essayer de répondre à mon objectif (mon professeur de programmation étant en vacances et ne se sentant pas capable de répondre pleinement à ma demande).

Je vous transmets ci-joint les lignes de script actuel :

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
close all
clc
clear
 
n = 19;
i = 4;
drop = 212;
 
%% Load des data %%
 
raw_data = cell(n, i);
for file = 1:n  
    for subfile = 1:i
        path = fullfile('\\teraetu.univ-lyon1.fr\homeetu\p1704319\My Documents\MATLAB\Mémoire\Data CON-TREX\Approche OMT', ...
            sprintf('data%d_%d.cxp', file, subfile));
        if exist(path, 'file') == 2
            data_file = dlmread(path, '\t', drop, 0);
            raw_data{file, subfile} = data_file;
        end
    end
end
 
%% Détermine les longueurs max et min dans les cellules de raw_data %%
 
min_length = Inf;
for file = 1:n
    for subfile = 1:i
        if ~isempty(raw_data{file, subfile})
            size_data = size(raw_data{file, subfile}, 1);
            min_length = min(min_length, size_data);
        end
    end
end
 
max_length = 0;
for file = 1:n
    for subfile = 1:i
        if ~isempty(raw_data{file, subfile})
            column_length = size(raw_data{file, subfile}, 1);
            max_length = max(max_length, column_length);
        end
    end
end
 
%% Comble les valeurs manquantes dans les colonnes de raw_data avec NaN %%
 
for file = 1:n
    for subfile = 1:i
        if ~isempty(raw_data{file, subfile});
            current_length = size(raw_data{file, subfile}, 1);
            num_values_to_add = max_length - current_length;
            if num_values_to_add > 0
                raw_data{file, subfile} = padarray(raw_data{file, subfile}, [num_values_to_add, 0], NaN, 'post');
            end
        end
    end
end
 
for file = 1:n
    for subfile = 1:i
        if isempty(raw_data{file, subfile})
           nan_data = NaN(max_length, 3);
           raw_data{file, subfile} = nan_data;
        end
    end
end
 
 
%% Récupère les données de forces dans les cellules de raw_data %%
 
% Complément des données manquantes par NaN
raw_force = NaN(n * i, max_length);
for file = 1:n
    for subfile = 1:i
        q = (file - 1) * i + subfile;
        raw_force(q, :) = raw_data{file, subfile}(:, 1)';
    end
end
 
 
force_lifted = NaN(size(raw_force, 1), min_length);
 
for k = 1:size(raw_force, 1)
    force_mean = NaN(1, min_length);
    p = round(size(raw_force(k,:), 2) / min_length);
    for l = 1:p:(size(raw_force(k,:), 2) - p)
        % Calcul de la moyenne sur le segment de longueur p
        force_mean(l:l+p-1) = mean(raw_force(k, l:l+p-1), 'omitnan');
    end 
    force_lifted(k, ~isnan(force_mean)) = force_mean(~isnan(force_mean));
end
 
 
force_fitted = NaN(size(force_lifted));
 
for k = 1:size(force_lifted, 1)
    p = round(size(force_lifted(k,:), 2) / min_length);
    force_fitted(k, 1:p:end) = force_lifted(k, 1:p:end);
end
 
 
force_fitted_cleaned = NaN(size(force_fitted, 1), size(force_fitted, 2));
 
for k = 1:size(force_fitted, 1)
    non_nan_indices = ~isnan(force_fitted(k, :));
    non_nan_values = force_fitted(k, non_nan_indices);
    force_fitted_cleaned(k, 1:numel(non_nan_values)) = non_nan_values;
end
 
force_fitted_cleaned = force_fitted_cleaned(:, 1:min_length);
En vous remerciant d'avance pour vos retours et conseils !