1

新しいバージョン:

メインプログラムと関数の編集部分

AID=[30,50,52,53,54,56,57,72,75,77];
SID=[30,50,52,53,54,56,57,72,75,77];
[AID,SID]=meshgrid(AID,SID)
myfunction=@(SID,AID)myfunc(Blink,SID,AID);                                    
[rss_dBm1,rss_dBm2,rss_dBm3,rss_dBm4,y1,y2,y3,y4]=arrayfun(Blink,AID,SID)

関数

function [rss_dBm1,rss_dBm2,rss_dBm3,rss_dBm4,y1,y2,y3,y4] = arrayfun(Blink,AID,SID)
for i=1:length(BlinkSetList)
 S=cell2mat(BlinkSetList(i));                                 
   for j=1:length(S)
     if S(j).AID==AID & S(j).SID==SID       
        if S(j).AnchorChan==0 & S(j).SourceChan==0             
        y=S(j).agc;                                             
        rss_dB1(i)= -(33+y*(89-33)/(29-1));
        else
            rss_dB1(i)=0;
            isempty(rss_dB1(i))              
        end
        if S(j).AnchorChan==0 & S(j).SourceChan==1            
        y=S(j).agc;                                             
        rss_dB2(i)= -(33+y*(89-33)/(29-1));
        else
            rss_dB2(i)=0;
            isempty(rss_dB2(i))
        end
        if S(j).AnchorChan==1 & S(j).SourceChan==0             
        y=S(j).agc;                                             
        rss_dB3(i)= -(33+y*(89-33)/(29-1));
        else
            rss_dB3(i)=0;
            isempty(rss_dB3(i))
        end
        if S(j).AnchorChan==1 & S(j).SourceChan==1             
        y=S(j).agc;                                            
        rss_dB4(i)= -(33+y*(89-33)/(29-1));
        else
            rss_dB4(i)=0;
            isempty(rss_dB4(i))
        end
     end           
   end
end
   rss_dB1(rss_dB1==0)=[];
   rss_dB2(rss_dB2==0)=[];
   rss_dB3(rss_dB3==0)=[];
   rss_dB4(rss_dB4==0)=[];
   y1=std(rss_dB1);
   y2=std(rss_dB2);
   y3=std(rss_dB3);
   y4=std(rss_dB4);
   rss_dBm1=sum(rss_dB1(:))/length(rss_dB1);
   rss_dBm2=sum(rss_dB2(:))/length(rss_dB2);
   rss_dBm3=sum(rss_dB3(:))/length(rss_dB3);
   rss_dBm4=sum(rss_dB4(:))/length(rss_dB4);

    disp([sprintf('The rssi value  with A-Chan 0 and S-Chan 0 is %0.0f',rss_dBm1)]);
    disp([sprintf('The rssi value  with A-Chan 0 and S-Chan 1 is %0.0f',rss_dBm2)]);
    disp([sprintf('The rssi value  with A-Chan 1 and S-Chan 0 is %0.0f',rss_dBm3)]);
    disp([sprintf('The rssi value  with A-Chan 1 and S-Chan 1 is %0.0f',rss_dBm4)]);

そして、出力に続いてエラーが表示されます

AID =

  Columns 1 through 10
  30 50 52........ 
  30 50 52 
  30 50 52
  .
  .

SID =

  Columns 1 through 10

  30        30          30                  
  50        50          50          
  52        52          52......   
  .
  .
  .

??? 未定義の関数または変数 "rss_dB1"。エラー ==> 54 rss_dB1 での arrayfun(rss_dB1==0)=[];

Error in ==> main_reduced at 38

[rss_dBm1,rss_dBm2,rss_dBm3,rss_dBm4,y1,y2,y3,y4]=arrayfun(まばたき,AID,SID)

しかし、私は自分の結果を

たとえば、すべての組み合わせの結果: AID=30 SID=50 、AID=50 SID=54 、AID= 54 SID=57 .......

