Logo Questions Linux Laravel Mysql Ubuntu Git Menu
 

Update cartesianIndex

Tags:

julia

I am stuck in a problem. I want to update my cartesian index.

I have a matrix (x) 200x6 that is binary. 1 if assigned, 0 otherwise. I want to find the cartesian index of when x is 1 in the first 3 columns and in the last 3 elements.

I have the following code:

index_right = findall( x -> x == 1, sol.x_assignment[:,1:3])
index_left = findall( x -> x == 1, sol.x_assignment[:,4:6])
index_left

However index_right is correct, index_left is wrong as it returns index between 1,2,3 instead of 4,5,6

CartesianIndex(2, 1)
CartesianIndex(3, 1)
CartesianIndex(10, 2)
CartesianIndex(11, 1)

Expected output:

CartesianIndex(2, 4)
CartesianIndex(3, 4)
CartesianIndex(10, 5)
CartesianIndex(11, 4)

How can I update index_left to add +3 in the second index for all?

like image 301
Nora Seinfield Avatar asked Dec 21 '25 21:12

Nora Seinfield


2 Answers

One solution could be

index_left = findall( x -> x == 1, sol.x_assignment[:,4:6])
index_left = map(x -> x + CartesianIndex(0, 3), index_left)

I think you can also use ==(1) in place of x -> x + 1, looks a bit nicer :)

index_left = findall(==(1), sol.x_assignment[:,4:6])

and the inplace version of map should work too

map!(x -> x + CartesianIndex(0, 3), index_left, index_left).

An alternative could be first finding all the indices with 1 and then filtering afterwards, so smth like

full_index = findall(==(1), sol.x_assignment)

and then

left_index = filter(x -> x[2] <= 3, full_index)
right_index = filter(x -> x[2] > 3, full_index)
like image 91
Giovanni Avatar answered Dec 24 '25 10:12

Giovanni


Assuming your x is:

using Random;Random.seed!(0);
x = rand(Bool, (5,6))

The first set can be found as:

findall(isone, @view x[:, 1:3])

For the second set you need to shift the results hence you want:

findall(isone, @view x[:, 4:6]) .+ Ref( CartesianIndex(0,3))

If you are searching for different value eg. 2 use ==(2) rather than a lambda as this is faster. Similarly @view allows to avoid unnecessary allocations.

like image 37
Przemyslaw Szufel Avatar answered Dec 24 '25 10:12

Przemyslaw Szufel



Donate For Us

If you love us? You can donate to us via Paypal or buy me a coffee so we can maintain and grow! Thank you!