【问题标题】:Mean value of each column of a matrix矩阵每一列的平均值
【发布时间】:2018-09-23 02:15:34
【问题描述】:

我有一个 64 X 64 矩阵,我需要找到它的列平均值。

但是,我需要除以矩阵中非零的总数,而不是除以每列中的元素总数(即 64)。

我设法让它为单个列工作,如下所示。作为参考,生成我的矩阵的函数标题为fmu2(i,j)

q = 0;
for i = 1:64
    if fmu2(i,1) ~= 0;
        q = q + 1;
    end
end

for i = 1:64
    mv = (1/q).*sum(fmu2(i,1));
end

这适用于生成第一列的“平均值”。但是,我在循环此过程时遇到了麻烦,因此我将获得每列的平均值。我尝试做一个嵌套的 for 循环,但它只是计算整个 64 X 64 矩阵的平均值,而不是一次计算一列。这是我尝试过的:

q = 0;
for i = 1:64
    for j = 1:64
        if fmu2(i,j) ~= 0;
            q = q +1;
        end
    end
end

for i = 1:64
    for j = 1:64
        mv = (1/q).*sum(fmu2(i,j));
    end
end

就像我说的,这只是给了我整个矩阵的一个值,而不是每列的 64 个单独的“平均值”。任何帮助将不胜感激。

【问题讨论】:

    标签: matlab matrix mean


    【解决方案1】:

    一方面,不要在循环的每次迭代中调用生成矩阵的函数。这是非常低效的,如果您的函数足够复杂而产生副作用,则会导致严重问题。将返回值存储在变量中一次,然后引用该变量。

    其次,这里根本不需要任何循环。非零的总数由nnz 函数(非零数的缩写)给出。 sum 函数接受可选的维度参数,因此您可以告诉它沿列求和,而不是沿行或整个矩阵求和。

    m = fmu2(i,1)
    averages = sum(m, 1) / nnz(m)
    

    averages 将是一个 64 元素数组,每列有一个平均值,因为 sum(m, 1) 是每列 64 个元素的总和,nnz(m) 是一个标量。

    MATLAB 的一大优点是它提供了几乎所有内容的矢量化实现。如果你做对了,你几乎不需要使用显式循环来进行任何数学运算。

    【讨论】:

    • 在 MATLAB 中,索引使用圆括号进行,看起来就像一个函数调用。 OP 的 fmu2 很可能是一个矩阵,而不是一个函数。此外,要计算列的平均值,您不能将每个总和除以整个矩阵中的值总数。除数必须是sum(fmu2!=0,1)
    • @CrisLuengo。我只是离开了问题中明确说明的内容,即使这不是 OP 真正 想要的。您所拥有的是一些未经证实的有根据的猜测。我怀疑你可能是对的。
    • 实际上,您是对的,OP 确实明确要求除以整个矩阵中的非零条目数。我很抱歉。这个问题相当矛盾,因为这与问题的其余部分不匹配。所以技术上你是对的,但我仍然不喜欢这个答案。 :)
    【解决方案2】:

    如果您想要非零元素的列平均值,您可以执行以下操作

    m = randi([0,5], 5, 5); % some data
    avg = sum(m,1) ./ sum(m~=0,1);
    

    这是按列计算的值之和,除以按列计算的不等于 0 的元素数。结果是一个行向量,其中每个元素是m 中对应列的平均值。

    注意这是非常灵活的,你可以使用任何条件来代替~=0

    【讨论】:

      猜你喜欢
      • 2014-03-15
      • 2016-10-01
      • 2021-10-29
      • 2018-08-27
      • 1970-01-01
      • 2021-07-24
      • 1970-01-01
      • 2022-01-05
      • 1970-01-01
      相关资源
      最近更新 更多