2016-12-20 66 views
0

我有一個包含許多重複值的單元格列表,包括字符串,採樣時間,飽和度上限和下限。從單元格數組中刪除重複的不同數據類型的值

例如:

MyValues={ 'Lookc_at_the_stars' 
      'Lookc_how_they_shine' 
      'forc_you' 
      'andm_everything_they_do' 
      'Theym_were_all_yellow' 
      'COLDPLAY_STOP' 
      'COLDPLAY_PLAY' 
      'COLDPLAY_PLAY' 
      'COLDPLAY_PLAY' 
      'COLDPLAY_BREAK' 
      'COLDPLAY_BREAK' 
      'Lookc_How_they_shinefor_you' 
      'its_true' 
      'COLDPLAY_STOP' 
      'COLDPLAY_STOP' } 

而我需要的輸出是:

NewMyValues = { 'Lookc_at_the_stars' 
       'Lookc_how_they_shine' 
       'forc_you' 
       'andm_everything_they_do' 
       'Theym_were_all_yellow' 
       'COLDPLAY_STOP' 
       'COLDPLAY_PLAY' 
       'COLDPLAY_BREAK' 
       'Lookc_How_they_shinefor_you' 
       'its_true' } 

既然我已經使用功能unique試過,我不能得到輸出,因爲它是給我一個錯誤,說

「Error using cell/unique
輸入A必須是字符串的單元陣列。「

MyValues由不同類型的數據類型值組成。

有人可以提供一個解決方案或功能代碼,我可以刪除重複的值嗎?

+2

創建[MCVE] –

+0

您使用Matlab的哪個版本? '獨特的(MyValues,'stable')'在Matlab 2015b中有效。 –

+1

在你提供的例子中,只有字符串。如果您提供了包含*字符串,採樣時間,飽和度上限和下限*的示例,則會更好,因爲您寫到實際數據包含所有這些數據。 –

回答

-1

這裏是一個基於循環溶液以提取將不同類型的單元陣列的唯一值:

MyValues={ 'Lookc_at_the_stars', 
      'Lookc_how_they_shine', 
      1, 
      'forc_you', 
      'andm_everything_they_do', 
      'Theym_were_all_yellow', 
      2, 
      'COLDPLAY_STOP', 
      'COLDPLAY_PLAY', 
      1, 
      'COLDPLAY_PLAY', 
      'COLDPLAY_PLAY', 
      {1 2 3}, 
      'COLDPLAY_BREAK', 
      {4 3 5}, 
      'COLDPLAY_BREAK', 
      {1 2 3}, 
      'Lookc_How_they_shinefor_you', 
      'its_true', 
      'COLDPLAY_STOP', 
      'COLDPLAY_STOP' }; 
N = numel(MyValues); 
idx = true(N,1); 
for m = 1: N 
    if idx(m) 
     for n = (m+1):N 
      if idx(n) && isequal(MyValues{m}, MyValues{n}) 
       idx(n) = false; 
      end 
     end 
    end 
end 
result = MyValues(idx); 

結果:

result = 
{ 
    [1,1] = Lookc_at_the_stars 
    [1,2] = Lookc_how_they_shine 
    [1,3] = 1 
    [1,4] = forc_you 
    [1,5] = andm_everything_they_do 
    [1,6] = Theym_were_all_yellow 
    [1,7] = 2 
    [1,8] = COLDPLAY_STOP 
    [1,9] = COLDPLAY_PLAY 
    [1,10] = 
    { 
    [1,1] = 1 
    [1,2] = 2 
    [1,3] = 3 
    } 
    [1,11] = COLDPLAY_BREAK 
    [1,12] = 
    { 
    [1,1] = 4 
    [1,2] = 3 
    [1,3] = 5 
    } 
    [1,13] = Lookc_How_they_shinefor_you 
    [1,14] = its_true 
} 

