Matlab: поиск интерполированного значения x по значению y, когда данные находятся в массиве - PullRequest
0 голосов
/ 23 июля 2011

У меня есть массив значений x и массив значений y. На графике есть два пика, где уклон в этих регионах очень крутой. Моя цель - найти FWHM этих пиков. Я могу найти значение y на половине максимума, но, учитывая крутизну наклона и тот факт, что мои данные находятся в массиве, у меня возникают трудности с поиском 4-х значений x, которые соответствуют этому y-значению.

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

Вот мое кодирование для этого:

    % yarray is list of y values
    % A = y value where I need to find the 4 corresponding x values 
    for k = 1:length(yarray)-1
        if yarray(k+1) <= A & yarray(k) >= A
            M = [yarray(k) yarray(k+1) k k+1]
        elseif yarray(k+1) >= A & yarray(k) <= A
            M = [yarray(k) yarray(k+1) k k+1]
        end
    end

Когда я запускаю этот код, существует 4 Массива, но каждый раз он перезаписывается. Как я могу "сохранить" эти массивы, чтобы я мог вспомнить позже? Есть ли более простой подход к этой проблеме? Дайте мне знать, если я могу уточнить мой вопрос. Большое спасибо!

Ответы [ 2 ]

0 голосов
/ 23 июля 2011

Да, есть более простой подход к вашей проблеме, и да, вы должны уточнить свой вопрос.(Например, не думайте, что такие аббревиатуры, как FWHM, широко известны, и вы можете описать, откуда поступают ваши данные и действительно ли ваш вопрос связан с интерполяцией).с одной вершины может прояснить ситуацию:

>>> x= linspace(0, pi, 100); y= sin(x);
>>> mi= min(y); ma= max(y);
>>> x_above= x(y> (ma- mi)/ 2);
>>> fwhm= x_above(end)- x_above(1)
fwhm =  2.0627
0 голосов
/ 23 июля 2011

Я могу дать ответ на сохранение массивов для последующего использования, и я могу подумать о трех подходах к этому.

1) Сохраните массивы в matfile.Поместите следующую строку после ваших условных операторов, чтобы сохранить массив в файл с именем saved_array_k.mat, где k - это номер итерации.

M = [yarray(k) yarray(k+1) k k+1];
save(['saved_array_' num2str(k) '.mat'],'M');

2) Вы также можете использовать вызов eval для динамическогосоздать четыре массива.Замените каждый оператор присваивания в вашем условном выражении на что-то вроде:

eval(['M' num2str(k) '= [yarray(k) yarray(k+1) k k+1];']);

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

3) Создайте матрицу с результатами, где каждая строка матрицы содержит данные, которые вы хотите.(это, вероятно, лучше всего).Создайте матрицу M наподобие

M = zeros(4); % each of your arrays has length 4 and there are 4 of them

В своих операторах присваивания используйте:

M(:,k) = [yarray(k) yarray(k+1) k k+1];

Надеюсь, это поможет.

Добро пожаловать на сайт PullRequest, где вы можете задавать вопросы и получать ответы от других членов сообщества.
...