The rss value  with A-Chan 0 and S-Chan 0 is -68 % combination of AID=30 SID=50 
The rss value  with A-Chan 0 and S-Chan 1 is -73 % with all pairs of anchor and source channel (0,0),(0,1),(1,0),(1,1)
The rss value  with A-Chan 1 and S-Chan 0 is -73
The rss value  with A-Chan 1 and S-Chan 1 is -76
The rss value  with A-Chan 0 and S-Chan 0 is -68 % combination of AID=50 SID=54 
The rss value  with A-Chan 0 and S-Chan 1 is -73% with all pairs of anchor and source channel (0,0),(0,1),(1,0),(1,1)
The rss value  with A-Chan 1 and S-Chan 0 is -73
The rss value  with A-Chan 1 and S-Chan 1 is -76
The rss value  with A-Chan 0 and S-Chan 0 is -68 % combination of AID=54 SID=57 
The rss value  with A-Chan 0 and S-Chan 1 is -73 % with all pairs of anchor and source channel (0,0),(0,1),(1,0),(1,1)
The rss value  with A-Chan 1 and S-Chan 0 is -73
The rss value  with A-Chan 1 and S-Chan 1 is -76

rss_dBm1 =-68
rss_dBm2 =-72.8621
rss_dBm3 =-73
rss_dBm4 = -76
rss_dBm1 =-68
rss_dBm2 =-72.8621
rss_dBm3 =-73
rss_dBm4 = -76
rss_dBm1 =-68
rss_dBm2 =-72.8621
rss_dBm3 =-73
rss_dBm4 = -76

注 : チャネル ペアの組み合わせまたは AID と SID の組み合わせが存在しない場合があるため、その場合は単純に NaN を返します (これが isempty を使用した理由です)。

%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%% %%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%

まず、この投稿を見て解決策を提供してくれる人に感謝します。よろしくお願いします

私の質問は次のとおりです。

メインプログラムの一部

 AID=30;
 SID=50;

[rss_dBm1,rss_dBm2,rss_dBm3,rss_dBm4,y1,y2,y3,y4]=サンプル(まばたき,AID,SID)

注: AID には 30,50,52,54,55,57 (SID と同じ) のような異なる ID があります SID には 30,50,52,54,55,57 のような異なる ID があります (AID と同じ)

  Here the AID and SID is manually entered from the user to check the below anchorchannel and source channel condition and check if such combination exist it will display the rss values if not it will return NaN.

呼び出し機能

 function [rss_dBm1,rss_dBm2,rss_dBm3,rss_dBm4,y1,y2,y3,y4]=sample(Blink,AID,SID)        


 for i=1:length(Blink)     %Blink=<500x1 cell> inside which several blinks are present
 S=cell2mat(Blink(i));     %  with information on AID,SID,agc
   for j=1:length(S)
    if S(j).AID==AID && S(j).SID==SID      
       if S(j).AnchorChannel==0 && S(j).SourceChannel==0 %Anchor-source channel                                   
        y=S(j).agc; %agc is present in every blink to calculate rss       %combination                                           
        rss_dB1(i)= -(33+y*(89-33)/(29-1));
        else
            rss_dB1(i)=0;
            isempty(rss_dB1(i))              
        end
        if S(j).AnchorChannel==0 && S(j).SourceChannel==1             
        y=S(j).agc;                                            
        rss_dB2(i)= -(33+y*(89-33)/(29-1));
        else
            rss_dB2(i)=0;
            isempty(rss_dB2(i))
        end
        if S(j).AnchorChannel==1 && S(j).SourceChannel==0            
        y=S(j).agc;                                            
        rss_dB3(i)= -(33+y*(89-33)/(29-1));
        else
            rss_dB3(i)=0;
            isempty(rss_dB3(i))
        end
        if S(j).AnchorChan==1 && S(j).SourceChan==1             
        y=S(j).agc;                                            
        rss_dB4(i)= -(33+y*(89-33)/(29-1));
        else
            rss_dB4(i)=0;
            isempty(rss_dB4(i))
        end
    end
  end
