Я преобразовал векторный набор данных C++ в массив AC. Я передаю тот же набор данных в функцию, которая должна давать тот же вывод
Этот код должен генерировать тот же вывод. Но вывод 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 coutput (bMat)
0 0 -1 0 0 -1 -1 -1 0
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);
1 ответ
Проблема, вероятно, из-за того, как вы храните queueTest
в deque
,
queueTest.at(ii).data()
достигает элемента iith без проблем (но с O(n)
сложность, и может заставить вас думать, что это индексированный доступ, тогда как это не так), но если вы передадите адрес первого элемента std::deque
в вашей C-программе добавление смещения не будет работать, потому что, в отличие от std::vector
объем памяти, std::deque
память не является непрерывной (это связанный список), поэтому вы получаете случайные данные для ваших коэффициентов.
С http://www.cplusplus.com/reference/deque/deque/:
в отличие от векторов, deques не гарантирует хранение всех своих элементов в смежных местах хранения: доступ к элементам в deque путем смещения указателя на другой элемент вызывает неопределенное поведение.
Быстрое исправление, чтобы иметь возможность использовать его со стороны C, это преобразовать ваши deque
к vector
,