Substract nd array slices
1 view (last 30 days)
Show older comments
Hi,
I have a n-dimensional array which may contain singleton dimensions and I would like to substract the second page of dimension i from the first page of dimension i. My current solution looks something like this:
function A = substract_page( A, dim )
orig_size = size(A); % store the original shape
A = shiftdim(A, dim); % shift the dimension to be substracted to the end
shifted_size = size(A); % aliter: shifted_size = circshift orig_size(dim); ?
A = reshape(A, [], shifted_size(end)); % collapse first dimensions for easier substraction
A = A(:, 2) - A(:, 1);
shifted_size(end) = shifted_size(end) - 1; % substraction leads to dimension loss
A = reshape(A, shifted_size); % restore shape
lost_dimensions = length(orig_size) - ndims(A);
A = shiftdim(A, -lost_dimensions); % make sure that singular dimensions in the end don't get lost
A = shiftdim(A, length(orig_size) - dim + lost_dimensions); % restore order
end
But it seems way to complicated and I feel there is a much easier and more elegant solution.
0 Comments
Accepted Answer
Jan
on 12 Nov 2017
Edited: Jan
on 12 Nov 2017
Does your code perform this:
dim = 3;
A = rand(2,3,4,5);
A = A(:, :, 2, :) - A(:, :, 1, :)
? Then:
function A = substract_page(A, dim)
C1 = repmat({':'}, 1, ndims(A));
C2 = C1;
C1{dim} = 1;
C2{dim} = 2;
A = A(C2{:}) - A(C1{:});
end
3 Comments
Jan
on 13 Nov 2017
@Orangelynx: When the dimension to operate on has the length 2, diff is perfect. My code would be useful only, if the input has e.g. the length 4 as in my example, and only the difference between the first 2 slices should be calculated ignoring the rest.
More Answers (1)
See Also
Categories
Find more on Matrix Indexing in Help Center and File Exchange
Products
Community Treasure Hunt
Find the treasures in MATLAB Central and discover how the community can help you!
Start Hunting!