I have attached a sample code below:
main:
=====
int main(int argc, char **argv)
{
Mat test = makeTestMat(3, 3);
wlsFilter(test, test);
return 0;
}
wlsFilter:
=======
void wlsFilter(Mat& src, Mat& dst, float lambda, float alpha)
{
float eps = 2.2204e-11;
float smallNum = 0.0001;
Mat L;
cv::log(src + eps, L);
int r = src.rows;
int c = src.cols;
int k = r*c;
Mat dy;
diffy(L, dy);
dy = F(dy, lambda, alpha, smallNum);
copyMakeBorder(dy, dy, 0, 1, 0, 0, BORDER_CONSTANT, Scalar::all(0));
dy = dy.t();
dy = dy.reshape(1, k);
Mat dx;
diffx(L, dx);
dx = F(dx, lambda, alpha, smallNum);
copyMakeBorder(dx, dx, 0, 0, 0, 1, BORDER_CONSTANT, Scalar::all(0));
dx = dx.t();
dx = dx.reshape(1, k);
Mat B = Mat(k, 2, CV_32FC1);
dx.copyTo(B.col(0));
dy.copyTo(B.col(1));
Mat e = dx.clone();
Mat w;
copyMakeBorder(dx, w, r, 0, 0, 0, BORDER_CONSTANT, Scalar::all(0));
w = w.rowRange(0, w.rows - r);
Mat s = dy.clone();
Mat n;
copyMakeBorder(dy, n, 1, 0, 0, 0, BORDER_CONSTANT, Scalar::all(0));
n = n.rowRange(0, n.rows - 1);
Mat D = 1 - (e + w + s + n);
solveSparse_MKL(src, B, D, r, dst);
}
solveSparse_MKL:
================
void solveSparse_MKL(Mat& img, Mat& B, Mat& D, int r, Mat &dst)
{
MKL_INT* i_csr = 0;
MKL_INT* j_csr = 0;
double* a_csr = 0;
_DOUBLE_PRECISION_t* rhs = 0;
MKL_INT nNonZeros = spDiag2_MKL(B, -r, -1, D, i_csr, j_csr, a_csr);
.
.
.
.
}
spDiag2_MKL:
============
int spDiag2_MKL(Mat& B, int d1, int d2, Mat& D, MKL_INT*& i_csr, MKL_INT*& j_csr, double*& a_csr)
{
MKL_INT* rowind = 0;
MKL_INT* colind = 0;
double* acoo = 0;
MKL_INT nnz = 0;
Vec2i off1, off2;
if (d1 > 0) { off1 = Vec2i(0, d1); }
else { off1 = Vec2i(-d1, 0); }
if (d2 > 0) { off2 = Vec2i(0, d2); }
else { off2 = Vec2i(-d2, 0); }
for (int i = 0; i < B.rows; ++i)
{
int i1 = i + off1[0];
int j1 = i + off1[1];
int i2 = i + off2[0];
int j2 = i + off2[1];
if (i1 < B.rows && j1 < B.rows)
{
nnz++;
}
if (i2 < B.rows && j2 < B.rows)
{
nnz++;
}
++nnz;
}
rowind = new MKL_INT[nnz];
colind = new MKL_INT[nnz];
acoo = new double[nnz];
MKL_INT ind = 0;
for (int i = 0; i < B.rows; ++i)
{
int i1 = i + off1[0];
int j1 = i + off1[1];
int i2 = i + off2[0];
int j2 = i + off2[1];
if (i1 < B.rows && j1 < B.rows)
{
if (j1 > i1)
{
rowind[ind] = i1 + 1;
colind[ind] = j1 + 1;
acoo[ind] = B.at<float>(i, 0);
++ind;
}
else
{
rowind[ind] = j1 + 1;
colind[ind] = i1 + 1;
acoo[ind] = B.at<float>(i, 0);
++ind;
}
}
if (i2 < B.rows && j2 < B.rows)
{
if (j2 > i2)
{
rowind[ind] = i2 + 1;
colind[ind] = j2 + 1;
acoo[ind] = B.at<float>(i, 1);
++ind;
}
else
{
rowind[ind] = j2 + 1;
colind[ind] = i2 + 1;
acoo[ind] = B.at<float>(i, 1);
++ind;
}
}
rowind[ind] = i + 1;
colind[ind] = i + 1;
acoo[ind] = D.at<float>(i);
++ind;
}
MKL_INT m = B.rows;
MKL_INT n = B.rows;
a_csr = new double[nnz];
i_csr = new MKL_INT[m + 1]; // m+1
j_csr = new MKL_INT[nnz];
MKL_INT info;
MKL_INT job[8] = { 2, // COO to CSR
1, // 1 based indexing in CSR rows
1, // 1 based indexing in CSR cols
0, //
nnz, // number of the non-zero elements
0, // job indicator
0,
0
};
mkl_dcsrcoo(job, &m, a_csr, j_csr, i_csr, &nnz, acoo, rowind, colind, &info);
.
.
.
.
}
Description:
I the above code "mkl_dcsrcoo(job, &m, a_csr, j_csr, i_csr, &nnz, acoo, rowind, colind, &info);"
The values of m,nnz,acoo,rowind,colind are same in both windows and unix
But the a_csr,j_csr,i_csr values differs.
Can you pls tell why its differs?
Before calling the mkl_dcsrcoo the values are same,but after calling the method the values differs,so i hope the issue occurs in the "mkl_dcsrcoo" method.
Pls suggest any solutions?
Thanks in advance.
Regards,
CIBIN