简介:我需要在一些给定的Matlab向量中找到与平均值的最大/最小可能偏差。问题是,由于所涉及的数组的维度很大,我无法显式地构建这样的向量。因此,我想知道是否有更明智的方法。我在下面总结了如果没有记忆限制,我将实施的程序,然后提出我的问题。
(1(在MatlabA{1},..., A{28}
中考虑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
为R x 28
矩阵,该矩阵由向量b{1},...,b{28}
:作为28-D网格获得
%[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列和CCD_ 28
我们开始计算第一列或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
因此CCD_ 31可以被计算为CCD_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
?包含CCD_ 41或CCD_。因此,我们使用cellfun
来计算b
的每个向量的max
。这样,我们不需要计算所有组合的平均值,我们只需要为b
的每个向量计算max
,然后计算该向量的平均值。这是上述解决方案的关键点,max
也可以通过这种方式计算。