gpt4 book ai didi

matlab - Matlab中的嵌套双重排序

转载 作者:行者123 更新时间:2023-12-02 05:33:26 26 4
gpt4 key购买 nike

假设我有 3 个向量,向量 A(n x 1),向量 B(n x 1) 和向量 C,即 (n x 1)

我想将 A 的元素排序为 5 组,然后在这些组中,我也想将 B 的相应元素排序为 5 组。然后取C中元素的平均值。所以我会有 25 个平均值。

换句话说:

  1. A的元素排序为5个五分位数;
  2. 选择第一个A中的一组元素,获取B中对应的值;
  3. B 中选取的元素分为 5 组。
  4. C 中取每组的平均值。
  5. 选取A中的第二组元素,得到对应的B 中的值;
  6. B 中选取的元素分为 5 组。
  7. C 中取每组的平均值。
  8. 等等等等。

这是我的虚拟代码:

minimum = 50;
maximum = 100;

A = (maximum-minimum).*rand(1000,1) + minimum;
B = (maximum-minimum).*rand(1000,1) + minimum;
C = (maximum-minimum).*rand(1000,1) + minimum;


nbins1 = 5;
nbins2 = 5;

bins1 = ceil(nbins1 * tiedrank(A) / length(A));

for i=1:nbins1

B1 = B(bins1==i);
C1 = C(bins1==i);
bins2 = ceil(nbins1 * tiedrank(B1) / length(B1));

for j=1:nbins2
C2 = C1(bins2==j);
output(i,j) = mean(C2);
clearvars C2
end


clearvars B1 C1
end

问题是,这看起来一点也不优雅或高效。还有其他方法可以做到这一点吗?对于金融界人士来说,这个问题类似于 Fama-French (1993) 的投资组合双重排序。

最佳答案

首先,按 A 列对所有内容进行排序:

sortedByA = sortrows([A,B,C], 1);

创建一个虚拟向量,表示 A 中每个组的索引(从 1nbins1):

groupsA = repmat(1:nbins1, 1000/nbins1, 1); groupsA = groupsA(:);

然后再次重新排序(按前两列),但用组索引替换实际的列 A,这实际上会在 A 中的每组值中对 B 进行排序:

sorted = sortrows([groupsA, sortedByA(:,[2,3])], [1,2]);

为 C 列中的组创建索引(从 1nbins1*nbins2):

groupsC = repmat(1:(nbins1*nbins2), 1000/(nbins1*nbins2), 1); groupsC = groupsC(:);

最后,计算每组内的平均值:

averages = accumarray(groupsC, sorted(:,3), [], @mean);

关于matlab - Matlab中的嵌套双重排序,我们在Stack Overflow上找到一个类似的问题: https://stackoverflow.com/questions/35903657/

26 4 0
Copyright 2021 - 2024 cfsdn All Rights Reserved 蜀ICP备2022000587号
广告合作:1813099741@qq.com 6ren.com