Filter löschen
Filter löschen

Substract nd array slices

1 Ansicht (letzte 30 Tage)
Orangelynx
Orangelynx am 12 Nov. 2017
Kommentiert: Orangelynx am 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.

Akzeptierte Antwort

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

Melden Sie sich an, um zu kommentieren.

Weitere Antworten (1)

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

Melden Sie sich an, um zu kommentieren.

Kategorien

Mehr zu Matrix Indexing finden Sie in Help Center und File Exchange

Tags

Produkte

Community Treasure Hunt

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

Start Hunting!

Translated by