Matlabでデータを分類する方法とは?

このQ&Aのポイント
  • Matlabを使用してデータを分類する方法について質問です。データの中の特定の値が正しく分類されない原因について教えてください。
  • Matlabで長さがdataの数のデータを分類するためのコードを書いていますが、データの中の一部の値が正しく分類されていません。どこに問題があるか教えてください。
  • Matlabでデータを分類する方法に関して質問があります。特定の値が正しく分類されず、原因を特定できません。ご教授いただけると幸いです。
回答を見る
  • ベストアンサー

Matlabについて質問です

Matlabについて質問です。 長さがdataの数のデータがあり次のように分類したいのですが、データの中の-0.0074などが1になってくれません。 どこに原因があると思われますか?よろしくお願いします! recd=zeros(length(data),1); for n=1:length(data) if data(n)<-0.01; recd(n) = 0; elseif(-0.01<=data(n)<0); recd(n) = 1; elseif(0<=data(n)<0.01); recd(n) = 2; else recd(n) = 3; end end よろしくお願いします!!

質問者が選んだベストアンサー

  • ベストアンサー
  • Kules
  • ベストアンサー率47% (292/619)
回答No.1

まあMatlabはCではないんですが、Cと同じようなことが起こる問題ですね。 (-0.01<=data(n)<0) のようには書けません。 (この式がどのように解釈されるのかはわかりませんが) (data(n)>=-0.01&&data(n)<0); としなければ、思ったようには動きません。 もっというと、この式はfor文で回さなくてもできます。 recd=zeros(length(data),1); recd(data<-0.01)=0; recd(data>=-0.01&data<0)=1; recd(data>=0&data<0.01)=2; recd(data>=0.01)=3; のような感じですね。Matlabでは、条件式そのものをインデックス代わりに使うことができますので。 見たらわかると思いますが、最初の設定をうまくすれば、 わざわざ5行も使う必要もなさそうですね。 参考になれば幸いです。

