我有矩陣:在第一個元素匹配的矩陣中求和?
a=[1 2
2 3
1 5
3 4
2 9];
我想通過加在一起,其行第一列元素相匹配的第二列簡化它。因此,上述矩陣a
應該變成:
a=[1 7
2 12
3 4];
我在茫然,如何做到這一點功能,換句話說沒有一個for循環。謝謝!
我有矩陣:在第一個元素匹配的矩陣中求和?
a=[1 2
2 3
1 5
3 4
2 9];
我想通過加在一起,其行第一列元素相匹配的第二列簡化它。因此,上述矩陣a
應該變成:
a=[1 7
2 12
3 4];
我在茫然,如何做到這一點功能,換句話說沒有一個for循環。謝謝!
使用accumarray
和unique
:
[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)) ]
太棒了,與您的最終編輯效果非常好。我想知道,是否可以直接製作'unique' return'subs',以便我可以將所有內容寫在一行上?我只是出於好奇而問(我意識到這樣做效率會比較低,因爲我必須兩次調用'unique',一次產生'u'和一次產生'subs'),因爲它可能會是在某些應用中對我有用。 –
我不知道一個簡單的解決方案將其集成到一行中。 – thewaywewalk
或者看看我的編輯 – thewaywewalk
* [...]加在一起的第二排,其第一列列元素匹配*請澄清/重新配置。 – Jubobs
我的意思是我想總結行如果他們的第一列中的元素匹配。例如,行['1 2]'和'[1 3]'應該相加在一起(因爲第一列中都有1),但行[1 2]和[2 4]不*總結在一起(因爲一個在第一列,另一個有2 ...) –
我會說在你的例子輸出'1 5'是錯誤的輸出,不是嗎? – thewaywewalk