2015-12-28 5 views
0

У меня есть ряд файлов, которые я погрузки в MATLAB и я пытаюсь сделать некоторые интерполяции, как следующее:процесс последовательность файлов, загруженных в 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 

Каждая вещь отлично до работы с этой точки и я получаю правильные размеры.

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

Теперь я хочу рассчитать среднее значение на каждом xq. Поэтому у меня должен быть массив из 1 * 1000 значений. Как мне это сделать? Правильно ли использовать этот контур

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

после yqvalues ​​{k} = ... строка внутри первого цикла?

Я пробовал это, но получаю разные значения для среднего по сравнению с тем, когда я загружаю файлы отдельно по одному и интерполируем каждый и весь процесс.

Может ли кто-нибудь помочь мне в этом вопросе, пожалуйста?

Благодаря

Пример файлов: 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 

С помощью этих файлов я нахожусь ожидая средние значения, как:

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 

Но то, что я получаю:

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

Просьба указать пример [Минимальный, полный и проверенный] (http://stackoverflow.com/help/mcve). – excaza

+0

Вы хотите, чтобы я загружал файлы? Я не знаю, как это сделать!!!:/@excaza – Elin

+0

Вам не нужно загружать файл, чтобы создать минимальный пример, который воспроизводит вашу проблему. Составьте 5-6 'xvalues' и' yvalues', которые воспроизводят поведение, которое вы испытываете при выполнении вышеуказанного кода. – excaza

ответ

0

Ваше текущее выполнение проходит одно значение (yqvalues{k}(i)) к mean, а не несколько значений вы ждете, чтобы пройти. Я сделал некоторые изменения в код, чтобы использовать mean найти в среднем по each row из 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); 

Я буду считать, что число XY значений переменной в каждом файле и сохранить xvalues и yvalues как ячейки массивов. Однако, поскольку yqvalues зависит от размера xq, он является константой, поэтому мы можем использовать простой массив double для yqvalues и исключить необходимость объединения цикла cellfun, петли или другого связанного подхода, чтобы найти среднее значение для каждой строки ,


В целом в сторону, я бы призывают к осторожности с этим interp1 подход, поскольку он, скорее всего, вернется очень плохие результаты для xq значений за пределы ваших данных.

Смежные вопросы