二维矩阵的直方图计数

信息处理 统计数据 直方图
2022-02-17 12:39:04

我目前正在从事一个项目,其中我有一个 10 x 2 矩阵: A. 我想使用 MATLAB 查找每行出现的前 3 次。

 A = [ 1 2; 1 2; 2 4; 3 2; 3 2; 2 4; 1 2; 1 2; 5 8; 3 2]

作为回报,我想拥有:

  • [ 1 2 ], 4次。
  • [ 3 2 ], 3次。
  • [ 2 4 ], 2次。

我已经尝试过hist3类似的功能,但无法得到我想要的。

PS 我的原始统计矩阵非常大(大约 565000 x 2 双倍,取决于我分析的图像),我正在寻找它的前 30 个最常见的行。在那种情况下,我几乎不相信任何基于循环的答案会涵盖它。

编辑:我昨天在教授的帮助下找到了答案。

我基本上所做的是设置hist3x 和 y 轴的范围。比方说( -5 : 5 )。

ctrs{1} = -5 : 5;
ctrs{2} = -5 : 5;
hist_A = hist3(A, ctrs);

然后通过使用sort降序格式的函数,我计算了矩阵 A 元素的出现次数和索引。

[hist_A_occurrence, hist_A_index] = sort(hist_A(:),'descend');

最后,选择前 3 个出现次数:

hist_A_index = hist_A_index(1:3);
hist_A_occurrence = hist_A_occurrence(1:3);

性能

它能够在A563160 x 2 的矩阵上计算前 60 个值,时间为 0.147038 秒,采用 Core i7 第 4 代处理器和 16gb 内存。

该方法非常快,我希望这对其他人有所帮助。

谢谢大家的回答。

2个回答

您是否正在寻找执行此任务的特定功能?否则,这可能通过一个简单的 for 循环来完成。

使用函数确定您的唯一行

箱 = 独特的(A,“行”);

然后只需遍历 A 的每一行并计算在 A 中找到的每个 bin 的每个实例。

如果您不关心程序运行多长时间(如果您的 A 矩阵不是大得离谱,这仍然不会很长),这可能已经足够了,但请记住 MATLAB 不“喜欢”运行循环。

consolidatorJ. d'Errico(MatlabCentral的可靠贡献者,具有高度优化和通用代码)的函数在这里非常有用。对于您的示例:

nTopRepeat = 3;
[xA,yA] = consolidator(A,[],'count');
[~,idx] = sort(yA,'descend'); 
[xA(idx(1:nTopRepeat),:), yA(idx(1:nTopRepeat),:)]

我刚刚按照您的建议尝试了一个大矩阵:

A = round(randn(565000,2));
nTopRepeat = 30;
[xA,yA] = consolidator(A,[],'count');
[~,idx] = sort(yA,'descend'); 
[xA(idx(1:nTopRepeat),:), yA(idx(1:nTopRepeat),:)]

这需要 0.3 秒。即使倍,它的扩展也相当线性。它确实循环,仅过度复制。100