MATLABアップグレード問題の修正方法とは?

このQ&Aのポイント
  • MATLAB初心者の方がMATLAB6.1から7.01にアップグレードした際に、特定のコードが動かないエラーが発生します。
  • 原因はMATLABのバージョンアップによるセル配列の連結方法の変更です。
  • 修正方法は、1回目のループの場合は連結しないようにし、2回目以降のループでは連結するように修正することです。
回答を見る
  • ベストアンサー

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回目以降は連結するように修正しています。 このように修正しても意図通り動いていません。 修正方法は間違っていますか。

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

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

間違っていると思います。 Conversion to cell from char is not possible というのは、 「セル配列と文字列は連結できねーんだよ」 というエラーです。 outはセル配列ですが、 helper([d '/' files{i}], pat(2:end))が文字列を返しているため、 いわば[{},'ABC']みたいな配列を作る形になってしまっているのだと思います。 これってもともとできるんですかね?意外と出来るのかも… もしこれが6.1から7.01に移行する時に出来なくなってしまったってことでしょうか? おそらくループ数のサイズを持ったセル配列を作ろうとしているのだと思いますが、 変更後の動作を見ると、ループの前にout={};としたのが意味なくなってます(M-Lintが警告出しませんか?ifの中だから警告出さないのかな?) 現在の動作は ・outを空のセル配列にする ・i=1でoutにhelper([d '/' files{i}], pat(2:end))を代入する(この時点でhelper([d '/' files{i}], pat(2:end))が文字列を返す関数なのであれば、outは文字列になります) ・iが2以上の時ouを連結する という動作なので、おそらく最終的にはoutはただの長い文字列になります。 それならループに入る前にfiel数×1のセル配列を作っておいて、 ループごとにout{i}=helper([d '/' files{i}], pat(2:end)); にしたらいいと思われます。 参考になれば幸いです。

mega55_531-mlb
質問者

お礼

「Kules」様、ご返信ありがとうございます。 ご指摘の方法で解決できました。 ループに入る前にfiel数×1のセル配列を作っておいて、 ループごとにout{i}=helper([d '/' files{i}], pat(2:end)); ※私が6.1で動作確認をしたわけではありませんが、動作実績はあったと聞いています。 大変助かりました。 ありがとうございました。

