Deleting an irregular "row"/"column" from 2-d array

1 visualización (últimos 30 días)
Knut
Knut el 5 de Dic. de 2017
Editada: Matt J el 5 de Dic. de 2017
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?

Respuestas (1)

Matt J
Matt J el 5 de Dic. de 2017
Editada: Matt J el 5 de Dic. de 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).'

Categorías

Más información sobre Matrix Indexing en Help Center y File Exchange.

Etiquetas

Productos

Community Treasure Hunt

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

Start Hunting!

Translated by