任何語言動起手來都是很有趣的

今天主要動手實現了下論文《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沒有解決,明天繼續奮鬥······

 

晚上的時候去聽了課,感覺自己真的是比那些有心人落下了,人家看着詞彙能那麼流利的說出來,我很汗顏啊,不過自己還有機會,加油!!!

男生就是需要增長自己的本領,擁有活躍的大腦和強壯的身體。

發佈了56 篇原創文章 · 獲贊 2 · 訪問量 2萬+
發表評論
所有評論
還沒有人評論,想成為第一個評論的人麼? 請在上方評論欄輸入並且點擊發布.
相關文章