• 締切済み

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

みんなの回答

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

A No1のKulesです。 なんだかなあ…ここまで何も反映されていないと逆にすがすがしくなってしまいますね。 小言言ってもまた反映されないんだろうなあ… まず、やっぱりコメントが少ないですよね。このプログラムをほぼノーヒントで相手に読み解かせる気ですか? また、途中からおそらく違う方が書いてますよね、このプログラム。コメントが突然英語になってますし、 変数の付け方、スペースの取り方も変わっているようです。関数dicstraってなんですか? まあ小言ばかり言ってても何も進まないので補足要求です。 >ここまで書いてみましたがうまくいきません。 というのは、どのように「うまくいかない」のでしょうか? (1)エラーが出て動かない 今Matlabが使える環境ではないのでチェックが出来ないのですが、まあ関数dicstraがどこにもいなければまず間違いなく動かないでしょうね。 (2)エラーは出ないが、想定通りの結果が出ていない これに関しては具体的にどこがどのようにうまく動かないのか説明して下さい。少なくともこのプログラムを一行一行読み解いていき、各場所での動作を推測した上でなおかつどこで考え方が間違っているのかをノーヒントで探したくはありません。(そもそもうまく動いていないということはプログラムを組む上でどこかの考え方が間違ってるわけで、コメントがないことにはそれを探すのはかなり困難です。コメントさえあれば、「コメントに書かれていることとプログラムで実行していることが違う」ということである程度の判断は可能ですけどね) (3)基本的には想定通り動いているが、変な入力をすると上手く動かなくなる これも具体的な症状や入力を書いていただかないと何とも言い難いです。 (4)例外処理などもうまく走るが、もっとスマートに書きたい 多分原形をとどめないほど書き変えることになりそうですね。 まずこの補足に正確に答えれば、私ももう少し有益なことが書けるでしょうし、他の方からもっと有効な回答を書いて下さると思います。

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

