2015-10-05 95 views
0

串刪除非唯一的字符讓一些變量是字符串abac,例如:從MATLAB /倍頻程

un = 
{ 
    [1,1] = abac 
} 

我需要改造它只是abc,即去掉3D符號a。 我不知道如何使字符串倍頻程功能變得很容易,而不是很大的變態。有任何想法嗎?

+1

[簡短的回答(HTTP: //codegolf.stackexchange.com/a/59641/45297) –

+0

好吧,最短的一個就是'unique' :) –

+0

不幸的是,'unique'中沒有'stable'選項,所以結果總是排序的。我實際上正在研究代碼高爾夫的更長版本。我會取消它併發布。 – beaker

回答

3

爲了找到唯一的符號中的單元陣列內的單個串,使用unique

un = 
{ 
    [1,1] = abac 
    [1,2] = asdlfkjasdf 
} 

>> unique(un{1}) 
ans = abc 
>> unique(un{2}) 
ans = adfjkls 

要查找所有字符串的獨特元素一次,在結合使用cellfununique

>> cellfun(@unique,un,'UniformOutput',false) 
ans = 
{ 
    [1,1] = abc 
    [1,2] = adfjkls 
} 

請注意,默認情況下,unique對結果的元素進行排序,與Matlab不同,Octave沒有stable選項來關閉此行爲。

1

如果你想要它們出現在原始字符串上的順序中的唯一字符,答案仍然是unique,但你需要它的第二個參數返回每個元素的第一個(或最後一個)索引。

octave> charv = "aaccbbahbc" 
charv = aaccbbahbc 
octave> [~, i] = unique (charv, "first") 
i = 

    1 5 3 8 

octave> charv(sort (i)) 
ans = acbh 

或單行:

octave> charv(sort (nthargout (2, @unique, charv, "first"))) 
ans = acbh 

如果你在一個單元陣列許多字符串,它變得有點複雜:

octave> charcv = {"aaccbbahbc", "erfyergfas"} 
charcv = 
{ 
    [1,1] = aaccbbahbc 
    [1,2] = erfyergfas 
} 
octave> [~, i] = cellfun (@unique, charcv , {"first"}, "UniformOutput", false) 
i = 
{ 
    [1,1] = 

    1 5 3 8 

    [1,2] = 

     9 1 3 7 2 10 4 

} 
octave> i = cellfun (@sort, i, "UniformOutput", false) 
i = 
{ 
    [1,1] = 

    1 3 5 8 

    [1,2] = 

     1 2 3 4 7 9 10 

} 
octave> cellfun (@subsref, charcv, num2cell (struct ("type", "()", "subs", num2cell (i))), "UniformOutput", false) 
ans = 
{ 
    [1,1] = acbh 
    [1,2] = erfygas 
}