2013-04-02 38 views
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值。

另外我的任務是當我回報錨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); 

在主要功能我已經編碼這樣的錯誤,

%A30(BlinkSet); 
A50(BlinkSet); 

任何幫助,高度讚賞。

回答

0

在這兩個函數中,如果執行在循環內輸入if語句(即xAnchorID==a && xSourceID==b在某點上爲真),則只創建變量。顯然,這個代碼永遠不會在你的A50函數中執行。如果不知道BlinkSet是什麼,那麼診斷確切的問題有點困難,但這至少是原因。

作爲一個方面說明:當代碼幾乎完全相同時,創建兩個單獨的函數來完成這項工作並不是一個好主意。您應該爲您的函數添加一個輸入參數,以允許它執行兩者的工作。在這種特殊情況下,所有的改變是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總是一個好主意,以便您的函數支持類似myFunction(myArg1, [], myArg3)的語法。另請注意,操作數的順序至||至關重要;如果你做了if isempty(theArgument) || nargin < theArgumentNumber並且用戶沒有通過theArgument,那麼它會在isempty中出錯,因爲theArgument不會作爲局部變量存在。我們可以通過交換操作數的順序來解決這個問題,因爲MATLAB足夠聰明,知道如果左操作數是true(注意在其他許多編程語言中也是如此)它不需要評估正確的操作數。

+0

實際上BlinkSet是一個包含大約<1561x1 cell>的結構。因此在每個單元格內都有不同的單元格,用於指示其AnchorID和sourceID的報告。 你介意給你寫的附註寫一個例子嗎?這將有所幫助! –

+0

編輯的答案包含請求的示例。 – wakjah

+0

謝謝你Wakjah!出乎意料的是它現在確實有意義!我會試試這個! –