Performance 计算矩阵值的频率,包括0

Performance 计算矩阵值的频率,包括0,performance,matlab,loops,vector,frequency,Performance,Matlab,Loops,Vector,Frequency,我有一个向量 A = [ 1 1 1 2 2 3 6 8 9 9 ] 我想写一个循环,在我选择的范围内计算向量中值的频率,这将包括频率为0的值 例如,如果我选择1:9的范围,我的结果将是 3 2 1 0 0 1 0 1 2 3 2 1 0 0 1 0 1 2 0 0 如果我选择1:11,结果将是 3 2 1 0 0 1 0 1 2 3 2 1 0 0 1 0 1 2 0 0 这可能吗?此外,理想情况下,我必须对巨型矩阵和向量执行此操作,因此最好采用快速计算方法。根据循环请求,这是一

我有一个向量

A = [ 1 1 1 2 2 3 6 8 9 9 ]
我想写一个循环,在我选择的范围内计算向量中值的频率,这将包括频率为0的值 例如,如果我选择
1:9的范围,我的结果将是

3 2 1 0 0 1 0 1 2 
3 2 1 0 0 1 0 1 2 0 0
如果我选择
1:11
,结果将是

3 2 1 0 0 1 0 1 2 
3 2 1 0 0 1 0 1 2 0 0

这可能吗?此外,理想情况下,我必须对巨型矩阵和向量执行此操作,因此最好采用快速计算方法。

根据循环请求,这是一个循环版本,自最近的发动机大修以来,该版本不会太慢:

A = [ 1 1 1 2 2 3 6 8 9 9 ];
maxRange = 11; %// your range
output = zeros(1,maxRange); %// initialise output
for ii = 1:maxRange
    tmp = A==ii; %// temporary storage
    output(ii) = sum(tmp(:)); %// find the number of occurences
end
这将导致

output = 
       3     2     1     0     0     1     0     1     2     0     0
更快且不循环将使用:


其中,
+1
确保最后一个条目也包括在内。

这里有一个替代建议,
histcounts
,在Matlab 2015b上似乎快了约8倍:

A = [ 1 1 1 2 2 3 6 8 9 9 ];
maxRange = 11;
N = accumarray(A(:), 1, [maxRange,1])';
N =
     3     2     1     0     0     1     0     1     2     0     0
比较速度:

K>> tic; for i = 1:100000, N1 = accumarray(A(:), 1, [maxRange,1])'; end; toc;
Elapsed time is 0.537597 seconds.

K>> tic; for i = 1:100000, N2 = histcounts(A,1:maxRange+1); end; toc;
Elapsed time is 4.333394 seconds.

K>> isequal(N1, N2)
ans =
     1

假设输入
A
是一个排序数组,范围从
1
开始,直到某个值大于或等于
A
中的最大元素,下面是一种使用
diff
find
的方法-

%// Inputs
A = [2 4 4 4 8 9 11 11 11 12]; %// Modified for variety
maxN = 13;

idx = [0 find(diff(A)>0) numel(A)]+1;
out = zeros(1,maxN); %// OR for better performance : out(maxN) = 0;
out(A(idx(1:end-1))) = diff(idx);
输出-

out =
     0     1     0     3     0     0     0     1     1     0     3     1     0

这可以很容易地用

让数据自由流动

A = [ 1 1 1 2 2 3 6 8 9 9 ]; %// data
B = 1:9; %// possible values
然后

给予


你看过吗?特别是使用
edges
参数?这很好,但仍然比使用
accumarray
慢大约2倍-试试计时。@nirvana msu你说得对,
accumarray
在这里更快。回答不错。BTW看起来比使用accumarray稍微慢一点,而且排序要求非常严格。@nirvana msu您可以尝试使用
out(maxN)=0也是吗?我很高兴能看到那玩意儿玩。是的,我就是这么试的。请随时对您的Matlab安装进行比较。
result =
     3     2     1     0     0     1     0     1     2