【问题标题】:Combine 2 rows in a cell array将 2 行合并到一个元胞数组中
【发布时间】:2014-11-25 23:21:27
【问题描述】:

我在一个单元格数组中有很多行,行尾有很多额外的空间,如下所示:

'a' 'b' 'c' 'd' [] [] [] [] []
'1' '2' '3' [] [] [] [] [] []
'w' 'x' 'y' 'z' [] [] [] [] []

我想将第二行复制到第一行的末尾,如下所示:

'a' 'b' 'c' 'd' '1' '2' '3' [] []
'1' '2' '3' [] [] [] [] [] []
'w' 'x' 'y' 'z' [] [] [] [] []

请注意,上面给出的代码是一个任意示例,用于演示我想要做什么。实际上,我会将此功能作为更复杂功能的一个步骤。

我尝试在元胞数组行中搜索第一个空元素,但由于某种原因 isempty 不会将它们视为空。有没有人可以指点我的替代方法?

编辑: 完成上述步骤后,第二行将被删除,给出:

'a' 'b' 'c' 'd' '1' '2' '3' [] []
'w' 'x' 'y' 'z' [] [] [] [] []

虽然真正的元胞数组的行数会多于 3 行。

【问题讨论】:

  • 在您的实际情况下,您只需要在第一行末尾复制第二行,还是我们也必须处理更多行?第二行和第三行以及其余行(如果有)会发生什么?他们会保持原样吗?
  • 我只需要将一行添加到另一行。在此之后,第二行将被删除。不会有我需要向另一行添加多个行的情况(即,将第 2 行和第 3 行都添加到第 1 行)。
  • 那么,如果要删除第二行,输出元胞数组会是什么样子?问题中所述的所需输出仍显示第二行。编辑您对所需输出的问题以澄清这一点?那么第三行会发生什么?
  • 我已经编辑了这个问题。我最初没有包含此信息,因为我认为它与问题无关。
  • 顺便问一下my solution 有什么错误吗?如果没有,在解决方案结束时,您可以使用 C(2,:) =[];? 删除第二行?

标签: matlab cell-array


【解决方案1】:

我认为这可以满足您的需求。我已将您的单元格数组表示为c

n1 = find(cellfun('isempty',c(1,:)), 1); %// first empty cell in row 1
n2 = find(cellfun('isempty',c(2,:)), 1); %// first empty cell in row 2
c(1,n1:n1+n2-2) = c(2,1:n2-1); %// copy the relevant part of row 2 onto row 1

如果第 2 行中非空单元格的数量超过第 1 行中空单元格的数量,这会自动水平扩展您的单元格。

示例:输入:

c = {'a' 'b' 'c' 'd' [] [] [] [] []
'1' '2' '3' [] [] [] [] [] []
'w' 'x' 'y' 'z' [] [] [] [] []}

输出:

c = 
    'a'    'b'    'c'    'd'    '1'    '2'    '3'    []    []
    '1'    '2'    '3'     []     []     []     []    []    []
    'w'    'x'    'y'    'z'     []     []     []    []    []

【讨论】:

  • 谢谢。这看起来应该可以工作,但是,在运行代码时,我收到一条“输入过多”的错误消息。你知道这个错误可能来自哪里吗?
  • 我没有收到 c 的任何错误,例如 Divakar 的回答。你如何定义你的c
  • @Doragan 确保按原样复制和粘贴,不要删除任何圆括号。
  • @LuisMendo 我定义它 c=cell(length(CAMINO),500)
  • @Divakar 我做了复制和粘贴,尽管我做了一些更改以使其在我的原始代码中工作。我目前正在再次尝试,似乎得到了不同的结果。我马上回来汇报。
【解决方案2】:

这是一种通用方法,它使用高效的 logical indexing 来选择非空单元格,单次调用 cellfun('isempty' 并按照 Luis's solution 中所述进行自动扩展 -

C = {
'a' 'b' 'c' 'd' [] [] [] [] []
'1' '2' '3' [] [] [] [] [] []
'w' 'x' 'y' 'z' [] [] [] [] []} %// Input cell array

N = 2; %//Number of rows to process, starting from 2 until the number of rows in C
Ct = C'; %//'# Transpose input cell array, as collecting elements that way is easier
vals = Ct(~cellfun('isempty',Ct(:,1:N))); %//'# elements from selected row(s)
C(1,1:numel(vals)) = vals; %// Place the values into the first row

N = 2 是问题中所述的情况,输出将是 -

C = 
    'a'    'b'    'c'    'd'    '1'    '2'    '3'    []    []
    '1'    '2'    '3'     []     []     []     []    []    []
    'w'    'x'    'y'    'z'     []     []     []    []    []

使用N = 3,您将复制第一行末尾的第二行和第三行。因此,输出将是 -

C = 
    'a'    'b'    'c'    'd'    '1'    '2'    '3'    'w'    'x'    'y'    'z'
    '1'    '2'    '3'     []     []     []     []     []     []     []     []
    'w'    'x'    'y'    'z'     []     []     []     []     []     []     []

等等。

【讨论】:

    猜你喜欢
    • 1970-01-01
    • 2011-07-17
    • 1970-01-01
    • 1970-01-01
    • 2021-02-12
    • 1970-01-01
    • 1970-01-01
    • 1970-01-01
    • 1970-01-01
    相关资源
    最近更新 更多