関連するQ&A

  • MATLABの計算過程での質問です。

    はじめまして。 MATLABのコードでどうしてもわからないことがあり質問させていただきます。 問題はerrorの計算で起こります。 error=Σ[((F_n+1)-(F_n))/(F_n+1)] ループ内の計算がiter=1以降に進まなくなりました。 いろいろ編集してみましたが、どうしてもerrorのところがうまく働きません。 良かったらアドバイスよろしくお願いします。 tol=tolerance N=number of maximum iterationです ---------------------------------------------------------------- tol=0.01; N=100; A=zeros(26,26); f0=zeros(26,26); A(11:26,1)=100; A(26,1:16)=100; f=A; iter=1;f0=0 n=1; for n=1:N for i=2:26-1 for j=2:26-1 f(i,j)=(1/4)*(A(i+1,j)+A(i-1,j)+A(i,j+1)+A(i,j-1)) error(i,j)= sum(abs((f(i,j)-f0(i,j))./f(i,j))); end end if error <=tol break; else A=f; f0=f; iter=iter+1 end end

  • matlab制御文での値の格納?

    現在matlabを使用してfor文で1から3000まで繰り返し、sigmaを求めるというプログラムを作っているのですが、うまくいきません。これだとn=3000のsigmaの値しかでてきません。sigmaにfor文で繰り返し求めたすべての値を格納したいです。初心者で低レベルな質問ですみません。どなたか教えていただけませんか。 sigma=0; for n=1:3000, if n <=300 dsig=1; elseif n <= 950 dsig=-1; elseif n <= 1700 dsig=1; elseif n <= 2550 dsig=-1; elseif n <= 3000 dsig=1; end sigma =sigma + dsig; end

  • MATLABからCへ

    if(n>1), nrm = sqrt(sum([A.*conj(A)],2)); else nrm = abs(A); end return MATLABで次のように与えられたときどのようにしてC言語で書けばよいでしょうか??

  • MATLABのアップグレード問題

    MATLAB初心者です。 MATLAB6.1(おそらく)で開発されたコードがMATLAB7.01で動きません。 アドバイスを頂ければと思います。 1: out = {}; 2: for i=1:length(files), 3: out = [out, helper([d '/' files{i}], pat(2:end))]; 4: end 上記のコードの3行目で「Conversion to cell from char is not possible.」エラーが発生します。 MATLAB6.1から6.5のアップグレード問題で、空のセル配列の連結が原因のようです。 そこで下記のように修正しました。 1: out = {}; 2: for i=1:length(files), 3: if i==1 out = helper([d '/' files{i}], pat(2:end)); 4: else out = [out, helper([d '/' files{i}], pat(2:end))]; 5: end 6: end 1回目のループの場合は連結せず、2回目以降は連結するように修正しています。 このように修正しても意図通り動いていません。 修正方法は間違っていますか。

  • プログラムについて(matlab)

    matlabで以下のプログラムを実行しているのですが、 グラフが表示されません。 何故でしょうか、、。 ----------------------------------------- t=10 for r=400:1:2000 %波長 if 400<= r <700 y= 18*t.^(0.75); elseif 700<= r <1050 y= 18.*t.^(0.75).*10.^(0.002.*(r-700)); elseif 1050<= r <1150 y= 90*t.^(0.75)*1*1; elseif 1150<= r <1200 y= 90.*t.^(0.75).*1.*10.^(0.018.*(r-1150)); elseif 1200<= r <1400 y= 90*t.^(0.75)*1*8; elseif 1400<= r <1500 y= 5600*t.^(0.25); end plot(r,y) end ------------------------------------------------------ お詳しい方よろしくお願いします.

  • matlabのfor文について

    matlabについて基本的な質問があります. たとえば a1 = 11 a2 = 32 a3 = 53 a4 = 63 for i = 1:length(a1) ○○○ end for i = 1:length(a2)  ○○○ end for i = 1:length(a3)  ○○○ end for i = 1:length(a4)  ○○○ end の時に,for文を一つにまとめるにはどうすればいいですか?

  • MATLAB ベクトル化(functionの繰り返

    MATLAB Lのプログラムを組んでいます。 for loop では実行時間が長すぎるため、改善したいです。そこでベクトル化を思いつきましたが、「functionの実行を繰り返す」場合の書き方がいまいち分からないので、教えていただきたいです。 元のループ処理は以下の通りです。 for n= 1:length(MeasuredData) SimulatedDataSet(n) = func1(param1(n), param2(n), param3(n)); end 宜しくお願い致します。

  • MCMCを用いたパラメータ推定[Matlab]

    今、MCMCを用いてパラメータ推定のためのプログラムを考えています。Matlabを用いてコードを書いている最中なのですが、IfとEndが合わないという忠告が何個も出てしまいます。下記にコードを載せましたので、何が間違っているか教えていただけませんでしょうか。 求めたいパラメータは、ポアッソン分布に従うと仮定し,尤度を使ってデータの当てはまりを見ています。 Matlab初心者なので間違いも多いと思いますが、どうぞよろしくお願いいたします。 logpt =0; %空値 theta =0; %空値 theta0 = ceil(100.*rand()); % i = initial value of MCMC 100 lambda = 5; % true mean value of dispersal updatewidth = 0.1; %sigma update width of MCMC nsample = 100; %number of iterations for MCMC nsample 100000 nthin = 1; %thinning number of MCMC kannbiki, sukashi individual = 100; %individual numbers 1000 xsize = 10; %space size of matrix ysize = 10; dat = zeros(xsize, ysize); %space xinit = 5; %initial position of population yinit = 5; %making dammy data for j = 1:individual lam(1) = ceil(100.*rand()); % decide a initial number P = poissrnd(lambda); tx = xinit; ty = yinit; i = 1; while i <= P d = ceil(4.*rand()); if d==1 && ty -1 >0 ty = ty-1; i = i+1; elseif 1==2 && tx +1 <= xsize tx = tx+1; i = i+1; elseif d==3 && ty+1 <= ysize ty = ty+1; i = i+1; elseif d==4 && tx-1 > 0 tx = tx-1; i = i+1; end; end; dat(tx,ty) = dat(tx,ty) + (1); end; %MCMC start for n = 1:nsample for o = 1:nthin %(ii) simulation with the previous step dispersal value sp0 = zeros(xsize, ysize); ind0 = zeros(2,individual); for m = 1:individual r = poissrnd(theta0); tx = xinit; ty = yinit; i = 1; while i <= r d = ceil(4.*rand()); if d==1 && ty-1 > 0 ty = ty-1; i = i+1; elseif d==2 && tx+1 <= xsize tx = tx+1; i = i+1; elseif d==3 && ty+1 <= ysize ty = ty+1; i = i+1; elseif d==4 && tx-1 > 0 tx = tx-1; i = i+1; end; end; sp0(tx,ty) = sp0(tx,ty) + 1; ind0(1,m) = tx; ind0(2,m) = ty; end; %calculating likelihood LOGP = 0; for q = 1:xsize for s = 1:ysize if sp0(q,s) == 0 LOGP = LOGP + log(poisspdf(0.001,dat(q,s))); else LOGP = LOGP + log(poisspdf(sp0(q,s),dat(q,s))); end; end; end; %(iii) making a proposal value tmp = updatewidth * randn(size(theta0)); %b= updatewidth = 0.1; sigma update width of MCMC while tmp < 0 tmp = updatewidth * randn(size(theta0)); end; %(iv) making proposal distances of each individuals theta1 = poissrnd(tmp); %(v) simulation with the proposal value for p = 1:individual tx = xinit; ty = yinit; i = 1; while i <= theta1 d = ceil(4.*rand()); if d==1 && ty-1>0 ty = ty-1; i = i+1; elseif d==2 && tx+1 <= xsize tx = tx+1; i = i+1; elseif d==3 && ty+1 <= ysize ty = ty+1; i = i+1; elseif d==4 && tx-1 > 0 tx = tx-1; i = i+1; end; end; %calculating likelihood prev = sp0(ind0(1,p),ind0(2,p)); dat_prev = dat(ind0(1,p),ind0(2,p)); prop = sp0(tx,ty); dat_prop = dat(tx,ty); if prop == 0 LOGP0 = log(poisspdf(prev,dat_prev)) + log(poisspdf(0.001,dat_prop)); else LOGP0 = log(poisspdf(prev,dat_prev)) + log(poisspdf(prop,dat_prop)); end; if prev == 1 LOGP1 = log(poisspdf(0.001,dat_prev)) + log(poisspdf(prop+1,dat_prop)); else LOGP1 = log(poisspdf(prev-1,dat_prev)) + log(poisspdf((prop+1),dat_prop)); end; if rand < exp(LOGP1 - LOGP0) r = theta1; LOGP0 = LOGP1; end; end; %(vi) calculating the mean of theta theta0 = mean(r); end; theta = theta0; LOGPt = LOGP; end;

  • MATLABのデータ抽出についておたずねしたいことがあります。

    MATLABのデータ抽出についておたずねしたいことがあります。 MATLAB初心者ですが、以下のようなプログラムを現在書いています。 f = input('file name? ---> ','s'); m = csvread(f,66,2,[66,2,1089,3]); time=(0:0.002:2.046); t=reshape(time,1024,1); current=m(:,1)*1000; voltage=m(:,2)*10; m2=[t current voltage]; a=m2(1,2); b=m2(2:40,2); if a>max(b); g=a; end for I=2:1024; for J=1:1024; for K=39+I; if K>1024; K=1024; end c=m2(I,2); d=m2(J:I-1,2); e=m2(I+1:K,2); if c>max(e)&&c>max(d); g=c; else end end end end plotyy(t,current,t,voltage) ylim([0,700]) ifの条件を満たしたときに、m2の2列目の値だけでなく条件を満たしたその行の3列全てのデータを抽出し、条件を満たした行だけの新たな行列を作りたいのですが、どのような命令を書けばよいでしょうか。 お手数をおかけしますが、ご教授よろしくお願いいたします。

  • matlabで複数条件のif文を行列計算で行うには?

    matlabで複数条件のif文を行列計算で行うには? matlabではfor文などは行列計算で回したほうが高速化できると聞きました。 for文でのやりかたはわかったのですが、複数条件でのif文ではどのように書けばよいのでしょうか? 自分のプログラムは以下のようなものです for i=1:100 for j=1:100 theta_kari=atan(abs(B(j,i))/abs(A(j,i))); if A(j,i)>=0&&B(j,i)>=0 theta(j,i)=theta_kari; elseif A(j,i)<0&&B(j,i)>=0 theta(j,i)=theta_kari+(pi/2); elseif A(j,i)<0&&B(j,i)<0 theta(j,i)=theta_kari+pi; elseif A(j,i)>=0&&B(j,i)<0 theta(j,i)=theta_kari+(pi/2*3); end end end よろしくお願いします

専門家に質問してみよう