# How can I transform this matlab code into Julia

**URL:** <https://discourse.julialang.org/t/how-can-i-transform-this-matlab-code-into-julia/81351>\
**Category:** General Usage\
**Tags:** matlab, indexing, arrays\
**Created:** [May 20, 2022, 7:57am UTC](https://discourse.julialang.org/t/how-can-i-transform-this-matlab-code-into-julia/81351 "2022-05-20T07:57:07Z")\
**Posts on this page:** 20\
**Page:** 1

<div class="post-metadata">

**Author:** ![Raymond](https://sea2.discourse-cdn.com/julialang/user_avatar/discourse.julialang.org/raymond/32/36557_2.png) [@Raymond](https://discourse.julialang.org/u/Raymond)\
**Post date:** [May 20, 2022, 7:57am UTC](https://discourse.julialang.org/t/how-can-i-transform-this-matlab-code-into-julia/81351/1 "2022-05-20T07:57:08Z")

</div>

```julia
>> val = zeros(3, 3);
>> row = zeros(3, 3);
>> A = [1 2 3; 6 5 1; 1 7 4];

[val(1, :), row(1, :)] = max(A)

val =

     6 7 4
     0 0 0
     0 0 0

row =

     2 3 3
     0 0 0
     0 0 0

```

How can I get the max value and row number and save them.

---

<div class="post-metadata">

**Author:** ![skleinbo](https://sea2.discourse-cdn.com/julialang/user_avatar/discourse.julialang.org/skleinbo/32/36080_2.png) [@skleinbo](https://discourse.julialang.org/u/skleinbo)\
**Post date:** [May 20, 2022, 8:17am UTC](https://discourse.julialang.org/t/how-can-i-transform-this-matlab-code-into-julia/81351/2 "2022-05-20T08:17:03Z")

</div>

```julia
julia> vals, idx = findmax(A, dims=1)
([6 7 4], CartesianIndex{2}[CartesianIndex(2, 1) CartesianIndex(3, 2) CartesianIndex(3, 3)])

julia> vals
1×3 Matrix{Int64}:
 6 7 4

julia> idx
1×3 Matrix{CartesianIndex{2}}:
 CartesianIndex(2, 1) CartesianIndex(3, 2) CartesianIndex(3, 3)

```

If you need the row only and not the full index:

```julia
row = first.(Tuple.(idx))
1×3 Matrix{Int64}:
 2 3 3

```

---

<div class="post-metadata">

**Author:** ![Raymond](https://sea2.discourse-cdn.com/julialang/user_avatar/discourse.julialang.org/raymond/32/36557_2.png) [@Raymond](https://discourse.julialang.org/u/Raymond)\
**Post date:** [May 20, 2022, 8:20am UTC](https://discourse.julialang.org/t/how-can-i-transform-this-matlab-code-into-julia/81351/3 "2022-05-20T08:20:50Z")

</div>

yes, I only need the row only. Thanks, it solves my problem.

---

<div class="post-metadata">

**Author:** ![Raymond](https://sea2.discourse-cdn.com/julialang/user_avatar/discourse.julialang.org/raymond/32/36557_2.png) [@Raymond](https://discourse.julialang.org/u/Raymond)\
**Post date:** [May 20, 2022, 4:10pm UTC](https://discourse.julialang.org/t/how-can-i-transform-this-matlab-code-into-julia/81351/4 "2022-05-20T16:10:52Z")

</div>

Dear @skleinbo ,

how can I transform this matlab code into Julia code.

Here is the MATLAB code.

```julia
>> xx = zeros(2, 3)

xx =

     0 0 0
     0 0 0

>> yy = zeros(2, 3)

yy =

     0 0 0
     0 0 0

>> location = [1 2 3; 2 3 4]

location =

     1 2 3
     2 3 4

>> [xx(1,:), yy(1,:)] = ind2sub([2,2], location(1,:))

xx =

     1 2 1
     0 0 0

yy =

     1 1 2
     0 0 0

```

I want to transform this matlab code into Julia. and I try to rewrite the code,but get an error.

```julia
julia> xx = zeros(2, 3)
2×3 Matrix{Float64}:
 0.0 0.0 0.0
 0.0 0.0 0.0

julia> yy = zeros(2, 3)
2×3 Matrix{Float64}:
 0.0 0.0 0.0
 0.0 0.0 0.0

julia> location = [1 2 3; 2 3 4]
2×3 Matrix{Int64}:
 1 2 3
 2 3 4

julia> xx[1,:] .= CartesianIndices((2, 2))[location[1,:]][1]
ERROR: iteration is deliberately unsupported for CartesianIndex. Use `I` rather than `I...`, or use `Tuple(I)...`
Stacktrace:

```

Can you help me to correct my code to get the row and column index by the first row of `location`?

---

<div class="post-metadata">

**Author:** ![skleinbo](https://sea2.discourse-cdn.com/julialang/user_avatar/discourse.julialang.org/skleinbo/32/36080_2.png) [@skleinbo](https://discourse.julialang.org/u/skleinbo)\
**Post date:** [May 20, 2022, 4:23pm UTC](https://discourse.julialang.org/t/how-can-i-transform-this-matlab-code-into-julia/81351/5 "2022-05-20T16:23:46Z")

</div>

You can use [`LinearIndices`](https://docs.julialang.org/en/v1/base/arrays/#Base.LinearIndices) and [`CartesianIndices`](https://docs.julialang.org/en/v1/base/arrays/#Base.IteratorsMD.CartesianIndices) to convert between linear and cartesian indices.

**Edit** : Ah, sorry, didn’t see you had discovered that already. You need to convert the cartesian indices to a tuple before indexing first, like the error suggests. Maybe

```julia
xx[1,:] .= first.(Tuple.(CartesianIndices((2, 2))[location[1,:]]))

```

As you can see, this is a bit unwieldy and inelegant and should prompt you to consider a less MATLABy way.

---

<div class="post-metadata">

**Author:** ![Raymond](https://sea2.discourse-cdn.com/julialang/user_avatar/discourse.julialang.org/raymond/32/36557_2.png) [@Raymond](https://discourse.julialang.org/u/Raymond)\
**Post date:** [May 20, 2022, 4:41pm UTC](https://discourse.julialang.org/t/how-can-i-transform-this-matlab-code-into-julia/81351/6 "2022-05-20T16:41:49Z")

</div>

I try to use `loop` .

```julia
julia> for i in 1:2, j in 1:3
          xx[i, j] = CartesianIndices((2, 2))[location[i, j]][1]
       end

julia> for i in 1:2, j in 1:3
          yy[i, j] = CartesianIndices((2, 2))[location[i, j]][2]
       end

julia> xx
2×3 Matrix{Float64}:
 1.0 2.0 1.0
 2.0 1.0 2.0

julia> yy
2×3 Matrix{Float64}:
 1.0 1.0 2.0
 1.0 2.0 2.0

```

This is the result what I need. But I don’t think `loop` is the best way.

---

<div class="post-metadata">

**Author:** ![Raymond](https://sea2.discourse-cdn.com/julialang/user_avatar/discourse.julialang.org/raymond/32/36557_2.png) [@Raymond](https://discourse.julialang.org/u/Raymond)\
**Post date:** [May 20, 2022, 4:42pm UTC](https://discourse.julialang.org/t/how-can-i-transform-this-matlab-code-into-julia/81351/7 "2022-05-20T16:42:14Z")

</div>

Thanks so much.This solves my problem.

---

<div class="post-metadata">

**Author:** ![Raymond](https://sea2.discourse-cdn.com/julialang/user_avatar/discourse.julialang.org/raymond/32/36557_2.png) [@Raymond](https://discourse.julialang.org/u/Raymond)\
**Post date:** [May 20, 2022, 4:45pm UTC](https://discourse.julialang.org/t/how-can-i-transform-this-matlab-code-into-julia/81351/8 "2022-05-20T16:45:52Z")

</div>

Does Julia have the same function `ind2sub` or `sub2ind`? I think CartesianIndices or LinearIndices is worse than matlab function `ind2sub`.

---

<div class="post-metadata">

**Author:** ![skleinbo](https://sea2.discourse-cdn.com/julialang/user_avatar/discourse.julialang.org/skleinbo/32/36080_2.png) [@skleinbo](https://discourse.julialang.org/u/skleinbo)\
**Post date:** [May 20, 2022, 4:47pm UTC](https://discourse.julialang.org/t/how-can-i-transform-this-matlab-code-into-julia/81351/9 "2022-05-20T16:47:47Z")

</div>

Not for a long time [PSA: replacement of ind2sub/sub2ind in Julia 0.7+](https://discourse.julialang.org/t/psa-replacement-of-ind2sub-sub2ind-in-julia-0-7/14666)

---

<div class="post-metadata">

**Author:** ![Raymond](https://sea2.discourse-cdn.com/julialang/user_avatar/discourse.julialang.org/raymond/32/36557_2.png) [@Raymond](https://discourse.julialang.org/u/Raymond)\
**Post date:** [May 20, 2022, 5:20pm UTC](https://discourse.julialang.org/t/how-can-i-transform-this-matlab-code-into-julia/81351/10 "2022-05-20T17:20:16Z")

</div>

@skleinbo I have another problem. I have convert the results to `Int`, but why the type is still Float64?

```julia
 pol_ind_kp[iak_state, :] = Int.(first.(Tuple.(CartesianIndices((nk, na))[Int.(location[iak_state, :])])))
 
typeof(pol_ind_kp)
Matrix{Float64} (alias for Array{Float64, 2})

```

---

<div class="post-metadata">

**Author:** ![Raymond](https://sea2.discourse-cdn.com/julialang/user_avatar/discourse.julialang.org/raymond/32/36557_2.png) [@Raymond](https://discourse.julialang.org/u/Raymond)\
**Post date:** [May 20, 2022, 5:26pm UTC](https://discourse.julialang.org/t/how-can-i-transform-this-matlab-code-into-julia/81351/11 "2022-05-20T17:26:01Z")

</div>

I have solved the problem by myself. I forget to set the zeros matrix Int when I define the `pol_ind_kp`.

---

<div class="post-metadata">

**Author:** ![Oscar\_Smith](https://sea2.discourse-cdn.com/julialang/user_avatar/discourse.julialang.org/oscar_smith/32/25343_2.png) [@Oscar\_Smith](https://discourse.julialang.org/u/Oscar_Smith)\
**Post date:** [May 20, 2022, 5:27pm UTC](https://discourse.julialang.org/t/how-can-i-transform-this-matlab-code-into-julia/81351/12 "2022-05-20T17:27:10Z")

</div>

Loops aren’t bad. They’re often the best way to solve a problem.

---

<div class="post-metadata">

**Author:** ![Raymond](https://sea2.discourse-cdn.com/julialang/user_avatar/discourse.julialang.org/raymond/32/36557_2.png) [@Raymond](https://discourse.julialang.org/u/Raymond)\
**Post date:** [May 20, 2022, 5:30pm UTC](https://discourse.julialang.org/t/how-can-i-transform-this-matlab-code-into-julia/81351/13 "2022-05-20T17:30:39Z")

</div>

Thanks for your reply. But I think `loops` may take a very long time.

---

<div class="post-metadata">

**Author:** ![Oscar\_Smith](https://sea2.discourse-cdn.com/julialang/user_avatar/discourse.julialang.org/oscar_smith/32/25343_2.png) [@Oscar\_Smith](https://discourse.julialang.org/u/Oscar_Smith)\
**Post date:** [May 20, 2022, 5:33pm UTC](https://discourse.julialang.org/t/how-can-i-transform-this-matlab-code-into-julia/81351/14 "2022-05-20T17:33:05Z")

</div>

They do in Matlab, but loops in Julia are fast.

---

<div class="post-metadata">

**Author:** ![Raymond](https://sea2.discourse-cdn.com/julialang/user_avatar/discourse.julialang.org/raymond/32/36557_2.png) [@Raymond](https://discourse.julialang.org/u/Raymond)\
**Post date:** [May 20, 2022, 5:36pm UTC](https://discourse.julialang.org/t/how-can-i-transform-this-matlab-code-into-julia/81351/15 "2022-05-20T17:36:04Z")

</div>

Oh, It is really a good news to me. I use matlab and Stata very often. And `loops` always take a very long time. Thank you very much.

---

<div class="post-metadata">

**Author:** ![Oscar\_Smith](https://sea2.discourse-cdn.com/julialang/user_avatar/discourse.julialang.org/oscar_smith/32/25343_2.png) [@Oscar\_Smith](https://discourse.julialang.org/u/Oscar_Smith)\
**Post date:** [May 20, 2022, 5:45pm UTC](https://discourse.julialang.org/t/how-can-i-transform-this-matlab-code-into-julia/81351/16 "2022-05-20T17:45:36Z")

</div>

Matlab to Julia requires significant unlearning of bad habits. Another one for free: whenever you type `rand(1)` or `rand(n,1)`, you almost certainly want `rand()` or `rand(n)`.

---

<div class="post-metadata">

**Author:** ![lmiq](https://sea2.discourse-cdn.com/julialang/user_avatar/discourse.julialang.org/lmiq/32/18314_2.png) [@lmiq](https://discourse.julialang.org/u/lmiq)\
**Post date:** [May 20, 2022, 5:52pm UTC](https://discourse.julialang.org/t/how-can-i-transform-this-matlab-code-into-julia/81351/17 "2022-05-20T17:52:15Z")

</div>

> [@Raymond](#):
>
> Thanks for your reply. But I think `loops` may take a very long time.

Read carefully the [Performance Tips · The Julia Language](https://docs.julialang.org/en/v1/manual/performance-tips/)

Particularly the first one. There is where most commonly new Julia users fail to get a good performance.

---

<div class="post-metadata">

**Author:** ![Raymond](https://sea2.discourse-cdn.com/julialang/user_avatar/discourse.julialang.org/raymond/32/36557_2.png) [@Raymond](https://discourse.julialang.org/u/Raymond)\
**Post date:** [May 21, 2022, 8:28pm UTC](https://discourse.julialang.org/t/how-can-i-transform-this-matlab-code-into-julia/81351/18 "2022-05-21T20:28:20Z")

</div>

Dear @skleinbo ,

how can I use `LinearIndices` to get the index. In matlab, we can use `sub2ind`.

```julia
>> A = [1 2 1; 2 2 1]

A =

     1 2 1
     2 2 1

>> inds = sub2ind([2,2], A(1,:), A(2,:))

inds =

     3 4 1

```

---

<div class="post-metadata">

**Author:** ![Raymond](https://sea2.discourse-cdn.com/julialang/user_avatar/discourse.julialang.org/raymond/32/36557_2.png) [@Raymond](https://discourse.julialang.org/u/Raymond)\
**Post date:** [May 21, 2022, 9:03pm UTC](https://discourse.julialang.org/t/how-can-i-transform-this-matlab-code-into-julia/81351/19 "2022-05-21T21:03:27Z")

</div>

@ [murphyk](https://discourse.julialang.org/u/murphyk) I try to use function `sub2indv` which @ [murphyk](https://discourse.julialang.org/u/murphyk) wrote.

```julia
function subv2ind(shape, cindices)
    """Return linear indices given vector of cartesian indices.
    shape: d-tuple of dimensions.
    cindices: n-iterable of d-tuples, each containing cartesian indices.
    Returns: n-vector of linear indices.

    Based on:
    https://discourse.julialang.org/t/psa-replacement-of-ind2sub-sub2ind-in-julia-0-7/14666/8
    Similar to this matlab function:
    https://github.com/tminka/lightspeed/blob/master/subv2ind.m
    """
    lndx = LinearIndices(Dims(shape))
    n = length(cindices)
    out = Array{Int}(undef, n)
    for i = 1:n
        out[i] = lndx[cindices[i]...]
    end
    return out
end

julia> A = [1 2 1; 2 2 1]
2×3 Matrix{Int64}:
 1 2 1
 2 2 1

julia> subv2ind((2, 2), Tuple.(zip(A[1, :], A[2, :])))
3-element Vector{Int64}:
 3
 4
 1

```

Is there another simpler way to do this?

---

<div class="post-metadata">

**Author:** ![Raymond](https://sea2.discourse-cdn.com/julialang/user_avatar/discourse.julialang.org/raymond/32/36557_2.png) [@Raymond](https://discourse.julialang.org/u/Raymond)\
**Post date:** [May 21, 2022, 9:44pm UTC](https://discourse.julialang.org/t/how-can-i-transform-this-matlab-code-into-julia/81351/20 "2022-05-21T21:44:26Z")

</div>

```julia
julia> subv2ind((2, 2), [(i, j) for (i, j) in zip(A[1, :], A[2, :])])
3-element Vector{Int64}:
 3
 4
 1

```

[Next page](https://discourse.julialang.org/t/how-can-i-transform-this-matlab-code-into-julia/81351.md?page=2)
