2012-11-06 55 views
17

假設我有一個細胞如何將電池轉換爲字符串在MATLAB

v = 'v' [576.5818] [3.0286] [576.9270] 

     'v' [576.5953] [3.1180] [576.8716] 

     'f' [  56] [ 58] [  52] 

     'f' [  56] [ 58] [  52] 

,我想使用的每個元素的格式字符串,將其轉換爲一個單元陣列:' %.5f'

我怎樣才能做這個?我嘗試以下方法,但我得到一個錯誤:

f1 = @(x) sprintf(' %.5f',x); 
cellfun(f1, num2cell(v),'UniformOutput', false) 

我得到一個錯誤???

Error using ==> sprintf

Function is not defined for 'cell' inputs.

Error in ==> @(x)sprintf(' %.5f',x)

任何一個可以幫助我在此先感謝

回答

21

String是一個單元陣列

那麼,不是真的..這是一個矩陣,但繼續閱讀。

我想單元格數組是MATLAB中最神祕的數據類型。因此,讓我們神祕性有點;-)

假設

fruits = {... 
    'banana',... 
    'apple',... 
    'orange'... 
} 

首先整數索引不需要爲小數組。使用foreach -like構造好得多。事實上,

for index = 1:numel(fruits) 
    fruits{index} 
end 

相當於

for fruit = fruits 
    fruit 
end 

吧?

嗯,不完全。第一個循環產生字符串,而第二個循環產生字符串。可以用

for index = 1:numel(fruits) 
    [isstr(fruits{index}) iscell(fruits{index})] 
end 

for fruit = fruits 
    [isstr(fruit) iscell(fruit)] 
end 

,即[1 0]和[0 1]檢查它。

如果你有現貨差異,那麼你必須知道如何處理下一個例子(在這一個真的與你的問題(!)我保證!)。假設你嘗試做橫向拼接在一個循環:

for fruit = fruits 
    [fruit 'is a fruit'] 
end 

你會得到

ans = 

    'banana' 'is a fruit' 

等。爲什麼?顯然,這段代碼試圖將一個嵌套的單元格數組連接到一個字符串(一個單元格數組包含一個構成像'香蕉'字符串的字符矩陣)。所以,正確的答案是

使用{:}

for fruit = fruits 
    [fruit{:} 'is a fruit'] 
end 

奇妙的本已產生預期的'香蕉是水果''蘋果是水果'

提示

一些提示:

  • 免費索引循環與結構很好地工作在for fruit = [fieldnames][1](fruits)'
  • 以上是開源倍頻
  • 香蕉不僅是水果,在分類學上這也是一種草藥;-)就像「香蕉」在MATLAB中既是一個字符串又是一個矩陣,即斷言(isstr('banana'))& & ismat('banana'))通過,但assert(iscell('banana'))失敗。
  • {:}相當於cell2mat

PS

你的問題的解決方案可能是這樣的:

鑑於

vcell = {... 
    'v' 576.5818 3.0286 576.9270; 
    'v' 576.5818 3.0286 576.9270  
} 

隱蔽指數明智僅數值類型爲字符串

vcell(cellfun(@isnumeric, vcell)) = cellfun(@(x) sprintf('%.5f', x), vcell(cellfun(@isnumeric, vcell)), 'UniformOutput', false) 

以上代碼輸出

VCELL =

'v' '576.58180' '3.02860' '576.92700' 
'v' '576.58180' '3.02860' '576.92700' 

可級聯。

6

假設我們有一個細胞如下:

my_cell = {'Hello World'} 
class(my_cell) 
ans = 
cell 

我們可以簡單地通過直接使用{:}運營商就可以得到字符串出來。

class(my_cell{:}) 
    ans = 
    char 

請注意,我們可以在任何使用普通字符串的地方使用表達式mycell{:}

+0

要走的路!永遠不要說挖掘從來沒有幫過任何人。 –

+0

調用多餘的函數調用'sprintf'一個黑客 - 是一個大聲笑 –

2

通過查看strjoin.m文件,我發現這個:

string = [x{:}];