MATLABの画像処理に関する質問

このQ&Aのポイント
  • MATLABを使用して画像の差分を取得し、色付きの差分画像を生成するプログラムを作成しました。
  • 作成したプログラムでは、2つの画像の差分を計算し、しきい値以下の値を持つピクセルを0に設定し、しきい値以上の値を持つピクセルを色付けしています。
  • また、複数の差分画像を一つの大きな画像にまとめています。
回答を見る
  • ベストアンサー

MATLABの質問

a = imread('AM100-1.png'); b = imread('AM100-2.png'); a = im2uint16(a); b = im2uint16(b); c=b-a; c2=a-b; d=c/10; d2=c2/10; p1=a+d; P1=p1-d2; p2=P1+d; P2=p2-d2; p3=P2+d; P3=p3-d2; p4=P3+d; P4=p4-d2; p5=P4+d; P5=p5-d2; PP1 = label2rgb(P1, @jet); PP2 = label2rgb(P2, @jet); PP3 = label2rgb(P3, @jet); PP4 = label2rgb(P4, @jet); PP5 = label2rgb(P5, @jet); [nRows nCols] = size(P1); for iCol = 1:nCols for iRow = 1:nRows if P1(iRow,iCol)<17000; PP1(iRow,iCol,:)=0; if P2(iRow,iCol)<17000; PP2(iRow,iCol,:)=0; if P3(iRow,iCol)<17000; PP3(iRow,iCol,:)=0; if P4(iRow,iCol)<17000; PP4(iRow,iCol,:)=0; if P5(iRow,iCol)<17000; PP5(iRow,iCol,:)=0; end end end end end end end A = cat(4,PP1,PP2,PP3,PP4,PP5); 初心者ながら上のようなプログラムを作ったんですが、うまくまとめられないでしょうか?

  • U-GE
  • お礼率100% (7/7)

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

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

#2です。 > P1が17000以上であっても、同座標のP2~P5が17000未満ならデータを0にしたい やっぱりそうですよね。 質問にあるコードにインデントを付けると、 for iCol = 1:nCols   for iRow = 1:nRows     if P1(iRow,iCol)<17000;       PP1(iRow,iCol,:)=0;       if P2(iRow,iCol)<17000;         PP2(iRow,iCol,:)=0;         if P3(iRow,iCol)<17000;           PP3(iRow,iCol,:)=0;           if P4(iRow,iCol)<17000;             PP4(iRow,iCol,:)=0;             if P5(iRow,iCol)<17000;               PP5(iRow,iCol,:)=0;             end           end         end       end     end   end end となり、P5はP1~P4が成立しない限り更新できなくなっていますから。 では、それも踏まえて3例ほど提示します。 a = imread('AM100-1.png'); b = imread('AM100-2.png'); a = im2uint16(a); b = im2uint16(b); 以上は共通部分とし、 ■ 行数重視 N = 5 d = (b - a) / 10; d2 = (a - b) / 10; A = zeros(size(a, 1), size(a, 2), 3, N); for i = 1:N   P = (a + i * d) - i * d2;   A(;, ;, ;, i) = (17000 <= repmat(P, [1, 1, 3])) .* label2rgb(P, @jet); end ■ 速度重視 d = (b - a) / 10; d2 = (a - b) / 10; P1 = (a + d) - d2; P2 = (P1 + d) - d2; P3 = (P2 + d) - d2; P4 = (P3 + d) - d2; P5 = (P4 + d) - d2; PP1 = (17000 <= repmat(P1, [1, 1, 3])) .* label2rgb(P1, @jet); PP2 = (17000 <= repmat(P2, [1, 1, 3])) .* label2rgb(P2, @jet); PP3 = (17000 <= repmat(P3, [1, 1, 3])) .* label2rgb(P3, @jet); PP4 = (17000 <= repmat(P4, [1, 1, 3])) .* label2rgb(P4, @jet); PP5 = (17000 <= repmat(P5, [1, 1, 3])) .* label2rgb(P5, @jet); A = cat(4, PP1, PP2, PP3, PP4, PP5); ■ 可読性重視 d = (b - a) / 10; d2 = (a - b) / 10; P1 = (a + d) - d2; P2 = (P1 + d) - d2; P3 = (P2 + d) - d2; P4 = (P3 + d) - d2; P5 = (P4 + d) - d2; PP1 = label2rgb(P1, @jet); PP2 = label2rgb(P2, @jet); PP3 = label2rgb(P3, @jet); PP4 = label2rgb(P4, @jet); PP5 = label2rgb(P5, @jet); for i = 1:size(P1, 1)   PP1(i, find(P1(i, :) < 17000), :) = 0;   PP2(i, find(P2(i, :) < 17000), :) = 0;   PP3(i, find(P3(i, :) < 17000), :) = 0;   PP4(i, find(P4(i, :) < 17000), :) = 0;   PP5(i, find(P5(i, :) < 17000), :) = 0; end A = cat(4, PP1, PP2, PP3, PP4, PP5); という感じでしょうか。 行数重視は、一見しただけではもはや処理内容が分からなくなっていますので、これはやり過ぎだと思います。 もしコードの最適化を行うにしても、速度重視あたりまでが妥当ではないでしょうか? 実行環境がないため、これらのコードは机上チェックしかしていません。動作するとは思いますが、もし問題があればおっしゃってください。

