mirror of
https://gitlab.com/libeigen/eigen.git
synced 2025-04-20 08:39:37 +08:00
bug #367: fix double copies in atWithInsertion, and add respective unit-test
This commit is contained in:
parent
48d537f59f
commit
349c2c9235
@ -172,12 +172,31 @@ class CompressedStorage
|
|||||||
size_t id = searchLowerIndex(0,m_size,key);
|
size_t id = searchLowerIndex(0,m_size,key);
|
||||||
if (id>=m_size || m_indices[id]!=key)
|
if (id>=m_size || m_indices[id]!=key)
|
||||||
{
|
{
|
||||||
resize(m_size+1,1);
|
if (m_allocatedSize<m_size+1)
|
||||||
for (size_t j=m_size-1; j>id; --j)
|
|
||||||
{
|
{
|
||||||
m_indices[j] = m_indices[j-1];
|
m_allocatedSize = 2*(m_size+1);
|
||||||
m_values[j] = m_values[j-1];
|
internal::scoped_array<Scalar> newValues(m_allocatedSize);
|
||||||
|
internal::scoped_array<Index> newIndices(m_allocatedSize);
|
||||||
|
|
||||||
|
// copy first chunk
|
||||||
|
internal::smart_copy(m_values, m_values +id, newValues.ptr());
|
||||||
|
internal::smart_copy(m_indices, m_indices+id, newIndices.ptr());
|
||||||
|
|
||||||
|
// copy the rest
|
||||||
|
if(m_size>id)
|
||||||
|
{
|
||||||
|
internal::smart_copy(m_values +id, m_values +m_size, newValues.ptr() +id+1);
|
||||||
|
internal::smart_copy(m_indices+id, m_indices+m_size, newIndices.ptr()+id+1);
|
||||||
|
}
|
||||||
|
std::swap(m_values,newValues.ptr());
|
||||||
|
std::swap(m_indices,newIndices.ptr());
|
||||||
}
|
}
|
||||||
|
else if(m_size>id)
|
||||||
|
{
|
||||||
|
internal::smart_memmove(m_values +id, m_values +m_size, m_values +id+1);
|
||||||
|
internal::smart_memmove(m_indices+id, m_indices+m_size, m_indices+id+1);
|
||||||
|
}
|
||||||
|
m_size++;
|
||||||
m_indices[id] = key;
|
m_indices[id] = key;
|
||||||
m_values[id] = defaultValue;
|
m_values[id] = defaultValue;
|
||||||
}
|
}
|
||||||
|
@ -23,8 +23,8 @@ template<typename Scalar,typename Index> void sparse_vector(int rows, int cols)
|
|||||||
SparseVectorType v1(rows), v2(rows), v3(rows);
|
SparseVectorType v1(rows), v2(rows), v3(rows);
|
||||||
DenseMatrix refM1 = DenseMatrix::Zero(rows, rows);
|
DenseMatrix refM1 = DenseMatrix::Zero(rows, rows);
|
||||||
DenseVector refV1 = DenseVector::Random(rows),
|
DenseVector refV1 = DenseVector::Random(rows),
|
||||||
refV2 = DenseVector::Random(rows),
|
refV2 = DenseVector::Random(rows),
|
||||||
refV3 = DenseVector::Random(rows);
|
refV3 = DenseVector::Random(rows);
|
||||||
|
|
||||||
std::vector<int> zerocoords, nonzerocoords;
|
std::vector<int> zerocoords, nonzerocoords;
|
||||||
initSparse<Scalar>(densityVec, refV1, v1, &zerocoords, &nonzerocoords);
|
initSparse<Scalar>(densityVec, refV1, v1, &zerocoords, &nonzerocoords);
|
||||||
@ -53,6 +53,20 @@ template<typename Scalar,typename Index> void sparse_vector(int rows, int cols)
|
|||||||
}
|
}
|
||||||
VERIFY_IS_APPROX(v1, refV1);
|
VERIFY_IS_APPROX(v1, refV1);
|
||||||
|
|
||||||
|
// test coeffRef with reallocation
|
||||||
|
{
|
||||||
|
SparseVectorType v1(rows);
|
||||||
|
DenseVector v2 = DenseVector::Zero(rows);
|
||||||
|
for(int k=0; k<rows; ++k)
|
||||||
|
{
|
||||||
|
int i = internal::random<int>(0,rows-1);
|
||||||
|
Scalar v = internal::random<Scalar>();
|
||||||
|
v1.coeffRef(i) += v;
|
||||||
|
v2.coeffRef(i) += v;
|
||||||
|
}
|
||||||
|
VERIFY_IS_APPROX(v1,v2);
|
||||||
|
}
|
||||||
|
|
||||||
v1.coeffRef(nonzerocoords[0]) = Scalar(5);
|
v1.coeffRef(nonzerocoords[0]) = Scalar(5);
|
||||||
refV1.coeffRef(nonzerocoords[0]) = Scalar(5);
|
refV1.coeffRef(nonzerocoords[0]) = Scalar(5);
|
||||||
VERIFY_IS_APPROX(v1, refV1);
|
VERIFY_IS_APPROX(v1, refV1);
|
||||||
|
Loading…
x
Reference in New Issue
Block a user