Azzera filtri
Azzera filtri

Substract nd array slices

2 visualizzazioni (ultimi 30 giorni)
Orangelynx
Orangelynx il 12 Nov 2017
Commentato: Orangelynx il 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.

Risposta accettata

Jan
Jan il 12 Nov 2017
Modificato: Jan il 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 Commenti
Jan
Jan il 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 il 13 Nov 2017
good point, I guess I didn't specify that clearly in my original question.

Accedi per commentare.

Più risposte (1)

Matt J
Matt J il 12 Nov 2017
Not sure, but maybe you are looking for
A=diff(A,1,dim);
  1 Commento
Orangelynx
Orangelynx il 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.

Accedi per commentare.

Categorie

Scopri di più su Downloads in Help Center e File Exchange

Tag

Prodotti

Community Treasure Hunt

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

Start Hunting!

Translated by