假設我有一個N×M
矩陣A
。我想計算每列A
的直方圖。天真的辦法是做這樣的事情:MATLAB中一維的直方圖
edges = 0:5:100;
counts = zeros(numel(edges) - 1, M);
for i_c = 1:M
counts(:, i_c) = histcounts(A(:, i_c), edges);
end
有沒有更好的(快)的方式來做到這一點?
編輯:添加一些性能測試
OK,讓我們做一些測試。第一個histcounts
+循環,然後使用arrayfun
和一個索引向量,然後btmcnellis/randomGuy的解決方案與cellfun
,最後obchardon的解決方案使用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(:))
實際測試:
niter = 100;
M = 10000;
N = 100;
經過時間2.423785秒。
已用時間爲2.730303秒。
已用時間爲3.774217秒。
已用時間爲2.721766秒。
niter = 10;
M = 100;
N = 10000;
經過時間5.438335秒。
已用時間爲7.387587秒。
已用時間爲7.647818秒。
已用時間爲0.276491秒。
會'edges'是'0:5:在您的實際情況100'嗎? – Divakar
@Divakar我不想排除其他值,但是你對這種特殊情況的建議是什麼? – zeeMonkeez
那麼,我試圖在漸進式步長5的門檻,然後使用accumarray沿着列的循環,但似乎這很慢。所以,我想,用'histc'或'histcounts'去。 – Divakar