• ベストアンサー

MATLABのプログラミングで

MATLABでプログラミングを行っているのですが、forを使い for trt=1:rety(1); xt2(trt,:)=xt1(trt):xt1(trt)+(x-1); yt2(trt,:)=yt1(trt):yt1(trt)+(x-1); end for t3t=1:re/ysuu torie(:,:,t33(:,t3t))=saweq(xt2(gjir1(trt),:),yt2(gjir1(trt),:),:); end この様な変数を作製しています。 上のアルゴリズムは a:b (a=1:10) (b=a+5) で複数の位置データを記録する物で、 下のアルゴリズムは画像データを重ね合わせる物です。 これらのアルゴリズムでforを使わずにより高速化できる方法があれば連絡をお願いします。

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

  • ベストアンサー
  • rabbit_cat
  • ベストアンサー率40% (829/2062)
回答No.2

xt1,yt1が rety(1)行、1列の縦ベクトルだとして、 xt2 = ones(rety(1),1)*(0:x-1) + xt1*ones(1,x); yt2 = ones(rety(1),1)*(0:x-1) + yt1*ones(1,x); とか。 もしかしたら早くならないかも。

その他の回答 (1)

  • sgwjn
  • ベストアンサー率70% (47/67)
回答No.1

このコードだと、やってやれないことは無いでしょうが難しいでしょうね。また、forを使わずに処理する必然性も感じられません。 MATLABで高速化のためにforを使用しないというのは有効な手段ですが、何でもかんでもforを無くせば良いというものでもないです。 このコードを見る限り、変数xt2、yt2、torieは初期化されていないようですので、ループ前にzeros関数で初期化すれば、ループ回数にもよりますがかなり高速になります。 既に初期化しているのであれば、MATLABを使用する限り処理速度についてはある程度我慢するしかないと思います。

関連するQ&A

  • MATLAB

    matlabで for x=1:10 for y=1:10 for z=1:10 f=2*x+3*y-4*z; end end end のようなプログラムで、最大のときのfの値と、そのときのx,y,zの値を表示させるにはどのように書けばいいでしょうか?

  • 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プログラミングをCのプログラミングに変換

    MATLABでよくやる以下のプログラミング方法を効率よくCでプログラムするにはどうすべきですか? a=[]; for i = 1:100 a_k = [1 2 3 4];<<-a_kは1行4列の行列です a = [a a_k];<<-特にこの部分 end よろしくお願いします。

  • MATLABのプログラミングについてご質問です

    MATLAB初心者です。 現在、以下の環境を使っています。 ------------------------------- OS:Windows XP MATLABのバージョン:R2007a ------------------------------- 以下の内容をプログラムでどう組み込めばよいのか分らないため、質問させて頂きました。 詳しい方、ご教授のほどお願いします。 (1)Windowsのペイントで、ドラッグ&ドロップすると    +----------+    |         |    +----------+  このように、点線で枠ができると思います。それをMATLABで表現する方法  (始点座標と終点座標はマウスで操作するため、座標は可変になります) (2)MATLAB-GUIに画像データ(sample.tif)を表示する方法 (3)MATLAB-GUIを表示した時に、表示位置を常にパソコンのモニター中央にする方法 (4)MATLAB-GUIで画面A, Bとある場合、画面Aの[次へ]ボタンを押すと画面Aを消して画面Bを表示する方法 長くて申し訳ございませんが、ご回答よろしくお願いします。

  • 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のプログラミングについてご質問ですが、 構造体配列を使った、二つの多項式を足すプログラムの作り方をご存じの方いらっしゃいますか? (コマンドのpolyaddを構造体配列で作ったプログラム) 例、 a=struct('exponent',{1,2,3},'coeff',{0,1,0}) b=struct('exponent',{1,2,3},'coeff',{1,0,1,}) でプログラム(a,b)を発動すると answer= 1x3 struct array with fields: exponent coeff となり、workspaceにある答えが昇順表示になるプログラムです。 よろしくお願いします。

  • matlabのプログラミング

    MATLABのプログラミングについてご質問ですが、 構造体配列を使った、二つの多項式を足すプログラムの作り方をご存じの方いらっしゃいますか? (コマンドのpolyaddを構造体配列で作ったプログラム) 例、 a=struct('exponent',{1,2,3},'coeff',{0,1,0}) b=struct('exponent',{1,2,3},'coeff',{1,0,1,}) でプログラム(a,b)を発動すると answer= 1x3 struct array with fields: exponent coeff となり、workspaceにある答えが昇順表示になるプログラムです。 よろしくお願いします。

  • MATLABについての質問です。

    大学の研究していてMATLABでわからないところがあるのでぜひ教えて頂けたらと思っています。 よろしくお願い致します。 現在任意の多角形障害物を設置し,それらを回避する折れ線経路を全部求めるプログラムを作っているのですがどのように作ればいいかわかりません。 今は始点と終点を決めてクリックした所をつないでいくプログラムができたのですが問題文に沿ってできていません。 このプログラム後はダイクストラの方法で最短折れ線経路を求めるので それを含めてよろしくお願い致します。 clear all; 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 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 end for D=init:final [x,y] = ginput if 0<=x(:,:)&x(:,:)<=1&0<=y(:,:)&y(:,:)<=1 plot([pb(1,1),x',pb(2,1)],[pb(1,2),y',pb(2,2)],'-*');hold on node{D}=[[pb(1,1),x',pb(2,1)],[pb(1,2),y',pb(2,2)]] B{D} = sum(node{D}) else break end end for E=init:D-1 B{E} end

  • 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を用いてあるデータを Aexp(B*t) (tは時間、AとBはともにパラメータ) で近似したいのですがやり方がわかりません。 よろしくお願いします。