【发布时间】:2015-03-01 15:27:27
【问题描述】:
给定一个图像 I 和两个矩阵 m_1 ;m_2(与 I 大小相同)。函数 f 定义为: 因为我的目标设计想要得到 f 的符号。因此,函数 f 可以重写如下:
- 我认为第二个公式比第一个公式更快,因为:它 可以忽略平方项
- 它可以直接计算符号,而不是第一个等式中的两个步骤:计算 f 和检查符号。
你同意我的观点吗?你有另一个更快的公式 f
I =[16 23 11 42 10
11 21 22 24 30
16 22 154 155 156
25 28 145 151 156
11 38 147 144 153];
m1 =[0 0 0 0 0
0 0 22 11 0
0 23 34 56 0
0 56 0 0 0
0 11 0 0 0];
m2 =[0 0 0 0 0
0 0 12 11 0
0 22 111 156 0
0 32 0 0 0
0 12 0 0 0];
输出 f 是
f =[1 1 1 1 1
1 1 -1 1 1
1 1 1 1 1
1 1 1 1 1
1 1 1 1 1]
我实现了第一种方式,但是我没有通过matlab完成第二种方式。你能帮我看看第二种方法并比较一下吗
更新:我想添加 chepyle 和 Divakar 的代码以明确提出问题。请注意,它们都给出与上面相同的结果 f
function compare()
I =[16 23 11 42 10
11 21 22 24 30
16 22 154 155 156
25 28 145 151 156
11 38 147 144 153];
m1 =[0 0 0 0 0
0 0 22 11 0
0 23 34 56 0
0 56 0 0 0
0 11 0 0 0];
m2 =[0 0 0 0 0
0 0 12 11 0
0 22 111 156 0
0 32 0 0 0
0 12 0 0 0];
function f=first_way()
f=sign((I-m1).^2-(I-m2).^2);
f(f==0)=1;
end
function f= second_way()
f = double(abs(I-m1) >= abs(I-m2));
f(f==0) = -1;
end
function f= third_way()
v1=abs(I-m1);
v2=abs(I-m2);
f= int8(v1>v2) + -1*int8(v1<v2); % need to convert to int from logical
f(f==0) = 1;
end
disp(['First way : ' num2str(timeit(@first_way))])
disp(['Second way: ' num2str(timeit(@second_way))])
disp(['Third way : ' num2str(timeit(@third_way))])
end
First way : 1.2897e-05
Second way: 1.9381e-05
Third way : 2.0077e-05
【问题讨论】:
-
我不认为你的第二个公式是正确的,因为平方项会改变
v_i(x,y)的符号——除非你知道I >= m_i什么的。 -
您到底在寻找什么?第一个等式还是第二个等式与题名一致但与第一个等式不匹配?
-
@Divakar 和 angdaers3:对不起,我弄错了第二个等式。我更新它。让我们再检查一次。我的目标是以最快的方式检查方程 1 中方程 f 的符号。因为,我们只考虑 f 的符号而不考虑它的实际值,因此,我们可以重新公式化以缩短计算时间
-
@john2182 将我编辑的代码最后添加到您的基准测试中,还请增加数据大小?如果内存允许,我会建议这样的东西 -
N = 5000; I = randi(1000,N,N); m1 = randi(1000,N,N); m2 = randi(1000,N,N);。随意更改N,但尽量保持较大的数字。 -
@Divakar:我再检查一次。抱歉,我的预期结果必须将 0 转换为 1。这意味着结果 f 只有 {1;-1}。所以我们需要添加 f(f==0) = -1;你有其他方程式可以更快吗?我提出了一个从等式 1 扩展而来的等式 2
标签: performance matlab image-processing optimization matrix