Skip to content

Commit 6486d6d

Browse files
authored
Merge pull request #284 from ManifoldFR/devel
Fix for Refs to dynamic (1, N) blocks
2 parents 1ae74c7 + 71a329d commit 6486d6d

File tree

2 files changed

+25
-13
lines changed

2 files changed

+25
-13
lines changed

include/eigenpy/numpy-allocator.hpp

Lines changed: 10 additions & 9 deletions
Original file line numberDiff line numberDiff line change
@@ -70,11 +70,11 @@ struct NumpyAllocator<Eigen::Ref<MatType, Options, Stride> > {
7070

7171
if (NumpyType::sharedMemory()) {
7272
const int Scalar_type_code = Register::getTypeCode<Scalar>();
73-
74-
Eigen::DenseIndex inner_stride = MatType::IsRowMajor ? mat.outerStride()
75-
: mat.innerStride(),
76-
outer_stride = MatType::IsRowMajor ? mat.innerStride()
77-
: mat.outerStride();
73+
const bool reverse_strides = MatType::IsRowMajor || (mat.rows() == 1);
74+
Eigen::DenseIndex inner_stride = reverse_strides ? mat.outerStride()
75+
: mat.innerStride(),
76+
outer_stride = reverse_strides ? mat.innerStride()
77+
: mat.outerStride();
7878

7979
const int elsize = call_PyArray_DescrFromType(Scalar_type_code)->elsize;
8080
npy_intp strides[2] = {elsize * inner_stride, elsize * outer_stride};
@@ -135,10 +135,11 @@ struct NumpyAllocator<const Eigen::Ref<const MatType, Options, Stride> > {
135135
if (NumpyType::sharedMemory()) {
136136
const int Scalar_type_code = Register::getTypeCode<Scalar>();
137137

138-
Eigen::DenseIndex inner_stride = MatType::IsRowMajor ? mat.outerStride()
139-
: mat.innerStride(),
140-
outer_stride = MatType::IsRowMajor ? mat.innerStride()
141-
: mat.outerStride();
138+
const bool reverse_strides = MatType::IsRowMajor || (mat.rows() == 1);
139+
Eigen::DenseIndex inner_stride = reverse_strides ? mat.outerStride()
140+
: mat.innerStride(),
141+
outer_stride = reverse_strides ? mat.innerStride()
142+
: mat.outerStride();
142143

143144
const int elsize = call_PyArray_DescrFromType(Scalar_type_code)->elsize;
144145
npy_intp strides[2] = {elsize * inner_stride, elsize * outer_stride};

unittest/python/test_eigen_ref.py

Lines changed: 15 additions & 4 deletions
Original file line numberDiff line numberDiff line change
@@ -35,17 +35,28 @@ def test(mat):
3535
assert np.all(mat[:2, :3] == np.ones((2, 3)))
3636

3737
mat.fill(0.0)
38+
mat[:, :] = np.arange(rows * cols).reshape(rows, cols)
39+
printMatrix(mat)
40+
mat0 = mat.copy()
3841
mat_as_C_order = np.array(mat, order="F")
39-
getBlock(mat_as_C_order, 0, 0, 3, 2)[:, :] = 1.0
42+
for i, rowsize, colsize in ([0, 3, 2], [1, 1, 2], [0, 3, 1]):
43+
print("taking block [{}:{}, {}:{}]".format(i, rowsize + i, 0, colsize))
44+
B = getBlock(mat_as_C_order, i, 0, rowsize, colsize)
45+
lhs = mat_as_C_order[i : rowsize + i, :colsize]
46+
print("should be:\n{}\ngot:\n{}".format(lhs, B))
47+
assert np.array_equal(lhs, B.reshape(rowsize, colsize))
48+
49+
B[:] = 1.0
50+
rhs = np.ones((rowsize, colsize))
51+
assert np.array_equal(mat_as_C_order[i : rowsize + i, :colsize], rhs)
4052

41-
assert np.all(mat_as_C_order[:3, :2] == np.ones((3, 2)))
53+
mat_as_C_order[:, :] = mat0
4254

43-
mat_as_C_order[:3, :2] = 0.0
4455
mat_copy = mat_as_C_order.copy()
4556
editBlock(mat_as_C_order, 0, 0, 3, 2)
4657
mat_copy[:3, :2] = np.arange(6).reshape(3, 2)
4758

48-
assert np.all(mat_as_C_order == mat_copy)
59+
assert np.array_equal(mat_as_C_order, mat_copy)
4960

5061
class ModifyBlockImpl(modify_block):
5162
def __init__(self):

0 commit comments

Comments
 (0)