0

我有 n 条曲线的集合,即这些 n 条曲线中每条曲线的点 (x,y)。我正在尝试绘制“结果曲线”或平均曲线。即,取每个 x 的 'n' y 坐标的平均值并绘制结果。问题是 n 条曲线的 xs 不一样。我知道我可能需要进行插值或其他操作,但我无法在网上找到一个例程。有谁知道某人为此实现的 r 包或 Matlab 代码或 C 或 C++ 代码?如果没有,任何想法如何以巧妙的方式进行插值?谢谢!!

4

3 回答 3

4

approx用于线性插值的 R 解决方案。

首先,我创建了一些数据(您质疑的是一个可重复的示例)。在这里,我正在创建一个带有 5 个 data.frame 的列表,其中 xs 不同:

ll <- lapply(1:5,function(i)
  data.frame(x=seq(i,length.out=10,by=i),y=rnorm(10)))

然后应用approx,我创建了一个包含所有数据的大 data.frame:

big.df <- do.call(rbind,ll)

然后,我绘制线性近似和我的所有系列:

plot(approx(big.df$x,big.df$y),type='l')
lapply(seq_along(ll), 
       function(i) points(ll[[i]]$x,ll[[i]]$y,col=i))

在此处输入图像描述

于 2013-05-26T22:20:44.097 回答
2

如果您curve在 R 中使用该函数,则可以将曲线的值分配给列表(使用 <-)。这使您可以在之后平均您的曲线。

x <-runif(10)                               
plot(x, ylim=c(-5,5))                       
a <-curve(sin, add=TRUE, col="red")         
b <-curve(cos, add=TRUE, col="blue")        
xx <-(a$x+b$x)/2 # x average                              
yy <-(a$y+b$y)/2 # y average                                  
lines(xx,yy, col="purple")  #draw average curve               

在此处输入图像描述

于 2013-05-26T22:32:25.267 回答
1

Matlab 解决方案使用interp1

% X and Y data for two curves
x1 = -1:0.11:1;
x2 = -1:0.09:1;
y1 = x1.^2;
y2 = x2.^2;

% Assemble variable length (ragged) data into cell arrays
X = {x1;x2};
Y = {y1;y2};

% Vector of interpolated x coordinates
Xq = -1:0.1:1;

% Interpolate each curve  to Xq and save in row of matrix Yq
N = length(X);
Yq(N,length(Xq)) = 0;
for i = 1:N
    Yq(i,:) = interp1(X{i},Y{i},Xq);
end

% Display result
figure;
plot(Xq,Yq,'.-')

您可以使用 中可用的各种插值方法interp1。如果您有 R2012a 或更新版本,请注意他的interp1功能将来会有所改变

于 2013-05-26T22:16:20.657 回答