Масштабирование одного набора данных в другой в Matlab - PullRequest
0 голосов
/ 01 мая 2018

У меня есть два набора данных, которые являются определенной метрикой из двух изображений (dat1 и dat2). Я хочу, чтобы оба изображения имели одинаковый ответ. «Идеальное» изображение должно выглядеть как первый набор данных (dat1)

enter image description here но реальное изображение выглядит как второй набор данных (dat2).

enter image description here

Я хочу попытаться «подогнать» второй набор данных к первому набору данных. Как я могу масштабировать dat2, чтобы он выглядел как dat1 с использованием Matlab? Я попытался установить dat1 с различными полиномами, экспонентами или гауссианами, а затем использовал коэффициенты, которые я нашел, чтобы соответствовать dat2, но программа не работает, и она не соответствует должным образом, она дает мне прямую нулевую линию. Когда я пытаюсь подогнать dat2, используя ту же форму, позволяющую освободить коэффициенты, тогда программа не дает мне идеальную форму, которую я хочу, потому что она следует тенденциям dat2.

Есть ли способ вставить набор данных в другой набор данных вместо функции?

1 Ответ

0 голосов
/ 01 мая 2018

Обычно в этой ситуации очень распространенный подход состоит в нормализации всех векторов между 0 и 1 (интервал [0,1] с включением обеих крайностей). Это может быть легко достигнуто следующим образом:

dat1_norm = rescale(dat1);
dat2_norm = rescale(dat2);

Если у вас версия Matlab больше или равна 2017b, функция rescale уже включена по умолчанию. В противном случае его можно определить следующим образом:

function x = rescale(x)
    x = x - min(x);
    x = x ./ max(x);
end

Для достижения указанной вами цели (масштабирование dat1 на основе минимальных и максимальных значений dat2) вы можете поступить так: @ cemsazara сказал в своем комментарии:

dat2_scaled = rescale(dat2,min(dat1),max(dat1));

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

Чтобы принять этот второй подход, если ваша версия Matlab меньше 2017b, вы должны изменить пользовательскую функцию rescale, определенную выше, чтобы принять два дополнительных аргумента:

function x = rescale(x,mn,mx)
    if (nargin == 1)
        mn = min(x);
        mx = max(x);
    elseif ((nargin == 0) || (nargin == 2))
        error('Invalid number of arguments supplied.');
    end

    x = x - mn;
    x = x ./ mx;
end
...