arrays - 基于两个数组的唯一条目求和 |速度问题

标签 arrays matlab loops sum vectorization

我有 3 个大小为 803500*1 的数组,具有以下详细信息:

Rid:可以包含任意数字
RidID:它包含从 1 到 184 的随机顺序的元素。每个元素出现多次。
r:它包含元素 0,1,2,...12。所有元素(零除外)在此数组中的随机索引处出现近 3400 到 3700 次。

以下可能对生成样本数据有用:

Rid = rand(803500,1);
RidID = randi(184,803500,1);
r = randi(13,803500,1)-1;  %This may not be a good sample for r as per previously mentioned details? 

我想做什么? 我想计算 Rid 的那些条目的总和,这些条目对应于 r 的每个正唯一条目和 RidID 的每个唯一条目。 我为这个问题写的代码可能会更清楚:

RNum = numel(unique(RidID));
RSum = ones(RNum,12); %Preallocating for better speed
for i=1:12
    RperM = r ==i;
    for j = 1:RNum 
        RSum(j,i)  = sum(Rid(RperM & (RidID==j)));
    end
end

问题: 我的代码有效,但在我的计算机上平均需要 5 秒,我必须进行近千次计算。如果这个时间从 5 秒减少到至少一半,我会很高兴。但是我该如何优化呢?我不介意它是否通过矢量化或任何更好的书面循环变得更好。

我正在使用 MATLAB R2017b。

最佳答案

您可以使用 accumarray :

u  = unique(RidID);
A = accumarray([RidID r+1], Rid);
RSum = A(u, 2:13);

关于arrays - 基于两个数组的唯一条目求和 |速度问题,我们在Stack Overflow上找到一个类似的问题: https://stackoverflow.com/questions/58653462/

相关文章:

javascript - 如何迭代名称数组并将每个名称分配为对象中属性的值?

php - 数组 foreach 循环 PHP

c++ - 如何在数组和 vector 中存储和保持输入 C++

Java 方法 split() 不适用于逗号,数组越界

javascript - 循环仅在添加 span 标记时显示数组中的最后一个字符串

java : why is it safe to modify a map's entry's value while we are iterating over it?

javascript - 具有普通概念javascript的自动完成文本框

matlab - 在 Matlab 中过滤包含 NaN 的图像?

matlab - 如何在matlab中将一个矩阵的每一行乘以另一个矩阵的相应列?

plot - 使用副标题覆盖 ('visible' , 'off' ) matlab 中的图形属性