COMPGROUPS.NET | Search | Post Question | Groups | Stream | About | Register

### Re: An easier functional way to divide each Column of matrix by a row vector, element-wise? #2

• Email
• Follow

```#/v & /@ mat

Bob Hanlon

On Thu, Jun 28, 2012 at 4:02 AM, Nasser M. Abbasi <nma@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
>>
>
>
>

--
Bob Hanlon

```
 0
Reply hanlonr357 (841) 6/29/2012 8:52:39 AM

See related articles to this posting

0 Replies
37 Views

Similar Articles

12/5/2013 6:21:59 AM
[PageSpeed]