Accessing the nth dimension in a variable sized multidimensional array

10 ビュー (過去 30 日間)
Jan Bode
Jan Bode 2020 年 7 月 13 日
コメント済み: Walter Roberson 2020 年 7 月 15 日
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?

採用された回答

Stephen23
Stephen23 2020 年 7 月 13 日
編集済み: Stephen23 2020 年 7 月 13 日
"...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 件のコメント
Walter Roberson
Walter Roberson 2020 年 7 月 14 日
subsref twice? That does not sound right. end calls the end method; https://www.mathworks.com/help/matlab/matlab_oop/object-end-indexing.html
Jan Bode
Jan Bode 2020 年 7 月 15 日
Well okay, guess I will do it manually then

サインインしてコメントする。

その他の回答 (1 件)

Walter Roberson
Walter Roberson 2020 年 7 月 13 日
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 件のコメント
Walter Roberson
Walter Roberson 2020 年 7 月 15 日
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.

サインインしてコメントする。

カテゴリ

Help Center および File ExchangeCreating and Concatenating Matrices についてさらに検索

Community Treasure Hunt

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

Start Hunting!

Translated by