Одним из решений может быть использование аргумента 'table'
для regionprops
. Это приводит к тому, что вывод будет table
, а не структурный массив. Этот формат более эффективен для хранения, чем массив struct.
Еще лучше, если вы не возражаете вручную отследить, где какие данные, - создать числовой массив с соответствующими данными:
BW = imread('text.png'); % Example image used in the docs
s = regionprops(BW,{'MajorAxisLength','MinorAxisLength','Orientation'});
t = regionprops('table',BW,{'MajorAxisLength','MinorAxisLength','Orientation'});
m = [s.MajorAxisLength; s.MinorAxisLength; s.Orientation];
whos
Name Size Bytes Class Attributes
BW 256x256 65536 logical
m 3x88 2112 double
s 88x1 31872 struct
t 88x3 3496 table
Числовой массив - гораздо более эффективный способ хранения данных, чем структурный массив, поскольку каждый элемент в структурном массиве представляет собой отдельную матрицу, которой требуется собственный заголовок. Заголовок (я полагаю, 114 байтов) в этом случае намного больше, чем значение, хранящееся в массиве (в данном случае 8 байтов), следовательно, издержки 31872 / 2112 = 15.1
.
Таблица хранит каждый столбец в отдельном массиве, поэтому у вас намного меньше накладных расходов. Вместо массивов 3 x 88 (количество объектов x количество объектов) у вас есть только 3.
Если гарантировано, что каждое изображение имеет одинаковое количество объектов, вы можете рассмотреть возможность размещения этих матриц в одном трехмерном массиве вместо массива ячеек. Усиление здесь будет меньше.