Как извлечь диагональные срезы из 3D-массива в matlab

#matlab #multidimensional-array

#matlab #многомерный массив

Вопрос:

Мой вопрос может быть тривиальным. У меня есть большая 3D-матрица (m на n на k элементов) в MatLab, и я хочу извлечь все диагональные срезы и сохранить их в другом 3D-массиве. Для лучшего представления я приложил фотографию. пунктирные линии-это диагональные срезы, которые я ищу.

введите описание изображения здесь

Комментарии:

1. (строка, столбец, страница) — это индексация в matlab

Ответ №1:

Учитывая m x n x k массив a , используйте следующий метод для извлечения срезов в массив ячеек:

 idx = repmat(reshape((0 : k - 1), 1, 1,[]) (1 : n), [m, 1, 1]); result = accumarray(idx(:), a(:), [], @(x){reshape(x, m, 1,[])});  

Срезы имеют размеры [m x 1 x y] в y диапазоне от 1 до min(n,k) .

Для старых версий MATLAB используйте следующее ( bsxfun вместо неявного расширения):

 idx = repmat(bsxfun(@plus, reshape((0 : k - 1), 1, 1,[]), (1 : n)), [m, 1, 1]); result = accumarray(idx(:), a(:), [], @(x){reshape(x, m, 1,[])});  

Комментарии:

1. Уважаемый @rahnema1 с этим определением и индексацией [m,n,k]=size(a) , я получил ошибку при применении вашего решения.