MATLAB中沿一维的直方图

时间:2016-01-21 20:34:18

标签: matlab histogram

假设我有一个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 / randomGuyarrayfun的解决方案,最后是{{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秒。

3 个答案:

答案 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)

你可以使用num2cellcellfun,虽然我不知道这与天真的方法表现如何相比。

默认情况下,

num2cell采用矩阵并将其转换为单元格数组,其中每个单元格包含矩阵的一个元素,但传递第二个参数允许您沿特定维度执行此操作。因此,对于2x3矩阵Anum2cell(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.