セルがあると仮定します
_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)
事前に感謝できますか?
まあ、そうではありません。それはマトリックスですが、読み続けてください。
セル配列は、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)'
のように構造体でうまく機能します{:}
_は_cell2mat
_と同等です質問に対する解決策は次のようになります。
与えられた
_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'
_
連結できます。
次のようなセルがあるとします。
my_cell = {'Hello World'}
class(my_cell)
ans =
cell
{:}
演算子を直接使用するだけで、文字列を取得できます。
class(my_cell{:})
ans =
char
式mycell{:}
は、通常の文字列を使用する任意の場所で使用できることに注意してください。
Strjoin.mファイルを調べると、次のことがわかりました。
string = [x{:}];