Effacer les filtres
Effacer les filtres

Substract nd array slices

2 vues (au cours des 30 derniers jours)
Orangelynx
Orangelynx le 12 Nov 2017
Commenté : Orangelynx le 13 Nov 2017
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.

Réponse acceptée

Jan
Jan le 12 Nov 2017
Modifié(e) : Jan le 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 commentaires
Jan
Jan le 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.
Orangelynx
Orangelynx le 13 Nov 2017
good point, I guess I didn't specify that clearly in my original question.

Connectez-vous pour commenter.

Plus de réponses (1)

Matt J
Matt J le 12 Nov 2017
Not sure, but maybe you are looking for
A=diff(A,1,dim);
  1 commentaire
Orangelynx
Orangelynx le 13 Nov 2017
wow.. I knew about diff, but for some reason my head told me it's not what I was looking for, eventhough with the dim parameter, it's exactly what I wanted... thanks.

Connectez-vous pour commenter.

Catégories

En savoir plus sur Downloads dans Help Center et File Exchange

Tags

Produits

Community Treasure Hunt

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

Start Hunting!

Translated by