我想将多个唯一出现的数组合并到一个数组中。为了首先获取数组,我使用此代码,其中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
命令,但是这个命令似乎不起作用。我想我可以用很长的方式搜索匹配的数字并将事件加在一起等等,但必须有更快的方法。
答案 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