Hi Doug, Doug McNutt writes: > >The first source of discussion was around whether there is any > >consistent meaning to array operations. The source of this was that > >some felt that other people may want C<*> to mean something other > >than element-wise multiplication by default (e.g. matrix inner > >product). However no-one actually said that I<they> wanted it to work > >this way, only that I<others> may prefer it, particularly > >mathematicians. > > This physicist wants it that way. In scalar context $dotproduct = @A > >>*<< @B; ought to return the scalar (dot, inner) product of vectors @A > and @B by which I mean the sum of the products of like components. In > array context it is quite reasonable to return the element by element > products but it will be for accounting rather than for electrical > engineering, mapmaking, and 3D rendering. > > @C = @A >>+<< @B; returning the vector sum is mathematically correct. > > An intrinsic ability to figure the dot product is useful for matrix > multiplication.
I was sincerely pissed when PDL, the Perl language _for_ mathematicians, was not capable of easily doing a tensor inner product. The "threading" system was too advanced, and you needed to jump through hoops to get it to do the simple thing. While Perl 6 is not being designed as a language for mathematicians, it's not being designed as a language against mathematicians. I want an inner product. One can generally do a dot product as such: $prod = @a >>*<< @b ==> sum; Where: sub sum([EMAIL PROTECTED]) { reduce { $^a + $^b } 0, @data } But $prod = @a >>*<< @b; Won't get you the dot product without some kind of module. It'll get you a reference to the array of @a[$i] multiplied by @b[$i]. And putting a numeric context on that won't do it either; that will give you the length of the resulting array. PDL has a lot of liberty in Perl 6, though. They can easily go far enough to overload piddle operations to do the Right Thing. If they so desire (don't know whether I would be for or against this), they could make up a whole new piddle sigil, so you could go: @>pid = (1,2,3,4,5); And have the scalar operations work right automatically. That might actually be the way to go, because when I'm programming these sorts of things, I have arrays and I have vectors, and I rarely interchange them. > RFC 82 offers a mathematically abhorrent example of > element by element "matrix" multiplication: > > > my int @mat1 = ([1,2], [3,4]); > > my int @mat2 = ([2,2], [1,1]); > > my @mat3 = @mat1 * @mat2; # ([2,4],[3,4]) > > Perhaps the designations "mat1, 2, 3" are not intended to be > abbreviations for the word matrix but it is dangerous indeed to > provide a syntax that will surely be confused with true matrix > multiplication. @matC = @matA >>*<< @matB should produce elements in > the result which are the dot products of the row vectors of the left > matrix with the column vectors of the right. Note that one or the > other of the input matrices needs to be transposed and some > standardized notation is required. Matrix multiplication is not > commutative. > > The apocalypse at <http://dev.perl.org/perl6/apocalypse/A03.html> has > this to say about confusing people. > > >Anyway, in essence, I'm rejecting the underlying premise of this RFC > >(82), that we'll have strong enough typing to intuit the right > >behavior without confusing people. Nevertheless, we'll still have > >easy-to-use (and more importantly, easy-to-recognize) > >hyper-operators. > > And then it goes on about other vector-like things:. > > >This RFC also asks about how return values for functions like abs( ) > >might be specified. I expect sub declarations to (optionally) include > >a return type, so this would be sufficient to figure out which > >functions would know how to map a scalar to a scalar. > > There is the norm of a vector, actually the length if we're talking > about 3 dimensional geometry, which can be considered the abs(@A) as a > scalar. It would be the positive square root of the sum of the squares > of the components. = sqrt ( @A >>*<< @A ). > > It would also be possible to include a scalar norm of a matrix which > would be its determinant but that's probably fodder for a module > dedicated to solution of linear equations. And abs() really doesn't seem the place to put the norm. That feels more like norm() to me. > An element by element concatenation of two arrays of text is certainly > reasonable. As a multiplication I'm not sure what it would mean but > it's a bit like the @mat1 >>*<< @mat2 in the quote above. Not very > interesting or useful. > > Whatever be the final result for perl 6 syntax it ought either to use > the terms matrix and vector as employed by the likes of Maxwell and > Heisenberg and provide mathematically correct operators or it should > avoid those terms when documenting hyper-operators that do something > else. So, I guess it won't be concerting to you to hear that we're calling hyper-operators vector-operators. I personally think it's not the operators that are misleading, though. They have clear and well-defined semantics, and when these are single-dimensional arrays, vector-operator makes a lot of sense. Anyway, I'm kind of losing my point. Basically, I think that the mathematically correct stuff should be saved for other kinds of variables or other kinds of operators. It's more important to have a consistent and useful semantic with vector operators than it is to get it to work mathematically in the >>*<< case. PDL will likely be the place to go for these semantics. Considering my vast disappointment with the current state of PDL, I'll probably be a contributor this second time 'round. > And then there are those two-component vectors which are complex > numbers. . . and vector cross products. . . and quaternions. . . All of which deserve types and their own set of semantics. Luke