# Tracking absolute index position durring dimension removal

**URL:** <https://discourse.julialang.org/t/tracking-absolute-index-position-durring-dimension-removal/23231>\
**Category:** General Usage\
**Created:** [April 17, 2019, 2:50am UTC](https://discourse.julialang.org/t/tracking-absolute-index-position-durring-dimension-removal/23231 "2019-04-17T02:50:28Z")\
**Posts on this page:** 1\
**Page:** 1

<div class="post-metadata">

**Author:** ![anon92994695](https://avatars.discourse-cdn.com/v4/letter/a/ce7236/32.png) [@anon92994695](https://discourse.julialang.org/u/anon92994695)\
**Post date:** [April 17, 2019, 2:50am UTC](https://discourse.julialang.org/t/tracking-absolute-index-position-durring-dimension-removal/23231/1 "2019-04-17T02:50:28Z")

</div>

Alright Julia wizardettes/wizards. While working on my package I keep running into this problem; it’s a book keeping problem and it shows up a lot in numerical methods. Say we have a 2-array/matrix and we want to make comparisons between I don’t know rows in that matrix between columns or something. IE: in a given iteration, depending on the comparison, a column will be removed. Now, at the end of a lot of shuffling and comparing what the end user wants to know about is, “what columns were compared”.

Trivial right? The trick is there’s a moving bed of absolute positions during the algorithm. For example after removal of column say 2, all columns \>2 are now N - 1. Problem is still trivial, well I’ve solved it maybe 4 different ways, and I dislike honestly, all of my approaches despite all of them doing what I want. I’ll share one I scribbled up in about 5 minutes below. This isn’t my best approach but its the only one I have that stands on its own. I am actually really tired and shouldn’t be writing/sharing code right now, but am eager to see what others can/have come up with,

```julia
mutable struct shieldedindices{ A, B, C }
    View::A
    Kept::B
    Len::C
end

function (x::shieldedindices)()
    #Ew In is slow here!
    activeset = [loc in x.Kept for (loc, _) in x.View];
    return last.( x.View[activeset] )
end

function ShieldedIndices( X )
    len = length( X )
    span = collect( 1 : len )
    return shieldedindices( span .=> X, span, [], len )
end

function RemoveFromShield( x, i )
    activeset = [loc in x.Kept for (loc, _) in x.View];
    corr = [loc != i for (loc, _) in enumerate( x.View[ activeset] ) ];
    x.Kept = x.Kept[corr]
    return x
end

function Removed(x)
    findall( [!(loc in x.Kept) for (loc, _) in x.View] )
end

a = [11,22,33,44,55,66,77,88,99];
si = ShieldedIndices(a);
si.View;

RemoveFromShield(si, 5);
si()
Removed(si)
RemoveFromShield(si, 7);
si()
si.Kept
Removed(si)

```
