0

实际上,我正在编写一个 Matlab 模拟,其中 AnchorID 和 SourceID 将相互报告。例如,如果我采用锚点 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 值。

另外,我的任务是,当我将 Anchor ID 和源 ID 说 Anchor 为 50,源 ID 为 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);

在主要功能中,我这样编码,

 %A30(BlinkSet);
 A50(BlinkSet);

非常感谢任何帮助。

4

1 回答 1

0

在这两个函数中,rssi_dB如果执行进入if循环中的语句(即,如果xAnchorID==a && xSourceID==b在某个点为真),您只创建变量。显然,此代码永远不会在您的A50函数中执行。在不知道其中有什么的情况下,BlinkSet很难诊断出确切的问题,但这至少是原因。

附带说明:当它们的代码几乎相同时,创建两个单独的函数来完成这项工作并不是一个好主意。您应该向您的函数添加一个输入参数,以允许它完成两者的工作。在这种特殊情况下,所有变化都是 and 的值xAnchorIDxSourceID因此您可以将这些传入:

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). 另请注意,操作数的顺序||至关重要;如果你这样做了if isempty(theArgument) || nargin < theArgumentNumber并且用户没有通过theArgument,那么它会出错,isempty因为它theArgument不会作为局部变量存在。我们可以通过交换操作数的顺序来解决这个问题,因为 MATLAB 足够聪明,知道如果左操作数是,它不必计算右操作数true(请注意,在许多其他编程语言中也是如此)。

于 2013-04-02T10:52:32.417 回答