U-GE
質問者

お礼

ありがとうございます。大変助かりました。 また何かあったらよろしくお願いします

その他の回答 (5)

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

#2です。 例として提示させて頂いたコードの意図が上手く伝わっていないようですので、少し補足させていただきます。 ご質問の意図は、単純にコードの行数が減ればそれでOKということでしょうか? そうであれば、#1の方が提示されている反復処理を多用する方法が良いでしょう。P1~P5は構造も処理内容も似通っているのでかなり簡略化できると思います。 ただし、その場合かなり処理速度が低下するはずです。(もちろん画像のサイズにもよりますが) MATLABは、反復処理や反復処理内の条件分岐が存在すると極端に処理速度が低下します。コードの可読性だけでなく、現実の使用を考えた場合、反復処理は極力使用せず行列演算を用いるべきです。 そういった意図もあり、#2は反復処理を減らすように変更を加えています。提示させて頂いた例は、完全に反復処理をなくすことも可能ですが、可読性とのバランスを考えて一つ残しています。 あと、一つ疑問なのですが、P1が17000以上であれば、同座標のP2~P5が17000未満でもデータを0に更新しないのは意図した動作でしょうか?

U-GE
質問者

お礼

単純にコード行数を減らしたかったのですが、処理速度の低下も困るので2がいいですね P1が17000以上であっても、同座標のP2~P5が17000未満ならデータを0にしたいのですが、なっていませんでしたか・・・

回答No.4

ANo. 1 です。 >・一応動作しております ということなので、まずは単純にコードをまとめたいだけということなのですね。 imread で読み込んだ画像 a は、a[row, column, color] となるので、 (ただし、グレイスケールのとき color=1, カラーのとき color = 1(Red)~3(Blue)) 複数の画像を 1 つの行列に収めるために P[row, column, color, index] という行列を 想定します。 P(index) = ((indexMax-index)/indexMax)*a + (index/indexMax)*b (ただし、0≦index≦indexMax) のように index を変化させて、それを P に代入していきます。 あとは、P の各画素が閾値に達しているかをチェックしていくことになります。 またまた疑問が生じたので挙げておきます。 (私は画像処理の経験が無いので的外れの質問である可能性があります。) ・元画像の色の諧調が 2^16 であるなら、a = im2uint16(a); を実行することに意味はあるのでしょうか? ・PP1 = label2rgb(P1, @jet); の意図が不明です。Color Map を変更したいのなら、colormap(jet); ではないでしょうか? ・for iCol = 1:nCols 以下の文ですが、ご質問の文章で提示されたコードだと画像 P1 の画素が  閾値(17000)に達していないときだけ画像 P2 の画素の閾値をチェックすることになりますがそれで良いのでしょうか? ※読みやすくするために、インデント(タブ)を全角スペースに置き換えています。 ※カラー画像の場合は "==== RGB の場合 ====" の部分のコメントを外して、"==== グレイスケールの場合 ===="  の部分をコメント アウトしてください。 ==== test02.m ==== clear; % 変化の段階数 x = 5; % 画像の読み込み a = imread('AM100-1.png'); b = imread('AM100-2.png'); a = im2uint16(a); b = im2uint16(b); % 画像 a から画像 b への変化 % P = (1-x)*a + x*b (ただし、0≦x≦1)という意味の式 for i = 1:x+1   P(:,:,:,i) = a(:,:,:) * ((x-i+1)/x) + b(:,:,:) * ((i-1)/x); end % Color Map を変化させたいということなのか?(意図不明) for i = 1:x+1   PP(:,:,:,i) = label2rgb(P(:,:,:,i), @jet); end % 画像の画素数の取得 [nRows nCols tmp1 tmp2] = size(P); % 各画素が閾値に達しない場合 0 にする for iCol = 1:nCols   for iRow = 1:nRows     for i = 1:x+1       % ==== RGB の場合 ====       % RGB を取得       %r = PP(iRow, iCol, 1, i);       %g = PP(iRow, iCol, 2, i);       %b = PP(iRow, iCol, 3, i);       %       % 輝度を計算       %if (r * 0.29891) + (g * 0.58661) + (b * 0.11448) < 17000       %  PP(iRow, iCol, 1, i) = 0;       %  PP(iRow, iCol, 2, i) = 0;       %  PP(iRow, iCol, 3, i) = 0;       %endif       % ここまで ==== RGB の場合 ====              % ==== グレイスケールの場合 ====       grayScale = PP(iRow, iCol, 1, i);              % 輝度を計算       if grayScale < 17000         PP(iRow, iCol, 1, i) = 0;       endif       % ここまで ==== グレイスケールの場合 ====     end   end end % 画像の連結 A(:,:,:) = PP(:,:,:,1); for i = 2:x+1   A = cat(2, A, PP(:,:,:,i)); end ==== end of test02.m ====

