我在某些发动机转速和节流位置有一个AirFuelRatio值矩阵。 (例如,AFR是在2500rpm和60%油门时为14) 矩阵现在为25x10,发动机转速范围为1200-6000rpm,间隔为200rpm,油门范围为0.1-1,间隔为0.1。
说我测量了新值,例如。在2138rpm的AFR为13.5,油门为74.3%,我如何将其合并到矩阵中?矩阵最接近的值是2000或2200rpm和70或80%油门。此外,我不希望新数据替换旧数据。如何使矩阵取值并调整其值以使用新值?
Simplified i有以下x轴值(顶行)和1x4矩阵(下面):
2 4 6 8
14 16 18 20
我刚刚在3转/分时测得AFR值为15.5。如果插入AFR矩阵,你会得到15,所以这个值是不寻常的。
我希望矩阵获取这些数据并将其他变量调整到它,即。平均一切,以便我投入的数据越多,矩阵就越可靠和准确。因此,在简化的情况下,矩阵将变为类似于:
2 4 6 8
14.3 16.3 18.2 20.1
所以它是旧数据和新数据之间的平均值。我已经阅读了关于连接的文档,但我相信我的问题无法通过该功能解决。
干杯
答案 0 :(得分:2)
这不是简单合并/平均的问题。除非你简化了假设,否则我认为没有一种快速方法可以做到这一点。你想要的是对潜在趋势的统计推断。我建议使用高斯过程回归来解决这个问题。 Rasmussen和Williams有一个很棒的MATLAB工具箱叫做GPML。 http://www.gaussianprocess.org/gpml/
答案 1 :(得分:2)
这听起来更像是我的数据拟合任务。您的建议是,您有一组测量,您希望获得最佳的线性拟合。您需要的是一个值表,而不是生成数据表,然后找到最适合这些值的表。因此,例如,我可以创建一个矩阵A,它具有所有记录的值。让我们从:
开始A=[2,14;3,15.5;4,16;6,18;8,20];
我现在需要一个点的矩阵用于我的拟合曲线的输入(在这个例子中,假设它是线性的,因此是值1和x的集合)
B=[ones(size(A,1),1), A(:,1)];
我们可以使用:
找到线性拟合参数(它切割y轴和渐变的位置)B\A(:,2)
或者,如果您想要线条经过的点数为x:
B*(B\A(:,2))
这导致了以下几点:
2,14.1897 3,15.1552 4,16.1207 6,18.0517 8,19.9828
表示通过这些点的最佳拟合线。
如果需要,您可以手动将其扩展为多项式拟合,或者您可以使用Matlab函数polyfit
。要手动扩展流程,您应该使用修订后的B
矩阵。您也可以在最后一行中仅生成一组指定的点。完整的代码将是:
% Original measurements - could be read in from a file,
% but for this example we will set it to a matrix
% Note that not all tabulated values need to be present
A=[2,14; 3,15.5; 4,16; 5,17; 8,20];
% Now create the polynomial values of x corresponding to
% the data points. Choosing a second order polynomial...
B=[ones(size(A,1),1), A(:,1), A(:,1).^2];
% Find the polynomial coefficients for the best fit curve
coeffs=B\A(:,2);
% Now generate a table of values at specific points
% First define the x-values
tabinds = 2:2:8;
% Then generate the polynomial values of x
tabpolys=[ones(length(tabinds),1), tabinds', (tabinds').^2];
% Finally, multiply by the coefficients found
curve_table = [tabinds', tabpolys*coeffs];
% and display the results
disp(curve_table);