2015-12-28 1 views
0

J'ai une série de fichiers que je suis chargement dans Matlab et je suis en train de faire une interpolation comme ce qui suit:une séquence de fichiers chargés dans Matlab

numfiles = 10; 
data = cell(1, numfiles); 
xvalues=[]; 
yvalues=[]; 
yqvalues=[]; 
xq=linspace(-10,10,1000); 
for k = 1:numfiles 
    file = sprintf('filename_%d', k); 
    data{k} = importdata(file); 
    xvalues{k} = data{k}(:,1); 
    yvalues{k} = data{k}(:,2); 
    yqvalues{k}= interp1(xvalues{k},yvalues{k},xq,'spline'); 
end 

Tout fonctionne bien jusqu'à ce point et je reçois les bonnes dimensions.

[1x1000 double] [1x1000 double] [1x1000 double] [1x1000 double] [1x1000 double] [1x1000 double] [1x1000 double] [1x1000 double] [1x1000 double] [1x1000 double] 

Maintenant, je veux calculer la valeur moyenne à chaque xq. Donc, je devrais avoir un tableau de 1 * 1000 valeurs. Comment devrais-je faire ça? Est-il correct d'utiliser cette boucle

for i=1:length(xq) 
     m(i)=mean(yqvalues{k}(i)); 
end 

après yqvalues ​​{k} = ... ligne dans la première boucle?

J'ai essayé ceci mais j'obtiens des valeurs différentes pour la moyenne par rapport à quand je charge les fichiers séparément un par un et interpolez chacun et le reste du processus.

Quelqu'un peut-il m'aider avec ce problème s'il vous plaît ?!

Merci

Exemple des fichiers: file_1

-14.7812 0.25 
-14.7712 0.36 
-14.7612 0.20 
-14.7512 0.14 
-14.7412 0.05 
-14.7312 0.05 
-14.7212 0.1 
-14.7112 0 
-14.7012 0.25 
-14.6912 0.23 

file_2

-14.8289 0.34 
-14.8189 0 
-14.8089 0.1 
-14.7989 0.08 
-14.7889 0.15 
-14.7789 0.22 
-14.7689 0 
-14.7589 0 
-14.7489 0.28 
-14.7389 0.36 

file_3

-14.7813 0.05 
-14.7713 0.25 
-14.7613 0.17 
-14.7513 0 
-14.7413 0 
-14.7313 0.09 
-14.7213 0.02 
-14.7113 0.18 
-14.7013 0.30 
-14.6913 0.04 

Avec ces fichiers, je suis attendre les valeurs moyennes comme:

D5_1 = 

    1.0e+09 * 

    Columns 1 through 13 

    -0.0000 -0.0002 -0.0022 -0.0082 -0.0203 -0.0408 -0.0718 -0.1156 -0.1743 -0.2501 -0.3453 -0.4619 -0.6022 

    Columns 14 through 20 

    -0.7684 -0.9627 -1.1872 -1.4441 -1.7357 -2.0641 -2.4315 

Mais ce que je reçois est:

D_5 = 

    1.0e+04 * 

    Columns 1 through 13 

    -0.0381 -0.0184 -0.0070 -0.0016 -0.0000 0.0000 -0.0001 -0.0026 -0.0120 -0.0325 -0.0686 -0.1245 -0.2047 

    Columns 14 through 20 

    -0.3135 -0.4552 -0.6343 -0.8549 -1.1217 -1.4387 -1.8105 
+0

Veuillez fournir un exemple [Minimal, complet et vérifiable] (http://stackoverflow.com/help/mcve). – excaza

+0

voulez-vous que je télécharge des fichiers? Je ne sais pas comment faire ça!!!:/@excaza – Elin

+0

Vous ne devriez pas avoir à télécharger un fichier pour créer un exemple minimal qui reproduit votre problème. Composez 5-6 'xvalues' et' yvalues' qui reproduisent le comportement que vous rencontrez lors de l'exécution du code ci-dessus. – excaza

Répondre

0

Votre implémentation actuelle passe une valeur unique (yqvalues{k}(i)) à mean, plutôt que les valeurs multiples que vous attendez de passer. J'ai apporté quelques modifications au code afin d'utiliser mean pour trouver la moyenne dans each row de yqvalues:

numfiles = 3; 
xvalues = cell(1, numfiles); 
yvalues = cell(1, numfiles); 
xq = linspace(-10,10,1000); 
yqvalues = zeros(length(xq), numfiles); 

for k = 1:numfiles 
    file = sprintf('file_%u.txt', k); 
    data = importdata(file); 
    xvalues{k} = data(:,1); 
    yvalues{k} = data(:,2); 
    yqvalues(:,k) = interp1(xvalues{k}, yvalues{k}, xq, 'spline'); 
end 

m = mean(yqvalues, 2); 

Je vais supposer que le nombre de valeurs XY est variable dans chaque fichier et de garder xvalues et yvalues en tant que matrices de cellules. Cependant, puisque yqvalues dépend de la taille de xq, c'est une constante et donc nous pouvons utiliser un simple tableau double pour yqvalues et éliminer la nécessité de mettre en place une cellfun, une boucle, ou une autre approche connexe pour trouver la moyenne de chaque rangée .


En général à part, j'exhorte la prudence avec cette approche interp1, car il retournera probablement des résultats très médiocres pour xq valeurs au-delà des limites de vos données.