今天主要动手实现了下论文《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没有解决,明天继续奋斗······
晚上的时候去听了课,感觉自己真的是比那些有心人落下了,人家看着词汇能那么流利的说出来,我很汗颜啊,不过自己还有机会,加油!!!
男生就是需要增长自己的本领,拥有活跃的大脑和强壮的身体。