On Sat, Jul 27, 2013 at 1:53 PM, Dmitriy Lyubimov <[email protected]> wrote:
> Can you show me some examples of where I'd *want* to do the "wrong thing" > > from an associativity standpoint? "5 - x" where x is a vector, is kinda > > weird. > > But maybe you're subtracting off a mean or something, but then I'd > probably > > write this as "- (x - 5)", because I always associate left to right. :) > > > > I actually haven't written support for unary_- , that's something i really > haven't encountered (yet) until you said it :) > Heh, yeah, that's something I can actually imagine using. :) > While there's a unary negation operatior, there's no unary inversion > operator (1/x). This actually an example of fairly frequent operation over > vectors. > > In my in-core ssvd example, i use it to compute inverse of a diagonal > matrix (Sigma)^-1 (or any inverse of a diagonal matrix for that matter): > > diagv(1 /: s) > But since this is just the inverse of the matrix, and I imagine it's actually clearer to do just diagv(s).inverse instead of diagv(1 /: s) > where s is the vector of singular values. > > elementwise substraction is fairly frequent when comparing matrices and > making approximation asserts, e.g. in svg test something like > > assert (a - u %*% diagv(s) %*% v.t ) norm <= 1e-10 > Like I was saying: elementwise addition and subtraction *are* matrix-wise operations, so there's no ambiguity. If a and s are matrices, (a - s) is completely clear. > I actually wouldn't know how to encode elementwise inversion if i cannot > use colon. > > Use of colon with operations in scala actually IMO is quite intuitive in a > sense that the side that has it, points to "this" and the other side points > to "that". > > The assumption is that use of the colon must not change the result of > operation (be functionally equivalent), just like in many cases foldLeft is > equivalent to foldRight, i.e. > > a * b === a :* b === a *: b, > > it follows that :* means "timesRight" or "solveRight", in Mahout speak, > and *: means "timesLeft", or "solveLeft'. > > FWIW I guess it does take a few minutes to settle (it took a few with me at > least), but after that it seems pretty intuitive. > Yeah, I can imagine getting used to it. Haven't yet, but I can imagine it. :) > > > > > > > and putting completely different functional meaning into :* and * will > > > confuse scala users to no end who got used to things like :/ and /: . > > This > > > all needs striking a subtle balance unfortunately. > > > > > > > Ok, then like I said, maybe I'll just defer to your judgement on the > > operator > > syntax, as I've *never* gotten used to the scala :/ and /: uses. I > prefer > > method calls to method calls masquerading as native operators. Maybe > > I should Stop Being Afraid and Learn to Love the DSL, but I'm not quite > > there yet: Too Much Magic. :) > > > > > > > > > > as i said before, i am not hung on %*% syntax, but i don't think doing > :* > > > or .* for elementwise would work on scala. > > > > > > > How often do we really do elementwise matrix operations? Is this really > > a thing we often want to worry about? addition and subtraction, sure, > but > > > > Use of Hadamard product is indeed rare (i had only one case with the PCA > pipeline), but elementwise - and / seems to be popular with me. Regardless, > it is done for completeness; and if it is done at all, imo it better be > done consistently with the rest of the elementwise pack. > Consistency I'm down with. Completeness, on the other hand, I'm with Godel on that one. ;) -- -jake
