2017-10-14 58 views
0
k=3000 
UnqLab = unique(TrainingLabels) 
n = length(UnqLab) 
count=hist(TrainingLabels,UnqLab); 
num = 1; 
for i = 1:n 
    fprintf('\n %i',i) 
    nn = count(i) 
    for j = 1:nn 
     NTrainingFeatures(num,:) = TrainingFeatures(num,ranking(i,1:k)) 
     num = num +1; 
    end 
end 

Here TrainingLabels的大小爲21,000 * 1,包含按排序順序排列的257個標籤。例如001,001,001,001,001,001 ...... 002,002,002 ....... 257,257。你能減少這個matlab代碼的計算時間嗎?

TrainingFeatures大小爲21,000 * 4096,包含一些值。

排名大小爲257 * 4096。 排名包含排名例如(3076,456,765,4000,87,5,.....)。這是第一排的樣子。這意味着所有第一個標籤在3076處輸入TrainingFeatures已經給出第一等級。

此代碼需要太多的計算時間(天)。有沒有什麼辦法可以減少時間。在Matlab或Python中的代碼將工作。

回答

0

一般在MATLAB中你想避免循環。特別是,它看起來像你最大的問題是你的內在循環;而不是逐步穿過count(i)項目,一次複製整個塊會更快。這應該是可能的,因爲它看起來每次都會採用相同大小的TrainingFeatures(我和k都不依賴於循環)。所以,你應該能夠做到像

NTrainingFeature(num:num+count(i),:) = TrainingFeatures(num:num+count(i),ranking(i,1:k)); 
num = num + count(i) + 1; 

我肯定會測試了這一點(也許您的數據或更小的矩陣的子集),以確保一切線正確。如果無法訪問您的代碼進行測試,我可能在設置索引時出錯,或者矩陣形狀可能不匹配。如果您無法將矩陣索引和形狀排列起來,您可以嘗試使用reshape()或使用單索引調用。

+0

如果您發現它有幫助,您介意接受答案嗎? – Mozglubov

+0

新的這裏..所以不知道它也是一個選項。 – AAA

+0

不用擔心,它只是有助於表明,如果問題出現在任何人的搜索中,問題都已得到解答。歡迎來到堆棧溢出! – Mozglubov