Как игнорировать отрицательные значения при построении линейного графика с помощью Matlab?

У меня есть матрица, в которой некоторые значения имеют -1 как указание на ошибку. Обычно я бы просто использовал ylim([0 100]), чтобы не отображать эти значения на моем графике, но при использовании линейного графика соединение все равно упадет до точки. Мне нужна диаграмма, состоящая из линий, а не точечная диаграмма. Есть ли простой способ игнорировать отрицательные значения при построении линии и подключать только положительные значения при использовании функции построения графика в MATLAB?

Я написал небольшой пример программы, которая ведет себя аналогичным образом, но способ, которым я использую, кажется немного «слишком сложным», и я хочу знать, есть ли более простой способ добиться этого. Он отлично работает, поскольку я помещаю значения в NaN, и теперь значения x и y равны одинаковому количеству. Однако удаление или сортировка значений из вектора приведет к разному количеству значений x и y.

Я надеялся на модификацию или флаг или что-то в этом роде.

x = 2*rand(10) - rand(10)
xx = 10:10:100;

figure;
for i=1:length(x)
    for j=1:length(x(i,:))
        if x(i,j) < 0
           x(i,j) = NaN; 
        end
    end
end

plot(xx,x)

Обратите внимание, что это только пример, весь код будет слишком большим, чтобы размещать здесь.

При наличии несоответствующих значений x (так что функция построения графика просто использует 1,2,3... и т. Д. Для соответствующих значений y) этого можно достичь, используя

plot(x(x>0))

В этом случае соответствующие значения разные, в реальном коде это измеренные данные, здесь я просто использую 10-й шаг для упрощения.

x = 2*rand(10) - rand(10)
xx = 10:10:100;

plot(xx,x(x>0))

Приведенный выше код приведет к ошибке с сообщением «Векторы должны быть одинаковой длины».


person Kev1n91    schedule 16.02.2017    source источник
comment
У вас есть вектор, который вы хотите построить, и он содержит отрицательные значения, которые вы хотите удалить?   -  person Tony Tannous    schedule 16.02.2017
comment
Я не хочу удалять отрицательные числа, я хочу, чтобы они не отображались на графике, чтобы при использовании линейного графика линия не соединялась с этим значением.   -  person Kev1n91    schedule 16.02.2017
comment
Я просто хочу быть уверенным, что правильно понимаю. Вы хотите построить вектор без его отрицательных значений?   -  person Tony Tannous    schedule 16.02.2017
comment
Извините, я не умею правильно писать задачи - но да, это то, что я хочу   -  person Kev1n91    schedule 16.02.2017
comment
Вы пробовали сделать их NaN?   -  person Ander Biguri    schedule 16.02.2017
comment
Да, я отредактировал код, чтобы он использовал NaN, это работает нормально, но мне кажется немного сомнительным, однако это соответствует моим потребностям. Просто хочу знать, есть ли более продвинутый способ   -  person Kev1n91    schedule 16.02.2017


Ответы (2)


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

y = 2*randn(10,1) - randn(10,1);
figure(); plot(1:numel(y), y./(y<=0) );
person Dev-iL    schedule 16.02.2017
comment
Спасибо за ваш ответ ! Когда я выполняю этот код, я получаю только пустую цифру, кто-нибудь еще испытывает то же самое? Я использую Matlab R2016 b - person Kev1n91; 16.02.2017
comment
@ Kev1n91 вот и случайность ... Просто запустите ее несколько раз, пока не появятся видимые строчки ... - person Dev-iL; 16.02.2017
comment
Конечно, ох. Однако учитывает ли это решение соответствующие значения x? (Обратите внимание, что вопрос был изменен, чтобы указать на это) - person Kev1n91; 16.02.2017
comment
@ Kev1n91 Увидев, что у нас есть numel(y) x значения, это не может пойти не так, как надо. Вы также можете поэкспериментировать с plot(linspace(XMIN,XMAX,numel(y)),y), если вам нужно равномерно расположить x. - person Dev-iL; 16.02.2017
comment
Я полагаю, это можно было бы немного упростить, заменив (1-(y<0)) на (y>=0) - person Dennis Jaheruddin; 16.02.2017

a = [50, -1, 10, 5, 8, 22, -1];
b = a > 0;
c = a(b);

Вывод:

c
[50, 10, 5, 8, 22]

Теперь вы можете построить график c

[~, s] = size(c);
xx = 1:1:s;

Вы также можете сделать это напрямую, не сохраняя расчет и не изменяя его. просто нарисуйте это. plot(x(x>0))

person Tony Tannous    schedule 16.02.2017
comment
Или, если OP не хочет изменять данные, plot(x(x>0)) - person Ander Biguri; 16.02.2017
comment
@AnderBiguri, верно, но первый способ, вероятно, будет ему более понятен. - person Tony Tannous; 16.02.2017
comment
Спасибо за ответ, я отредактировал свой пост. У меня есть соответствующие значения x, если я изменю его, как показано в сообщении, то количество значений x для значений y будет отключено. Даже при отрицательном значении (-1) все равно есть соответствующее. Мне нужно было бы изменить их оба и стереть соответствующее значение - person Kev1n91; 16.02.2017
comment
@ Kev1n91 это можно применить и к матрице. Не могли бы вы тогда написать пример в своем посте? ввода и ожидаемого вывода? - person Tony Tannous; 16.02.2017
comment
@ Kev1n91 Подсчитайте количество оставшихся элементов, создайте новый вектор xx и постройте. - person Tony Tannous; 16.02.2017