【发布时间】:2016-01-07 19:28:02
【问题描述】:
我有一个包含大约 100 万个唯一值的大约 1500 万个整数 (int32) 的向量。我想找到一种计算重复整数并将它们与原始向量相关联的有效方法,以便我有一个包含每个元素计数的新向量。
这可能很清楚,所以这是我正在寻找的一个小例子:
A = [1 1 1 3 2 5 2 1 2 6];
...
result = [4 4 4 1 3 1 3 4 3 1];
我的(不切实际的慢)实现如下(请注意,在我的 matlab 版本中, hist 不适用于整数):
A = randi(1e6,[15e6,1],'int32');
result = zeros(size(A),'int32');
[uniqueA,~,iuA] = unique(A);
counts = accumarray(iuA,1);
到目前为止,一切都很好:uniqueA 包含 A 的唯一元素的列表,而 counts 包含每个元素对应数量的列表。这相当快。
接下来是缓慢的部分。我尝试了以下方法来检索每个元素的索引:
cellIndex = arrayfun(@(x) A == x, uniqueA,'UniformOutput',false);
但这会耗尽内存(使用 16 GB 内存)并在开始交换时停止。为了避免这种情况,我尝试循环遍历唯一元素(100 万),这也很慢:
for n = 1:length(uA)
result(A == uA(n)) = counts(n);
end
我不知道这需要多长时间,因为我已经等了半个小时了,还没有完成。
关于如何有效地完成我的任务有什么想法吗?
【问题讨论】:
-
您是否尝试过编译程序以加快速度? Matlab 不喜欢 for 循环。
-
我没试过编译,如果可能的话,我通常会尽量避免使用for循环。
标签: matlab performance vectorization large-data