2015-09-04 92 views
3

我有矩陣:在第一個元素匹配的矩陣中求和?

a=[1 2 
    2 3 
    1 5 
    3 4 
    2 9]; 

我想通過加在一起,其行第一列元素相匹配的第二列簡化它。因此,上述矩陣a應該變成:

a=[1 7 
    2 12 
    3 4]; 

我在茫然,如何做到這一點功能,換句話說沒有一個for循環。謝謝!

+0

* [...]加在一起的第二排,其第一列列元素匹配*請澄清/重新配置。 – Jubobs

+0

我的意思是我想總結行如果他們的第一列中的元素匹配。例如,行['1 2]'和'[1 3]'應該相加在一起(因爲第一列中都有1),但行[1 2]和[2 4]不*總結在一起(因爲一個在第一列,另一個有2 ...) –

+2

我會說在你的例子輸出'1 5'是錯誤的輸出,不是嗎? – thewaywewalk

回答

6

使用accumarrayunique

[u,~,subs] = unique(a(:,1)) 
out = [ u, accumarray(subs,a(:,2)) ] 

out = 

    1  7 
    2 12 
    3  4 

對於一個在線解決方案,你需要一個外部函數:

function subs = unique3rdOutput(vec) 
    [~,~,subs] = unique(vec) 

然後

out = [ unique(a(:,1)), accumarray(unique3rdOutput(a(:,1)),a(:,2)) ] 

如果你可以■確保在第一列只是正整數,你也可以使用:

out = [ unique(a(:,1)) accumarray(a(:,1),a(:,2)) ] 

或由路易斯Mendo建議:

out = [ (1:max(a(:,1))).' accumarray(a(:,1),a(:,2)) ] 
+0

太棒了,與您的最終編輯效果非常好。我想知道,是否可以直接製作'unique' return'subs',以便我可以將所有內容寫在一行上?我只是出於好奇而問(我意識到這樣做效率會比較低,因爲我必須兩次調用'unique',一次產生'u'和一次產生'subs'),因爲它可能會是在某些應用中對我有用。 –

+0

我不知道一個簡單的解決方案將其集成到一行中。 – thewaywewalk

+0

或者看看我的編輯 – thewaywewalk

相關問題