文字列の数値化について

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

Accepted Answer

Satoshi Kobayashi
Satoshi Kobayashi on 1 Feb 2019
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 Comments
Satoshi Kobayashi
Satoshi Kobayashi on 2 Feb 2019
Edited: Satoshi Kobayashi on 2 Feb 2019
str2numは数値を受け付けず、入力が数値だった場合にエラーを返します。
cellfunではエラーの際に'ErrorHandler'で指定した関数で処理を行わせることができます。
この場合、関数の二番目の入力が元の数値となります。
数値は数値のままで返したいので、二番目の入力を出力として返す無名関数@(~,t)tを作成しました。
つまり、以下の操作と同等です。
x = 1;
try
y = str2num(x);
catch
y = x;
end
詳細はcellfun無名関数を御覧ください。
Kenta
Kenta on 2 Feb 2019
Satoshi Kobayashi 様
コメントの返信ありがとうございます。
解説していただき、ようやく理解することができました。ありがとうございます。
教えていただいたドキュメントも見ました。非常に勉強になります。このように書けると非常に便利ですね。
ご回答ありがとうございました。

Sign in to comment.

More Answers (1)

Kenta
Kenta on 1 Feb 2019
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 Comments
qrqr
qrqr on 1 Feb 2019
ありがとうございます。
参考になります。
qrqr
qrqr on 1 Feb 2019
Edited: qrqr on 1 Feb 2019
お二方とも異なるやり方なのでとても助かります。
状況に応じて使い分けもできると思いました。

Sign in to comment.

Categories

Find more on cell 配列 in Help Center and File Exchange

Products


Release

R2013b

Community Treasure Hunt

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

Start Hunting!