Переверните матрицу для точечного графика - PullRequest
0 голосов
/ 27 апреля 2020

Я хочу перевернуть "ar c" на правую сторону. Я попытался imrotate, но это дает мне «ar c», направленную вниз, а не на правую сторону, как показано на рисунке ниже. Пожалуйста, посмотрите на код , который я использую. Заранее спасибо.

 R = 8; x_c = 5; y_c = 8;
thetas = 0:pi/499:pi;
xs = x_c + R*cos(thetas);
ys = y_c + R*sin(thetas);

% Now add some random noise to make the problem a bit more challenging:
mult = 0.5;
xs = xs+mult*randn(size(xs));
ys = ys+mult*randn(size(ys));

c = linspace(1,50,500);

D = [xs' ys'];
Dx = imrotate(D, 180, 'crop');
Dy=Dx;
Dy = imrotate(Dy, 180, 'crop') ;
subplot(211)
scatter(Dx(:,1), Dx(:,2), 140,  c, 'filled', 'LineWidth',1.5) 
subplot(212)
scatter(Dy(:,1), Dy(:,2),[],c,  'd','LineWidth',1.5)

enter image description here

Ответы [ 3 ]

2 голосов
/ 27 апреля 2020

Вы хотите отразить распределение для Dx. Операция отражения означает взять x и сделать его -x.

Здесь ось x для Dx равна Dx(:,1), поэтому сначала нам нужно написать Dx(:,1) = - Dx(:,1).

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

Если я вас правильно понимаю, этого недостаточно. Теперь, чтобы вернуть это распределение к положительному значению оси X, оно должно быть переведено . Это означает:

Dx(:,1) = - Dx(:,1) + some number that translated x-axis to positive values.

вы можете выбрать это число, сначала взяв среднее (или центр масс) распределения, т.е. mean(Dx(:,1)), это значение, вокруг которого распределяется ваше значение. Если вы только вычитаете среднее значение из распределения, то в итоге получаете значения около нуля, чтобы вывести его на то же расстояние с положительной стороны, вам нужно вычесть другое значение.

Dx(:,1) = - Dx(:,1) + 2 * mean(Dx(:,1))

Чтение этой строки означает, что mean(Dx) является вычисленным до отражения, поэтому оно имеет положительное значение ...

1 голос
/ 27 апреля 2020

Другим решением было бы установить свойство «XDir» осей на «реверс»:

set(gca,'XDir','reverse')

Это переворачивает оси, поэтому оно увеличивается влево, а не вправо. Представленные данные по-прежнему идентичны, они просто отображаются по-разному. Это может или не может быть то, что вы после.

0 голосов
/ 27 апреля 2020

fliplr может работать, но не с вашим массивом Dx, как есть. fliplr работает с данными, а не с изображением, поэтому с массивом размером 500 x 2 функция переворачивает значения x для значений y, и наоборот, поэтому вы получаете вращение вместо отражения.

Один из способов заставить fliplr работать - это захватить данные изображения после того, как вы нанесете их, а затем перевернуть их:

scatter(Dx(:,1), Dx(:,2), 140,  c, 'filled', 'LineWidth',1.5)
f = getframe;
flipped = fliplr(f.cdata);
imshow(flipped)
...