Re: An easier functional way to divide each Column of matrix by a row vector, element-wise?
- To: mathgroup at smc.vnet.net
- Subject: [mg127099] Re: An easier functional way to divide each Column of matrix by a row vector, element-wise?
- From: Ray Koopman <koopman at sfu.ca>
- Date: Sat, 30 Jun 2012 05:17:16 -0400 (EDT)
- Delivered-to: l-mathgroup@mail-archive0.wolfram.com
On Jun 28, 1: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} } What's "unnatural" is that there is no convenient way to operate on the columns of a matrix, as opposed to the rows. Tranposing to make the columns rows, operating on the rows, and then re-transposing may seem awkward, but it's fast, especially if mat has many rows. If you want code that's both fast and readable, consider defining T = Transpose, perhaps even in your init.m. Then you can write things like T[T@mat/v]. >> >> 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