3d array Literal

In C, 3d array literal is written as

int arr[3][3][3]=   
		{
		    {
			{11, 12, 13},
			{14, 15, 16},
			{17, 18, 19}
		    },
		    {
			{21, 22, 23},
			{24, 25, 26},
			{27, 28, 29}
			},
			{
			{31, 32, 33},
			{34, 35, 36},
			{37, 38, 39}
			},
		};

I wonder how to write 3d array literal in Julia and higher dimensional array in general.

I tried below but it produces only 2d array:

a = [
[1 2 3; 4 5 6];
[11 12 13; 14 15 16];
[21 22 23; 24 25 26];
]

6×3 Array{Int64,2}:
1 2 3
4 5 6
11 12 13
14 15 16
21 22 23
24 25 26

1 Like

I don’t think there is syntax for this, see

Just construct it — eg cat(...; dims = 3).

4 Likes

Or, alternatively, provide a matrix/vector and reshape.

That’s right. I tried permutedims!(reshape(1:8, (2,2,2)), (2,1,3)) and it works well indeed! A bit cumbersome due to column-major vs row-major conversion :slight_smile: It should be really great if syntax for multidimensional array is merged in near future.

TBH, while I agree that it is nice when you need it, it is not something that is used so often that it needs its own specific syntax.

Something like

"Concatenate along an extra first dimension."
function upcat(a::AbstractArray{T,N}, rest...) where {T,N}
    @assert all(ndims.(rest) .== N)
    permutedims(cat(a, rest...; dims = N + 1), (N + 1, ntuple(identity, N)...))
end

A = upcat([1 2 3; 4 5 6],
          [11 12 13; 14 15 16],
          [21 22 23; 24 25 26])

would be more generic and allow nesting to arbitrary dimensions (warning: not well-tested, optimized, etc).

2 Likes