2

此代码应生成相同的输出。但是 c 输出似乎被四舍五入,而 c++ 不是。我不明白这里发生了什么。请解释。

在我展示代码之前,相同的值被传递给 c 和 c++ 代码。

c代码:

unsigned int sz1=sz+1; 
double* bMat = (double*)calloc(bMatSize,bMatSize * sizeof(double));

for (unsigned int ii = 0; ii<sz; ii++)
    for (unsigned int jj = 0; jj <= ii; jj++)
    {
       bMat[jj*sz1 + ii] = simgms_math_ddot(numBFunc, queueTest[ii], queueTest[jj] );
       bMat[ii*sz1 + jj] = bMat[jj*sz1 + ii];
    }

C++代码:

std::vector<double> bMat;
unsigned int sz1=sz+1;
bMat.resize(sz1*sz1);
for(unsigned int ii=0; ii<sz; ii++)
    for(unsigned int jj=0; jj<=ii; jj++)
    {
        bMat.at(jj*sz1+ii)=simgms_math_ddot(numBFunc, queueTest.at(ii).data(), queueTest.at(jj).data());
        bMat.at(ii*sz1+jj)=bMat.at(jj*sz1+ii);
    }

for (int i = 0; i < bMat.size(); ++i) {
   std::cout << bMat[i] << ' ';
}
std::cout << std::endl;

常用功能

double simgms_math_ddot(unsigned int numElements, double aMat[], double bMat[])

{
    const MKL_INT n=numElements;

    double res = cblas_ddot(n, aMat, 1, bMat, 1);

    return res;
}

c c 输出 (bMat)

0 0 -1 0 0 -1 -1 -1 0  

时间:2019-05-10 标签:c++coutput(bMat)

 1.05e-05 0.00134 -1 0.00134 1.11 -1 -1 -1 0 

并且误差矩阵包含值:

1.78e-15 0.387 1.3 -0.48 -17.5 2.28 -0.387 -1.78e-15 1.48 -0.33 -17.3 2.4 -1.3 -1.48 -1.11e-16 1.08 -0.926 2.41 0.48 0.33 -1.08 0 0.551 0.74 17.5 17.3 0.926 -0.551 0 -0.384 -2.28 -2.4 -2.41 -0.74 0.384 0

std::deque< double* > queueTest;

....它充满了 errorMatrix 元素,它们是 2d 数组,

 e.g: queueTest.push_front(errorMatrix);
4

1 回答 1

1

问题可能是因为您存储queueTestdeque.

queueTest.at(ii).data()

毫无问题地到达第 i 个元素(但很O(n)复杂,并且可以让您认为它是索引访问,而实际上不是),但是如果您将第一个元素的地址传递std::deque给您的 C 程序,添加偏移量将不起作用,因为,与std::vector内存不同,std::deque内存不是连续的(它是一个链表),因此您将获得系数的随机数据。

来自http://www.cplusplus.com/reference/deque/deque/

与向量不同,双端队列不能保证将其所有元素存储在连续的存储位置:通过偏移指向另一个元素的指针来访问双端队列中的元素会导致未定义的行为

能够从 C 端使用它的快速修复是将您的转换dequevector.

于 2017-06-21T20:12:05.267 回答