功能isequal可以比較的任何使用它所有的值進行比較並刪除重複項。因此result是包含唯一值的單元格數組。
根據問題中的示例,如果您想擁有唯一的單元格字符數組,您可以使用cellfunischar來檢查單元格值是否是字符數組。然後使用邏輯索引來提取它們並應用unique

unique(MyValues(cellfun(@ischar,MyValues)),'stable') 

不使用stable選項的結果進行排序

+1

不提供所需的訂單。 –

+0

好,回答更新 – rahnema1

+0

OP的數據可以有*採樣時間,飽和度上限和下限*,如果它們不是'char'類型,它將忽略這個代碼。他想要刪除那些數據的重複。 –

0

你在你的問題中提供的電池只包含字符串,所以unique可以處理它。但是,如果添加ints,浮點數或複數數字,則要在將所有單元格元素轉換爲字符串之前先調用唯一的元素。例如,我會告訴你一個小strcaster功能

function y = strcaster(x) 
    if ischar(x) 
     y = x; 
    elseif isreal(x) 
     y = num2str(x); 
    else 
     if imag(x)>=0 
      s = '+j'; 
     else 
      s = '-j'; 
     end 
     y = [num2str(real(x)),s,num2str(imag(x))]; 
    end 
end 

,然後你可以得到獨特的元素,保留它們出現在小區做的順序如下:

MyValues={'Lookc_at_the_stars',... 
'Lookc_how_they_shine',... 
'forc_you',... 
'andm_everything_they_do',... 
'Theym_were_all_yellow',... 
'COLDPLAY_STOP',... 
'COLDPLAY_PLAY',... 
'COLDPLAY_PLAY',... 
'COLDPLAY_PLAY',... 
'COLDPLAY_BREAK',... 
'COLDPLAY_BREAK',... 
'Lookc_How_they_shinefor_you',... 
'its_true',... 
'COLDPLAY_STOP',... 
'COLDPLAY_STOP',... 
1,... 
1.32423,... 
complex(-3.,13)}; 
[u,i] = unique(cellfun(@(x)strcaster(x),MyValues,'uniformoutput',false),'stable'); 
disp(MyValues(i)) 

編輯

根據您的評論,很顯然MyValues單元格包含其他單元格,從您的問題示例中不清楚。獲得MyValues中唯一值的最佳方法仍然是將內容轉換爲字符串。該JSON協議將讓你幾乎任何數據類型轉換爲字符串,所以我建議使用下列方式MATLAB的jsonencode功能:

MyValues={'Lookc_at_the_stars',... 
'Lookc_how_they_shine',... 
'forc_you',... 
'andm_everything_they_do',... 
'Theym_were_all_yellow',... 
'COLDPLAY_STOP',... 
'COLDPLAY_PLAY',... 
'COLDPLAY_PLAY',... 
'COLDPLAY_PLAY',... 
'COLDPLAY_BREAK',... 
'COLDPLAY_BREAK',... 
'Lookc_How_they_shinefor_you',... 
'its_true',... 
'COLDPLAY_STOP',... 
'COLDPLAY_STOP',... 
1,... 
1.32423,... 
[1,23,4,4;5,3,2,1],... 
{'bla',1324,{'12',123}},... 
struct('NextTime','Provide a complete working example in the question')}; 
[u,i] = unique(cellfun(@(x)jsonencode(x),MyValues,'uniformoutput',false),'stable'); 
disp(MyValues(i)) 
+0

嗨@lucianopaz,我在使用你的函數strcaster(x)時出錯,它說:「未定義函數'imag',用於'cell'類型的輸入參數。 錯誤as> @(x)strcaster(x) 錯誤as as [u,i] =唯一(cellfun(@(x)strcaster(x),ParameterValues,'uniformoutput',false),'stable ')「 –

+0

當然,你會得到一個錯誤。我寫的strcaster函數不是用來處理,結構體,單元格或矩陣的。但是,可以稍微改變它以使用json將任何內容轉換爲字符串。如果你提供了一個完整的工作示例,顯示你有單元格,我會從一開始就使用json。 – lucianopaz

相關問題