Matlab下无需构造大矩阵求解均值偏差极值的方法咨询
解题思路
我们可以通过代数变形直接推导结果,完全不需要构造超大规模网格矩阵:
对于任意一行的第j列元素,D(row,j) = b_j(v_j) - mean([b_1(v_1), b_2(v_2), ..., b_28(v_28)]),其中v_i是第i个向量的任意取值索引。
展开化简后得到:D(row,j) = (27*b_j(v_j) - sum_{i≠j} b_i(v_i)) / 28
- 要得到D第j列的最大值:只需让
b_j(v_j)取自身的最大值,其余27个b_i都取自身的最小值(表达式减去其余项的和,其余项和越小整体值越大) - 要得到D第j列的最小值:只需让
b_j(v_j)取自身的最小值,其余27个b_i都取自身的最大值(其余项和越大整体值越小)
实现代码
% 步骤1:计算每个b_j的最小、最大值,无需存储完整b向量,更省内存 min_b = zeros(28,1); max_b = zeros(28,1); for j = 1:28 temp_b = A{j}(:,1) + A{j}(:,2) - A{j}(:,3) - A{j}(:,4); min_b(j) = min(temp_b); max_b(j) = max(temp_b); end % 步骤2:计算所有最小值总和、所有最大值总和 sum_min = sum(min_b); sum_max = sum(max_b); % 步骤3:直接计算目标矩阵F F = zeros(2,28); for j = 1:28 F(1,j) = (27*min_b(j) - (sum_max - max_b(j))) / 28; % 第j列最小值 F(2,j) = (27*max_b(j) - (sum_min - min_b(j))) / 28; % 第j列最大值 end
方案优势
- 内存占用从原方案的指数级
O(Πr(j))降到线性级O(max(r(j))),完全避免内存不足问题 - 计算耗时从数小时/数天级降到毫秒级,无额外循环开销
- 结果和原构造网格的方案完全等价,无精度损失
内容的提问来源于stack exchange,提问作者Star
相关产品推荐
相关产品推荐

