【问题标题】:I want to calculate the mean of two rows in matlab我想在matlab中计算两行的平均值
【发布时间】:2012-09-17 06:39:43
【问题描述】:

我在 matlab 中有一个 1028 x 18 矩阵。我想在 Matlab 中按列值、第三和第四等计算第一行和第二行的平均值,并得到一个具有平均值的新矩阵。

【问题讨论】:

    标签: matlab mean


    【解决方案1】:

    我认为您想计算每对行的按列均值。将数组重新整形为 2 x 18*1028/2,计算平均值(按列操作),并将结果重新整形为 1028/2 x 18:

    >> x = 兰德(1028, 18); >> 结果 = 重塑(x, 2, 1028/2*18); >> 结果 = 平均值(结果); >> 结果 = 重塑(结果, 1028/2, 18);

    一个快速测试,用于展示向量化解决方案与对行的 for 循环相比的速度:

    >> x = 兰德(1028, 18); >> 抽动;结果1 = 零(1028/2, 18);对于 ii = 1:1028/2;结果1(ii,:) = 平均值(x((2*ii-1):(2*ii),:));结尾;目录; 经过的时间是 0.022432 秒。 >> 抽动;结果2 = 重塑(x, 2, 1028/2*18);结果2 =平均值(结果2);结果 2 = 重塑(结果 2、1028/2、18);目录; 经过的时间是 0.000388 秒。

    【讨论】:

    • 使用第 3 列和第 4 列是什么意思?我想计算第 1 行和第 2 行、第 3 和第 4 行等的平均值。我可以在 for 循环中执行此操作吗。那将是更有用
    • @user1687051 - 上面的矢量化解决方案避免了for 循环,这应该会更快。
    • 这不是我想要的。我只是用上面的代码得到两个值。我想要一个全新的行,前两行的平均值
    • @user1687051 - 您必须查看旧答案。当前答案生成 514 x 18 数组。
    • 是的,这就是我想要的。但这是否比 for 循环计算每对行的平均值更好。我假设上面的代码计算第一和第二行的平均值,第三和第 4 行以此类推。
    【解决方案2】:

    我认为您正在寻找的是:

    x = rand( 1028, 18 );
    meanx = ( x(1:2:end,:) + x(2:2:end,:)) / 2;
    

    运行后,meanx 将是一个 [514 x 18] 矩阵。

    meanx 的第一行是x 中第 1 行和第 2 行的平均值。

    meanx 的第二行是x 的第 3 行和第 4 行的平均值。

    meanx 的第三行是x 中第 5 行和第 6 行的平均值。

    编辑

    如果您还想根据第一行的值从平均过程中排除某些行,则可以添加以下内容:

    dx = diff(x(:,1));
    
    goodrows = (dx(1:2:end) == 0);  %find row-pairs for which the first elements match
    badrows = ~goodrows;
    
    goodmeans = meanx(goodrows,:)  %average rows with matching first element
    badmeans = meanx(badrows,:)    %average rows with non-matching first element
    

    【讨论】:

    • 非常感谢。这正是我要找的
    • 如果我想比较第 1 行和第 2 行的第一个元素(比较行的第一个元素和它之后的行)并且只有当它们相等时才找到平均值,你能帮我吗?
    • @Anand ,我编辑了我的答案,希望能解决你的问题。我建议,如果您打算进一步使用 MATLAB,那么您应该花一些时间来学习这些基础知识——通过一个好的教程进行几个小时的练习,您就会掌握它的窍门。
    • 感谢您的建议和帮助。我一定会投入更多的时间来学习matlab
    【解决方案3】:

    以 b3 和 cjh 的出色答案为基础。这个是最快的

    m=1028;
    n=18;
    D=rand(m, n);
    
    % compute mean for two neighboring rows
    D=reshape(D, 2, m/2*n);
    D=(D(1,:)+D(2,:))/2;
    D=reshape(D, m/2, n);
    

    在 for 循环中测量 2000 次迭代

    b3         Elapsed time is 0.264215 seconds.
    cjh        Elapsed time is 0.134812 seconds.
    my version Elapsed time is 0.087994 seconds.
    

    原因很清楚。 b3 使用函数均值,如果我们只想计算两个数字的平均值,这对性能来说不是很好。另一方面,巧妙的 reshape 确保我们不必在读取数据期间跳过整个内存,就像 cjh 版本中的情况一样。因此,将这两种解决方案中最好的结合起来会得到最好的结果..

    【讨论】:

    • 如果第 1 行和第 2 行的前两个元素相等,我应该做一个微小的变化。示例:第 1 行 [1 2 3 4] 和第 2 行 [1 5 6 8]。那么平均值是否为 1=1。我将不得不为此编写一个 for 循环和 if 语句。我是对的还是有其他更短的方法?
    • @angainor我很抱歉重复自己,但我被困在一个点上。我有一个 1028 x 18 矩阵,其中一些整行具有 NaN 值。所以我需要比较相邻行的前两个元素并仅在前两个元素相等时计算平均值。 D 是 1028 x 18 矩阵 [m,n]=size(D);对于 i=1:m-1 如果 D(i,1)==D(i+1,1) D=reshape(D, 2, m/2*n); D=(D(i,:)+D(i+1,:))/2; D=重塑(D, m/2, n);否则结束结束
    猜你喜欢
    • 2011-03-28
    • 1970-01-01
    • 1970-01-01
    • 2014-06-26
    • 2016-12-14
    • 1970-01-01
    • 1970-01-01
    • 1970-01-01
    • 1970-01-01
    相关资源
    最近更新 更多