2014-11-25 71 views
2

我有许多在与许多额外空间的单元阵列的行的行的端部作为这样的2行:合并在一个单元阵列

'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

+0

在您的实际情况中,您是否只需要复制第一行末尾的第二行,或者我们是否也必须处理更多行?第二行和第三行以及其余行(如果有的话)会发生什么?他们保持原样吗? – Divakar 2014-11-25 12:49:20

+0

我只需要添加一行到另一行。在此之后,第二行将被删除。不会有我需要向另一行添加多行的情况(即将第2行和第3行添加到第1行)。 – Doragan 2014-11-25 14:02:53

+0

因此,如果要删除第二行,输出单元阵列将会是什么样子?问题中所述的期望输出仍显示第二行。在需要的输出上编辑你的问题来澄清?那么第三排会发生什么? – Divakar 2014-11-25 14:05:54

回答

5

更多的行我觉得这做你想做的事。我已将您的单元格阵列表示为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'  []  []  [] [] [] 
+0

谢谢你。这看起来应该可以工作,但是,在运行代码时,我会收到“太多输入”的错误消息。你知道这个错误可能来自哪里吗? – Doragan 2014-11-25 13:59:52

+0

例如,在Divakar的答案中,我没有遇到'c'的任何错误。你如何定义你的'c'? – 2014-11-25 14:41:27

+1

@Doragan务必复制并粘贴原样,并且不要删除任何圆括号。 – Divakar 2014-11-25 14:45:50

3

以下是一种使用高效的一般方法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'  []  []  []  []  []  []  [] 

等等。