假设我有一个this.listView.GiveFeedback -= listView_GiveFeedback;
矩阵N×M
。我想为A
的每列计算直方图。天真的方式是做这样的事情:
A
有更好(更快)的方法吗?
编辑:添加一些性能测试
好的,我们来做一些测试。第一个edges = 0:5:100;
counts = zeros(numel(edges) - 1, M);
for i_c = 1:M
counts(:, i_c) = histcounts(A(:, i_c), edges);
end
+循环,然后是使用histcounts
和索引向量的替代方案,然后是btmcnellis / randomGuy与arrayfun
的解决方案,最后是{{3}使用cellfun
的解决方案。
对于长列来说,histc
效率更高。但是对于较短但很多的列,histcount
获得了很大的优势!
histc
实际测试:
niter = 10;
M = 100;
N = 10000;
A = rand(M, N);
edges = 0:.05:1;
counts1 = zeros(numel(edges) - 1, N);
counts2 = zeros(numel(edges) - 1, N);
counts3 = zeros(numel(edges) - 1, N);
counts4 = zeros(numel(edges), N);
tic;
for i_r = 1:niter
for i_c = 1:N
counts1(:, i_c) = histcounts(A(:, i_c), edges);
end
end
toc
tic;
for i_r = 1:niter
counts2 = cell2mat(arrayfun(@(ind) histcounts(A(:, ind), edges), 1:size(A, 2), 'UniformOutput', 0)')';
end
toc
tic;
for i_r = 1:niter
Acell = num2cell(A, 1);
counts3 = cell2mat(cellfun(@(column) histcounts(column, edges), Acell, 'UniformOutput', 0)')';
end
toc
tic;
for i_r = 1:niter
counts4 = histc(A, edges, 1);
end
toc
all(counts1(:) == counts2(:))
all(counts1(:) == counts3(:))
counts4 = counts4(1:numel(edges)-1, :); % histc has an extra bin
all(counts1(:) == counts4(:))
经过的时间是2.423785秒 经过的时间是2.730303秒 经过的时间是3.774217秒 经过的时间是2.721766秒。
niter = 100;
M = 10000;
N = 100;
经过的时间是5.438335秒 经过的时间是7.387587秒 经过的时间是7.647818秒 经过的时间是0.276491秒。
答案 0 :(得分:1)
您可以使用:histc
x = [0:5:100];
y = histc(A,x, dim);
其中dim
是要计算的维度。
然后
hist(y(:,1),x);
hist(y(:,2),x);
...
答案 1 :(得分:0)
将数组A拆分为一个单元格数组,其中每个单元格都是矩阵中的一列:
Acell = [mat2cell(A',ones(1,M))]';
使用cellfun
将函数应用于单元格数组Acell
counts = cellfun(@(x)histcounts(x,edges),Acell);
计数将是一个单元格数组,每个单元格包含来自A的相应列的histcounts。
答案 2 :(得分:0)
你可以使用num2cell
和cellfun
,虽然我不知道这与天真的方法表现如何相比。
num2cell
采用矩阵并将其转换为单元格数组,其中每个单元格包含矩阵的一个元素,但传递第二个参数允许您沿特定维度执行此操作。因此,对于2x3矩阵A
,num2cell(A, 1)
将返回1x3单元格数组,其中每个单元格包含A的2 x 1列。
cellfun
将一个函数应用于单元格的每个元素。因此,在这种情况下,您可以如上所述从C
获取单元格数组num2cell
,并将histcounts应用于A
的每一列,如下所示:
counts = cellfun(@(column) histcounts(column, edges), C);
counts
应该是一个3元素数组,其中第i个元素包含histcounts
的第i列的A
结果。
(请注意,上面的@()
语法是anonymous function.)