如何在MATLAB中快速/轻松地合并和平均矩阵中的数据?

时间:2016-09-15 12:50:20

标签: matlab matrix simulink

我在某些发动机转速和节流位置有一个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 所以它是旧数据和新数据之间的平均值。我已经阅读了关于连接的文档,但我相信我的问题无法通过该功能解决。

编辑:澄清我的问题,以下视觉澄清。 enter image description here 添加新数据点时,“矩阵”保持5个点的相同大小。它会考虑新数据并相应地调整矩阵。这就是我想要实现的目标。我得到的分散数据越多,矩阵就越准确。 (是的,在这种情况下,绿点是一个异常值,但它解释了我的情况)

干杯

2 个答案:

答案 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);