任何语言动起手来都是很有趣的

今天主要动手实现了下论文《A real-time subcarrier allocation scheme for multiuser access````》的代码部分,实现了对各个用户子载波进行排序,进行标号,信道增益最大的表为1,其次的表为2,一次类推,具体MATLAB代码如下

function result = MatrixSort(Matrix)
[m,n] = size(Matrix);
temp = Matrix;
temp = temp';
result = zeros(n,m);
for i=1:n
     [Y,I] = max(temp);
     for j = 1:m
        result(I(j),j) = i;
        
        temp(I(j),j) = 0;
     end
     if(temp == zeros(n,m))
         break;
     end
end
result = result';

这个其实没什么难度,比较难的MATLAB都给我们封装好了,只需我们调用就好了。比如,找到最大值所在的位置

备注:其实这样正好为后面的分配打下了基础:子载波分配的一个约束条件,每一个子载波只能分配给一个用户

排完序之后,还需要分配,这样就需要找到每一个子载波中的最大的增益那个

具体的代码如下:可是在MATLAB7.0的环境中运行,如果不设断点的话,运行起来总是计算遥遥无期,CPU使用率达到60%以上,还退不出来,只能任务管理器中强制退出,说明我的代码里面有很多bug

function result = InitialAlloction(ChannelGainSortN,eedSubNumber)
%使用排序好的信道增益顺序表,来预分配
%
%分配的原则是遍历每一列,按照优先级来分配
%分配达到每个用户目标的数量
clc
Channel = rand(4,20);
ChannelGainSort = MatrixSort(Channel);
[m,n] = size(ChannelGainSort);
result = zeros(m,n);                            
NeedSubNumber = 5;                              %暂定每个用户需要5个子载波
UserSubTotal = zeros(m,1);
for i = 1:n
    [Y,I] = min(ChannelGainSort(:,i));
    if (UserSubTotal(I) < NeedSubNumber)
        result(I,i) = 1;
    end
    if(UserSubTotal(I) == NeedSubNumber)
        continue;
    end
    UserSubTotal = sum(result,2);
end
%下面是整理那些初次分配之后还没有分配出去的子载波
TempTotal = sum(result,1);              %在完全分配的情况下,应该是一个1矩阵
while min(TempTotal) ~= 1
    b = find(TempTotal == 0);                    %用b来记录那些每一列和还是0的位置
    LeftSubNumber = length(b);

    c = find(UserSubTotal < NeedSubNumber);         %找到那些仍需要子载波的用户
    for i = b
        TempMin = n+1;                              %这里是要设定一个初始的值n+1
                                                    %因为每次排序最大的值是n
        for j = c
            if(TempMin > ChannelGainSort(j,i))
                TempMin = ChannelGainSort(j,i);
                Xlabel = j;
                Ylabel = i;
            end
        end                                         %这次循环之后找到了剩下的列数
                                                    %中的最大的增益
        UserSubTotal = sum(result,2);
        if(UserSubTotal(Xlabel) ~= NeedSubNumber)
            result(Xlabel,Ylabel) = 1;
        end
        TempTotal = sum(result,1);
    end
end
UserSubTotal = sum(result,2);
result
UserSubTotal

这个代码里面显示设定一个每个用户需要的最忌子载波数量,然后依次去分配

在第一个循环结束之后,可能还有些没有分配出去,这是因为有可能某个用户在该载波上的增益最大,但是她已经达到所需的子载波数了,因此只能让贤,但这时候仅仅在那个循环里面是不能找到分配给谁,因此需要第二个循环。

我的问题就是出在第二个循环那里,如果不设断点的话,似乎进入死循环,很郁闷

还有一个cost function没有解决,明天继续奋斗······

 

晚上的时候去听了课,感觉自己真的是比那些有心人落下了,人家看着词汇能那么流利的说出来,我很汗颜啊,不过自己还有机会,加油!!!

男生就是需要增长自己的本领,拥有活跃的大脑和强壮的身体。

  • 0
    点赞
  • 1
    收藏
    觉得还不错? 一键收藏
  • 0
    评论
评论
添加红包

请填写红包祝福语或标题

红包个数最小为10个

红包金额最低5元

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

抵扣说明:

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

余额充值