前回回答したKulesです。 http://okwave.jp/qa/q7146569.html 先にお小言をいくつか。 前回私が >で、仮にもプログラム載せるのであればコメントぐらい入れて欲しいなあ…と思ってみたり。 と書いたのを覚えていますか? まあおそらくそれを踏まえて何か所かコメントを入れたのだと思いますが、全く不足です。 前回と比べどこで何をしようとしているかは大まかにわかるようになりましたが、 せめて変数の素性(それぞれの変数が何を表しているかなど)も記載しておいてほしいところです。 人に読んでもらい、理解してもらうためには。 よっぽど教科書通りのプログラムの書き方をしない限り、コードには人それぞれの癖のようなものが出ます。 私には私の癖が、あなたにはあなたの癖が。私が、私の癖であなたの書いたコードを読んでいる限り、どうしても理解は遅れますので。 もう一つ。 前回私は、 「で、それより問題なのはこのプログラムがきちんと動いているにも関わらずこの質問を >MATLABについての質問です。 と思っていることでしょうか。」 と書きました。 これの意味するところは ・プログラムは自分の思う通り動いている限り、自分で使う分には問題ないのでそのプログラムを質問本文に載せることに何の意味もない。(例外処理をどうするかとか、想定外の処理をした時にどのように抜けるかとか、どうやったらもっとスマートに書けるのか、などを聞きたい場合は別です) ・考え方は一つでも、それをプログラムで実行する方法はたくさんある。事実、あなたが現状までで作ったものを私が作る場合、全く違う書き方にするでしょう。 ということで、やはりこれはMatlabの問題ではありません。まずダイクストラ法が何かを調べ、それを無理やりの方法でもいいからプログラムに起こしてみる。それで上手く動かない時、初めてMatlabの問題になります。 まずそれがわかってない限り「課題の丸投げだな」とか「自分で何にも考えていないな」と思われても仕方ありません。特に前回指摘があった分なおさら。 お小言終わります。 ダイクストラ法とは何ぞや?というのを調べてみましょう。普段はWikipediaに頼るんですが、私の頭ではよく理解できなかったので他を探してみます。 例えば http://www.ss.cs.meiji.ac.jp/CCP024.html とか。 これを見ると、ダイクストラ法とは「ある1点から別の1点までの最短経路を求める方法」であり、これを求めるには ・頂点の情報と、そこからつながれている頂点の情報 ・頂点間の距離 ・ゴールから各点までの距離 これだけの情報が必要だということがわかります。 ということは、これらの情報を何らかの形で変数として持っておく必要がありますね。 上から順番にP,Q,Rとします。 P:つながれている頂点のペアを集めた行列。辺の数×2の行列にしておけばよいでしょう。 Q:頂点間を結ぶ辺の長さ。辺の数×1の行列にして、なおかつAと同じ順番にしておくとよさそうですね。 R:ゴールからの最短距離。点の数(ゴールも含む)×1の行列にして、最初はinfとかnanで初期化しておくとよいでしょう。 S:経路上、どの点からどの点につなげるか。点の数×1の行列にします。nanで初期化するのがいいですかね。 T:使用済みかどうかを示す。点の数×1の行列で、logicalで持っておくのがいいかも知れません。最初はfalseで初期化でしょうか。 以下の説明は、上で紹介したページの例を参考に考えていきます。 そうすると、 P:辺は8本あるので、8×2の行列 Q:同じく辺は8本なので、8×1の行列 R:点は5つなので、5×1の行列。順番はどうでもいいですが、説明しやすくするために R=[EA間の最短経路;EB間の最短経路;EC間の最短経路;ED間の最短経路;EE間の最短経路];として、 R=[inf;inf;inf;inf;0];と初期化しておきましょう。 Pをどういう形で持つかは難しいですが、簡単にA=1,B=2,…,E=5として、AとBがつながってることを[…;1,2;…]という形で表すことにしましょうか。 ここからがプログラム本体です。 ・Pの中から、5(つまりE)が含まれている行を探す ・上で選んだ行のEじゃない方(この場合B,D)を調べ、対応する長さ(この場合1と8)をRに入れておく。結果、R=[inf;1;inf;8;0]となる。また、BとDはEから来たので、S=[nan;E;nan;E;nan];となります。さらに、TのEに対応する部分をfalseにします。 ・Rがinfでないもののうち最小のものを基準に選びます。このページではBを選択しているのでBにしましょう。PからBが含まれている行を探し、その行の中でBじゃない方(この場合A,C,D)を調べ、対応する長さ(この場合2、5、6)をRのBに対応する部分の値(1)に足します。すでに値が入っている時は両者を比較し、小さい方を選択します。R=[3;1;6;7;0]となります。A,C,Dは共にBから来た場合が最短なのでSの対応する部分にBを入れ、Bは使用済みなのでTの対応する部分をfalseにします。 ・同様に、Rがinfでなく、なおかつTがtrueのものから最小のものを基準にして上と同様の作業を行います。 ・Tが全てfalseになれば終了です。 ・スタートとゴールが明示されているのであれば、Sに記憶された値を手掛かりに最短経路を求めます。 ここまで考えた上で(ここまででもずいぶんMatlabの表現はしていますが、使わずに書こうと思えば書けます)、それをプログラムに起こしていく中で「思った通りの動きをしない」「エラーが出る」「もっと早く動くプログラムにしたい」「もっとシンプルに書きたい」などがあればそこで初めて「Matlabの質問」となります。 はじめ厳しいことを書いてしまいすみません。参考になれば幸いです。

syounan101
質問者

補足

