你能减少这个matlab代码的计算时间吗?

时间:2017-10-14 01:36:19

标签: python matlab python-3.x

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中的代码可以工作。

1 个答案:

答案 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()或使用单索引调用。

相关问题