18

セルがあるとします

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)

誰でも私を助けてくれますか

4

4 に答える 4

21

文字列はセル配列です

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

セル配列はMATLABで最も神秘的なデータ型だと思います。それでは、少しわかりやすく説明しましょう;-)

推定

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

まず第一に、小さな配列には整数のインデックス付けは必要ありません。foreachのような構造を使用する方がはるかに優れています。それはそう、

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

、つまり[10][01]

あなたが違いを見つけたなら、あなたは次の例をどうするかを知っている必要があります(これは本当にあなたの質問に関連しています(!)私は約束します!)。ループで水平連結を実行しようとしたとします。

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

あなたは得るでしょう

ans = 

    'banana'    'is a fruit'

等々。なんで?どうやらこのコードは、ネストされたセル配列を文字列('banana'のような文字列を構成するcharの行列を含むセル配列)に連結しようとします。だから、正解は

使用する {:}

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

魔法のように、これはすでに期待される「バナナは果物です」「リンゴは果物です」などを生成します。

ヒント

いくつかのヒント:

  • インデックスフリーループは、次のように構造体でうまく機能しますfor fruit = [fieldnames][1](fruits)'
  • 上記はオープンソースのオクターブに当てはまります
  • バナナは単なる果物ではなく、分類学的にはハーブでもあります;-) 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'

連結することができます。

于 2013-03-18T22:41:45.173 に答える
7

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

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

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

   class(my_cell{:})
    ans =
    char

mycell{:}通常の文字列を使用する場所ならどこでも式を使用できることに注意してください。

于 2013-04-21T01:23:05.467 に答える
2

これを試して:

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

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

于 2012-12-30T15:17:02.497 に答える
2

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

string = [x{:}];
于 2016-09-02T07:48:29.600 に答える