U-GE
質問者

お礼

・すいません256でした ・colormap(jet);だとカラー画像として保存してくれないようなのですが、表示のみ? ・すいません、よく分らないのですが。それでいいとおもいます

回答No.3

ANo. 1 です。 まだ途中ですが、とりあえずそれっぽいソースを書いてみました。 (手元に Matlab が無いため、Matlab のクローンソフトである Octave を使用しています。) 以下のソースコードを「test01.m」などのファイル名で保存し、 matlab で test01 と入力することで実行します。 いくつか疑問があるので挙げます。 ・画像の色の諧調は 2^16 (= 65536) なのでしょうか? ・画像はグレイスケールなのでしょうか、それともカラーなのでしょうか? ・もう一度お尋ねしますが、提示されたプログラムは動作しているのでしょうか?  (エラーで止まる or 動作はするが思ったとおりの結果ではない or 思ったとおりに動作する) ※読みやすくするために、インデント(タブ)を全角スペースに置き換えています。 ==== test01.m ==== clear; % 変化数 x = 5; % 画像の読み込み a = imread('AM100-1.png'); b = imread('AM100-2.png'); % 画像 a から画像 b への変化 for i = 1:x+1   P(:,:,:,i) = a(:,:,:) * ((x-i+1)/x) + b(:,:,:) * ((i-1)/x); end [nRows nCols tmp1 tmp2] = size(P); for iCol = 1:nCols   for iRow = 1:nRows     for i = 1:x+1       % RGB の場合       % RGB を取得       %r = P(iRow, iCol, 1, i);       %g = P(iRow, iCol, 2, i);       %b = P(iRow, iCol, 3, i);       %       % 輝度を計算       %if (r * 0.29891) + (g * 0.58661) + (b * 0.11448) < 17000       %  P(iRow, iCol, 1, i) = 0;       %  P(iRow, iCol, 2, i) = 0;       %  P(iRow, iCol, 3, i) = 0;       %endif              % グレイスケールの場合       grayScale = P(iRow, iCol, 1, i);              % 輝度を計算       if grayScale < 17000         P(iRow, iCol, 1, i) = 0;       endif     end   end end ==== end of test01.m ====

U-GE
質問者

お礼

・画像の色の諧調は65536です ・画像はグレイスケールです(できればそこからカラーにしたいのですが・・) ・一応動作しております

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

単純に整理するだけなら、こんなところでしょうか。 a = imread('AM100-1.png'); b = imread('AM100-2.png'); a = im2uint16(a); b = im2uint16(b); d = (b - a) / 10; d2 = (a - b) / 10; P1 = (a + b) - d2; P2 = (P1 + d) - d2; P3 = (P2 + d) - d2; P4 = (P3 + d) - d2; P5 = (P4 + d) - d2; PP1 = label2rgb(P1, @jet); PP2 = label2rgb(P2, @jet); PP3 = label2rgb(P3, @jet); PP4 = label2rgb(P4, @jet); PP5 = label2rgb(P5, @jet); for i = 1:size(P1, 1)   PP1(i, find(P1(i, :) < 17000), :) = 0;   PP2(i, find((P1(i, :) < 17000) & (P2(i, :) < 17000)), :) = 0;   PP3(i, find((P1(i, :) < 17000) & (P2(i, :) < 17000) & (P3(i, :) < 17000)), :) = 0;   PP4(i, find((P1(i, :) < 17000) & (P2(i, :) < 17000) & (P3(i, :) < 17000) & (P4(i, :) < 17000)), :) = 0;   PP5(i, find((P1(i, :) < 17000) & (P2(i, :) < 17000) & (P3(i, :) < 17000) & (P4(i, :) < 17000) & (P5(i, :) < 17000)), :) = 0; end A = cat(4, PP1, PP2, PP3, PP4, PP5);

