【发布时间】:2020-02-07 03:20:42
【问题描述】:
我有两个最大为35,000*35,000 的二维数组:indices 和dotPs。由此,我想创建两个一维数组,使得pop 包含每个数字在indices 中出现的次数,nn 包含dotPs 中与这些数字相对应的元素的总和。我想出了以下(非常愚蠢)的方式:
dotPs = [81.4285 9.2648 46.3184 5.7974 4.5016 2.6779 16.0092 41.1426;
9.2648 24.3525 11.4308 14.6598 17.9558 23.4246 19.4837 14.1173;
46.3184 11.4308 92.9264 9.2036 2.9957 0.1164 26.5770 26.0243;
5.7974 14.6598 9.2036 34.9984 16.2352 19.4568 31.8712 5.0732;
4.5016 17.9558 2.9957 16.2352 19.6595 16.0678 3.5750 16.7702;
2.6779 23.4246 0.1164 19.4568 16.0678 25.1084 6.6237 15.6188;
16.0092 19.4837 26.5770 31.8712 3.5750 6.6237 61.6045 16.6102;
41.1426 14.1173 26.0243 5.0732 16.7702 15.6188 16.6102 47.3289];
indices = [3 2 1 1 2 1 2 1;
2 2 1 2 2 1 2 2;
1 1 3 3 2 2 2 2;
1 2 3 4 3 3 4 2;
2 2 2 3 3 1 3 2;
1 1 2 3 1 8 2 2;
2 2 2 4 3 2 4 2;
1 2 2 2 2 2 2 2];
nn = zeros(1,8);
pop = zeros(1,8);
uniqueInd = unique(indices);
for k=1:numel(uniqueInd)
j = uniqueInd(k);
[I,J]=find(indices==j);
if j == 0 || numel(I) == 0
continue
end
pop(j) = pop(j) + numel(I);
nn(j) = nn(j) + sum(sum(dotPs(I,J)));
end
由于find 函数,这非常慢。我怎样才能更聪明地做到这一点,让它在几秒钟而不是几分钟内运行?
编辑:添加了用于测试代码的小型虚拟矩阵。
【问题讨论】:
-
pop和dotPs是什么类型的数据?double/uint16/uint8(整数/浮点)...另外,请提供一个小的输入样本(如 8*8 而不是 35,000*35,000)。 -
@Rotem 完成,查看编辑。
-
我认为你有一个错误:而不是
nn(j) = nn(j) + sum(sum(dotPs(I,J)));,我认为应该是:nn(j) = nn(j) + sum(dotPs(sub2ind(size(dotPs), I, J))) -
@Rotem 哦,谢谢。
-
我发布了一个更聪明的解决方案,我希望它更快。