Matlab中与平均值的偏差的最小值和最大值
Min and max of deviations from mean in Matlab
简介: 我需要在某些给定的 Matlab 向量中找到与平均值的 greatest/smallest 可能偏差。问题是,由于涉及的数组维度很大,我无法显式构造此类向量。因此,我想知道是否有更聪明的方法来进行。如果没有内存限制,我将在下面总结我将实施的过程,然后提出我的问题。
(1) 考虑 Matlab 中的 28 个矩阵 A{1},..., A{28}
。
对于每个 j=1,...,28
,A{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
?包含 b
或 mx=[2 4 6]
每个向量的最大值的组合。
所以我们使用 cellfun
为 b
的每个向量计算 max
。这样我们就不需要计算所有组合的均值,我们只需要为 b
的每个向量计算 max
,然后计算该向量的均值。
这是上述解决方案的关键点,max
也可以这样计算。
简介: 我需要在某些给定的 Matlab 向量中找到与平均值的 greatest/smallest 可能偏差。问题是,由于涉及的数组维度很大,我无法显式构造此类向量。因此,我想知道是否有更聪明的方法来进行。如果没有内存限制,我将在下面总结我将实施的过程,然后提出我的问题。
(1) 考虑 Matlab 中的 28 个矩阵 A{1},..., A{28}
。
对于每个 j=1,...,28
,A{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
?包含 b
或 mx=[2 4 6]
每个向量的最大值的组合。
所以我们使用 cellfun
为 b
的每个向量计算 max
。这样我们就不需要计算所有组合的均值,我们只需要为 b
的每个向量计算 max
,然后计算该向量的均值。
这是上述解决方案的关键点,max
也可以这样计算。