2015-11-02 40 views
-1

我想將多個唯一事件數組合併到一個數組中。爲了得到陣列首先我用這個代碼,其中圖像序列是從TIFF圖像切片使用imread輸入:合併多個獨特的事件數組

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

我這樣做多次,因爲我使用的TIFF圖像有數百張圖片疊加,我的RAM不支持立即導入。因此,每個「且發生」看起來是這樣的(第一個數字是獨特的價值,第二個數字是OCCURENCES數):

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

你想如何合併它們?作爲3D矩陣,作爲2D矩陣追加列還是2D矩陣追加行? – IKavanagh

+0

作爲一個二維矩陣,增加了出現次數。所以對於上面的例子:[0 1; 1 2; 10 1; 12 2; 14 2; 15 1] – Johannes

回答

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。這將第一個參數作爲字典密鑰,並將每個密鑰的值添加在一起。因爲0不能成爲MATLAB中的索引,所以完成1的加法和減法。爲了避免這種情況(假設你沒有負數),你可以簡單地加1,然後刪除它,將所有的索引轉換爲正整數。如果你擊中負數,減去tmp(:,1) = min(tmp(:,1)+1並加上E(:,1) = min(tmp(:,1)-1

+0

它們沒有相同的行數,如上例所示,發生的值可能不同。 – Johannes

+0

使用你的代碼矩陣將被簡單地連接起來。我編輯了我的問題來解釋結果應該是什麼。我計算唯一值的出現次數,因此結果矩陣的第一列中的每個值只能出現一次,並且都需要按正確的順序排列。第二個值需要是臨時矩陣出現的總和。 – Johannes

+0

C = [63 15],不是我要找的。我再次編輯我的問題,以明確合併的結果應該是什麼。 – Johannes