# SubArray -selecting same combination of rows from 2 arrays

Hi,
I have 2 arrays and I want to make subarrays by selecing a combination of 2 rows from each but the selected index should be the same. e.g A = [1 1 1 1 ;2 2 2 2 ;3 3 3 3 ;4 4 4 4 4 ] and B = [5 5 5 5; 6 6 6 6; 7 7 7 7;8 8 8 8].
So If I am selecting rows 1&3 from A, B should also have the same selection.
A_sub = [ 1 1 1 1;3 3 3 3], B_sub = [5 5 5 5; 7 7 7 7].

I tried sampling but it does not work, the row index changes. Would highly appreciate any feedback.

Does this do what you want?

``````julia> A = [1 1 1 1; 2 2 2 2; 3 3 3 3; 4 4 4 4]; B = [5 5 5 5; 6 6 6 6; 7 7 7 7; 8 8 8 8];

julia> rows = [1,3]; # Select rows 1 and 3; replace this with whatever code you use to pick the rows

julia> A_sub = A[rows,:] # The : keeps all the columns
2×4 Matrix{Int64}:
1  1  1  1
3  3  3  3

julia> B_sub = B[rows,:]
2×4 Matrix{Int64}:
5  5  5  5
7  7  7  7
``````

Not sure what you mean here.

Not exactly what I am looking for. I want different combinations. e.g 1&3, 1&2, 2&3 - but this should be the same for both the arrays.
I tried this. : A_sub = A[sample(1:size(A,1), 2, replace=false, ordered=true),:].
This does give me 2 rows but then it is not the same for both the arrays. So let’s say if I get rows 1 &3 for A, for B I get 2&3.

Move your `sample` command outside of the actual indexing, like `rows` in the previous example.

You mean like this. :
rows_a = sample(1:size(A,1), 2, replace=false, ordered=true)
rows_b = sample(1:size(B,1), 2, replace=false, ordered=true)

A_sub = [rows_a,:]
B_sub = [rows_b,:]

Doesn’t work - it still gives a different row index for each array.

Of course it gives a different row index in general - you are sampling twice? If you want the same index for both arrays, just index them with the same vector?

``````julia> rows = sample(1:size(A, 1), 2; replace = false, ordered = true)
2-element Vector{Int64}:
2
4

julia> A[rows, :]
2×4 Matrix{Int64}:
2  2  2  2
4  4  4  4

julia> B[rows, :]
2×4 Matrix{Int64}:
6  6  6  6
8  8  8  8
``````
2 Likes

My bad, I didn’t realize it. Thanks a lot. Is there any way I can view or store the index combination at each stage?

No, I meant exactly like @nilshg said.

1 Like

What is a “stage”? The code I posted above shows the index combination - the first output is:

``````2-element Vector{Int64}:
2
4
``````

So this is what I want to do :

• sample different combinations (1,2),(1,3),(1,4),(2,3),(2,4),(3,4) and store those combinations. I want to check each combination against certain criteria and if the criteria is met, add a new row to the initial matrix. Terminate the sampling when all combinations are done. I have the criteria set, it’s the storing and accessing of combinations that I am not able to figure out.

This doesn’t sound like “sampling” combinations, but rather generating all pairwise (unordered) combinations of the integers 1 to 4? If that’s what you want:

``````julia> using Combinatorics

julia> collect(combinations(1:4, 2))
6-element Vector{Vector{Int64}}:
[1, 2]
[1, 3]
[1, 4]
[2, 3]
[2, 4]
[3, 4]
``````
1 Like

Classical loops to check all combinations and store those who pass the criteria along with sub-arrays:

``````function check_row_combs(A,B,criteria)
A_subs = Vector{Matrix{Int64}}(undef,0)
B_subs = Vector{Matrix{Int64}}(undef,0)
combs  = Vector{Vector{Int64}}(undef,0)
for i = 1:size(A,1)
for j = i+1:size(B,1)
comij = [i,j]
A_sub = A[comij,:]
B_sub = B[comij,:]
if criteria(A_sub,B_sub)
push!(A_subs, A_sub)
push!(B_subs, B_sub)
push!(combs, comij)
end
end
end
return A_subs, B_subs, combs
end
``````
``````A = [1 1 1 1; 2 2 2 2; 3 3 3 3; 4 4 4 4]
B = [5 5 5 5; 6 6 6 6; 7 7 7 7; 8 8 8 8]
f(A,B) = true
check_row_combs(A,B,f)

([[1 1 1 1; 2 2 2 2], [1 1 1 1; 3 3 3 3], [1 1 1 1; 4 4 4 4], [2 2 2 2; 3 3 3 3], [2 2 2 2; 4 4 4 4], [3 3 3 3; 4 4 4 4]], [[5
5 5 5; 6 6 6 6], [5 5 5 5; 7 7 7 7], [5 5 5 5; 8 8 8 8], [6 6 6 6; 7 7 7 7], [6 6 6 6; 8 8 8 8], [7 7 7 7; 8 8 8 8]], [[1, 2],
[1, 3], [1, 4], [2, 3], [2, 4], [3, 4]])
``````
1 Like