Accessing the nth dimension in a variable sized multidimensional array

51 views (last 30 days)
I have a large array of values, and before the execution I don't know how many dimension I need.
How can I extract a single column from this? Or even a specific value?
I tried things like writing a vector of the indices, but that didn't return a single value.
Example: I have a matrix A, how do I get A(1,1,...,1,:) when I don't know how many dimensions A has?
And what if I want to set a single dimension to a specific value like A(1,:,:,...,:)
Alternatively: is there another good way of storing high-dimensional scalar fields? I tried a list of index vectors like in a sparse matrix, but finding a specific value becomes very inefficient that way right?

Accepted Answer

Stephen23
Stephen23 on 13 Jul 2020
Edited: Stephen23 on 13 Jul 2020
"...how do I get A(1,1,...,1,:) when I don't know how many dimensions A has?"
You use a comma-separated list, which you can easily generate from a cell array:
C = {1,1,1,...1,,':'};
A(C{:})
You can create the cell array using repmat or num2cell or similar. The function ndims will also be useful here.
"...what if I want to set a single dimension to a specific value like A(1,:,:,...,:)"
Use a comma-separated list. Lets try a more practical example, where we define the size of C automatically:
C = repmat({':'},1,ndims(A));
C{1} = 1; % C{dim} = index
val = A(C{:})
  4 Comments

Sign in to comment.

More Answers (1)

Walter Roberson
Walter Roberson on 13 Jul 2020
nd = ndims(YourArray);
dim_wanted = randi(nd);
proto = repmat({1}, 1, nd);
proto{dim_wanted} = ':';
just_that_dim = YourArray(proto{:});
dim_one = randi(nd);
proto = repmat({':'}, 1, nd);
proto{dim_one} = 1;
all_except_that_dim = YourArray(proto{:});
proto = arrayfun(@randi, size(YourArray), 'uniform', 0);
dim_wanted = randi(nd);
proto{dim_wanted} = ':';
random_vector_in_N_space = YourArray(proto{:});
  1 Comment
Walter Roberson
Walter Roberson on 15 Jul 2020
My Answer showed how to index by any arbitrary dimension: repmat() the most common index, and replace the specific choices, then use cell expansion as the index expression. You could make a helper function, such as
IndexDim = @(A,n,index) A(struct('t',[repmat({':'},1,n-1),index,repmat({':'},1,ndims(A)-2+(n==1))]).t)
Note: doing this on one line requires a fairly new version of MATLAB; I do not recall at the moment if it needs R2020a or R2019b, but R2019a would be expected to fail for this.

Sign in to comment.

Categories

Find more on Matrices and Arrays in Help Center and File Exchange

Community Treasure Hunt

Find the treasures in MATLAB Central and discover how the community can help you!

Start Hunting!