필터 지우기
필터 지우기

文字列の数値化について

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

채택된 답변

Satoshi Kobayashi
Satoshi Kobayashi 2019년 2월 1일
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일
편집: 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!