web-dev-qa-db-ja.com

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)

事前に感謝できますか?

18
user1804229

文字列はセル配列です

まあ、そうではありません。それはマトリックスですが、読み続けてください。

セル配列は、MATLABで最も神秘的なデータ型だと思います。それではdemystifyそれを少し;-)

仮定する

_fruits = {...
    'banana',...
    'Apple',...
    'orange'...
}
_

まず、小さな配列には整数のインデックス付けは必要ありません。 foreach-like構造を使用することをお勧めします。確かに、

_for index = 1:numel(fruits)
    fruits{index}
end
_

に等しい

_for fruit = fruits
    fruit
end
_

右?

まあ、そうではありません。最初のループはストリングを生成し、2番目のループはセルを生成します。で確認できます

_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)'のように構造体でうまく機能します
  • 上記は、オープンソースの場合、trueoctave
  • バナナは単なる果物ではなく、分類学的にはハーブでもあります;-) MATLABの 'banana'が文字列と行列の両方であるように、つまりassert(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'
_

連結できます。

21

次のようなセルがあるとします。

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

{:}演算子を直接使用するだけで、文字列を取得できます。

   class(my_cell{:})
    ans =
    char

mycell{:}は、通常の文字列を使用する任意の場所で使用できることに注意してください。

7
merlin2011

Strjoin.mファイルを調べると、次のことがわかりました。

string = [x{:}];
2
Dieter

これを試して:

sprintf('   %.5f',x{:})

(いくつかの Googleの結果 に従って動作します。)

2
Lynn