今天主要動手實現了下論文《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沒有解決,明天繼續奮鬥······
晚上的時候去聽了課,感覺自己真的是比那些有心人落下了,人家看着詞彙能那麼流利的說出來,我很汗顏啊,不過自己還有機會,加油!!!
男生就是需要增長自己的本領,擁有活躍的大腦和強壯的身體。