U-GE
質問者

お礼

ありがとうございます参考になりました

回答No.1

回答される方がいらっしゃらないようなので。。。 ・何を意図したプログラムなのか明記しましょう。 ・動作はするのでしょうか?デバグなのか?それともコードを簡潔にしたいのか?

U-GE
質問者

お礼

2つの熱画像A,B(ここでは強度イメージ)の差分を取りその差分をXで割りX回たすことで徐々にAの画像をBにちかづけて、 更にcolormapをjetにして強度イメージの輝度が17000以下の所は輝度0にしてそれの変化を動画のようにするというもです

関連するQ&A

  • テニス(ダブルス)乱数表 Excelマクロ

    テニス等のダブルスゲームのペアを決めるための乱数表を作りたいと思い、Web検索したところrio_dさんが作成されたExcelマクロプログラムを見つけました(http://oshiete1.goo.ne.jp/kotaeru.php3?q=1388951)。記載されている通りにマクロを作成しましたが、実行すると「SubまたはFunctionが定義されていません」というコンパイルエラーメッセージが出てしまいます。rio_dさんのマクロプログラムの最初に「Sub 乱数表作成()」がありますが、この( )の中に何かを入力する必要があるのでしょうか。この他にも空白の( )がいくつかあります。マクロについて全くの素人で何も分かりません。このrio_dさんのマクロプログラムを実行する方法を素人にも分かるように解説していただければ幸いです。 【rio_dさんが書かれたマクロは以下の通りです】 <マクロ準備編> (1)新規ブックを開き、とりあえず名前をつけて保存します。『てにす乱数表.xls』にしましょうか。 (2)メニューバーから、ツール→マクロ→Visual Basic Editorを選択します。   Visual Basic Editorが起動します。 (3)左側に「VBAProject(てにす乱数表).xls」というのがあると思います。  ツリー状になっていて、左の[+]で展開していくと、「ThisWorkbook」という  ものが表示されると思います。 (4)その「ThisWorkbook」をダブルクリックします。  右側に「~~.xls - Thisworkbook(コード)」というウインドウが表示されます。 (5)そこに、下記のコードをコピー&ペーストしてください。 (6)Visual Basic Editorを閉じます。 (7)ここで一旦上書き保存しておきましょう。 <データ準備編> (1)セルA1に、コート数を入力してください。数字でお願いします。 (2)セルB1から横方向に、人数を入れていってください。 (3)セルA2から縦方向に、試合数を入れていってください。 こんなかんじ  _A__B_C_D__E__F__G__H__I__J__K 1|  3  5  6  7  8  9  10  11  12  13  14… 2|  1 3|  2 4|  3 5|  4 6|  5 7|  6    : <データ作成編> (1)メニューバーから、ツール→マクロ→マクロ と選択してください。 (2)実行するマクロの一覧に「ThisWorkbook.乱数表作成」というのがでるので、   それを選択して「実行」してください。 (3)砂時計が消えたら完成です。 このマクロは実行するたびに結果が変わります。気に入らなかったら何度でも やり直してください。 また、全セルを消去すれば、データ準備からやり直すことも出来ます。 好きな表をいくつでも作ってください。 ちなみに100人とかデータ数がえらく膨大になると、なかなか計算が終わりませんので。 その場合は気長に待ってください。 '-----マクロ ここから----- Sub 乱数表作成() Dim iRow As Integer Dim iCol As Integer Dim iCnt As Integer Dim iCnt2 As Integer Dim iTmp As Integer Dim sNum() As String Dim bChk() As Boolean Dim bChk2() As Boolean Dim bFull As Boolean Dim iCourt As Integer iCol = 2 Do Until Cells(1, iCol) = "" iRow = 2 If Cells(1, 1) * 4 > Cells(1, iCol) Then iCourt = Round(Cells(1, iCol) / 4 - 0.5, 0) Else iCourt = Cells(1, 1) End If ReDim sNum(iCourt * 4 - 1) ReDim bChk(Cells(1, iCol)) ReDim bChk2(Cells(1, iCol)) For iCnt = 1 To Cells(1, iCol) bChk(iCnt) = True bChk2(iCnt) = True Next iCnt Do Until Cells(iRow, 1) = "" iCnt = 0 Do Until iCnt = iCourt * 4 iTmp = Round(Rnd(Second(Now)) * Cells(1, iCol) + 0.5, 0) If bChk(iTmp) And bChk2(iTmp) Then sNum(iCnt) = "[" & Trim(Str(iTmp)) & "]" iCnt = iCnt + 1 bChk(iTmp) = False bChk2(iTmp) = False bFull = False For iCnt2 = 1 To Cells(1, iCol) bFull = bFull Or bChk(iCnt2) Next iCnt2 If bFull = False Then For iCnt2 = 1 To Cells(1, iCol) bChk(iCnt2) = True Next iCnt2 End If End If Loop Cells(iRow, iCol) = sNum(0) For iCnt = 1 To iCourt * 4 - 1 Select Case iCnt Mod 4 Case 0 Cells(iRow, iCol) = Cells(iRow, iCol) & Chr(10) & sNum(iCnt) Case 2 Cells(iRow, iCol) = Cells(iRow, iCol) & ":" & sNum(iCnt) Case Else Cells(iRow, iCol) = Cells(iRow, iCol) & sNum(iCnt) End Select Next iCnt For iCnt = 1 To Cells(1, iCol) bChk2(iCnt) = True Next iCnt iRow = iRow + 1 Loop iCol = iCol + 1 Loop End Sub '-----マクロ ここまで-----

  • MATLABで画像の表示方法

    a = imread('C:\Users\Labmember2011\Desktop\MatlabStuffs\2266057137_611af466d4.jpg'); b = imread('C:\Users\Labmember2011\Desktop\MatlabStuffs\pc.jpg'); cont = 0; %フレームカウンター figure; tic; %ストップウオッチタイマの開始 while(toc<10) %10秒の間アニメーション if toc > cont*0.5 %0.5秒間隔でフレームを更新 if mod(cont, 2) %カウンターが偶数の時はaの画像を表示 image(a); else %奇数の場合はbの画像を表示 image(b); end drawnow() %確実に描画させる cont = cont+1; end pause(0.05); %CPU使用率が上がるのが嫌な場合はpauseを入れる。(フレーム更新の精度はその分落ちる) end で実行したら2枚の画像が切り替わるプログラムが実行されました。 複数枚画像の表示方法はどのように書いたら実行できますか? 教えてください。

  • 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の質問です。

    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

  • みなさまのお力をお貸しください。フローチャート質問

    a^2=b^2+c^2の三平方の定理のフローチャートです 1<=a,b,c<=100の範囲の自然数で 定理をみたす自然数をもとめる問題なのですが 私が考えた下記のフローチャートを見てもらえませんか?  開始 (1)a=0 (2)b=0 (3)c=0 (4)a=sqrt(pow(b,2)+pow(c,2)) (5)b=sqrt(pow(a,2)-pow(c,2)); (6)b=sqrt(pow(a,2)-pow(b,2)); (7)処理1<=a<=100NOならb=b+1,c=c+1で(4)へ YES (8)処理1<=b<=100NOならa=a+1で(5)へ YES (9)処理1<=c<=100NOならa=a+1で(6)へ YES (a,b,c)表示 終了 実行したら(2,1,1)になります 範囲のなかで上いがいで定理が成り立つabcを出したいのですが どこが違うのかどうしたら良いのかアドバイスをください 一様c言語を書いてみました できたら上の形でお願いします a=0; b=0; c=0; Label01: a=sqrt(pow(b,2)+pow(c,2)); Label02: b=sqrt(pow(a,2)-pow(c,2)); Label03: c=sqrt(pow(a,2)-pow(b,2)); if (a>=1 && a<=100) { /* YES 処理 */ printf("%d\n",a); if (b>=1 && b<=100) { /* YES 処理 */ printf("%d\n",b); if (c>=1 && c<=100) { /* YES 処理 */ printf("%d,%d,%d\n",a,b,c); } else { /* NO 処理 */ a=a+1; printf("%d\n",c); goto Label03; } } else { /* NO 処理 */ a=a+1; printf("%d\n",b); goto Label02; } } else { /* NO 処理 */ b=b+1; c=c+1; printf("%d\n",a); goto Label01; } printf("a^2=b^2+c^2\n"); return 0;

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

  • C言語で質問します

    Sorting Three Numbers 3つの整数を読み込み、それらを値が小さい順に並べて出力するプログラムを作成して下さい。 Input 3つの整数が空白で区切られて与えられます。 Output 小さい順に並べ替えた3つの整数を1行に出力して下さい。整数の間に1つの空白を入れて下さい。 Sample Input 3 8 1 Sample Output 1 3 8 以上がAIZU ONLINE JUDGEというサイトの問題です。 自分が書いたソースプログラムは以下です: #include<stdio.h> int main(void){ int a,b,c; scanf("%d %d %d",&a,&b,&c); if(c>b&&b>a){ printf("%d %d %d",a,b,c); } if(b>c&&c>a){ printf("%d %d %d",a,c,b); } if(a>c&&c>b){ printf("%d %d %d",b,c,a); } if(c>a&&a>b){ printf("%d %d %d",b,a,c); } if(b>a&&a>c){ printf("%d %d %d",c,a,b); } if(a>b&&b>c){ printf("%d %d %d",c,b,a); } if(a==b&&b==c){ printf("%d %d %d",a,a,a); } if(a==b&&b>c){ printf("%d %d %d",c,a,a); } if(a==b&&c>b){ printf("%d %d %d",a,a,c); } if(a>c&&b==c){ printf("%d %d %d",b,b,a); } if(c>a&&b==c){ printf("%d %d %d",a,b,b); } return(0); } 自分のパソコン上でコンパイルして,いろいろ整数を入力してみて,全部大丈夫でしたが,なぜこのオンラインサイトでコンパイルするとエラーが出るでしょうか? よろしくお願いします

  • MATLABで連続した画像の取り込み方

    1つのJPGファイルを取り込み、表示させるやり方は I = imread('sample000.jpg'); imshow(I) これででき、作業を書くと for t=1:1:10 if(t==1) A=imread('sample000.jpg'); imshow(A) hold on [xa, ya]=textread('sample01.txt','%d %d','headerlines',10); end plot(xa(t,1), ya(t,1), 'r+'); if(t==10) hold off end end ということになります。 10回ループさせるのは、sample01.txtの10行目以降の中身が10個ずつの座標だからです 以下はsample01.txtの中身を簡単に書いたものです ...         ※9行目 test coordinates  ※10行目 44 54        ※11行目 45 46 53 43 55 41 58 38 61 33 66 36 69 41 72 47 73 52        ※20行目 10         ※21行目 46 54        ※22行目 48 52 ... ... 77 51        ※31行目 10         ※32行目 47 52        ※33行目 ... ... という感じです。 で、本題ですが sample000.jpg sample001.jpg sample002.jpg ... ... など複数のjpgファイルをループを使って連続して取り込み、作業したいときは、どういうコマンドでどういうループを作ればいいでしょうか? 具体的には 1枚目のsample000.jpgファイルを読み込みhold on、sample01.txtの11行目から20行目の座標を赤い点でプロットし、最後にhold off 2枚目のsample001.jpgファイルを読み込みhold on、sample01.txtの22行目から31行目の座標を赤い点でプロットし、最後にhold off 3枚目の... というループです。 下手な説明でごめんなさい、誰かMATLABの画像処理に詳しい方がいたら応答よろしくおねがいします。

  • C# uint += long

    C# uint += long こんにちは、 C#なのですが、 uint a=0xffff0000; long b=-100; である場合、 a+=b; とするとエラーになります。 オーバーフローは考えないとして、この計算を行うにはどうすればよいのでしょうか? ifで切り分けるか、64bitで計算するしかないのでしょうか?

  • MATLABのfor文の使い方について

    MATLAB(というかプログラム)初心者です 下記を教えてください よろしくお願いいたします 「つくりたいプログラム」 y1=[A B C] y2=[D E F] ・ ・ ・ y200=[AA BB CC] 上記のような200個くらいある行列に同じ操作をしたいです そこでいちばん簡単な構造を考えました ////////////////////// y1=[A B C] y2=[D E F] for i=1:2 Yi=yi*5 end ///////////// 成功イメージは Y1=[5A 5B 5C] Y2=[5D 5E 5F] となってほしいのですが回りません・・・ yiの定義のしかたがわからず困っております 初歩的な質問かもしれませんが教えてくださいよろしくお願いいたします

専門家に質問してみよう