Skip to content
体验新版
项目
组织
正在加载...
登录
切换导航
打开侧边栏
Greenplum
Opencv
提交
91634719
O
Opencv
项目概览
Greenplum
/
Opencv
11 个月 前同步成功
通知
7
Star
0
Fork
0
代码
文件
提交
分支
Tags
贡献者
分支图
Diff
Issue
0
列表
看板
标记
里程碑
合并请求
0
DevOps
流水线
流水线任务
计划
Wiki
0
Wiki
分析
仓库
DevOps
项目成员
Pages
O
Opencv
项目概览
项目概览
详情
发布
仓库
仓库
文件
提交
分支
标签
贡献者
分支图
比较
Issue
0
Issue
0
列表
看板
标记
里程碑
合并请求
0
合并请求
0
Pages
DevOps
DevOps
流水线
流水线任务
计划
分析
分析
仓库分析
DevOps
Wiki
0
Wiki
成员
成员
收起侧边栏
关闭侧边栏
动态
分支图
创建新Issue
流水线任务
提交
Issue看板
体验新版 GitCode,发现更多精彩内容 >>
提交
91634719
编写于
11月 08, 2012
作者:
V
Vadim Pisarevsky
浏览文件
操作
浏览文件
下载
电子邮件补丁
差异文件
improved accuracy of 3x3 invert on poorly-conditioned matrices (bug #2525)
上级
64847325
变更
2
隐藏空白更改
内联
并排
Showing
2 changed file
with
28 addition
and
54 deletion
+28
-54
modules/core/src/lapack.cpp
modules/core/src/lapack.cpp
+13
-54
modules/core/test/test_math.cpp
modules/core/test/test_math.cpp
+15
-0
未找到文件。
modules/core/src/lapack.cpp
浏览文件 @
91634719
...
...
@@ -954,7 +954,7 @@ double cv::invert( InputArray _src, OutputArray _dst, int method )
size_t
esz
=
CV_ELEM_SIZE
(
type
);
int
m
=
src
.
rows
,
n
=
src
.
cols
;
if
(
method
==
DECOMP_SVD
)
if
(
method
==
DECOMP_SVD
)
{
int
nm
=
std
::
min
(
m
,
n
);
...
...
@@ -1101,62 +1101,21 @@ double cv::invert( InputArray _src, OutputArray _dst, int method )
result
=
true
;
d
=
1.
/
d
;
#if CV_SSE2
if
(
USE_SSE2
)
{
__m128
det
=
_mm_set1_ps
((
float
)
d
);
__m128
s0
=
_mm_loadu_ps
((
const
float
*
)
srcdata
);
//s0 = Sf(0,0) Sf(0,1) Sf(0,2) ***
__m128
s1
=
_mm_loadu_ps
((
const
float
*
)(
srcdata
+
srcstep
));
//s1 = Sf(1,0) Sf(1,1) Sf(1,2) ***
__m128
s2
=
_mm_set_ps
(
0.
f
,
Sf
(
2
,
2
),
Sf
(
2
,
1
),
Sf
(
2
,
0
));
//s2 = Sf(2,0) Sf(2,1) Sf(2,2) ***
__m128
r0
=
_mm_shuffle_ps
(
s1
,
s1
,
_MM_SHUFFLE
(
3
,
0
,
2
,
1
));
//r0 = Sf(1,1) Sf(1,2) Sf(1,0) ***
__m128
r1
=
_mm_shuffle_ps
(
s2
,
s2
,
_MM_SHUFFLE
(
3
,
1
,
0
,
2
));
//r1 = Sf(2,2) Sf(2,0) Sf(2,1) ***
__m128
r2
=
_mm_shuffle_ps
(
s2
,
s2
,
_MM_SHUFFLE
(
3
,
0
,
2
,
1
));
//r2 = Sf(2,1) Sf(2,2) Sf(2,0) ***
__m128
t0
=
_mm_mul_ps
(
s0
,
r0
);
//t0 = Sf(0,0)*Sf(1,1) Sf(0,1)*Sf(1,2) Sf(0,2)*Sf(1,0) ***
__m128
t1
=
_mm_mul_ps
(
s0
,
r1
);
//t1 = Sf(0,0)*Sf(2,2) Sf(0,1)*Sf(2,0) Sf(0,2)*Sf(2,1) ***
__m128
t2
=
_mm_mul_ps
(
s1
,
r2
);
//t2 = Sf(1,0)*Sf(2,1) Sf(1,1)*Sf(2,2) Sf(1,2)*Sf(2,0) ***
__m128
r3
=
_mm_shuffle_ps
(
s0
,
s0
,
_MM_SHUFFLE
(
3
,
0
,
2
,
1
));
//r3 = Sf(0,1) Sf(0,2) Sf(0,0) ***
__m128
r4
=
_mm_shuffle_ps
(
s0
,
s0
,
_MM_SHUFFLE
(
3
,
1
,
0
,
2
));
//r4 = Sf(0,2) Sf(0,0) Sf(0,1) ***
__m128
t00
=
_mm_mul_ps
(
s1
,
r3
);
//t00 = Sf(1,0)*Sf(0,1) Sf(1,1)*Sf(0,2) Sf(1,2)*Sf(0,0) ***
__m128
t11
=
_mm_mul_ps
(
s2
,
r4
);
//t11 = Sf(2,0)*Sf(0,2) Sf(2,1)*Sf(0,0) Sf(2,2)*Sf(0,1) ***
__m128
t22
=
_mm_mul_ps
(
s2
,
r0
);
//t22 = Sf(2,0)*Sf(1,1) Sf(2,1)*Sf(1,2) Sf(2,2)*Sf(1,0) ***
t0
=
_mm_mul_ps
(
_mm_sub_ps
(
t0
,
t00
),
det
);
//Sf(0,0)*Sf(1,1) Sf(0,1)*Sf(1,2) Sf(0,2)*Sf(1,0) ***
//-Sf(1,0)*Sf(0,1) -Sf(1,1)*Sf(0,2) -Sf(1,2)*Sf(0,0)
t1
=
_mm_mul_ps
(
_mm_sub_ps
(
t1
,
t11
),
det
);
//Sf(0,0)*Sf(2,2) Sf(0,1)*Sf(2,0) Sf(0,2)*Sf(2,1) ***
//-Sf(2,0)*Sf(0,2) -Sf(2,1)*Sf(0,0) -Sf(2,2)*Sf(0,1)
t2
=
_mm_mul_ps
(
_mm_sub_ps
(
t2
,
t22
),
det
);
//Sf(1,0)*Sf(2,1) Sf(1,1)*Sf(2,2) Sf(1,2)*Sf(2,0) ***
//-Sf(2,0)*Sf(1,1) -Sf(2,1)*Sf(1,2) -Sf(2,2)*Sf(1,0)
_mm_store_ps
(
t
,
t0
);
_mm_store_ps
(
t
+
4
,
t1
);
_mm_store_ps
(
t
+
8
,
t2
);
Df
(
0
,
0
)
=
t
[
9
];
Df
(
0
,
1
)
=
t
[
6
];
Df
(
0
,
2
)
=
t
[
1
];
Df
(
1
,
0
)
=
t
[
10
];
Df
(
1
,
1
)
=
t
[
4
];
Df
(
1
,
2
)
=
t
[
2
];
Df
(
2
,
0
)
=
t
[
8
];
Df
(
2
,
1
)
=
t
[
5
];
Df
(
2
,
2
)
=
t
[
0
];
}
else
#endif
{
t
[
0
]
=
(
float
)(((
double
)
Sf
(
1
,
1
)
*
Sf
(
2
,
2
)
-
(
double
)
Sf
(
1
,
2
)
*
Sf
(
2
,
1
))
*
d
);
t
[
1
]
=
(
float
)(((
double
)
Sf
(
0
,
2
)
*
Sf
(
2
,
1
)
-
(
double
)
Sf
(
0
,
1
)
*
Sf
(
2
,
2
))
*
d
);
t
[
2
]
=
(
float
)(((
double
)
Sf
(
0
,
1
)
*
Sf
(
1
,
2
)
-
(
double
)
Sf
(
0
,
2
)
*
Sf
(
1
,
1
))
*
d
);
t
[
0
]
=
(
float
)(((
double
)
Sf
(
1
,
1
)
*
Sf
(
2
,
2
)
-
(
double
)
Sf
(
1
,
2
)
*
Sf
(
2
,
1
))
*
d
);
t
[
1
]
=
(
float
)(((
double
)
Sf
(
0
,
2
)
*
Sf
(
2
,
1
)
-
(
double
)
Sf
(
0
,
1
)
*
Sf
(
2
,
2
))
*
d
);
t
[
2
]
=
(
float
)(((
double
)
Sf
(
0
,
1
)
*
Sf
(
1
,
2
)
-
(
double
)
Sf
(
0
,
2
)
*
Sf
(
1
,
1
))
*
d
);
t
[
3
]
=
(
float
)(((
double
)
Sf
(
1
,
2
)
*
Sf
(
2
,
0
)
-
(
double
)
Sf
(
1
,
0
)
*
Sf
(
2
,
2
))
*
d
);
t
[
4
]
=
(
float
)(((
double
)
Sf
(
0
,
0
)
*
Sf
(
2
,
2
)
-
(
double
)
Sf
(
0
,
2
)
*
Sf
(
2
,
0
))
*
d
);
t
[
5
]
=
(
float
)(((
double
)
Sf
(
0
,
2
)
*
Sf
(
1
,
0
)
-
(
double
)
Sf
(
0
,
0
)
*
Sf
(
1
,
2
))
*
d
);
t
[
3
]
=
(
float
)(((
double
)
Sf
(
1
,
2
)
*
Sf
(
2
,
0
)
-
(
double
)
Sf
(
1
,
0
)
*
Sf
(
2
,
2
))
*
d
);
t
[
4
]
=
(
float
)(((
double
)
Sf
(
0
,
0
)
*
Sf
(
2
,
2
)
-
(
double
)
Sf
(
0
,
2
)
*
Sf
(
2
,
0
))
*
d
);
t
[
5
]
=
(
float
)(((
double
)
Sf
(
0
,
2
)
*
Sf
(
1
,
0
)
-
(
double
)
Sf
(
0
,
0
)
*
Sf
(
1
,
2
))
*
d
);
t
[
6
]
=
(
float
)(((
double
)
Sf
(
1
,
0
)
*
Sf
(
2
,
1
)
-
(
double
)
Sf
(
1
,
1
)
*
Sf
(
2
,
0
))
*
d
);
t
[
7
]
=
(
float
)(((
double
)
Sf
(
0
,
1
)
*
Sf
(
2
,
0
)
-
(
double
)
Sf
(
0
,
0
)
*
Sf
(
2
,
1
))
*
d
);
t
[
8
]
=
(
float
)(((
double
)
Sf
(
0
,
0
)
*
Sf
(
1
,
1
)
-
(
double
)
Sf
(
0
,
1
)
*
Sf
(
1
,
0
))
*
d
);
t
[
6
]
=
(
float
)(((
double
)
Sf
(
1
,
0
)
*
Sf
(
2
,
1
)
-
(
double
)
Sf
(
1
,
1
)
*
Sf
(
2
,
0
))
*
d
);
t
[
7
]
=
(
float
)(((
double
)
Sf
(
0
,
1
)
*
Sf
(
2
,
0
)
-
(
double
)
Sf
(
0
,
0
)
*
Sf
(
2
,
1
))
*
d
);
t
[
8
]
=
(
float
)(((
double
)
Sf
(
0
,
0
)
*
Sf
(
1
,
1
)
-
(
double
)
Sf
(
0
,
1
)
*
Sf
(
1
,
0
))
*
d
);
Df
(
0
,
0
)
=
t
[
0
];
Df
(
0
,
1
)
=
t
[
1
];
Df
(
0
,
2
)
=
t
[
2
];
Df
(
1
,
0
)
=
t
[
3
];
Df
(
1
,
1
)
=
t
[
4
];
Df
(
1
,
2
)
=
t
[
5
];
Df
(
2
,
0
)
=
t
[
6
];
Df
(
2
,
1
)
=
t
[
7
];
Df
(
2
,
2
)
=
t
[
8
];
}
Df
(
0
,
0
)
=
t
[
0
];
Df
(
0
,
1
)
=
t
[
1
];
Df
(
0
,
2
)
=
t
[
2
];
Df
(
1
,
0
)
=
t
[
3
];
Df
(
1
,
1
)
=
t
[
4
];
Df
(
1
,
2
)
=
t
[
5
];
Df
(
2
,
0
)
=
t
[
6
];
Df
(
2
,
1
)
=
t
[
7
];
Df
(
2
,
2
)
=
t
[
8
];
}
}
else
...
...
modules/core/test/test_math.cpp
浏览文件 @
91634719
...
...
@@ -2453,6 +2453,21 @@ REGISTER_TYPED_TEST_CASE_P(Core_CheckRange, Negative, Positive, Bounds, Zero);
typedef
::
testing
::
Types
<
signed
char
,
unsigned
char
,
signed
short
,
unsigned
short
,
signed
int
>
mat_data_types
;
INSTANTIATE_TYPED_TEST_CASE_P
(
Negative_Test
,
Core_CheckRange
,
mat_data_types
);
TEST
(
Core_Invert
,
small
)
{
cv
::
Mat
a
=
(
cv
::
Mat_
<
float
>
(
3
,
3
)
<<
2.42104644730331
,
1.81444796521479
,
-
3.98072565304758
,
0
,
7.08389214348967e-3
,
5.55326770986007e-3
,
0
,
0
,
7.44556154284261e-3
);
//cv::randu(a, -1, 1);
cv
::
Mat
b
=
a
.
t
()
*
a
;
cv
::
Mat
c
,
i
=
Mat_
<
float
>::
eye
(
3
,
3
);
cv
::
invert
(
b
,
c
,
cv
::
DECOMP_LU
);
//std::cout << b*c << std::endl;
ASSERT_LT
(
cv
::
norm
(
b
*
c
,
i
,
CV_C
),
0.1
);
cv
::
invert
(
b
,
c
,
cv
::
DECOMP_SVD
);
//std::cout << b*c << std::endl;
ASSERT_LT
(
cv
::
norm
(
b
*
c
,
i
,
CV_C
),
0.1
);
cv
::
invert
(
b
,
c
,
cv
::
DECOMP_CHOLESKY
);
//std::cout << b*c << std::endl;
ASSERT_LT
(
cv
::
norm
(
b
*
c
,
i
,
CV_C
),
0.1
);
}
/////////////////////////////////////////////////////////////////////////////////////////////////////
TEST
(
Core_CovarMatrix
,
accuracy
)
{
Core_CovarMatrixTest
test
;
test
.
safe_run
();
}
...
...
编辑
预览
Markdown
is supported
0%
请重试
或
添加新附件
.
添加附件
取消
You are about to add
0
people
to the discussion. Proceed with caution.
先完成此消息的编辑!
取消
想要评论请
注册
或
登录