Re: Re: how to build pattern for a square matrix of reals?
- To: mathgroup at smc.vnet.net
- Subject: [mg98539] Re: [mg98492] Re: how to build pattern for a square matrix of reals?
- From: DrMajorBob <btreat1 at austin.rr.com>
- Date: Sun, 12 Apr 2009 03:46:43 -0400 (EDT)
- References: <grhp95$mj7$1@smc.vnet.net> <grkgmm$6kq$1@smc.vnet.net>
- Reply-to: drmajorbob at bigfoot.com
You called l a "lower diagonal vector" and u an "upper diagonal vector" -- neither of which makes any sense. Only matrices, not vectors, can be upper or lower diagonal. I also noticed that you want 0 (an integer) to be treated as if it were Real. So here's a rendition of your "TridiagonalSolve": tridiagonal[___] := False tridiagonal[lower : {0 | 0., __Real}, d : {__Real}, upper : {__Real, 1 | 1.}, b : {__Real}] /; Equal @@ Length /@ {lower, d, upper, b} := True Notice I'd never, EVER use "l" as a variable name, as it's indistinguishable from "1" for many of us. I used the "lower" and "upper" names because you're thinking of them that way, even though vectors can't physically BE lower or upper. And here's a replacement for the second line of code, where I would NOT redefine the built-in Solve: realQ[0] = True; realQ[x_] := MatchQ[x, _Real] realQ[_] = False; commensurable[a_ /; MatrixQ[a, realQ], b : {__Real}] /; Union@Dimensions@a == {Length@b} := True commensurable[__] = False; Bobby On Sat, 11 Apr 2009 02:52:47 -0500, <sagrailo at gmail.com> wrote: > Once again: big thanks to all who replied! I think I'm able now to > fully get what I wanted. > > I guess it would be better if I explained initially what is all about: > I have some simple Fortran routines for solving tri-diagonal, and then > regular, system of linear equations, that I'm wrapping, through > Mathlink, for use from Mathematica. I want Mathematica to do arguments > checking for me, and this could be achieved through specifying > corresponding patterns for functions signature in the MathLink > template file. > > So, my functions are: > TridiagonalSolve[l, d, u, b] - for tridiagonal solver > Solve[A, b] - for regular solver > If the dimension of system is n in both cases, then here: > l - lower diagonal vector, of size n, with first element set to 0 > d - diagonal vector, of size n > u - upper diagonal vector, of size n, with last element set to 0 > b - right-side vector, of size n > A - matrix of the system, of size nxn > > So, I want to check that dimensions of all vectors match, for > tridiagonal solver function, and also that vector l has 0 as first, > and vector u has 0 as last element. Also, for regular solver > function, I want to check that dimensions of system matrix, and the > length of the right-side vector match. Of course, I also want to > check that A is matrix of reals, and that l, d,u and b are vectors of > reals. So here are final patterns I came up with (these seem to work > fine, but I'd appreciate any further suggestions on improvement): > > TridiagonalSolve[l_/;(VectorQ[l,MatchQ[#,_Real]&]&&l[[1]] > ==0),d_/;VectorQ[d,MatchQ[#,_Real]&],u_/;(VectorQ[u,MatchQ[#,_Real]&] > &&u[[-1]]==0),b_/;VectorQ[b,MatchQ[#,_Real]&]]/;Length[l]==Length[d] > ==Length[u]==Length[b]:="OK" > > Solve[A_/;(MatrixQ[A,MatchQ[#,_Real]&]&&Equal@@Dimensions > [A]),b_/;VectorQ[b,MatchQ[#,_Real]&]]/;Dimensions[A][[2]]==Length > [b]:="OK" > > Regards. > -- DrMajorBob at bigfoot.com