ここまで書いてみましたがうまくいきません。是非教えていただいてもよろしいでしょうか。よろしくお願い致します。 clear all; close all; clc; init=1; final=1000; figure(1) h = 0; for loop=init:final [x,y] = ginput A=[x,y] if 0<=x(:,:)&x(:,:)<=1&0<=y(:,:)&y(:,:)<=1 h = h+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) 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=1:size(Pall,1) k=k+1; path(k,:) = [Pall(i,:),Pall(j,:)]; end end % path=[Pall,Pall] % 交差判定(1) 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 end end if cflas==1 X=[path(j,1),path(j,3)]; Y=[path(j,2),path(j,4)]; S{j}=[X,Y] plot(X,Y,'-');hold on if S{j}(1,1) == S{j}(1,2) S{j} =[0,0,0,0,] end else S{j}=[0,0,0,0] for i = 1:length(Pall); text(Pall(i,1),Pall(i,2),num2str(i));hold on end end if S{j} ==0 S{j} = inf else S{j} = 1 end end for C=init:loop-1 L{C}=B{C}*0.5; xm1=sum(B{C}(:,1))/length(B{C}(:,1)); ym1=sum(B{C}(:,2))/length(B{C}(:,2)); xm2=sum(L{C}(:,1))/length(L{C}(:,1)); ym2=sum(L{C}(:,2))/length(L{C}(:,2)); L{C}(:,1)=L{C}(:,1)+(xm1-xm2); L{C}(:,2)=L{C}(:,2)+(ym1-ym2); fill(L{C}(:,1),L{C}(:,2),'g');hold on axis([0,1,0,1]); end %すべてのコスト arricade = length(S); for i=1:barricade; X1=path(i,1); X2=path(i,2); Y1=path(i,3); Y2=path(i,4); distance(:,i) = [sqrt((X2-X1)^2+(Y2-Y1)^2)]; end X = [Pall(:,1)] Y = [Pall(:,2)] X1=rot90(X); Y1=rot90(Y); for i = 1:length(Pall) plot(X(i),Y(i),'.');hold on text(X(i),Y(i),num2str(i)); for j = 1:length(Pall) distance =sqrt((X(i) - X(j))^2 + (Y(i) - Y(j))^2); A=distance if distance<= 0.5 matrix(i, j) = 1; plot([X(i) X(j)], [Y(i) Y(j)], 'LineStyle','-'); else matrix(i,j) = inf; end end end axis([0,1,0,1]); activeNodes = []; for i = 1:length(Pall), % initialize the farthest node to be itself; farthestPreviousHop(i) = i; % used to compute the RTS/CTS range; farthestNextHop(i) = i; end; [path, totalCost, farthestPreviousHop, farthestNextHop] = dicstra(length(Pall),S, 1, length(Pall), farthestPreviousHop, farthestNextHop); path totalCost if length(path) ~= 0 for i = 1:(length(path)-1) line([X(path(i)) X(path(i+1))], [Y(path(i)) Y(path(i+1))], 'Color','r','LineWidth', 0.50, 'LineStyle', '-'); line([netXloc(path(i)) netXloc(path(i+1))], [netYloc(path(i)) netYloc(path(i+1))], 'Color','r','LineWidth', 0.50, 'LineStyle', '-.'); end; end; hold off; return;