end


   rss_dB1(rss_dB1==0)=[];
   rss_dB2(rss_dB2==0)=[];
   rss_dB3(rss_dB3==0)=[];
   rss_dB4(rss_dB4==0)=[];
   y1=std(rss_dB1);
   y2=std(rss_dB2);
   y3=std(rss_dB3);
   y4=std(rss_dB4);
   rss_dBm1=sum(rss_dB1(:))/length(rss_dB1);
   rss_dBm2=sum(rss_dB2(:))/length(rss_dB2);
   rss_dBm3=sum(rss_dB3(:))/length(rss_dB3);
   rss_dBm4=sum(rss_dB4(:))/length(rss_dB4);

    disp([sprintf('The rss value  with A-Chan 0 and S-Chan 0 is %0.0f',rss_dBm1)]);
    disp([sprintf('The rss value  with A-Chan 0 and S-Chan 1 is %0.0f',rss_dBm2)]);
    disp([sprintf('The rss value  with A-Chan 1 and S-Chan 0 is %0.0f',rss_dBm3)]);
    disp([sprintf('The rss value  with A-Chan 1 and S-Chan 1 is %0.0f',rss_dBm4)]);

今私の問題は、ユーザー入力を与えずに AID と SID のさまざまな組み合わせを自動的にチェックする方法です。これが理にかなっている場合は、すべての組み合わせをループし、AID SID とアンカー チャネルおよびソース チャネルのすべての可能な組み合わせに対して「rss」結果を返す必要があります。

1 つの組み合わせの結果: AID=30 SID=50

The rss value  with A-Chan 0 and S-Chan 0 is -68
The rss value  with A-Chan 0 and S-Chan 1 is -73
The rss value  with A-Chan 1 and S-Chan 0 is -73
The rss value  with A-Chan 1 and S-Chan 1 is -76

rss_dBm1 =-68
rss_dBm2 =-72.8621
rss_dBm3 =-73
rss_dBm4 = -76


y1 = 1.4142
y2 =  1.4072
y3 =   0
y4 =  1.1547

上記は、1 つの AID(30) SID(50) の組み合わせの結果です。しかし、AID=50 SID=52、AID=52 SID=55、AID=57 SID=54 のようにループしたいので、これらはいくつかの例です。ペア。結果を上記の出力のようにしたいのですが、前述のペアも含める必要があります。4 つの異なるチャネルの組み合わせがあります。

注: 上記の組み合わせによる出力は、以下の組み合わせにも含まれている必要があります。例: AID=50 SID=52,AID=52 SID=55,AID=57 SID=54 アンカー、ソース チャネル ペア (0,0),(0,1),(1,0),(1,1 ) ほとんどの場合、アンカー ソース チャネルのペアが存在しないため、自動的に '0' または 'NaN' が返されます。

4

1 に答える 1

1

sidと引数を取り、aid必要なすべてのデータを含む単一の構造体を返す関数があるとします。

res = function sample(Blink, AID, SID)

私が言ったように、これはフィールドをres持つ構造体です 、 など...rss_dBm1rss_dBm2

また、2 つの配列もあります。

SIDS = [30,50,52,54,55,57];
AIDS = [30,50,52,54,55,57];

SID と AID のすべてのペアを取得するには、functionを使用meshgridできます。

[sid aid] = meshgrid(SIDS, AIDS);

各ペアに対して関数を呼び出すには、 function を使用できarrayfunます。

fn = @(sid, aid) sample(Blink, sid, aid);
data = arrayfun(fn, sid, aid);

dataここにlength(SIDS) x length(AIDS)構造行列があります。ここでは、匿名関数 (ラムダ式)を使用して、関数の最初の引数を部分的に適用sampleしました。

関数を変更したくない場合は、そのまま使用できます。

fn = @(sid, aid) sample(Blink, sid, aid);
[rss_dBm1,rss_dBm2,rss_dBm3,rss_dBm4,y1,y2,y3,y4] = arrayfun(fn, sid, aid);

この場合、返される変数はlength(SIDS) x length(AIDS)配列になります。

于 2013-04-18T10:52:01.743 に答える