我正在nanmean用 OpenCV 编写一个经典函数。我尝试模拟 MatLab 的nanmean默认行为(即nanmean在第一维上减少)。CV_32F我生成一个随机大小的矩阵,最多可以有CV_64F4 个通道。我按照统一法则用随机值填充它。然后我使用std::numerical_limits<float>(if CV_32F, doubleelse)为 Nan 分配一些值:: quiet_NaN();
在调试步骤中,我正在寻找问题并打印以下内容:
T v = *it_src;
std::cout<<"v before: "<<v<<" "<<std::isnan(v)<<" "<<cvIsNaN(v)<<" "<<(v==v)<<" "<<" "<<std::isinf(v)<<" "<<((v+v)==v)<<std::endl;
Run Code Online (Sandbox Code Playgroud)
T 是模板类型,它可以是float或double,不能是其他。
输出是:
v before: nan 0 0 1 0 1
Run Code Online (Sandbox Code Playgroud)
所以该值是“nan”,但“std::isnan”和“CvIsNan”都无法检测到它。IEEE 754 的比较功能(如果 v 是 Nan 则v == v应该为 false)失败(v == v返回true)。唯一有效的是最后一个检查 ( (v+v) == v)。
我有几个问题: …
我想将双精度值的向量转换为char.我必须制作两种不同的方法,一种用于SSE2,另一种用于AVX2.
我开始使用AVX2.
__m128i sub_proc(__m256d& in)
{
__m256d _zero_pd = _mm256_setzero_pd();
__m256d ih_pd = _mm256_unpackhi_pd(in,_zero_pd);
__m256d il_pd = _mm256_unpacklo_pd(in,_zero_pd);
__m128i ih_si = _mm256_cvtpd_epi32(ih_pd);
__m128i il_si = _mm256_cvtpd_epi32(il_pd);
ih_si = _mm_shuffle_epi32(ih_si,_MM_SHUFFLE(3,1,2,0));
il_si = _mm_shuffle_epi32(il_si,_MM_SHUFFLE(3,1,2,0));
ih_si = _mm_packs_epi32(_mm_unpacklo_epi32(il_si,ih_si),_mm_unpackhi_epi32(il_si,ih_si));
return ih_si;
}
__m128i proc(__m256d& in1,__m256d& in2)
{
__m256d _zero_pd = _mm_setzeros_pd();
__m128i in1_si = sub_proc(in1);
__m128i in2_si = sub_proc(in2);
return _mm_packs_epi16(in1_si,in2_si);
}
int main()
{
double input[32] = {1,2,3,4,5,6,7,8,9,10,11,12,13,14,15,16,17,18,19,20,21,22,23,24,25,26,27,28,29,30,31,32};
char output[32] = {0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0};
char check[8];
double* ibeg = input;
char* obeg = output;
for(int …Run Code Online (Sandbox Code Playgroud)