関連するQ&A

  • 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について質問です

    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 よろしくお願いします!!

  • 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の計算精度

    いま,  A=[0.803, -0.803, 1.2124, 0.803, -0.803, -0.803, 1.2124, 0.803]; とします. このとき,次の2通りの演算をします. (i) a=0; for I=1:8  if( A(I)>=0 )   a=a+A(I)*0.25;  else   a=a+A(I)*0.75;  end end (ii) Bi=[0.25, 0.75, 0.25, 0.25, 0.75, 0.75, 0.25, 0.25]; b=sum(Bi.*A); (i)と(ii)によって得られる和の値をMATLABのコマンド上で表示すると, 同じ値として表示されるのですが,a-b と計算すると,0 ではなく, 8.04e-15のようになります.(現環境ではMATLABが使えないので,確認できませんが,もっと大きいデータでやったとき場合には,上記のように誤差が生じました). 困っているのは,現在組んでいるプログラムでは計算した値の正負によって 異なった計算をする必要があり,計算精度が非常に重要になってきます. そのため計算結果が例えば +1.4e-15となるか -6.4e-16 となるかによってその後の計算結果が大きく変わってしまいます. MATLABでは,上記(i)(ii)のような誤差が生じるためか,+1.4e-15となってほしいところが,なぜか -6.4e-16となってしまいうまくプログラムが動きません. MATLABでは,for文によって和をとるのではなく,一回でまとめて計算しなければ誤差が生じるのでしょうか? また,MATLABで計算精度を変更できないのでしょうか? (formatコマンドによって,「format short g」「format double g」としましたが有効な小数点が増減するだけで結果は同じでした.) よりよい精度で計算するにはどうしたらよいのでしょうか? 回答よろしくお願いします.

  • matlabにおける行列の格納

    matlabにおける質問です。 (matlabもとよりプラグラミング初心者です。) 例えばx=[1 2 3;3 4 5]となっているとき for i=1:10 y(1)=i*x end のように、しても、y(1)とxの次元が合わないというエラーが 出ると思います 行列を、このように「i番目」といった添え字のついた変数に 代入するには、どうしたらよいのでしょうか。 初心者のため大変初歩的なことですが、どなたかご教授ください。 とても焦っております。。。

  • MATLABの質問です。

    MATLABについての質問です。 大学の研究していてMATLABでわからないところがあるのでぜひ教えて頂けたらと思っています。 よろしくお願い致します。 現在任意の多角形障害物を設置し,それらを回避する折れ線経路を全部求めるところまでできています。その後、全経路からダイクストラの方法で最短折れ線経路を求めたいのですがどのようにプログラムを持っていけばいいか分からず手詰まりしました。 ぜひご指導いただけますでしょうか。 よろしくお願いいたします。 プログラムは動きます。 close all; clc; init=1; final=1000; %図形座標取得 figure(1) for loop=init:final [x,y] = ginput A=[x,y] if 0<=x(:,:)&x(:,:)<=1&0<=y(:,:)&y(:,:)<=1 B{loop} =A else break end end % size(B{i},1) figure(2) for C=init:loop-1 B{C} fill(B{C}(:,1),B{C}(:,2),'g');hold on axis([0,1,0,1]); end [x,y] = ginput pb=[x,y] figure(3) for C=init:loop-1 fill(B{C}(:,1),B{C}(:,2),'g');hold on axis([0,1,0,1]); plot(pb(:,1),pb(:,2),'o');hold on axis([0,1,0,1]); end %図形の辺 k=0; for i=1:loop-1 for p=1:size(B{i},1) for q=p+1:size(B{i},1) k=k+1; obst(k,:) = [B{i}(p,:),B{i}(q,:)]; end end end Pall = pb(1, :); Pall = [Pall; cat(1, B{:})]; Pall = [Pall; pb(2, :)]; %全経路 k=0 for i=1:size(Pall,1) for j=i+1:size(Pall,1) k=k+1; path(k,:) = [Pall(i,:),Pall(j,:)]; point{k}=[i,j]; end end % 交差判定 H=0 for j=1:size(path,1) cflas=1 for i=1:size(obst,1) y1=((obst(i,1)-obst(i,3))*(path(j,2)-obst(i,2))+(obst(i,2)-obst(i,4))*(obst(i,1)-path(j,1))) y2=((obst(i,1)-obst(i,3))*(path(j,4)-obst(i,2))+(obst(i,2)-obst(i,4))*(obst(i,1)-path(j,3))) y3=((path(j,1)-path(j,3))*(obst(i,2)-path(j,2))+(path(j,2)-path(j,4))*(path(j,1)-obst(i,1))) y4=((path(j,1)-path(j,3))*(obst(i,4)-path(j,2))+(path(j,2)-path(j,4))*(path(j,1)-obst(i,3))) Y1=y1*y2 Y2=y3*y4 if Y1<0&&Y2<0 H=H+1 cflas=0 S{j}=[0,0,0,0] S1{j}=[0,0,0,0] end end if cflas==1 X=[path(j,1),path(j,3)]; Y=[path(j,2),path(j,4)]; Xa=[path(j,1),path(j,2)]; Yb=[path(j,3),path(j,4)]; S{j}=[X,Y] S1{j}=[Xa,Yb] plot(X,Y,'-');hold on end end barricade = length(B{1,1}); M=zeros %コストを計算 for k = 1:size(path,1) X1=S{k}(1,1); X2=S{k}(1,3); Y1=S{k}(1,2); Y2=S{k}(1,4); cost{k}=sqrt((X2-X1)^2+(Y2-Y1)^2) M(point{k}(1), point{k}(2) )=cost{k} % if cost{i}==0 % cost{i}=10 % end end M' g=cost{1} for j=1:size(obst,1)+1 if(cost{j}>cost{j+1}) g= cost{j+1} end end

  • 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 ベクトル化(functionの繰り返

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

  • MATLABでの行列の全要素の和

    MATLABでの行列の全要素の和を計算するのに下の例のようにfor文を使うのとsum関数を使うのとで結果が違います。何故ですか? 計算結果の差をとってみると極々微小な差が生じてしまいます(e-10位)。 シミュレーションの中でこのような処理を行っているのでより正確な方が知りたいです。 例 A=rand(10); plus=0; sum=0; for i=1:10  for j=1:10   plus=plus+A(i,j);  end end sum=sum(A(:));

  • 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;

専門家に質問してみよう