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
此处 TrainingLabels 的大小为21,000 * 1,并按排序顺序包含257个标签。例如001,001,001,001,001,001 ..... 002,002,002 ....... 257,257。
TrainingFeatures 的大小为21,000 * 4096,包含一些值。
排名的大小为257 * 4096。 排名包含排名,例如(3076,456,765,4000,87,5,.....)。这就是第一行的样子。这意味着在 TrainingFeatures 中输入3076处的所有第一个标签已经获得了第一名。
此代码需要太多的计算时间(以天为单位)。可以有任何方式,以便花费更少的时间。 Matlab或Python中的代码可以工作。
答案 0 :(得分:0)
一般来说,在MATLAB中你想避免循环。特别是,看起来你最大的问题是你的内循环;而不是单步执行count(i)
个项目,一次复制整个块会更快。这应该是可能的,因为看起来你每次都使用相同大小的TrainingFeatures块(i和k都不依赖于循环)。所以你应该能够做类似
NTrainingFeature(num:num+count(i),:) = TrainingFeatures(num:num+count(i),ranking(i,1:k));
num = num + count(i) + 1;
我肯定会对此进行测试(可能在您的数据或较小矩阵的子集上)以确保所有内容都正常排列。如果无法访问您的代码进行测试,我可能在设置索引时犯了一个错误,或者矩阵形状可能不匹配。如果您在将矩阵索引和形状排成一行时遇到问题,可以尝试使用reshape()
或使用单索引调用。