文字列の数値化について

42 次查看(过去 30 天)
qrqr
qrqr 2019-2-1
评论: Kenta 2019-2-2
以下のcellデータがあります。
A =
'73647360' [1121]
'1212' [1232]
'Phoenix' [5654563]
文字と数字があり、数字は数値と文字列に分かれています。
ここで数字は全て数値にしたいと考えています。
単純にstr2num(A)をすると、
文字列または文字配列の入力が必要です。 とエラーになります。
文字列、数値の混合する中で数字だけを数値にする方法はありますか?
宜しくお願いします。

采纳的回答

Satoshi Kobayashi
str2numでは文字を空行列に変換します。
forを使わない方法を提示します。
A = {'73647360',[1121];...
'1212',[1232];...
'Phoenix',[5654563]};
B = cellfun(@str2num,A,'UniformOutput' ,false,'ErrorHandler',@(~,t)t);
C = cellfun(@isempty,B);
B(C) = A(C);
  5 个评论
Satoshi Kobayashi
编辑:Satoshi Kobayashi 2019-2-2
str2numは数値を受け付けず、入力が数値だった場合にエラーを返します。
cellfunではエラーの際に'ErrorHandler'で指定した関数で処理を行わせることができます。
この場合、関数の二番目の入力が元の数値となります。
数値は数値のままで返したいので、二番目の入力を出力として返す無名関数@(~,t)tを作成しました。
つまり、以下の操作と同等です。
x = 1;
try
y = str2num(x);
catch
y = x;
end
詳細はcellfun無名関数を御覧ください。
Kenta
Kenta 2019-2-2
Satoshi Kobayashi 様
コメントの返信ありがとうございます。
解説していただき、ようやく理解することができました。ありがとうございます。
教えていただいたドキュメントも見ました。非常に勉強になります。このように書けると非常に便利ですね。
ご回答ありがとうございました。

请先登录,再进行评论。

更多回答(1 个)

Kenta
Kenta 2019-2-1
clear;clc
A=cell(3,2);
A{1,1}='73647360';
A{2,1}='1212';
A{3,1}='Phoenix';
A{1,2}=1121;
A{2,2}=1232;
A{3,2}=5654563;
%1)ischarでAのi行目、j列が文字配列か確認(文字ならtrue)
%2)isnanでAのi行目、j列を数字に直した時、nanにならないか(=文字として入っているA{i,j}が数字か)
%上の1および2を満たせば、A{i,j}は文字として入っている数字である=>str2doubleで数字に直せばよい
for i=1:size(A,1)
for j=1:size(A,2)
if (ischar(A{i,j})==true)&&(isnan(str2double(A{i,j}))==false)
A{i,j}=str2double(A{i,j});
end
end
end
人の手で確認する場合と同じように、for文を2回用いて訂正するのが直感的にわかりやすい気がします。
for Aを上からしたに
for Aを左から右に
として、A{i,j}が文字配列か=>(もし文字配列なら)=>A{i,j}は文字なのか、それとも文字配列として入っている数字なのか
=>(もし、文字配列として入っている数字なら)=>A{i,j}を数字に直す
もちろん、forやifを並べると実行が遅くなりますが、おそらく、大規模なデータではないと思うのでこれでよいと思いました。添付写真のような結果が返されるのでうまく走ると思います。
  3 个评论
qrqr
qrqr 2019-2-1
ありがとうございます。
参考になります。
qrqr
qrqr 2019-2-1
编辑:qrqr 2019-2-1
お二方とも異なるやり方なのでとても助かります。
状況に応じて使い分けもできると思いました。

请先登录,再进行评论。

类别

Help CenterFile Exchange 中查找有关 cell 配列 的更多信息

产品


版本

R2013b

Community Treasure Hunt

Find the treasures in MATLAB Central and discover how the community can help you!

Start Hunting!