0

我昨天问了一个类似的问题,关于如何在使用atan2d. 该函数在 -180 到 180 的范围内运行,如下所示:

带 atan2d 的单位圆

当一个数字超过 180 时,它会直接变为 -180,使线图非常难看且不直观。有人建议我用它unwrap来解决这个问题,我认为它确实如此。但是,今天我遇到了一个看起来像这样的图表:

带有奇怪翻译的图表.

跳转是固定的,但在它的位置,一条线被翻译到顶部。如果你绘制这三条线,它们非常接近,就像它们应该的那样(-180 和 180 仍然是同一个地方,就像atan2d图表一样)。我希望我的图表能够反映角度的真实方式 - 非常接近。

根据 David K 的要求,这是我用来计算其中一条线的角度的代码。rec,ret是一组有序的坐标, 和recx分别recy是它们的 x 和 y 值。然后我将 theta_r 的结果绘制到一个常规图形上。

for i=1:length(recx)
    dy(i,1)=((recy(i)-rety(i)));
    dx(i,1)=((recx(i)-retx(i)));
    sloperight(i,1)=(dy(i)/dx(i));
    theta_r(i,1)=atan2d(dy(i),dx(i));

end
theta_r = 180/pi * unwrap(theta_r * pi/180);

我的问题

如何使展开功能仅在一个方向展开(使所有角度相对于圆上的顺时针方向或逆时针方向)而不是在最近的方向展开?或者我应该使用其他东西unwrap来使图表看起来不错?

4

2 回答 2

4

这里有一个想法:在您的数据集中选择一个值,例如,第一“行”数据中的第一个值。设置angle0为该值,并为每个数据数组A,制作如下的“调整”副本AwrapTo180(A - angle0) + angle0,并绘制新数据。

请确保对angle0您在一张图表上绘制的所有数据使用相同的值。

这种方法可能对某些数据集有其自身的问题(例如,如果角度在足够宽的范围内逐渐增加,这种方法将产生原始数据中不存在的“跳跃”),但由于您知道数据都围绕一个角度值(模 360 度)聚集,对于您的图表应该没问题。

于 2014-07-17T20:03:32.413 回答
1

当我离开我的电脑时,我没有回答这个问题,因此今天早上我自嘲了。

下面是一些将 David K 的答案付诸实践的代码。使用提供的随机种子来保证一个体面的例子。注释该行以每次查看不同的示例。

%Seed maintenance
%    This seed seems to demonstrate the desired behavior. Comment this out
%    to see multiple examples
rng(523205203)

%Parameters
N = 500;
commonRate = 10;
independentRate = 2;
nSeries = 4;

%Some random data
common = randn(N*2,1)*commonRate;
independent = randn(N*2,nSeries)*independentRate;

%Build up some interesting data series
data = cumsum(bsxfun(@plus,common, independent), 1);
data = data((N+1):end, :);

%Setup observed data, observing modulated data
observedData = mod(data, 360)-180;

%Utility functions
%    Basic unwrapping, in deg
unwrap_deg            = @(x) unwrap(x/180*pi)*180/pi;           
%    Unwrapping, using an arbitrary offset, in deg
unwrapToValue_deg     = @(x, value) unwrap_deg(x-value)+value;  
%    Basic unwrapping, in dim 1, after adjusting columns based on row 1
equalizeAndUnwrap_deg = @(x) unwrap_deg(...
    bsxfun(@plus, ...
    unwrapToValue_deg(x(1,:),x(1,1)) - x(1,:), ...   %Per column, add the difference ebtween row 1 and the unwrapped row 1
    observedData)...    
    );

%Use functions to correct observred data
unwrappedObservedData = unwrap_deg(observedData);
equalizedUnwrappedObservedData = equalizeAndUnwrap_deg(observedData);

%Plot
figure(2932323)
subplot(311)
plot(observedData,'.')
subplot(312)
plot(unwrappedObservedData,'.')
subplot(313)
plot(equalizedUnwrappedObservedData,'.')
于 2014-07-18T16:05:26.867 回答