2013-06-28 56 views
0

我有一個包含字符串和電池單元陣列,與此類似:評估字符串的細胞單元陣列

theCellArray = {{'aa1' {'bb'; 'cc'}}; {'aa2' {'dd'; 'ee'}}}; 

現在我想能夠類似的東西串聯的名字,並獲得這樣的:

aa1.bb 
aa1.cc 
aa2.dd 
aa2.ee 

元件的數目可能會改變(因此對於aa1,可能會有bbccddee等)。

我嘗試了各種各樣的東西,但我總是無法讓Matlab評估字符串的第二步(包含bb,cc ...的那一個)。有任何想法嗎?

編輯:

可能有超過2級,所以theCellArray可能是:

theCellArray = {{'aa1' {'bb' {'b1' {'b11' 'b12'} 'b2'}; 'cc'}}; {'aa2' {'dd'; 'ee'}}}; 

theCellArray就像一棵樹,這樣水平的數量是未知的。

+0

是'aa1.bb'字符串' 'aa1.bb''或'struct'名爲'aa1'與命名字段'' bb''和''cc''? – horchler

+0

@horcler'aa1.bb'應該是一個字符串''aa1.bb'' –

+0

什麼是這些名字的最終目的是什麼? – Oleg

回答

1

這裏是一個遞歸解決方案:

function t = recCat(s) 
if ~iscell(s) 
    t = s; 
elseif size(s,1) > 1, 
    t = [recCat(s(1,:)); recCat(s(2:end,:))]; 
elseif size(s,2) > 1, 
    t0 = cellfun(@(x) strcat('.', x), ... 
     cellfun(@recCat, s(2:end), 'UniformOutput', false), ... 
     'UniformOutput', false); 
    t = strcat(s{1}, t0{:}); 
elseif ischar(s{1}) 
    t = s; 
else 
    t = recCat(s{1}); 
end 
end 

下面是第一示例中的結果是:

>> theCellArray = {{'aa1' {'bb'; 'cc'}}; {'aa2' {'dd'; 'ee'}}}; 
>> recCat(theCellArray) 
ans = 
    'aa1.bb' 
    'aa1.cc' 
    'aa2.dd' 
    'aa2.ee' 

第二,因爲它代表現在失敗,因爲在級聯尺寸的問題。我把'bb' {'b1' {'b11' 'b12'} 'b2'}到另一個細胞,使其具有相同的列數爲'cc'那麼你得到

>> theCellArray = {{'aa1' {{'bb' {'b1' {'b11' 'b12'} 'b2'}}; 'cc'}}; {'aa2' {'dd'; 'ee'}}}; 
>> recCat(theCellArray) 
ans = 
    'aa1.bb.b1.b11.b12.b2' 
    'aa1.cc' 
    'aa2.dd' 
    'aa2.ee' 

然而,你可能是指b11b12是在同一列不是在這種情況下排這樣:

>> theCellArray = {{'aa1' {{'bb' {'b1' {'b11';'b12'} 'b2'}}; 'cc'}}; {'aa2' {'dd'; 'ee'}}}; 
>> recCat(theCellArray) 
ans = 
    'aa1.bb.b1.b11.b2' 
    'aa1.bb.b1.b12.b2' 
    'aa1.cc' 
    'aa2.dd' 
    'aa2.ee' 
1

這是一個甜蜜的一個:

out = cellfun(@(y) cellfun(@(x) [ y{1} '.' x],y{2},'UniformOutput',false),theCellArray,'UniformOutput',false) 
out{:} 
ans = 

    'aa1.bb' 
    'aa1.cc' 


ans = 

    'aa2.dd' 
    'aa2.ee' 

超級本內膽! (但不是非常有效),並且只適用於具有兩級單元串的原始問題。

+0

它工作的很好,但只有當單元陣列有兩個層次。請參閱我的問題中的編輯。 –

+0

+1超級單線! – Schorsch

+0

這不會是一個內襯了,但你可以使用eval,並提供額外水平的VAR名稱的方式。如果你有創意,你可以在沒有for循環的情況下構建str,但是如果你想要使用大部分核心思想,那麼就可以解決這個問題 – Shaun314