An easier functional way to divide each Column of matrix by a row vector, element-wise?
- To: mathgroup at smc.vnet.net
- Subject: [mg127069] An easier functional way to divide each Column of matrix by a row vector, element-wise?
- From: "Nasser M. Abbasi" <nma at 12000.org>
- Date: Thu, 28 Jun 2012 04:01:40 -0400 (EDT)
- Delivered-to: l-mathgroup@mail-archive0.wolfram.com
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