Sequential multiple hcat()s of a range of rows?

My first post, first question and eternal novice.

I wish to sequentially horizontal concatenate a range of rows from an array:

A = [
	0 1
	2 3
	4 5
	6 7
	8 9
	]

So far this is the function I have come up with to perform the operation:

function multihcat(A, steps)
	B = A[1:end-steps, :]
	for i ∈ 1:steps
		B = hcat(B, A[1+i:end-(steps-i),:])
	end
	return B
end

Then running multihcat(A, 2) gives the desired result:

3Γ—6 Array{Int64,2}:
 0  1  2  3  4  5
 2  3  4  5  6  7
 4  5  6  7  8  9

However I think I am missing a much more elegant Julia way of doing this and welcome suggestions of better solutions.

Maybe a more julian way would be to use reduce:

 multihcat(A, steps) = reduce(hcat, A[i+1:end-(steps-i), :] for i in 0:steps)

However, since the size of B is known in advance, it makes the most sense to preallocate it with

n, m = size(A)
B = similar(A, n-steps, m*(steps+1)

And then fill it in a loop. This will be the fastest and most memory efficient.

1 Like

Memory inefficient, but fun way to solve this task

hcat(circshift.(Ref(A), 0:-1:-2)...)[1:3, :]

Thank you for the feedback. I agree, preallocating the array, because its size is known in advance, would be a better approach, I will try that.

Thank you for the suggestion, it’s very compact and I will have to study it for a while to understand it. I’ve never used circshift before but looks like it can be useful.

1 Like

If you will have any questions, do not hesitate to ask.

1 Like