2

matlab の関数に問題があります。この特定の機能は、光信号をフィルタリングするためのものです。以下に示すように、関数と while ループ自体で使用したコーディングを追加しました。コードは NXT レゴ ロボット用に書かれています。

カウント変数 ( i = i + 1 ) を関数で機能させる方法のヒントはありますか? Light(i) をプロットできますか? さまざまなコードを試して動作させると、大量のエラー メッセージが表示されるためです。

function  [light]  = filter_func( i)
  lightI(i) = GetLight(SENSOR_3);  

  if i==1
    light(i)=lightI(i)

  elseif i==2
    light(i) =  0.55*lightI(i) + 0.45*lightI(i-1)
  else
    light(i) =  0.4*lightI(i) + 0.3*lightI(i-1) + 0.3*lightI(i-2);
  end

end

i=1
while true
  lightI(i) = GetLight(SENSOR_3); % Get’s a lightvalue between    0 and 1024.
  if i>2
    light =filter_func(i)
    light=round(light); 
  else
    light(i) = GetLight(SENSOR_3);;
  end
  i=1+i  

  plot(light(end-90:end), 'r-');
  title('Lightvalue')
  axis([0 100 0 1023]) ;
end
4

1 に答える 1

0

MATLAB では (Python のように) このようなスクリプトと関数を混在させることは許可されていないため、主にエラーが発生する可能性があります。

フィルター関数は i>2 の場合にのみ使用されるのに、最初の 2 つのテストを行うのはなぜですか? グローバル変数として lightI が必要なようですが、それはあなたが行ったことではありません。関数内の lightI は、while ループ内のものと同じではありません。

while ループは永久に実行されるため、最初の 2 回のプロットの更新について心配する必要はないかもしれません。その場合、これを行うことができます:

filter                  = [0.4 0.3 0.3]';
latest_filtered_light   = nan(90,1);
lightI                  = [];
p                       = plot(latest_filtered_light, 'r-');
title('Lightvalue')
axis([0 100 0 1023]) ;

while True
    lightI(end+1,1) = rand*1024; % Get’s a lightvalue between    0 and 1024.
    if i>=3
        new_val               = lightI(end-2:end,1)'*filter;
        latest_filtered_light = [latest_filtered_light(2:end);...
                                new_val];
        set(p, 'ydata', latest_filtered_light)
        drawnow
    end
end

毎回 plot を呼び出さないことは重要なポイントだと思います - 少なくともパフォーマンスを気にしないのであれば。

于 2012-11-07T08:45:43.170 に答える