合并两行包含相同元素的单元格

时间:2013-06-25 18:20:55

标签: arrays matlab row cell

例如,我有一个像:

这样的单元格数组

列1列2 ----

'AAAA' -------- 4

'BBBB' -------- 5

'CCCC' --------- 2

'CCCC' --------- 0

'DDDD' -------- 0

'DDDD' -------- 3

'EEEE' -------- 0

'FFFF' ----------- 0

我想要的是合并具有相同元素的行。最后我想要获得的是:

'AAAA' -------- 4

'BBBB' -------- 5

'CCCC' --------- 2

'DDDD' -------- 3

'EEEE' -------- 0

'FFFF' ----------- 0

我正在寻找一个没有for循环的答案。

2 个答案:

答案 0 :(得分:0)

试试这个:

arr([arr{:,2}] ~= 0,:)

arr - rows:arr的所有行,使第二列不等于0, 列:所有列

在那里可能会出现语法错误,因为我使用了Matlab ...

编辑:新答案

non_zero = transpose([arr{:,2}] ~= 0);
arr = arr(non_zero | ~ismember(arr(:,1),arr(non_zero,1)),:)

基本上我正在做的事情:获取所有行,使得右侧不为零,或者左侧不是非零行的左侧成员。后一条件仅满足零行且非零行中没有匹配左侧的行(因此不重复)。现在请记住,如果您有任何重复的行(左侧和右侧相同),这仍然无效。如果这是可能的话,那就这样做:

non_zero = transpose([arr{:,2}] ~= 0);
arr = arr(non_zero | ~ismember(arr(:,1),arr(non_zero,1)),:);
[~,U] = unique(arr(:,1));
arr = arr(U,:)

答案 1 :(得分:0)

找到所有完全独特的字符串(即ffff_ 0和ffff __ 1是唯一的,但aaaa _1和aaaa___1显然不是唯一的。(显然下划线表示格式化?)< / p>

一旦你有了这个,只用字母做同样的事情。

我很确定你必须以某种身份做到这一点(上图)来获得你想要的输出,如果是这样的话,我认为你正处于for循环之间的速度权衡的边缘内存分配和通过值查找唯一的内容进行排序。