You can get results roughly equally fast to sblom's double-Transpose
approach using the generalised version of Inner
.
Inner[Divide, matrix, vector, List]
Timing tests
Set up some example data:
ci = RandomInteger[{0, 100}, {20, 3}];
cr = RandomReal[{0., 100.}, {20, 3}];
vi = {3, 2, 1};
vr = {3., 2., 1.};
Division
In[38]:= Do[Transpose[Transpose[ci]/vi];, {1000}] // Timing (*sblom*)
Out[38]= {0.047, Null}
In[39]:= Do[#/vi & /@ ci;, {1000}] // Timing (* faleichik/Heike in comments*)
Out[39]= {0.172, Null}
In[56]:= Do[Inner[Divide, ci, vi, List];, {1000}] // Timing (* me *)
Out[56]= {0.047, Null}
In[40]:= Do[ScalingTransform[1/vi][ci];, {1000}] // Timing (* Brett *)
Out[40]= {0.39, Null}
(* as before but for real numbers *)
In[41]:= Do[Transpose[Transpose[cr]/vr];, {1000}] // Timing
Out[41]= {0.016, Null}
In[42]:= Do[#/vr & /@ cr;, {1000}] // Timing
Out[42]= {0.109, Null}
In[57]:= Do[Inner[Divide, cr, vr, List];, {1000}] // Timing
Out[57]= {0.031, Null}
In[43]:= Do[ScalingTransform[1/vr][cr];, {1000}] // Timing
Out[43]= {0.36, Null}
Multiplication
As an aside, because of the way Divide
works internally, if you are dividing through by the same vector a lot, it makes some sense to create a vector that is 1./thefirstvector
and multiply through with that. The effect is more noticeable if you have integer data.
ivi = 1/vi;
ivr = 1./vr;
In[82]:= Do[Transpose[Transpose[ci]*ivi];, {1000}] // Timing
Out[82]= {0.031, Null}
In[83]:= Do[#*ivi & /@ ci;, {1000}] // Timing
Out[83]= {0.125, Null}
In[84]:= Do[Inner[Times, ci, ivi, List];, {1000}] // Timing
Out[84]= {0.031, Null}
In[85]:= Do[ScalingTransform[ivi][ci];, {1000}] // Timing
Out[85]= {0.375, Null}
In[86]:= Do[Transpose[Transpose[cr]*ivr];, {1000}] // Timing
Out[86]= {0.016, Null}
In[87]:= Do[#*ivr & /@ cr;, {1000}] // Timing
Out[87]= {0.063, Null}
In[88]:= Do[Inner[Times, cr, ivr, List];, {1000}] // Timing
Out[88]= {0.031, Null}
In[89]:= Do[ScalingTransform[ivr][cr];, {1000}] // Timing
Out[89]= {0.343, Null}
S=#/v & @@@ C;
Best regards to Mr.Wizard! $\endgroup$#/v & /@ C
? $\endgroup$vec.mat
andmat.vec
work. (You can of course have an $1\times n$ or $n\times 1$ matrix.) Operations between $m \times k$ matrices and $m$-length vectors do work automatically, but not with $k$-length vectors. $\endgroup$C
andK
are built-in symbols, and assigning to either of them will break the system in subtle ways (for those who wonder, yes: even assigning toK
breaks it, I have seen examples). $\endgroup$