Вот способ, как это сделать.По сути, ваш массив представляет собой матрицу Ханкеля и векторы 1: m, где m - количество элементов в каждой диагонали.Возможно, у кого-то есть четкое представление о том, как создавать диагональные массивы, которые должны быть добавлены в перевернутый массив Ханкеля без цикла.
Я думаю, что это должно быть обобщено на неквадратный массив.
% for a 3x3 array
n=3;
numElementsPerDiagonal = [1:n,n-1:-1:1];
hadaRC = cumsum([0,numElementsPerDiagonal(1:end-1)]);
array2add = fliplr(hankel(hadaRC(1:n),hadaRC(end-n+1:n)));
% loop through the hankel array and add numbers counting either up or down
% if they are even or odd
for d = 1:(2*n-1)
if floor(d/2)==d/2
% even, count down
array2add = array2add + diag(1:numElementsPerDiagonal(d),d-n);
else
% odd, count up
array2add = array2add + diag(numElementsPerDiagonal(d):-1:1,d-n);
end
end
% now flip to get the result
indexMatrix = fliplr(array2add)
result =
1 2 6
3 5 7
4 8 9
После этого вы просто звоните reshape(image(indexMatrix),[],1)
, чтобы получить вектор переупорядоченных элементов.
РЕДАКТИРОВАТЬ
Хорошо, из вашего комментария это выглядит как вынужно использовать sort
, как предложил Марк.
indexMatrixT = indexMatrix'; % ' SO formatting
[dummy,sortedIdx] = sort(indexMatrixT(:));
sortedIdx =
1 2 4 7 5 3 6 8 9
Обратите внимание, что вам нужно сначала транспонировать входную матрицу перед индексированием, потому что Matlab считает сначала вниз, затем вправо.