## Glas :## Re: [glas] arithmetic operations |

**From:** Karl Meerbergen (*Karl.Meerbergen_at_[hidden]*)

**Date:** 2005-11-07 10:03:59

**Next message:**David Abrahams: "Re: [glas] Block matrices"**Previous message:**Guntram Berti: "Re: [glas] arithmetic operations"**In reply to:**Guntram Berti: "Re: [glas] arithmetic operations"**Next in thread:**KF: "Re: [glas] arithmetic operations"

Guntram Berti wrote:

>On Fri, Oct 28, 2005 at 08:14:46AM -0500, Andrew Lumsdaine wrote:

>

>

>>On Oct 28, 2005, at 2:23 AM, Karl Meerbergen wrote:

>>

>>

>

>

>

>

>>>To make the choice easier, we could assume that a vector is a column

>>>(as

>>>is always the case in linear algebra). In this case

>>>trans(x)*y = dot product

>>>x*trans(y) = outer product

>>>herm(x)*y = hermitian inner product

>>>

>>>This is probably the closest we can get to linear algebra notation.

>>>

>>>

>>Right. I think these all make perfect sense mathematically. I wasn't

>>suggesting to leave out the use of * altogether, but rather to use it

>>only in the ways that make sense mathematically. And to have it always

>>mean the same thing.

>>

>>

>>

>

>Another point to note is that if we use * on unqualified vectors like u*v

>for the dot (inner) product, we loose associativity:

>(u*v)*w != u*(v*w)

>(if we assume * also is used for the multiplication with a scalar).

>Therefore I personally never use * for the dot product.

>

>So if we use operators like *, we must make sure (in addition to corresponding

>to mathemtical convention) that its use is 100% unambigous and can be deduced from the types.

>So Karl's suggestion, using trans(x)*y etc. seems to make sense,

>because then any multiplication involving non-scalar quantities

>is formally a matrix multiplication, and errors can be detected easily (at least at

>run time).

>

It is close to the notation that matlab uses. I have added an

orientation_type to the attribute of a collection. This allows the

compiler to select the inner or outer product algorithm when a * is

encountered:

column_orientation * row_orientation : outer prod, or cross prod

row_orientation * column_orientation : inner or dot prod

When the two vectors have the same orientation, a compiler error should

be generated.

>If we want an operator for element-wise multiplication, we must then

>use something like elem(v) * elem(w) (to keep with Karl's notation)

>or elemwise_mul(v,w), as has been suggested before.

>

>

>Concerning the dot product: If we overload the comma operator,

>we can probably use the notation (v,w) common in mathemetics ;-)

>(just kidding ...)

>

>

>Another remark/idea concerning the inner product (also concerning norms):

>Sometimes it may be useful to make this a parameter of an algorithm,

>for instance, using different norms to compute stopping criteria,

>or orthonormalization using different inner products.

>This is perhaps an argument for preferring inner_prod(v,w)

>over a notation using operator *, because I feel that it is easier

>to influence the former using template parameters.

>Perhaps something like space::inner_product(v,w) ...

>

The one does not exclude the other: even with the * notation, we can

have a function or functor dot() that can serve for this purpose.

Although I could use an inner product and norm templated function in

some Krylov and related stuff, I am not very enthousiastic to support

this by GLAS. I think GLAS should focus on vector and matrix operations.

I consider orthogonalization (by Gram-Schmidt and its derivatives) an

application and not the core of GLAS. We could, of course, build a layer

on top of GLAS that helps the implementation of specific applications, a

kind of toolbox organization, e.g. iterative methods, ode, etc.

Karl

**Next message:**David Abrahams: "Re: [glas] Block matrices"**Previous message:**Guntram Berti: "Re: [glas] arithmetic operations"**In reply to:**Guntram Berti: "Re: [glas] arithmetic operations"**Next in thread:**KF: "Re: [glas] arithmetic operations"