2016-11-19 1 views
1

私は先週Matlabをプログラミングし始めました。私は成功していない関数ファイルをプロットしようとしていました。別の.mファイルで関数をプロットする

これは機能ファイル(impuls.m)です。基本的に0 < = x < 5とx> 10に対してy = 0に設定する必要があります。 y = 5 for 5 < = x < = 10)。

function y = impuls(x) 

    if ((x>=0 && x<5) || x>10) 
     y=0; 
    else if (x>=5 && x<=10) 
      y=5; 
     end 
    end 

end 

私はIMPULSを使用して、私のメインファイル(fourierreihe.m)上でそれをテストする場合(1)私は「0」を取得するので、私は、私は右のそれをやったと思いますし、IMPULSを使用した場合(7)私は5を取得問題は、区間[0 13]のすべてのリサットを取得し、それらを長方形のインパルスとしてプロットしようとするときです。

私が使用してみました:

impuls([0 13]) 

しかし、私はエラーを取得しておいてください。

fouhierreihen 
Operands to the || and && operators must be convertible to logical scalar values. 

Error in impuls (line 3) 
    if ((x>=0 && x<5) || x>10) 

Error in fouhierreihen (line 1) 
impuls([0 13]) 

はずの私はANS = 0 0 0 0 0 5 5 5 5 5 5 0」として何かを得ることが0 0 "これを答えとして?

だから私は間違っていますか?私はビデオや投稿を検索したことがあり、間違いを見つけることはできません。どのように私はおそらく間隔のためにそれをプロットすることができますか?

ありがとうございます。 Pedro。

+0

:ただし、fplotは、次の警告を投げ、アレイ入力が失敗した場合に機能出力要素ごとの(ループ)を計算に戻ります[0:13] 'は範囲です。エラーメッセージとドキュメンテーションの両方が指摘しているように、[短絡論理演算](https://www.mathworks.com/help/matlab/ref/logicaloperatorsshortcircuit.html)に必要な*スカラー*はありません。 [論理インデックス](https://www.mathworks.com/help/matlab/math/matrix-indexing.html?refresh=true#bq7egb6-1)または[値を繰り返し処理する](https:///www.mathworks.com/help/matlab/ref/for.html)。 – excaza

+0

まずはお返事ありがとうございます。範囲ではないとしても、それは私にimpuls(0)とimpuls(13)の答えを与えるべきではありませんか?私は関数ファイルが正しいと確信しています。私たちは先週同じ運動をしましたが、このように働いていました。私はちょうど機能をプロットするためにメインファイルでそれを動作させる方法を覚えていません。 – romanocph

+0

いいえ、それは私の前のコメントで説明した理由ではありません。 '&&'と '||'はスカラーを渡さなければならず、 '[0 13]'と '[0:13]'のどちらもスカラーではありません。これが配列のために働いていたならば、 'impuls'の書かれた方法が違っていたり、外部でループで呼び出していたのです。 – excaza

答えて

1

エラーメッセージとdocumentationに説明されているように、短絡論理演算子への入力はスカラーでなければなりません。基本的に2つの真理値の配列で確実に短絡しようとするのは理にかなっていません。

logical indexingを使用すると、同じタスクをベクトル化して実行できます。たとえば、次のように返し

function y = impuls(x) 
y = zeros(size(x)); % Initialize the output array 
y(x>=5 & x<=10) = 5; % Condition one 

impuls(1) = 

    0 


impuls(7) = 

    5 


impuls([0 13]) = 

    0  0 


impuls(0:13) = 

    0  0  0  0  0  5  5  5  5  5  5  0  0  0 

を元の機能がfplotで動作することは、MATLABの開発者からの譲歩です。機能の文書が繰り返し(彼らは実際には明らかに、それを強制しませんが)にプロットされている関数はベクトル入力を受け入れなければならないと述べている:

The function must accept a vector input argument and return a vector output argument of the same size

&&||はスカラ演算であるため、あなたの関数は、これを実行しません。 ``、範囲ではない[0 13] `

Warning: Function fails on array inputs. Use element-wise operators to increase speed. 
> In matlab.graphics.function.FunctionLine>getFunction 
    In matlab.graphics.function.FunctionLine/updateFunction 
    In matlab.graphics.function.FunctionLine/set.Function_I 
    In matlab.graphics.function.FunctionLine/set.Function 
    In matlab.graphics.function.FunctionLine 
    In fplot>singleFplot (line 223) 
    In fplot>@(f)singleFplot(cax,{f},limits,extraOpts,args) (line 182) 
    In fplot>vectorizeFplot (line 182) 
    In fplot (line 153) 
    In trialcode (line 1) 
+0

私は、教授が警告についてあまり気にしなかったと思う。 Hehe。しかし、あなたの答えをありがとう、私は今それを得た!関数がもっと複​​雑であれば、y = 3x ^(4-x)のように0 <= x <= 10の場合はどうすればいいのでしょうか? 0から10までのforループを使って、それを計算し、各結果を配列内のその場所にアサーションしますか? – romanocph

+0

あなたはそうすることができますが、それらはすべて行列演算なので、一般的にそれらを以下のように扱う方がはるかに高速です: 'x = 1:10; y = 3 * x。^(4-x) 'である。常に[言語の強み](https://www.mathworks.com/help/matlab/language-fundamentals.html)をコーディングしてみてください。 – excaza

+0

よろしくお願いします。 :) – romanocph

0

マイフレンド....

このお試しください:forループはこれらの例に重要である

  • 機能impulseはどこにでも存在する可能性:注

    function y = impulse(t) 
    if 0 
        %% Example 
        t=(0:100)'; 
        y=impulse(t) 
        plot(t,y); 
    end 
    for i=1:length(t) 
        if ((t(i)>=0 && t(i)<5) || t(i)>10) 
         y(i,1)=0; 
        else if (t(i)>=5 && t(i)<=10) 
          y(i,1)=5; 
         end 
        end 
    end 
    

    をあなたのローカルバージョンが優先します。

  • y(i,1)
  • 、列としてあなたのベクトルを保持時間は、通常の変数として、ここで使用されている
  • if 0)ボイドループ内のセクションを実行します。)....

HYP。

関連する問題