2015-05-05 3 views
0

У меня просто проблема с графикой разных графиков на одном графике в цикле 'for'. Надеюсь, кто-то может указать мне в правильном направлении.Графическое отображение разных наборов данных на одном графике в цикле 'for' MATLAB

У меня есть 2-мерный массив с дискретными кусками данных и среди нулей. Мои данные следующим образом:

А =

0   0 
    0   0 
    0   0 
    3   9 
    4   10 
    5   11 
    6   12 
    0   0 
    0   0 
    0   0 
    0   0 
    7   9.7 
    8   9.8 
    9   9.9 
    0   0 
    0  0 

Кусок данных определяется как непрерывный набор данных без прерывания строки [0 0]. Таким образом, в этом примере, первый фрагмент данных будет

3   9 
    4   10 
    5   11 
    6   12 

И второй чанк

7  9.7 
    8  9.8 
    9  9.9 

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

код, который я до сих пор показано ниже:

fh1 = figure; 
hold all; 
ah1 = gca; 

% plot graphs: 
for d = 1:max_number_zeros+num_rows 
    if sequence_holder(d,1)==0 
     continue; 
    end 
    c = d; 

    while sequence_holder(c,1)~=0 
     plot(ah1,sequence_holder(c,1),sequence_holder(c,num_cols),'*'); 
     %lsline; 
     c =c+1; 
     continue; 
    end 
end 

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

Может кто-нибудь сказать мне, как

-plot обоих наборов графов

-как нарисовать линию из лучших уместить получить коэффициент регрессии?

ответ

1

Первая часть может быть выполнена несколькими способами. Я хотел бы проверить вторую колонку для zeroness

zerodata = A(:,2) == 0; 

который даст вам логический массив из единиц и нулей, как [1 1 1 0 1 0 0 ...]. Затем вы можете использовать это, чтобы разделить ваш вход. Вы можете посмотреть на diff этого массива и проверить его на положительный или отрицательный знак. Ваши данные начинаются с 0, поэтому вы не получите переход для этого, так что вам нужно подумать о каком-то способе справиться с этим или другим случаем, если вы точно не знаете, что он всегда будет одним из способов или Другие. Вы можете просто проверить первый элемент, или вы можете вставить известное значение в начале вашего входного массива.

Затем вы должны будете хранить свои куски. Поскольку они могут иметь переменную длину и переменное число, вы не помещаете их в большую матрицу, но вы все равно хотите использовать цикл. Я бы использовал либо массив ячеек, где каждая ячейка в строке содержит данные x или y для фрагмента, или массив структур, где говорят structarray(1).x и structarray)1).y, чтобы сохранить ваши значения данных.

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

Что касается установки, вы можете использовать команду fit.Он сложный и имеет множество опций, поэтому сначала вы должны сначала обратиться к справке (введите doc fit внутри консоли, чтобы получить встроенную справку, которая совпадает с справочной информацией по веб-сайту). Короткая версия, что вы можете сделать простую линейную аппроксимацию, как этот

[fitobject, gof] = fit(x, y, 'poly1'); 

где «poly1» задающим вы хотите полином первого порядка (то есть прямая линия) и выходные аргументы дают вам подходит объект, который вы можете делать разные вещи с помощью сюжета или интерполяции, а второй дает вам структуру, содержащую среди прочего r^2 и скорректированную r^2. Фитообъект также содержит ваши коэффициенты соответствия.

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