基站寻找邻居节点索引号的MATLAB代码

基站邻居的MATLAB代码记录:

调用方式:

M = 100; % BS总数, 要求: 4 9 16 25 36 49 64 81 100 ....
index_BS = 20;
neighbor = find_neighbor( index_BS , M ) ;
function  neighbor = find_neighbor( index_BS , M ) 
% 本代码是为基站寻找邻居的代码。任意一个基站索引都可以找到其邻居节点(index_BS为基站索引)
% 注意,这里的索引是按行排列的,若有M=100,则为10*10的基站,每行10个,一共10行,索引号按行排列
sqrt_M = sqrt(M);
if floor( sqrt_M )^2 ~= M 
    disp(['本仿真中,BS数量必须是平方数']);
    throw(exception);
end
line =  mod ( index_BS-1 , sqrt_M ) + 1 ;
%disp(['当前仿真共有',num2str(M),'个基站,即:',num2str(sqrt_M),'×',num2str(sqrt_M),' 。当前基站索引号为',num2str(index_BS),',该基站位于第',num2str(line),'列']);
if mod( line , 2 ) == 0  % 位于偶数列还是奇数列
    neighbor = [index_BS-sqrt_M-1 ; index_BS-sqrt_M ; index_BS-sqrt_M+1 ;  index_BS-1 ;  index_BS;   index_BS+1 ;  index_BS+sqrt_M ];    % 针对非边缘"偶数"节点
    %disp(['备注:偶数列']);
    neighbor( find ( neighbor<=0 | neighbor>sqrt_M*sqrt_M )  ) = [];  % 处理上下边缘
    if line == 1  %左边缘
        %disp(['备注:偶数列的左边缘节点']);
        neighbor ( find ( neighbor == index_BS-sqrt_M-1  |  neighbor == index_BS-1 ) ) = [];
    elseif line == sqrt_M & mod( sqrt_M , 2) ==0  %右边缘 且一行为偶数个BS
        %disp(['备注:偶数列的右边缘节点']);
        neighbor ( find ( neighbor == index_BS-sqrt_M+1  |  neighbor == index_BS+1 ) ) = [];
    elseif line == sqrt_M & mod( sqrt_M , 2) ==1  %右边缘 且一行为奇数个BS
        disp(['备注:不存在这种可能']);
    end
else
    neighbor = [ index_BS-sqrt_M ;  index_BS-1 ;  index_BS;   index_BS+1 ;  index_BS+sqrt_M-1 ; index_BS+sqrt_M ; index_BS+sqrt_M+1 ];   % 针对非边缘"奇数"节点
    %disp(['备注:奇数列']);
    neighbor( find ( neighbor<=0 | neighbor>sqrt_M*sqrt_M )) = [];  % 处理上下边缘
    if line == 1  %左边缘
        %disp(['备注:奇数列的左边缘节点']);
        neighbor ( find ( neighbor == index_BS+sqrt_M-1  |  neighbor == index_BS-1 ) ) = [];
    elseif line == sqrt_M & mod( sqrt_M , 2) ==0  %右边缘 且一行为偶数个BS
        disp(['备注:不存在这种可能']);
    elseif line == sqrt_M & mod( sqrt_M , 2) ==1  %右边缘 且一行为奇数个BS
        %disp(['备注:奇数列的右边缘节点']);
        neighbor( find (  neighbor == index_BS+1   |  neighbor == index_BS+sqrt_M+1 )  ) = []; 
    end
end


end


case1 运行结果:

基站索引编号如下图:

case 2 运行结果:

基站索引编号如下图:

任意两个基站之间跳数计算代码:

function  [hop] = find_BS_distance( index_BS_1 , index_BS_2 , M ) 
% 本代码是为任意两个基站寻找最短跳数的代码

sqrt_M = sqrt(M);

line_1 =  mod ( index_BS_1-1 , sqrt_M ) + 1 ;
line_2 =  mod ( index_BS_2-1 , sqrt_M ) + 1 ;

flag_1 = mod( line_1 , 2 );    % flag = 1 则为下行;  flag = 0 则为上行;
flag_2 = mod( line_2 , 2 );    % flag = 1 则为下行;  flag = 0 则为上行;



row_1 = ceil( index_BS_1 / sqrt_M );
line_1 =  mod ( index_BS_1-1 , sqrt_M ) + 1 ;

row_2 = ceil( index_BS_2 / sqrt_M );
line_2 =  mod ( index_BS_2-1 , sqrt_M ) + 1 ;

line_dis = abs( line_1 - line_2 );
row_dis = abs( row_1 - row_2 );

if (row_1<row_2 & flag_1==0 & flag_2==1) | (row_2<row_1 & flag_2==0 & flag_1==1) | (row_2==row_1 & flag_1~=flag_2)
    row_dis = row_dis + 1; % 由于行的上下位导致的多一跳
end


if mod( line_dis , 2 ) == 0  %列差为偶数
    hop = row_dis + (line_dis / 2) ;
else
    hop = row_dis + ( (line_dis-1) / 2) ;
end
end

case 3 运行结果:

评论
添加红包

请填写红包祝福语或标题

红包个数最小为10个

红包金额最低5元

当前余额3.43前往充值 >
需支付:10.00
成就一亿技术人!
领取后你会自动成为博主和红包主的粉丝 规则
hope_wisdom
发出的红包
实付
使用余额支付
点击重新获取
扫码支付
钱包余额 0

抵扣说明:

1.余额是钱包充值的虚拟货币,按照1:1的比例进行支付金额的抵扣。
2.余额无法直接购买下载,可以购买VIP、付费专栏及课程。

余额充值