patch for $addrow needed?
- Subject: patch for $addrow needed?
- From: van Nek
- Date: Thu, 20 Apr 2006 16:04:23 +0200
--Alt-Boundary-27852.9751671
Content-type: text/plain; charset=US-ASCII
Content-transfer-encoding: 7BIT
Content-description: Mail message body
Hi all,
I found, that src/comm2.lisp/$addrow can produce sideeffects.
(%i1) m1:matrix([1,2,3],[4,5,6]);
[ 1 2 3 ]
(%o1) [ ]
[ 4 5 6 ]
(%i2) m2:addrow(m1,[7,8,9]);
[ 1 2 3 ]
[ ]
(%o2) [ 4 5 6 ]
[ ]
[ 7 8 9 ]
(%i3) m2[1][1]:0$
(%i4) m1;
[ 0 2 3 ]
(%o4) [ ]
[ 4 5 6 ]
Is this intended?
With $addcol there isn't such a problem.
(%i5) m3:addcol(m1,[4,7]);
[ 0 2 3 4 ]
(%o5) [ ]
[ 4 5 6 7 ]
(%i6) m3[1][1]:1$
(%i7) m1;
[ 0 2 3 ]
(%o7) [ ]
[ 4 5 6 ]
In src/comm2.lisp I found at first sight, that $addcol uses
matrix.lisp/$transpose and $transpose does consing via
matrix.lisp/mxc.
I suggest a small patch for $addrow:
(defmfun $addrow n
(cond ((= n 0) (wna-err '$addrow))
((not ($matrixp (arg 1))) (merror "First argument to
`addrow' must be a matrix"))
((= n 1) (arg 1))
;;(t (do ((i 2 (f1+ i)) (m (arg 1))) ((> i n) m);; old
(t (do ((i 2 (f1+ i)) (m (copy-tree (arg 1)))) ((> i n) m)
;; patch: copying the matrix
(setq m (addrow m (arg i)))))))
What do you think?
Volker
--Alt-Boundary-27852.9751671
Content-type: text/html; charset=US-ASCII
Content-transfer-encoding: 7BIT
Content-description: Mail message body
<!DOCTYPE html PUBLIC "-//W3C//DTD XHTML 1.0 Transitional//EN"
"http://www.w3.org/TR/xhtml1/DTD/xhtml1-transitional.dtd">
<html xmlns="http://www.w3.org/1999/xhtml" xml:lang="en" lang="en"><head>
<title></title>
<meta http-equiv="content-type" content="text/html;charset=utf-8"/>
<meta http-equiv="Content-Style-Type" content="text/css"/>
</head>
<body>
<div align="left"><font face="Lucida Console" size="2"><span style="font-size:10pt">Hi all,</span></font></div>
<div align="left"><font face="Lucida Console" size="2"><span style="font-size:10pt">I found, that src/comm2.lisp/$addrow can produce sideeffects.</span></font></div>
<div align="left"><font face="Lucida Console" size="2"><span style="font-size:10pt"><br />
</span></font></div>
<div align="left"><font face="Lucida Console" size="2"><span style="font-size:10pt">(%i1) m1:matrix([1,2,3],[4,5,6]);</span></font></div>
<div align="left"><font face="Lucida Console" size="2"><span style="font-size:10pt">                                  [ 1  2  3 ]</span></font></div>
<div align="left"><font face="Lucida Console" size="2"><span style="font-size:10pt">(%o1)                             [         ]</span></font></div>
<div align="left"><font face="Lucida Console" size="2"><span style="font-size:10pt">                                  [ 4  5  6 ]</span></font></div>
<div align="left"><font face="Lucida Console" size="2"><span style="font-size:10pt">(%i2) m2:addrow(m1,[7,8,9]);</span></font></div>
<div align="left"><font face="Lucida Console" size="2"><span style="font-size:10pt">                                  [ 1  2  3 ]</span></font></div>
<div align="left"><font face="Lucida Console" size="2"><span style="font-size:10pt">                                  [        
]</span></font></div>
<div align="left"><font face="Lucida Console" size="2"><span style="font-size:10pt">(%o2)                             [ 4  5  6 ]</span></font></div>
<div align="left"><font face="Lucida Console" size="2"><span style="font-size:10pt">                                  [        
]</span></font></div>
<div align="left"><font face="Lucida Console" size="2"><span style="font-size:10pt">                                  [ 7  8  9 ]</span></font></div>
<div align="left"><font face="Lucida Console" size="2"><span style="font-size:10pt">(%i3) m2[1][1]:0$</span></font></div>
<div align="left"><font face="Lucida Console" size="2"><span style="font-size:10pt">(%i4) m1;</span></font></div>
<div align="left"><font face="Lucida Console" size="2"><span style="font-size:10pt">                                  [ 0  2  3 ]</span></font></div>
<div align="left"><font face="Lucida Console" size="2"><span style="font-size:10pt">(%o4)                             [         ]</span></font></div>
<div align="left"><font face="Lucida Console" size="2"><span style="font-size:10pt">                                  [ 4  5  6 ]</span></font></div>
<div align="left"><font face="Lucida Console" size="2"><span style="font-size:10pt"><br />
</span></font></div>
<div align="left"><font face="Lucida Console" size="2"><span style="font-size:10pt">Is this intended?</span></font></div>
<div align="left"><font face="Lucida Console" size="2"><span style="font-size:10pt"><br />
</span></font></div>
<div align="left"><font face="Lucida Console" size="2"><span style="font-size:10pt">With $addcol there isn't such a problem.</span></font></div>
<div align="left"><font face="Lucida Console" size="2"><span style="font-size:10pt"><br />
</span></font></div>
<div align="left"><font face="Lucida Console" size="2"><span style="font-size:10pt">(%i5) m3:addcol(m1,[4,7]);</span></font></div>
<div align="left"><font face="Lucida Console" size="2"><span style="font-size:10pt">                                [ 0  2  3  4 ]</span></font></div>
<div align="left"><font face="Lucida Console" size="2"><span style="font-size:10pt">(%o5)                           [            ]</span></font></div>
<div align="left"><font face="Lucida Console" size="2"><span style="font-size:10pt">                                [ 4  5  6  7 ]</span></font></div>
<div align="left"><font face="Lucida Console" size="2"><span style="font-size:10pt">(%i6) m3[1][1]:1$</span></font></div>
<div align="left"><font face="Lucida Console" size="2"><span style="font-size:10pt">(%i7) m1;</span></font></div>
<div align="left"><font face="Lucida Console" size="2"><span style="font-size:10pt">                                  [ 0  2  3 ]</span></font></div>
<div align="left"><font face="Lucida Console" size="2"><span style="font-size:10pt">(%o7)                             [         ]</span></font></div>
<div align="left"><font face="Lucida Console" size="2"><span style="font-size:10pt">                                  [ 4  5  6 ]</span></font></div>
<div align="left"><font face="Lucida Console" size="2"><span style="font-size:10pt"><br />
</span></font></div>
<div align="left"><font face="Lucida Console" size="2"><span style="font-size:10pt">In src/comm2.lisp I found at first sight, that $addcol uses
matrix.lisp/$transpose and $transpose does consing via
matrix.lisp/mxc.</span></font></div>
<div align="left"><font face="Lucida Console" size="2"><span style="font-size:10pt"><br />
</span></font></div>
<div align="left"><font face="Lucida Console" size="2"><span style="font-size:10pt">I suggest a small patch for $addrow:</span></font></div>
<div align="left"><font face="Lucida Console" size="2"><span style="font-size:10pt"><br />
</span></font></div>
<div align="left"><font face="Lucida Console" size="2"><span style="font-size:10pt">(defmfun $addrow n</span></font></div>
<div align="left"><font face="Lucida Console" size="2"><span style="font-size:10pt">  (cond ((= n 0) (wna-err '$addrow))</span></font></div>
<div align="left"><font face="Lucida Console" size="2"><span style="font-size:10pt">        ((not ($matrixp (arg 1))) (merror "First argument to
`addrow' must be a matrix"))</span></font></div>
<div align="left"><font face="Lucida Console" size="2"><span style="font-size:10pt">        ((= n 1) (arg 1))</span></font></div>
<div align="left"><font face="Lucida Console" size="2"><span style="font-size:10pt"><br />
</span></font></div>
<div align="left"><font face="Lucida Console" size="2"><span style="font-size:10pt">        ;;(t (do ((i 2 (f1+ i)) (m (arg 1))) ((> i n) m);; old</span></font></div>
<div align="left"><font face="Lucida Console" size="2"><span style="font-size:10pt">        (t (do ((i 2 (f1+ i)) (m (copy-tree (arg 1)))) ((> i n) m)</span></font></div>
<div align="left"><font face="Lucida Console" size="2"><span style="font-size:10pt">                                 ;; patch: copying the matrix</span></font></div>
<div align="left"><font face="Lucida Console" size="2"><span style="font-size:10pt">             (setq m (addrow m (arg i)))))))</span></font></div>
<div align="left"><font face="Lucida Console" size="2"><span style="font-size:10pt"><br />
</span></font></div>
<div align="left"><font face="Lucida Console" size="2"><span style="font-size:10pt">What do you think?</span></font></div>
<div align="left"><font face="Lucida Console" size="2"><span style="font-size:10pt"><br />
</span></font></div>
<div align="left"><font face="Lucida Console" size="2"><span style="font-size:10pt">Volker</span></font></div>
</body>
</html>
--Alt-Boundary-27852.9751671--