Deleting an irregular "row"/"column" from 2-d array
1 Ansicht (letzte 30 Tage)
Ältere Kommentare anzeigen
I have a 2d array, and I want to eliminate the same number of elements in each row (or column) (e.g. 1 element), but the index of that element is itself av vector. This operation would be relevant for doing seam-carving (content-aware image resize).
Is there any neat way of doing this without my array collapsing into a 1d vector?
A = (1:3)'*(1:3);
A =
1 2 3
2 4 6
3 6 9
b = [1; 2; 2];
for r=(1:3)
tmp = A(r,:);
tmp(b(r)) = [];
Y(r,:) = tmp;
end
Y =
2 3
2 6
3 9
I seem to have a working method, but it is kind of cumbersome as I have to (?) make sure that the linear indexing into Y is strictly monotonic:
Y = A';
Y(sub2ind(size(A'), b, (1:3)')) = [];
Y = reshape(Y, size(A,2)-1, size(A,1))'
Anything neater?
0 Kommentare
Antworten (1)
Matt J
am 5 Dez. 2017
Bearbeitet: Matt J
am 5 Dez. 2017
I think your solution is probably the best, except that I would avoid the extra calls to size() and ctranspose(). The latter are particularly expensive.
Y = A.';
[m,n]=size(Y);
Y( sub2ind([m,n], b, (1:3)) )=[];
Y = reshape(Y, m-1, n).'
0 Kommentare
Siehe auch
Kategorien
Mehr zu Matrix Indexing finden Sie in Help Center und File Exchange
Produkte
Community Treasure Hunt
Find the treasures in MATLAB Central and discover how the community can help you!
Start Hunting!