Hi Vincent,
Great, thanks!
I'd say that the docstring should be amended as well, don't you think? (As
the keyword argument `entries` does not exist)
Peleg.
On Wednesday, 21 December 2016 14:42:00 UTC+2, vdelecroix wrote:
>
> Hi Peleg,
>
> It would be better if matrix would do a type check for partial function.
> Currently it does not, the relevant line is
>
> {{{
> if isinstance(arg, (types.FunctionType, types.LambdaType,
> types.MethodType)):
> }}}
>
> in sage/matrix/constructor.pyx the function MatrixFactory.
>
> Concerning a direct solution, you can cheat with
>
> sage: matrix(QQ, 3, 3, lambda i,j: g(i,j))
>
> Or even more directly with
>
> sage: matrix(QQ, 3, 3, lambda i,j: f(i,j,7))
>
> Vincent
>
> Le 21/12/2016 à 13:29, Peleg Michaeli a écrit :
> > The matrix (or Matrix) documentation reads:
> >
> > INPUT:
> >
> > * "ring" -- the base ring for the entries of the matrix.
> >
> > * "nrows" -- the number of rows in the matrix.
> >
> > * "ncols" -- the number of columns in the matrix.
> >
> > * "sparse" -- create a sparse matrix. This defaults to "True"
> > when the entries are given as a dictionary, otherwise defaults to
> > "False".
> >
> > * "entries" -- see examples below.
> >
> >
> > However, the examples below do not give any example of using "entries"
> as a *keyword
> > argument*. And, indeed, passing `entries=...` in the call of Matrix
> raises
> > TypeError.
> >
> > I can overcome this using positional arguments only. Here is a working
> > example:
> >
> > sage: def f(i, j):
> > ....: return i+j
> > ....:
> > sage: matrix(QQ, 3, 3, f)
> >
> > [0 1 2]
> > [1 2 3]
> > [2 3 4]
> >
> > But if I am passing a *partial function*, this does not work any more:
> >
> > sage: def f(i, j, x):
> > ....: return (i + j) * x
> > ....:
> > sage: import functools
> > sage: def f(i, j, x):
> > ....: return (i + j) * x
> > ....:
> > sage: g = functools.partial(f, x=7)
> > sage: g(0, 1)
> > 7
> > sage: matrix(QQ, 3, 3, g)
> > Traceback (most recent call last):
> > File "<ipython-input-131-5bd380f06a54>", line 1, in <module>
> > matrix(QQ, Integer(3), Integer(3), g)
> > File "sage/matrix/constructor.pyx", line 794, in
> sage.matrix.constructor.
> > MatrixFactory.__call__ (build/cythonized/sage/matrix/constructor.c:7154)
> > return MatrixSpace(ring, nrows, ncols, sparse=sparse)(entries)
> > File
> >
> "/home/peleg/sage/local/lib/python2.7/site-packages/sage/matrix/matrix_space.py"
>
>
> > , line 531, in __call__
> > return self.matrix(entries, coerce, copy)
> > File
> >
> "/home/peleg/sage/local/lib/python2.7/site-packages/sage/matrix/matrix_space.py"
>
>
> > , line 1488, in matrix
> > return MC(self, x, copy=copy, coerce=coerce)
> > File "sage/matrix/matrix_rational_dense.pyx", line 199, in
> sage.matrix.
> > matrix_rational_dense.Matrix_rational_dense.__init__
> (build/cythonized/sage/
> > matrix/matrix_rational_dense.c:4734)
> > raise TypeError("entries must be coercible to a list or integer")
> > TypeError: entries must be coercible to a list or integer
> >
> >
> > How can I make this work?
> >
>
--
You received this message because you are subscribed to the Google Groups
"sage-support" group.
To unsubscribe from this group and stop receiving emails from it, send an email
to [email protected].
To post to this group, send email to [email protected].
Visit this group at https://groups.google.com/group/sage-support.
For more options, visit https://groups.google.com/d/optout.