合并多个独特出现的数组

时间:2015-11-02 10:55:32

标签: arrays matlab merge

我想将多个唯一出现的数组合并到一个数组中。为了首先获取数组,我使用此代码,其中image系列是使用 imread 导入的tiff图像的切片:

a = unique(img_series);
occu = [a,histc(img_series(:),a)];

我多次这样做,因为我使用的tiff图像堆叠了多个图像,我的RAM不支持一次导入。所以每个人都会出现这种情况。看起来像这样(第一个数字是唯一值,第二个数字是出现次数):

occu1      occu2    .....
0   1      1   2
12  1      10  1
14  1      12  1
15  1      14  2
..  ..     ..  ..    .....

现在我想将它们合并在一起,或者在我读取另一个堆叠图像时更好地合并它们。

合并结果应该是类似于上面的2D矩阵。应该将相同值的出现次数相加,因为这是计算它们的重点。所以上面例子的结果应该是这样的:

occu_total
0   1
1   2
10  1
12  2
14  3
15  1 
..  ..

我找到了join命令,但是这个命令似乎不起作用。我想我可以用很长的方式搜索匹配的数字并将事件加在一起等等,但必须有更快的方法。

1 个答案:

答案 0 :(得分:0)

A = [0 1;12 1; 14 1;15 1];B = [1 2;10 1;12 1;14 2];
tmp = [A;B]; %// merge arrays into a single one
tmp(:,1) = tmp(:,1)+1;%// remove zero occurrences by adding 1 to everything
C = accumarray(tmp(:,1),tmp(:,2)); %// add occurrences all up
D = [1:numel(C)].'; %// create numbered array
E = [D C];
E((C==0),:)=[]; %// get output
E(:,1) = E(:,1)-1;%// subtract the 1 again

E =
     0     1
     1     2
    10     1
    12     2
    14     3
    15     1

accumarray的工作。这将第一个参数作为您的字典键,并将每个键的值添加到一起。 1的加法和减法是完成的,因为0不能是MATLAB中的索引。为了避免这种情况(假设您没有负数),您可以简单地添加1并在之后删除它,将所有索引转换为正整数。如果您输入负数,则减去tmp(:,1) = min(tmp(:,1)+1并添加E(:,1) = min(tmp(:,1)-1