関連するQ&A

  • 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によるラグランジェ補間

    下記1~2行目の8点が与えられていて、ラグランジェ補間を行う問題です。 下記のプログラムを自分で組んだものの、おかしな値が返ってきます。 どこが間違っているのか全く検討がつかないのでわかる方がいらっしゃったらどうかご教授お願いします。 x=[0,1.2,2.1,3.5,4.8,6.7,8.5,9.7]; y=[0.4,1.3,2.0,3.1,4.0,5.2,6.0,6.1]; x0=(0:0.001:15); h=0.0001; a=0; j=1; while a<=15 f(j)=0; for i=1:8 b=(lag(x(i)+h)-lag(x(i)))/h; f(j)=f(j)+lag(a)*y(i)/(b*(a-x(i))); end a=a+0.001; j=j+1; end plot(x0,f) [lag.m] function f=lag(x) g=1; z=[0,1.2,2.1,3.5,4.8,6.7,8.5,9.7]; for i=1:1:8 if x ~= z(i) g = g*(x-z(i)); end end f=g;

  • C言語のプログラムで質問です。

    C言語のプログラムで質問です。 下のプログラム(最小二乗法の計算)を実行したところ -1.#IND00 というエラーが出てしまいます。 どこを直せばいいのでしょうか、教えてください。 #include <stdio.h> #include <math.h> /* gauss33.c */ #define N 3 main(){ double A[N][N],Aa[N][N]; double b[N],x[N], bb[N], e[N]; int n=N; int i, j, k; double akk, aik, s; double y[N]; double xx,yy; for(i=0;i<n;i++){ /*変数の初期化*/ x[i]=y[i]=0; for(j=0;j<n;j++) A[i][j]=0; } for(i=0;i<5;i++){ /*データ点は5点*/ printf("\n(x,y)="); scanf("%lf,%lf",&xx,&yy); A[0][0]+=xx*xx*xx*xx; /*Σx^4*/ A[0][1]+=xx*xx*xx; /*Σx^3*/ A[0][2]+=xx*xx; /*Σx^2*/ A[0][1]=A[1][0]; A[0][2]=A[1][1]=A[2][0]; A[1][2]+=xx; /*Σx*/ A[1][2]=A[2][1]; A[2][2]=n; y[0]+=xx*xx*yy; /*Σx^2y*/ y[1]+=xx*yy; /*Σxy*/ y[2]+=yy; /*Σy*/ } /* save original coefficients */ for(i=0; i<n; i++){ for(j=0; j<n; j++){ Aa[i][j]=A[i][j]; } bb[i]=b[i]; } /* forward operation */ for(k=0; k<n-1; k++){ akk=1/A[k][k]; for (i=k+1; i<n; i++){ aik=-A[i][k]*akk; for (j=k+1; j<n; j++){ A[i][j]+=aik*A[k][j]; } b[i]+=aik*b[k]; } for(j=k+1; j<n; j++){ A[k][j]*=akk; } b[k]*=akk; } /* backward operation */ x[n-1]=b[n-1]/A[n-1][n-1]; for(k=n-2; k>=0; k--){ s=0.0; for (j=k+1; j<n; j++){ s+=A[k][j]*x[j]; } x[k]=b[k]-s; } /* chek */ for(i=0; i<n; i++){ s=0.0; for(j=0; j<n; j++){ s+=Aa[i][j]*x[j];} e[i]=s-bb[i]; printf("\nx(%d)=%f error=%f\n",i, x[i], e[i]); } }

  • 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の値を表示させるにはどのように書けばいいでしょうか?

  • C言語についての質問です。

    C言語についての質問です。 このプログラムの前半にある A[N][N]={{1,0,0},{0,1,0},{0,0,1}} b[N]={4,5,3} という行列の成分をキーボードから入力するようにする にはどうすればいいでしょうか。 for や scanf や printf を使って、変えてくれないでしょうか。 #include <stdio.h> #include <math.h> /* gauss33.c */ #define N 3 main(){ double A[N][N]={{1,0,0},{0,1,0},{0,0,1}}; double b[N]={4,5,3}; double Aa[N][N]; double x[N], bb[N], e[N]; int n=N; int i, j, k; double akk, aik, s; /* input original coefficients */ /* save original coefficients */ for(i=0; i<n; i++){ for(j=0; j<n; j++){ Aa[i][j]=A[i][j]; } bb[i]=b[i]; } /* forward operation */ for(k=0; k<n-1; k++){ akk=1/A[k][k]; for (i=k+1; i<n; i++){ aik=-A[i][k]*akk; for (j=k+1; j<n; j++){ A[i][j]+=aik*A[k][j]; } b[i]+=aik*b[k]; } for(j=k+1; j<n; j++){ A[k][j]*=akk; } b[k]*=akk; } /* backward operation */ x[n-1]=b[n-1]/A[n-1][n-1]; for(k=n-2; k>=0; k--){ s=0.0; for (j=k+1; j<n; j++){ s+=A[k][j]*x[j]; } x[k]=b[k]-s; } /* chek */ for(i=0; i<n; i++){ s=0.0; for(j=0; j<n; j++){ s+=Aa[i][j]*x[j];} e[i]=s-bb[i]; printf("\nx(%d)=%f error=%f\n",i, x[i], e[i]); } }

  • C言語のプログラムで質問です。

    C言語のプログラムで質問です。 これは、2元1次連立方程式の解を求めるプログラムです。 このプログラムを (1)3元1次連立方程式の解を求めるプログラムにする (2)係数行列、定数行列(6、7行目)をキーボードからの入力にする。 ようにしたいのですが、どうすればよいでしょうか。 前半の部分を変えれば良いようなのですが分かりません。教えてください。 #include <stdio.h> #include <math.h> /* gauss22.c */ #define N 2 main(){ double A[N][N]={1.,4.,3.,2.}, Aa[N][N]; /*簡単のため係数行列を予め指定*/ double b[N]={4.,5.}, x[N], bb[N], e[N]; /*簡単のため定数ベクトルを予め指定*/ int n=2; int i, j, k; double akk, aik, s; /* save original coefficients */ for (i=0; i<n; i++){ for (j=0; j<n; j++){ Aa[i][j]=A[i][j]; } bb[i]=b[i]; } /* forward operation */ for (k=0; k<n-1; k++){ akk=1/A[k][k]; for (i=k+1; i<n; i++){ aik=-A[i][k]*akk; for (j=k+1; j<n; j++){ A[i][j]+=aik*A[k][j]; } b[i]+=aik*b[k]; } for (j=k+1; j<n; j++){ A[k][j]*=akk; } b[k]*=akk; } /* backward operation */ x[n-1]=b[n-1]/A[n-1][n-1]; for (k=n-2; k>=0; k--){ s=0.0; for (j=k+1; j<n; j++){ s+=A[k][j]*x[j]; } x[k]=b[k]-s; } /* chek */ for (i=0; i<n; i++){ s=0.0; for (j=0; j<n; j++){ s+=Aa[i][j]*x[j];} e[i]=s-bb[i]; printf("x(%d)=%f error=%f?n",i, x[i], e[i]); } }

  • c 言語 B tree

    C言語で B-treeを実装するプログラムを書きました。 まだtreeに挿入する関数しか書いておりませんが。。 まず空の根を作ってからそこにどんどん要素を挿入していくのですが、どうも要素が 挿入されていないように思えます。 どこがいけないのか分かる方いらっしゃいませんか? よろしくお願いします。 #include <stdio.h> #define T 10 struct b_tree{ int key[2*T-1]; struct b_tree *node[2*T]; int size; int leaf;//この節点が葉であったら1とする }; void BTreeCreate(void); void BTreeSplitChild(struct b_tree x,int i,struct b_tree y); void BTreeInsert(struct b_tree t,int k); void BTreeInsertNonfull(struct b_tree x,int k); void PrintBtree(struct b_tree x); struct b_tree root; int main (int argc, const char * argv[]) { // insert code here... /*int t;*/ char command; int key; BTreeCreate(); /*scanf("%d",&t);*/ while (1) { scanf("%c %d",&command,&key); if (command=='E') break; if(command=='I') BTreeInsert(root,key);//木にkeyを挿入 } PrintBtree(root); //木を表示 return 0; } void BTreeCreate(void){//空のB-木の生成 struct b_tree x; x.leaf=1; x.size=0; root=x; } void BTreeSplitChild(struct b_tree x,int i,struct b_tree y){ /*B-木における節点の分割をする節点xのi番目の枝の先にある節点yが飽和であった 場合にyをyの中央値で分ける。yの中央値はxの新たなkeyとなりxの枝数は1つ増える*/ int j; struct b_tree z; z.leaf=y.leaf; //zが葉であるかどうかはyが葉であるかどうかに依る z.size=T-1; //また新しくできるxの子zは最小数のkey(T-1)を持たせる for (j=1; j<= T-1; j++) { z.key[j]=y.key[j+1]; //yの中央値よりおおきい値(T-1個)をzに渡す } if(y.leaf==0){ //またyが個をもつ場合は枝もzに渡す for (j=1; j<=T; j++) z.node[j]=y.node[T+j]; } y.size=T-1; //そしてyのサイズも中央値とzに渡した分小さくなる for (j= x.size+1; j>=i+1; j--) { //xにyの中央値を渡すのでx枝の右半分を1つずつ右へずらす x.node[j+1]=x.node[j]; } x.node[i+1]=&z; //i+1番目の枝に新たな子zのポインタを与える for (j=x.size; j>=i; j--) { //値も右へずらす x.key[j+1]=x.key[j]; } x.key[i]=y.key[T]; //xのi番目の値をyの中央値とする。 x.size=x.size+1; //xは1サイズup } void BTreeInsert(struct b_tree t,int k){ int Tsub=T; //条件部にTが使えなかったのでTsubに退避 struct b_tree r,s; r=t; if (r.size == Tsub) { /*根が飽和だった場合を考える新たな親を必要とするため それをsとする。するとsは葉ではなく、sizeは0, そして元々の根rのポインタを与える*/ s.leaf=0; s.size=0; s.node[1]=&r; root=s; BTreeSplitChild(s,1,r); BTreeInsertNonfull(r,k); } else { BTreeInsertNonfull(r,k); } } void BTreeInsertNonfull(struct b_tree x,int k){ /*未飽和の節点xにkを挿入しようと考える。*/ int i; int Tsub=T; if (x.leaf==1) { /*もし、xが葉であれば大小関係を考えて挿入。その際他のkey を右へ1つずつずらす。またxのサイズを1up*/ while (i>=1 && k<x.key[i]) { x.key[i+1]=x.key[i]; i--; } x.key[i+1]=k; x.size++; } else { /*もしxが葉でなければどこの枝をたどればいいのか考える*/ while (i>=1 && k<x.key[i]) { i--; } i++; if ((*x.node[i]).size == 2*Tsub-1) { /*たどる枝の先が飽和であった場合分割する*/ BTreeSplitChild(x, i, *x.node[i]); if (k > x.key[i]) { i++; } } BTreeInsertNonfull(*x.node[i],k);//枝をたどる } } void PrintBtree(struct b_tree x){ printf("abc"); printf("%d",x.leaf);//実行するとleafが1のままなので、数が挿入されていない? int i,l;        if(x.leaf==1){ for (i=1; i<=x.size; i++) { printf("%d def",x.key[i]); } if(l==0)printf("\n"); }else { for (i=1; i<=x.size; i++) { printf("%d ghi",x.key[i]); } if(l==0)printf("\n"); l++; printf(" jkl"); for (i=1; i <= x.size+1; i++) { PrintBtree(*x.node[i]); } } printf("\n"); }

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

    ガウスの消去法による解の求め方をプログラムしたいのですが、上手くいかなかったので質問しました。以下のプログラムから実行はできるのですが、解が求められていませんでした。 どこを変えればきちんとできるのでしょうか、回答お願いします。 var A=[[1,-1,1],[1,2,0],[2,0,3]],b=[5,1,9]; WScript.Echo("ガウスの消去法の解:\n"+Gauss(A,b)); function Gauss(A,b) { var s,x=new Array(A.length),M=new Array(A.length); for(var i=k+1;i<A.length-1;k++) { for(var i=k+1;i<A.length;i++) { M[i]=new Array(A.length); M[i][k]=(A[i][k])/(A[k][k]); for(var j=k+1;j<A.length ;j++) A[i][j]=A[i][j]-(M[i][k]*A[k][j]); b[i]=b[i]-(M[i][k]*b[k]); } } for(var i=A.lengh-1;i>=0;i--) { s=0; for(var k=i+1;k<A.length;k++) s+=A[i][k]*x[k]; x[i]=(1/A[i][i])*(b[i]-s); } return x; }

  • 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列全てのデータを抽出し、条件を満たした行だけの新たな行列を作りたいのですが、どのような命令を書けばよいでしょうか。 お手数をおかけしますが、ご教授よろしくお願いいたします。

  • LU分解を利用した逆行列のプログラム(Java)

    LU分解を利用した逆行列のプログラムが作れません… というか、作ったのですが実行するとエラーが出てしまいます(´Д`;) どこをどう直せばいいか、もしくはこのようにプログラムした方が効率がよい などのアドバイスどなたか下さい double a[][]={{2,5,4}, {2,3,-1}, {6,9,28}}; int N=a.length; double[][] s=new double[N][N]; for(int k=0; k<a[0].length-1; k++){ for(int i=k+1; i<N; i++){ s[i][k]=a[i][k]/a[k][k]; a[i][k]=s[i][k]; for(int j=k+1; j<N; j++){ a[i][j] -= s[i][k] * a[k][j]; } } } double[][] y=new double[N][N]; double[][] X=new double[N][N]; double[][] e=new double[N][N]; for(int i=0;i<N;i++){ for(int j=0;j<N;j++){ if(i==j){ e[i][j]=1; }else{ e[i][j]=0; } } } for(int i=0;i<N;i++){ y[1][i]=e[1][i]; for(int k=2;k<=N;k++){ for(int j=1;j<=N;j++){ y[k][i]=e[k][i]-s[k][j]*y[j][i]; } } X[N][i]=y[N][i]/a[N][N]; for(int k=N-1;k>=1;k--){ for(int j=k+1;j<=N;j++){ X[k][j]=(y[k][j]-s[k][j]*X[j][i])/a[k][k]; } } } for(int i=0;i<N;i++){ for(int j=0;j<N;j++){ System.out.printf(" %6.5f ", X[i][j] ); } System.out.println(""); }