【问题标题】:Combine two rows of cell which includes same element合并包含相同元素的两行单元格
【发布时间】:2013-06-25 18:20:55
【问题描述】:

例如我有一个像这样的单元格数组:

Column1----Column2

'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 循环的答案。

【问题讨论】:

  • 你尝试过什么吗?代码,其他答案?你遇到了什么困难?
  • 最佳答案是:[A,B] = unique(arr(:,1),'first'); arr = arr(B,:);但这并不能完全解决我的问题,例如'dddd'--------0(重复行是第一行)'dddd'--------3。它会给我: 'dddd'--------0 但我想获得:'dddd'--------3

标签: arrays matlab row cell


【解决方案1】:

查找所有完全唯一的字符串(即 ffff_0 和 ffff__1 是唯一的,但 aaaa_1 和 aaaa___1 显然不是唯一的。(显然下划线代表格式?)

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

我很确定您必须以某种能力(以上)这样做才能获得所需的输出,如果是这种情况,我认为您正处于 for 循环和所有额外的速度之间权衡的边缘内存分配和排序通过找到唯一值的值。

【讨论】:

  • ___ 用于单独的列。没有什么关于_的。第 1 列包含相同或不同的字符串,第 2 列只是双精度值。
【解决方案2】:

试试这个:

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,:)

【讨论】:

  • 您需要将第二列转换为矩阵才能使其工作:arr([arr{:,2}] ~= 0, :)
  • 我已经编辑了我的问题。我不应该删除所有值为 0 的行,只删除重复的行。
  • 好的,试试这个:[A,B] = unique(arr(:,1),'first'); arr = arr(B,:);
  • 但是如果情况是:'dddd'--------0(重复行是第一)'dddd'--------3 那么它会给出我:'dddd'--------0 但我想获得:'dddd'--------3
猜你喜欢
  • 1970-01-01
  • 2021-09-20
  • 1970-01-01
  • 2018-01-10
  • 1970-01-01
  • 1970-01-01
  • 1970-01-01
  • 1970-01-01
  • 1970-01-01
相关资源
最近更新 更多