MATLAB:如何在连续 block 中按列计算数字频率

标签 matlab matrix frequency

我在 Matlab 中有一个矩阵 a,如下所示:

a = zeros(10,3); 
a(3:6,1)=2; a(5:9,3)=1; a(5:7,2)=3; a(8:10,1)=2;

a =
 0     0     0
 0     0     0
 2     0     0
 2     0     0
 2     3     1
 2     3     1
 0     3     1
 2     0     1
 2     0     1
 2     0     0

我想获取一个元胞数组,其中包含每个数字在一列中出现的次数。此外,无论列号如何,都应根据元素值对其进行排序。在上面的示例中,我想获取单元格:

b = {[5],[4,3],[3]}

因为数字 1 在 5 次中出现一次,数字 2 在 4 和 3 的 block 中出现两次,数字 3 在 3 次中出现一次。如您所见,循环是根据元素值而不是元素出现的列数排序的。

最佳答案

由于您不关心列,您可以将所有列串成一个列向量,在两端填充零以防止列开始和结束处的跨度一起运行:

v = reshape(padarray(a, [1 0]), [], 1);
% Or if you don't have the Image Processing Toolbox function padarray...
v = reshape([zeros(1, size(a, 2)); a; zeros(1, size(a, 2))], [], 1);

现在,假设跨度总是由 1 个或多个零分隔,您可以按如下方式找到每个跨度的长度:

endPoints = find(diff(v) ~= 0);  % Find where transitions to or from 0 occur
spans = endPoints(2:2:end)-endPoints(1:2:end); % Index of transitions to 0 minus
                                               % index of transitions from 0

最后你可以 accumulate基于这些跨度中存在的值的跨度:

b = accumarray(v(endPoints(1:2:end)+1), spans, [], @(v) {v(:).'}).';

以你的例子为例:

b =

  1×3 cell array

    [5]    [1×2 double]    [3]

注意事项:

生成的元胞数组中值的顺序不能保证与 spans 中的顺序匹配(即上面的 b{2}[3 4] 而不是 [4 3])。如果顺序很重要,您需要对下标进行排序 as per this section of the documentation .以下是如何更改 b 的计算:

[vals, index] = sort(v(endPoints(1:2:end)+1));
b = accumarray(vals, spans(index), [], @(v) {v(:).'}).';

关于MATLAB:如何在连续 block 中按列计算数字频率,我们在Stack Overflow上找到一个类似的问题: https://stackoverflow.com/questions/44417082/

相关文章:

matlab - 如何从我的数据中为 surf() 创建一个二维矩阵?

matlab - 检测到分段违规 - matlab

matlab - 如果不是所有变量都相同,如何连接两个数据集?

swift - 在 Swift 中产生不同频率的声音

Elasticsearch如何返回每个文档的匹配词条数

matlab - 使用Matlab对声音进行反卷积

python - 提高在二维 numpy 数组中查找最小元素的速度,该数组有许多条目设置为 np.inf

r - 如何获得R的两个矩阵中每个元素的总和

r - 在 r 中查找点积

python - 如何在python中的列表列表中查找元素的出现