Index slice of ND array of unknown dimension
조회 수: 9 (최근 30일)
이전 댓글 표시
Let's say I have a 3D array A, and I want to remove a slice:
A(i,:,:) = [];
But what if I don't know the dimension of the array beforehand? Just doing
A(i,:) = [];
Is valid, but reshapes the array into a 2D matrix.
I was thinking something like:
A(i,indices{:}) = [];
but I don't think you can put a colon operator in a cell.
댓글 수: 0
채택된 답변
Stephen23
2017년 6월 12일
편집: Stephen23
2017년 6월 12일
If you do not know the size of the array before hand then you can call subsasgn directly. The function subsasgn is the actual function that MATLAB calls whenever you assign to an array using the indexing convenience operators () or {}, e.g. X(1) = 2, in just the same way that 1+2 is just a convenience operator for plus(1,2). We can also call subasgn directly, just like we could call plus if we so wished.
Here is a simple example of removing one row of A without hard-coding how many dimensions it has:
>> A = rand(5,4,3,2);
>> S.subs = repmat({':'},1,ndims(A));
>> S.subs{1} = 3; % the third row
>> S.type = '()';
>> B = subsasgn(A,S,[]);
>> size(B)
ans =
4 4 3 2
댓글 수: 4
Daniel Plotnick
2020년 3월 23일
It looks like this has changed in more recent updates: I had been using this technique, but it failed when using it on a gpuArray. The included code below now works for gpuArrays and normal arrays:
A = gpuArray.rand(5,4,3,2);
v = repmat({':'},ndims(A),1);
v{1} = 3; % Do the third row
B = A;
B(v{:}) = []; % Note, you can replace this with a numeric to substitite instead of delete
size(B)
추가 답변 (0개)
참고 항목
카테고리
Help Center 및 File Exchange에서 Matrix Indexing에 대해 자세히 알아보기
제품
Community Treasure Hunt
Find the treasures in MATLAB Central and discover how the community can help you!
Start Hunting!