Matlab中与平均值的偏差的最小值和最大值

Min and max of deviations from mean in Matlab

简介: 我需要在某些给定的 Matlab 向量中找到与平均值的 greatest/smallest 可能偏差。问题是,由于涉及的数组维度很大,我无法显式构造此类向量。因此,我想知道是否有更聪明的方法来进行。如果没有内存限制,我将在下面总结我将实施的过程,然后提出我的问题。

(1) 考虑 Matlab 中的 28 个矩阵 A{1},..., A{28}。 对于每个 j=1,...,28A{j} 有 4 列。 A{j} 的行数在 j=1,..., 28 中可以不同,并存储在向量 r.

clear
rng default
A=cell(28,1);
r=randi(10000,28,1)+10000; %28x1
for j=1:28
    A{j}=randn(r(j),4); %r(j)x4
end

(2) 对于每个 j=1,...,28,设 b{j}r(j) x 1 对前两行求和得到的向量A{j} 并减去 A{j} 的最后两行:

b=cell(28,1);
for j=1:28
    b{j}=A{j}(:,1)+A{j}(:,2)-A{j}(:,3)-A{j}(:,4); %r(j)x1
end

(3)B 是从向量 b{1},...,b{28} 中作为 28 维网格获得的 R x 28 矩阵:

%[ca, cb, cc, cd, ce, ...] = ndgrid(b{1}, b{2}, b{3}  , ..., b{28});
%B(:,1)=ca(:);
%B(:,2)=cb(:);
%...
%B(:,28)=...;
c=cell(28,1);
[c{:}]=ndgrid(b{:});
c=cellfun(@(x)x(:),c,'UniformOutput',false);
B=[c{:}];

对于不完整的代码深表歉意。可以想象,这是我遇到问题的步骤,如下所述。

(4) 对于 B 的每一行,我计算该行与其平均值之间的差异并将结果存储在 R x 28矩阵 D:

%R=size(B,1);
%D=zeros(R,28);
%for t=1:R
%    D(t,:)=B(t,:)-mean(B(t,:)); 
%end
D=B-mean(B,2);

(5) 对于每个 j=1,...,28,我计算 D(:,j) 的最小值和最大值并将其存储在矩阵 F

F=zeros(2,28);
for j=1:28
    F(1,j)=min(D(:,j));
    F(2,j)=max(D(:,j));
end

问题: F是我要构造的矩阵。但是,由于 r(1),..., r(28) 太大,步骤 (3) 是不可行的。即使是一个循环也需要永远。因此,我要问:是否有一种更聪明的方法来构造 F,使我免于显式获得 B?

这是一个快速的解决方案(不使用 ndgrid):

F = zeros(2,28);
mx = cellfun(@max,b)
mn = cellfun(@min,b)
for k = 1: 28
    F(1,k) = min(b{k}-(b{k}+sum(mx)-mx(k))/28);
    F(2,k) = max(b{k}-(b{k}+sum(mn)-mn(k))/28);
end

解释:

假设矩阵 B 为:

B =   
   1   3   5
   1   3   6
   1   4   5
   1   4   6
   2   3   5
   2   3   6
   2   4   5
   2   4   6

所以我们要计算 MinB=min(B-mean(B,2))。有 3 列和 MinB = [MinB(1) MinB(2) MinB(3)].
我们开始计算第一列或 MinB(1).
我们可以根据第一列的值拆分 B 矩阵:

 B1=  
   1   3   5
   1   3   6
   1   4   5
   1   4   6

 B2= 
   2   3   5
   2   3   6
   2   4   5
   2   4   6

所以 MinB(1) 可以计算为 min(MinB1(1), MinB2(1)).
MinB1(1)可以写成:MinB1(1) = min(1 - mean(B1, 2)).
等价地可以写成:MinB1(1) = 1 - max(mean(B1, 2)).

我们可以将 mean 写成 sum : max(mean(B1, 2))== > max(sum(B1,2)/3).

考虑所有数字组合。哪个组合的最大 mean 或最大 sum ?包含 bmx=[2 4 6] 每个向量的最大值的组合。 所以我们使用 cellfunb 的每个向量计算 max。这样我们就不需要计算所有组合的均值,我们只需要为 b 的每个向量计算 max,然后计算该向量的均值。 这是上述解决方案的关键点,max 也可以这样计算。