文字列はセル配列です
まあ、そうではありません..それはマトリックスですが、読み続けてください。
セル配列は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'
連結することができます。