I = imread('E:\学习文档\image\1.bmp');
[m,n] = size(origin_I);
PE_I = origin_I;
for i = 2: m - 1 %不是边界像素值
for j = 2: n - 1
a = origin_I(i-1,j-1);
b = origin_I(i-1,j);
c = origin_I(i-1,j+1);
d = origin_I(i,j-1);
e = origin_I(i,j+1);
f = origin_I(i+1,j-1);
g = origin_I(i+1,j);
h = origin_I(i+1,j+1);
x1 = sum(a+b+c+d+e+f+g+h)/8;%把邻域 8 个像素的均值作为初始值
x = [a,b,c,d,e,f,g,h];
for e = 1: 8 %计算各个方向的梯度
k(e) = x(e) - x1;
end
for t = 1: 8 %计算各方向梯度模的大小
p(t) = abs( k(t)) ;
end
p = sort(p);
k = sort(k);
for f3 = 1: 8 %计算各方向的权值
w(f3) = mse(f3) /sum(mse(f3)) ;
end
w = sort(w,1,'descend');%各个方向的权值进行降序排列
for i = 1: 8 %根据权值求出预测误差
m(i,j) = sum(w(i) * ((k(i) +x1)));
PE_I(i,j) = origin_I(i,j) - m(i,j);
end
end
end
我复现一下复杂度还是很高,有没有更好的方法
对于程序,衡量其好坏的重要标准是时间复杂度和空间复杂度。在可以完成目标任务的前提下,使程序具有较低的时间复杂度和较低的空间复杂度是我们一直追求的目标。
然而有时候两者不可兼得。在减少时间复杂度的状况下,空间复杂度往往会提高,而在减少空间复杂度的状况下,时间复杂度往往会提高。想要在二者之间得到平衡,显然,这不太容易,可谓是鱼和熊掌不可兼得!
好吧,开始我们的正题!
假设我们想象这样一个场景,在我们的电脑上有一份文件,上面保存了水果名称,比如类似这样的一些数据,苹果,梨,桃子,西瓜,葡萄,苹果,西瓜......。我们的目的是统计这些名称中谁出现的次数最多。
程序实现思路很简单,也就是初始化一个字典,如果该名称不存在,则将该名称加入字典,其值设为一,如果该名称已存在,则其值加一。
降低复杂度的核心方法主要三个步骤:
第一步,暴力解法。在没有任何时间、空间约束下,完成代码任务的开发。(没有太多的套路,只要围绕你面临的问题出发,大胆发挥想象去尝试解决即)
无效操作处理。将代码中的无效计算、无效存储剔除,降低时间或空间复杂度。(需要学会并掌握递归、二分法、排序算法、动态规划等常用的算法思维)
时空转换。设计合理数据结构,完成时间复杂度向空间复杂度的转移。(需要对数据的操作进行细分,全面掌握常见数据结构的基础知识,再围绕问题,有针对性的设计数据结构、采用合理的算法思维,去不断完成时空转移,降低时间复杂度)
我提升算法速度的一般方法:
把循环1:8的部分用数组运算替换可以降低复杂度。参考小例子:
>> a= [1 5 9 8 7 6]
a =
1 5 9 8 7 6
>> c=sum(a)/6
c =
6
>> b=a-c
b =
-5 -1 3 2 1 0
给几点建议:
对于程序,衡量其好坏的重要标准是时间复杂度和空间复杂度。在可以完成目标任务的前提下,使程序具有较低的时间复杂度和较低的空间复杂度是我们一直追求的目标。
然而有时候两者不可兼得。在减少时间复杂度的状况下,空间复杂度往往会提高,而在减少空间复杂度的状况下,时间复杂度往往会提高。想要在二者之间得到平衡,显然,这不太容易,可谓是鱼和熊掌不可兼得!