求64×64矩阵按列均值:以矩阵非零元素总数为除数的实现问题
解决64×64矩阵按列均值(分母为全局非零元素总数)的问题
我来帮你梳理一下这个需求,并且优化你的代码实现~
首先明确你的核心需求:对64×64的矩阵计算每一列的均值,但不是除以该列的元素数(64),也不是该列的非零元素数,而是整个矩阵的所有非零元素总数。
先看看你当前代码存在的小问题:
- 你计算的
q是第一列的非零元素数,而不是整个矩阵的全局非零数,不符合需求 - 第二个循环里,
sum(fmu2(i,1))其实只取了第i行第1列的单个元素,循环下来并没有累加整个列的和,逻辑有误
下面是更高效、完全符合需求的实现方式:
步骤分解
- 先生成完整的64×64矩阵(假设
fmu2(i,j)可以返回矩阵第i行j列的元素,我们先把整个矩阵存下来) - 统计整个矩阵的全局非零元素总数
- 对每一列计算元素总和,再除以全局非零元素总数,得到该列的目标均值
代码实现(以MATLAB为例)
% 1. 生成完整的64×64矩阵 matrix = arrayfun(@(i,j) fmu2(i,j), 1:64, 1:64'); % 一次性生成64x64矩阵 % 2. 统计全局非零元素总数,用MATLAB内置函数更高效 global_nonzero_count = nnz(matrix); % 3. 计算每一列的目标均值,sum(matrix,1)按列求和后直接除以全局数 column_means = sum(matrix, 1) / global_nonzero_count;
如果你想基于原有思路调整
要是你更习惯用嵌套循环的写法,也可以这样修正:
% 第一步:先遍历整个矩阵,统计全局非零元素总数 q = 0; for i = 1:64 for j = 1:64 if fmu2(i,j) ~= 0 q = q + 1; end end end % 第二步:计算每一列的总和,再除以全局非零数 column_means = zeros(1, 64); % 预分配数组,提升效率 for j = 1:64 col_total = 0; for i = 1:64 col_total = col_total + fmu2(i,j); end column_means(j) = col_total / q; end
这里要重点注意:必须先遍历整个矩阵统计所有非零元素的总数q,而不是只统计某一列;计算每列均值时,要把该列所有元素累加求和后,再除以全局的q。
这样就能得到你想要的结果啦~
内容的提问来源于stack exchange,提问作者TechGoose
相关产品推荐
相关产品推荐

