# Maximal value - product of two lists

Concerning the following situation: max \forall i { h_i * X_{mij} }

Is there a function to obtain the maximal value between the product of two lists?

This?

``````julia> h = rand(10); x = rand(10,10,10);

julia> m = 2; j = 3;

julia> maximum(h .* x[m,:,j]) # note the dot in .* : element-wise multiplication
0.6705150233027053

julia> maximum(h[i] * x[m,i,j] for i in eachindex(h))
0.6705150233027053
``````

The second won´t allocate intermediate arrays which are allocated in the first.

1 Like

I’d also like to point out the generic version of this, `reduce`, which I think is easier to remember than the difference between `max` and `maximum`. `reduce(max, (h[i] * x[m, i, j] for i in eachindex(h)))` does the same thing, but works for generic “reducing” functions (functions that can take a collection and summarize it into one number). For example, `reduce(+, array)` will take an array and return the sum.

TensorCast.jl is a friend:

``````using TensorCast
maximum(@cast _[i] := h[i] * x[\$m,i,\$j])
``````

TensorCast is still a friend, with the `@reduce` macro, if you want to make the calculation for all `m` and `j`:

``````using TensorCast
@reduce S[m,j] := maximum(i) h[i] * x[m,i,j]
``````

For example:

``````julia> h = rand(3)
3-element Vector{Float64}:
0.8601614537887764
0.9085586312619703
0.5942727699394317

julia> x = rand(4,3,2)
4×3×2 Array{Float64, 3}:
[:, :, 1] =
0.350826  0.739942  0.565042
0.751966  0.430443  0.293777
0.714827  0.974151  0.680083
0.752213  0.289802  0.784696

[:, :, 2] =
0.95478   0.0218679  0.652646
0.308032  0.499596   0.724832
0.426453  0.865667   0.790571
0.370235  0.494717   0.53362

julia> @reduce S[m,j] := maximum(i) h[i] * x[m,i,j]
4×2 Matrix{Float64}:
0.672281  0.821265
0.646812  0.453912
0.885073  0.786509
0.647025  0.44948

julia> S[1,1]
0.672280575421645

julia> S[1,1] == h*x[1,2,1]
true
``````
3 Likes

The computation for single (m,j) could be also written as:

``````@reduce _ := maximum(i) h[i] * x[\$m,i,\$j]
``````

Dear colleagues, many thanks to you for you support.