1

I have the following list of matrices

data= {{{23,3,4,5,20.5},{24,3,1,0,20.5},{25,3,7,8,20.5},{26,6,5,4,20.5}},{{23,4,5,3,20.4},{24,4,3,5,20.4},{26,4,3,2,20.4},{27,4,5,7,20.4},{28,4,3,2,20.4}},{{23,4,5,3,20.3},{24,4,3,5,20.3},{26,4,3,2,20.3},{27,4,5,7,20.3},{28,4,3,2,20.3},{29,0,0,2,20.3}},{{23,4,5,3,20.2},{24,4,3,5,20.2},{26,4,3,2,20.2},{30,4,5,7,20.2},{29,0,0,2,20.2}}}

I want to multiply the 2nd,3rd and 4th element of each row by its 5th element, eg: the first row would be {{{23,61.5,82,102.5,20.5},{24,61.5,20.5,0,20.5} and so on...

I know how to multiply these columns

data[[All,All,{2,3,4}]]*data[[All,All,5]] 

but this generates

{{{61.5, 82., 102.5}, {61.5, 20.5, 0.}, {61.5, 143.5, 164.}, {123., 102.5, 82.}}, {{81.6, 102., 61.2}, {81.6, 61.2, 102.}, {81.6, 61.2, 40.8}, {81.6, 102., 142.8}, {81.6, 61.2, 40.8}}, {{81.2, 101.5, 60.9}, {81.2, 60.9, 101.5}, {81.2, 60.9, 40.6}, {81.2, 101.5, 142.1}, {81.2, 60.9, 40.6}, {0., 0., 40.6}}, {{80.8, 101., 60.6}, {80.8, 60.6, 101.}, {80.8, 60.6, 40.4}, {80.8, 101., 141.4}, {0., 0., 40.4}}}

how do I put this back into data ?

HuShu
  • 439
  • 2
  • 14

2 Answers2

3

You were one character away from the solution:

data[[All, All, {2, 3, 4}]] *= data[[All, All, 5]];

data
{{{23, 61.5, 82., 102.5, 20.5}, {24, 61.5, 20.5, 0., 20.5}, . . .

See documentation for TimesBy and Elegant operations on matrix rows and columns.

Mr.Wizard
  • 271,378
  • 34
  • 587
  • 1,371
3

A couple of approaches:

f[x_] := {x[[1]], Sequence @@ (x[[-1]] # & /@ x[[2 ;; -2]]), x[[-1]]};
g = {#1, #2 #5, #3 #5, #4 #5, #5} &;
Map[f, data, {2}]
g @@@ # & /@ data
ubpdqn
  • 60,617
  • 3
  • 59
  • 148