0

実際、AnchorID と SourceID が互いに報告する Matlab シミュレーションをコーディングしています。たとえば、アンカー 30 とソース 50 を使用すると、これらのアンカーとソースの間のすべての agc 値が収集され、rssi_dB が計算されて表示されます。以下は、アンカー 30 とソース ID 50 の例です。

注: アンカー ID のリストとソース ID は同じです。たとえば 30 50 55 58 です。これらの ID は、アンカーとソースの両方で同じです。

function A30(BlinkSet)
for i=1:length(BlinkSet)

      xAnchorID=30;
      xSourceID=50;
      a=BlinkSet{i}.AnchorID;
      b=BlinkSet{i}.SourceID;
      if xAnchorID==a && xSourceID==b
      xagc=BlinkSet{i}.agc;
      rssi_dB(i)=-(33+xagc*(89-33)/(29-1));
      end
  end
     rssi_dB(rssi_dB==0)=[];
     rssi_dBm=sum(rssi_dB(:))/length(rssi_dB);
     disp([sprintf('The rssi value is %0.0f',rssi_dBm)]);

Matlab コマンド ウィンドウで関数を呼び出すと、上記の関数の rssi 値が取得されます。

また、私のタスクは、アンカー ID とソース ID を相互にやり取りすると、アンカーを 50、ソースを 30 として、以下で言及した関数のように、以下の関数の後に言及されているエラーが発生することです。

function A50(BlinkSet)
for i=1:length(BlinkSet)

   xAnchorID=50;
   xSourceID=30;
   a=BlinkSet{i}.AnchorID;
   b=BlinkSet{i}.SourceID;
   if xAnchorID==a && xSourceID==b
   xagc=BlinkSet{i}.agc;
   rssi_dB(i)=-(33+xagc*(89-33)/(29-1));
   end

end
rssi_dB(rssi_dB==0)=[];
   rssi_dBm=sum(rssi_dB(:))/length(rssi_dB);
disp([sprintf('The rssi value is %0.0f',rssi_dBm)]);

この関数を呼び出すと、エラーが発生します

??? Undefined function or variable "rssi_dB".

 Error in ==> A50 at 14
 rssi_dB(rssi_dB==0)=[];

 Error in ==> main_reduced at 26
 A50(BlinkSet);

main 関数では、次のようにコーディングしました。

 %A30(BlinkSet);
 A50(BlinkSet);

どんな助けでも大歓迎です。

4

1 に答える 1

0

これらの関数の両方で、rssi_dB実行ifがループ内のステートメントに入った場合 (つまり、xAnchorID==a && xSourceID==bある時点で true の場合) にのみ変数を作成します。明らかに、このコードはA50関数内で実行されることはありません。何が入っているかを知らなければBlinkSet、正確な問題を診断するのは少し難しいですが、少なくともこれが原因です。

補足として、コードがほとんど同じ場合、このジョブを実行するために 2 つの別個の関数を作成することはお勧めできません。関数に入力引数を追加して、両方のジョブを実行できるようにする必要があります。この特定のケースでは、変更されるのはxAnchorIDandの値xSourceIDだけなので、これらを渡すだけで済みます。

function srcToAnchorRssi(BlinkSet, xSourceID, xAnchorID)
    % The rest of the function stays the same!

これらの引数にいくつかのデフォルトを提供したい場合は、次のようにします。

if nargin < 3 || isempty(xAnchorID), xAnchorID = 50; end
if nargin < 2 || isempty(xSourceID), xSourceID = 30; end

isempty関数が のような構文をサポートするように、この種の in ステートメントを含めることは常に良い考えmyFunction(myArg1, [], myArg3)です。また、オペランド to の順序が重要であることにも注意してください||。あなたがそうif isempty(theArgument) || nargin < theArgumentNumberし、ユーザーが渡さなかった場合、ローカル変数として存在しないためtheArgument、エラーになります。これは、オペランドの順序を交換することで回避できます。これは、MATLAB は、左のオペランドが評価された場合に右のオペランドを評価する必要がないことを認識できるほどスマートであるためです(これは、他の多くのプログラミング言語でも当てはまることに注意してください)。isemptytheArgumenttrue

于 2013-04-02T10:52:32.417 に答える