Mathematica 9 is now available
Services & Resources / Wolfram Forums / MathGroup Archive
-----

MathGroup Archive 2012

[Date Index] [Thread Index] [Author Index]

Search the Archive

Re: An easier functional way to divide each Column of matrix by a row

  • To: mathgroup at smc.vnet.net
  • Subject: [mg127153] Re: An easier functional way to divide each Column of matrix by a row
  • From: Dana DeLouis <dana01 at me.com>
  • Date: Mon, 2 Jul 2012 22:17:44 -0400 (EDT)
  • Delivered-to: l-mathgroup@mail-archive0.wolfram.com

> mat = {{a1,a2},{b1,b2}};
> v   = {v1,v2};
> Inner[Divide,mat,v,List]

Hi.  The ideas given by others in the similar thread (about multiplying) could apply here.
Just divide instead.   For example:

mat={{a1,a2},{b1,b2}};
v={v1,v2};

// Yours
Inner[Divide,mat,v,List]
{{a1/v1,a2/v2},{b1/v1,b2/v2}}

Map[#/v &,mat]
{{a1/v1,a2/v2},{b1/v1,b2/v2}}

%% == %
True

// Your other example:

mat = {{1,2},{3,4}};
v={5,10};

Inner[Divide,mat,v,List]
{{1/5,1/5},{3/5,2/5}}

Map[#/v &,mat]
{{1/5,1/5},{3/5,2/5}}

%% == %
True


If one inverts the vector at the start, one has the same solution as the other tread using Times.

mat={{a1,a2},{b1,b2}};
v=1 / {v1,v2};

Map[# * v &, mat]
{{a1/v1,a2/v2},{b1/v1,b2/v2}}


= = = = = = = = = =
HTH  :>)
Dana DeLouis
Mac & Math 8
= = = = = = = = = =




On Jun 28, 4:03 am, "Nasser M. Abbasi" <n... at 12000.org> wrote:
> hello;
> 
> I found a better solution.
> 
> (after a strong coffee and staring on it for sometime)
> 
> method(5)
> -----------
> mat = {{a1,a2},{b1,b2}};
> v   = {v1,v2};
> Inner[Divide,mat,v,List]
> 
> Out[61]= { {a1/v1, a2/v2}, {b1/v1,b2/v2} }
> 
> But I can't say though it was easy and intuitive to find
> for me but at least the above solution is a functional and
> I think the right Mathematica way of doing it. So I am
> happy. Was good practice though.
> 
> --Nasser
> 
> On 6/27/2012 8:13 PM, Nasser M. Abbasi wrote:
> 
> 
> 
> > I have a list like this 'mat' and 'v' like this
> 
> > mat = { {a1,a2},{b1,b2} }
> > v   = {v1,v2}
> 
> > I want to generate
> 
> > mat={  {a1/v1,  a2/v2}, { b1/v1, b2/v2 } }
> 
> > I can't just do  mat/v since this does
> 
> > mat={  {a1/v1,  a2/v1}, { b1/v2, b2/v2 } }
> 
> > I solved this 2 ways, but I am still not happy.
> > I think there should be an easier way.
> 
> > method 1  (not too natural)
> > -------------------------------
> > Clear["Global`*"]
> > mat={{a1,a2},{b1,b2}};
> > v={v1,v2};
> > Transpose[Transpose[mat]/v]
> 
> > Out[93]= { {a1/v1, a2/v2}, {b1/v1,  b2/v2} }
> 
> > method 2 (too complicated)
> > ---------------------------
> > In[94]:= MapIndexed[Divide[#1,v[[#2[[2]]]]]&,mat,{2}]
> 
> > Out[94]= { {a1/v1, a2/v2}, {b1/v1, b2/v2}}
> 
> > method 3 (using a Table, oh no !)
> > ------------------------------------
> > In[96]:= Table[mat[[i,j]]/v[[j]],{i,2},{j,2}]
> 
> > Out[96]= {{a1/v1, a2/v2} , {b1/v1, b2/v2} }
> 
> > method 4 (a not good way to do it )
> > ----------------------------------------
> > In[108]:= mat.v/.Plus->List/.Times->Divide
> 
> > Out[108]= {{a1/v1, a2/v2}, {b1/v1, b2/v2}}
> 
> > I looked at real Mathematical tricks using Inenr and Outer and
> > something like this, but I do see a way so far. (I also did not
> > have my morning coffee yet), so I wanted to ask if
> > someone can see one of those elegant super functional
> > correct ways to do this.
> 
> > ps. fyi, in that other system (starts with O and ends with VE)
> > I can do this like this:
> 
> > mat=[1 2;3 4]
> > v=[5 10]
> > bsxfun(@rdivide,mat,v)
> 
> >      0.20000   0.20000
> >      0.60000   0.40000
> 
> > thanks,
> > --Nasser





  • Prev by Date: Re: Rearranging terms - user-defined
  • Next by Date: Re: Creating a PDF graphic with Mathematica
  • Previous by thread: Why Export drops namespace prefixes in the exported XML?
  • Next by thread: Re: Creating a PDF graphic with Mathematica