# Absolute value of matrix

**URL:** https://discourse.julialang.org/t/absolute-value-of-matrix/44395
**Category:** Optimization (Mathematical)
**Tags:** question
**Created:** [August 6, 2020, 7:55am UTC](https://discourse.julialang.org/t/absolute-value-of-matrix/44395 "2020-08-06T07:55:07Z")
**Posts on this page:** 12
**Page:** 1

<div class="post-metadata">

### Author: ![dty](https://sea2.discourse-cdn.com/julialang/user_avatar/discourse.julialang.org/dty/32/16885_2.png) [@dty](https://discourse.julialang.org/u/dty)
#### Post date: [August 6, 2020, 7:55am UTC](https://discourse.julialang.org/t/absolute-value-of-matrix/44395/1 "2020-08-06T07:55:07Z")

</div>

How to define the absolute value of all elements in the matrix?

```julia
using JuMP,Gurobi

 model = Model(Gurobi.Optimizer);
model=Model(Gurobi.Optimizer)
T=24
 @variable(model, 2 <= a[1:T,1:3]<= 2.5, Int)
@variable(model,-1<=PMT[1:T,1:3]<=20)
@variable(model,0<=WES_BT[1:T,1:3]<=20)

for i = 1:3
        for t = 2:T
            @constraint(model, WES_BT[t,i] == WES_BT[t-1,i]/0.98 )
            
        end
    end
     

@NLobjective(model,Min,sum(abs(0.3PMT+0.3a)))
@constraint(model,0 .<=PMT .<= 60)
optimize!(model)

term_status = JuMP.termination_status(model)
   primal_status = JuMP.primal_status(model)
   is_optimal = term_status == MOI.OPTIMAL

```

I try to use`@NLobjective`，  
`@NLobjective(model,Min,sum(abs(0.3PMT[i,j]+0.3a[i,j] for i in 1:T j in 1:3)))`  
The following error still occurs, I don’t know how to change it

```julia
LoadError: sum() can appear in nonlinear expressions only if the argument is a generator statement, for example, sum(x[i] for i in 1:N).
Stacktrace:
 [1] error(::String) at .\error.jl:33
 [2] top-level scope at C:\Users\61940\.juliapro\JuliaPro_v1.4.2-1\packages\JuMP\YXK4e\src\parse_nlp.jl:247
 [3] top-level scope at C:\Users\61940\.juliapro\JuliaPro_v1.4.2-1\packages\JuMP\YXK4e\src\macros.jl:1328
in expression starting at E:\Julia程序\lizi.jl:23

```

---

<div class="post-metadata">

### Author: ![tomaklutfu](https://sea2.discourse-cdn.com/julialang/user_avatar/discourse.julialang.org/tomaklutfu/32/2411_2.png) [@tomaklutfu](https://discourse.julialang.org/u/tomaklutfu)
#### Post date: [August 6, 2020, 9:59am UTC](https://discourse.julialang.org/t/absolute-value-of-matrix/44395/2 "2020-08-06T09:59:14Z")

</div>

Have you tried `sum(abs(0.3PMT[i,j]+0.3a[i,j]) for i in 1:T j in 1:3)` ? I am not proficient in JuMP but the error suggests that `sum` should take generator instead of the `abs`.

---

<div class="post-metadata">

### Author: ![dty](https://sea2.discourse-cdn.com/julialang/user_avatar/discourse.julialang.org/dty/32/16885_2.png) [@dty](https://discourse.julialang.org/u/dty)
#### Post date: [August 6, 2020, 10:41am UTC](https://discourse.julialang.org/t/absolute-value-of-matrix/44395/3 "2020-08-06T10:41:06Z")

</div>

I’ve tried, but it doesn’t seem right.

---

<div class="post-metadata">

### Author: ![dty](https://sea2.discourse-cdn.com/julialang/user_avatar/discourse.julialang.org/dty/32/16885_2.png) [@dty](https://discourse.julialang.org/u/dty)
#### Post date: [August 6, 2020, 12:53pm UTC](https://discourse.julialang.org/t/absolute-value-of-matrix/44395/4 "2020-08-06T12:53:03Z")

</div>

@odow  
I’m very sorry to ask you again!  
In `JuMP`, how to add absolute value to the objective function, I only know that because of the absolute value, it becomes nonlinear and needs to be used `@NLobjective`  
But how to realize the sum of matrix?

---

<div class="post-metadata">

### Author: ![anon37204545](https://avatars.discourse-cdn.com/v4/letter/a/439d5e/32.png) [@anon37204545](https://discourse.julialang.org/u/anon37204545)
#### Post date: [August 6, 2020, 1:04pm UTC](https://discourse.julialang.org/t/absolute-value-of-matrix/44395/5 "2020-08-06T13:04:15Z")

</div>

What you want is to broadcast the abs function to individual elements:

```julia
sum(abs.(0.3PMT+0.3a))

```

---

<div class="post-metadata">

### Author: ![dty](https://sea2.discourse-cdn.com/julialang/user_avatar/discourse.julialang.org/dty/32/16885_2.png) [@dty](https://discourse.julialang.org/u/dty)
#### Post date: [August 6, 2020, 1:12pm UTC](https://discourse.julialang.org/t/absolute-value-of-matrix/44395/6 "2020-08-06T13:12:27Z")

</div>

I changed it according to what you said, but the error is still the same```  
@NLobjective(model,Min,sum(abs.(0.3PMT+0.3a)))

```julia

```

LoadError:sum() can appear in nonlinear expressions only if the argument is a generator statement, for example, sum(x[i] for i in 1:N).

```julia

```

---

<div class="post-metadata">

### Author: ![odow](https://sea2.discourse-cdn.com/julialang/user_avatar/discourse.julialang.org/odow/32/28685_2.png) [@odow](https://discourse.julialang.org/u/odow)
#### Post date: [August 6, 2020, 1:15pm UTC](https://discourse.julialang.org/t/absolute-value-of-matrix/44395/7 "2020-08-06T13:15:47Z")

</div>

No need for `@NLobjective`,you can formulate this as a linear program:

```nohighlight
using JuMP
T = 24
model = Model()
@variables(model, begin
    2 <= a[1:T, 1:3]<= 2.5, Int
    0 <= PMT[1:T, 1:3] <= 60
    0 <= WES_BT[1:T, 1:3] <= 20
    abs_pmt[1:T, 1:3] >= 0
end)
@constraints(model, begin
    [i=1:3, t = 2:T], WES_BT[t, i] == WES_BT[t-1, i] / 0.98
    abs_pmt .>= 0.3 .* PMT + 0.3 .* a
    abs_pmt .>= -(0.3 .* PMT + 0.3 .* a)
end)
@objective(model, Min, sum(abs_pmt))

```

---

<div class="post-metadata">

### Author: ![dty](https://sea2.discourse-cdn.com/julialang/user_avatar/discourse.julialang.org/dty/32/16885_2.png) [@dty](https://discourse.julialang.org/u/dty)
#### Post date: [August 6, 2020, 1:26pm UTC](https://discourse.julialang.org/t/absolute-value-of-matrix/44395/8 "2020-08-06T13:26:09Z")

</div>

This transformation is so ingenious！  
But I still want to ask one more question: is it not easy to realize my previous idea of using `for` loops in `objective` ？

---

<div class="post-metadata">

### Author: ![dty](https://sea2.discourse-cdn.com/julialang/user_avatar/discourse.julialang.org/dty/32/16885_2.png) [@dty](https://discourse.julialang.org/u/dty)
#### Post date: [August 6, 2020, 1:28pm UTC](https://discourse.julialang.org/t/absolute-value-of-matrix/44395/9 "2020-08-06T13:28:52Z")

</div>

If it is a nonlinear objective function (for example, if there is a matrix summation of the square term in the objective function), then how to realize sum () I am more curious

---

<div class="post-metadata">

### Author: ![odow](https://sea2.discourse-cdn.com/julialang/user_avatar/discourse.julialang.org/odow/32/28685_2.png) [@odow](https://discourse.julialang.org/u/odow)
#### Post date: [August 6, 2020, 1:33pm UTC](https://discourse.julialang.org/t/absolute-value-of-matrix/44395/10 "2020-08-06T13:33:37Z")

</div>

As stated in the error message, you need to write `@NLobjective(model, Min, sum(abs(PMT[t,i]) for t = 1:T, i=1:3))`.

---

<div class="post-metadata">

### Author: ![odow](https://sea2.discourse-cdn.com/julialang/user_avatar/discourse.julialang.org/odow/32/28685_2.png) [@odow](https://discourse.julialang.org/u/odow)
#### Post date: [August 6, 2020, 1:34pm UTC](https://discourse.julialang.org/t/absolute-value-of-matrix/44395/11 "2020-08-06T13:34:31Z")

</div>

The Mosek modeling cookbook has lots of interesting transformations: [2 Linear optimization — MOSEK Modeling Cookbook 3.3.0](https://docs.mosek.com/modeling-cookbook/linear.html#absolute-value)

---

<div class="post-metadata">

### Author: ![dty](https://sea2.discourse-cdn.com/julialang/user_avatar/discourse.julialang.org/dty/32/16885_2.png) [@dty](https://discourse.julialang.org/u/dty)
#### Post date: [August 6, 2020, 1:38pm UTC](https://discourse.julialang.org/t/absolute-value-of-matrix/44395/12 "2020-08-06T13:38:32Z")

</div>

Your answer is always to the point！  
I know that most solvers can’t solve the NLP problem. Thank you. I’ll take a look at it.
