# triangular matrix fill

5 messages
Open this post in threaded view
|

## triangular matrix fill

 I have a question on filling a lower triangular matrix using numpy. Thisis essentially having two loops and the inner loop upper limit is theouter loop current index. In the inner loop I have a vector beingmultiplied by a constant set in the outer loop. For a matrix N*N in size, the C the code is:for(i = 0; i < N; ++i){    for(j = 0; j < i; ++j){        Matrix[i*N + j] = V1[i] * V2[j];    }}ThanksTom _______________________________________________ Numpy-discussion mailing list [hidden email] http://projects.scipy.org/mailman/listinfo/numpy-discussion
Open this post in threaded view
|

## Re: triangular matrix fill

 On Thu, May 22, 2008 at 7:19 PM, Tom Waite <[hidden email]> wrote: I have a question on filling a lower triangular matrix using numpy. Thisis essentially having two loops and the inner loop upper limit is theouter loop current index. In the inner loop I have a vector beingmultiplied by a constant set in the outer loop. For a matrix N*N in size, the C the code is:for(i = 0; i < N; ++i){    for(j = 0; j < i; ++j){        Matrix[i*N + j] = V1[i] * V2[j];    }}You can use numpy.outer(V1,V2) and just ignore everything  on and above the diagonal. In [1]: x = arange(3)In [2]: y = arange(3,6) In [3]: outer(x,y)Out[3]: array([[ 0,  0,  0],       [ 3,  4,  5],        [ 6,  8, 10]])You can mask the upper part if you want:In [16]: outer(x,y)*fromfunction(lambda i,j: i>j, (3,3)) Out[16]: array([[0, 0, 0],        [3, 0, 0],       [6, 8, 0]]) Or you could use fromfunction directly. Chuck _______________________________________________ Numpy-discussion mailing list [hidden email] http://projects.scipy.org/mailman/listinfo/numpy-discussion
Open this post in threaded view
|

## Re: triangular matrix fill

 On Thu, May 22, 2008 at 9:07 PM, Charles R Harris <[hidden email]> wrote: > > On Thu, May 22, 2008 at 7:19 PM, Tom Waite <[hidden email]> wrote: >> >> I have a question on filling a lower triangular matrix using numpy. This >> is essentially having two loops and the inner loop upper limit is the >> outer loop current index. In the inner loop I have a vector being >> multiplied by a constant set in the outer loop. For a matrix N*N in size, >> the C the code is: >> >> for(i = 0; i < N; ++i){ >>     for(j = 0; j < i; ++j){ >>         Matrix[i*N + j] = V1[i] * V2[j]; >>     } >> } >> > > You can use numpy.outer(V1,V2) and just ignore everything  on and above the > diagonal. > > In [1]: x = arange(3) > > In [2]: y = arange(3,6) > > In [3]: outer(x,y) > Out[3]: > array([[ 0,  0,  0], >        [ 3,  4,  5], >        [ 6,  8, 10]]) > > You can mask the upper part if you want: > > In [16]: outer(x,y)*fromfunction(lambda i,j: i>j, (3,3)) > Out[16]: > array([[0, 0, 0], >        [3, 0, 0], >        [6, 8, 0]]) > >  Or you could use fromfunction directly. Or numpy.tril(). -- Robert Kern "I have come to believe that the whole world is an enigma, a harmless enigma that is made terrible by our own mad attempt to interpret it as though it had an underlying truth."  -- Umberto Eco _______________________________________________ Numpy-discussion mailing list [hidden email] http://projects.scipy.org/mailman/listinfo/numpy-discussion