MATLAB Answers

qrqr
0

文字列の数値化について

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

  0 Comments

Sign in to comment.

Products


Release

R2013b

2 Answers

Answer by Satoshi Kobayashi on 1 Feb 2019
 Accepted Answer

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

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

Sign in to comment.


Answer by Kenta Itakura 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

Kenta Itakura on 1 Feb 2019
ほかの方が先に回答されていますね。見落としていました。
qrqr
on 1 Feb 2019
ありがとうございます。
参考になります。
qrqr
on 1 Feb 2019
お二方とも異なるやり方なのでとても助かります。
状況に応じて使い分けもできると思いました。

Sign in to comment.