2014-11-25 82 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'  []  []  []  []  []  []  [] 

等等。

相關問題