【问题标题】:How to quickly/easily merge and average data in matrix in MATLAB?如何在 MATLAB 中快速/轻松地合并和平均矩阵中的数据?
【发布时间】:2016-09-15 12:50:19
【问题描述】:

我有一个在某些发动机速度和节气门位置下的 AirFuelRatio 值矩阵。 (例如,AFR 在 2500rpm 和 60% 油门时为 14) 矩阵现在是 25x10,发动机转速范围为 1200-6000rpm,间隔为 200rpm,油门范围为 0.1-1,间隔为 0.1。

假设我测量了新值,例如。在 2138rpm 和 74.3% 油门时 AFR 为 13.5,我如何将其合并到矩阵中?矩阵最接近的值为 2000 或 2200rpm 和 70 或 80% 油门。我也希望新数据替换旧数据。我怎样才能让矩阵接受这个值并调整它的值以考虑新的值?

简化后的我有以下 x 轴值(顶行)和 1x4 矩阵(下): 2 4 6 8 14 16 18 20 我刚刚在 3 rpm 时测量了 15.5 的 AFR 值。如果你对 AFR 矩阵进行插值,你会得到 15,所以这个值是不寻常的。 我希望矩阵获取这些数据并调整其他变量,即。平均一切,以便我输入的数据越多,矩阵就越可靠和准确。因此,在简化的情况下,矩阵将变为: 2 4 6 8 14.3 16.3 18.2 20.1 所以它在新旧数据之间取平均值。我已阅读有关串联的文档,但我相信我的问题无法通过该功能解决。

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

干杯

【问题讨论】:

    标签: matlab matrix simulink


    【解决方案1】:

    这不是简单的合并/平均问题。除非您有简化的假设,否则我认为没有快速的方法可以做到这一点。您想要的是对潜在趋势的统计推断。我建议使用高斯过程回归来解决这个问题。 Rasmussen 和 Williams 有一个很棒的 MATLAB 工具箱,称为 GPML。 http://www.gaussianprocess.org/gpml/

    【讨论】:

    • 它似乎能够做我想做的事,即。将分散的数据平均到一个矩阵中。我希望我能够使用它,它看起来相当复杂,而且我仍然是一名教育工程师。如果它对我有用,我会调查它并将您的回复标记为答案,谢谢
    【解决方案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);
    

    【讨论】:

    • 这会创建现有矩阵的过滤版本,对吗?或者它适合它的曲线。但这不是我的目标。我需要向矩阵添加更多数据,因此它与新数据进行平均,而矩阵的大小保持不变。
    • 如果您要向矩阵添加数据,我不确定它如何保持相同的大小!如果您只想将 2、4、6、8 等的值制成表格,但允许通过基础数据调整这些值,那么您基本上适合扩展矩阵,但在最后一行您应该做什么不是将系数乘以 B,而是创建一个新矩阵 tabvals=[ones(1,4), (2:2:8)']; 然后使用 tabvals*(B\A(:,2)) 仅获取您指定的常规网格上的列表值。这就是你所追求的吗?
    • 我应该补充一点,如果您存储的只是最终的表格值,那么您就会遇到一些问题。当新值出现时,您如何知道以何种方式调整表格。在您的示例中,您为什么不简单地将 0.5 添加到所有值?如果您有一个异常值,但其余所有数据都很好,会发生什么情况。如果不存储数据,或者至少不存储有关该数据的统计信息,您实际上就没有其他依据来调整表格。这就是为什么我建议存储测量数据,然后对这些数据进行最佳线性拟合。
    • 感谢您的帮助和努力。我不太清楚如何解释它,所以我会在我原来的问题中发布一个视觉澄清。我收集越来越多(分散的)数据,但我想保持矩阵,我用相同的大小近似数据的趋势。 IE。矩阵本身不应该变大。我帖子中的图片显示了 5 个数据点的“矩阵”,它基于 10 个测量的、分散的数据点。现在我测量了一个新的,绿色的,我希望矩阵适应它。就像红线一样。
    • @Bart,如果是这种情况,那么我上面的评论应该很有用。您应该将所有测量值存储在 A 中,使用 B\A(:,2) 重新计算最佳线性拟合,然后显示指定数据点的结果,其 x 坐标位于 tabvals 中。您的曲线表明线性拟合是不够的,因此我将修改我的原始帖子以包含二次拟合。
    猜你喜欢
    • 1970-01-01
    • 1970-01-01
    • 2016-07-04
    • 2014-03-16
    • 2012-11-21
    • 2018-12-02
    • 2011-10-21
    • 1970-01-01
    • 1970-01-01
    相关资源
    最近更新 更多