Подтвердить что ты не робот

В чем разница между ячейкой и матрицей в Matlab?

В чем разница между ячейкой (т.е. с { }) и матрицей (т.е. с [ ]) в Matlab?

4b9b3361

Ответ 1

Существует несколько отличий между массивом ячеек и матрицей в MATLAB:

  • Ячейный массив может содержать любой произвольный тип элемента в каждой ячейке; в то время как матрица требует, чтобы типы ее элементов были однородными, то есть одного и того же типа.

  • Что касается макета памяти, все элементы матрицы сложены в памяти, а массив ячеек содержит указатели на каждый элемент массива. Это может быть важно при рассмотрении таких вещей, как локализация кэша для высокопроизводительного кода.

  • Оборотная сторона точки 2 заключается в том, что при изменении размера матрицы каждый элемент в матрице должен быть скопирован в вновь выделенную область памяти, но в случае массива ячеек нужно скопировать только список указателей над. В зависимости от размера и типа элементов, которые вы храните, это может означать, что массивы ячеек намного быстрее изменяются.


Чтобы проиллюстрировать различия в макете памяти, рассмотрим простой пример:

A = [10 20 30 40];

Здесь MATLAB создает новую матричную переменную с именем A, выделяет достаточное количество памяти для хранения 4 двухлокальных (32 байта, предполагая 8 байтовых удвоений) и присваивает этой памяти указателю, указывающему на действительную часть A. (Если вы создаете матрица комплексных чисел, память также выделяется для мнимой части, а отдельный указатель указывает на эту область памяти).

Теперь давайте создадим массив ячеек, содержащий эти элементы:

B = cell(1, 4);
B{1,1} = 10;
B{1,2} = 20;
B{1,3} = 30;
B{1,4} = 40;

Когда MATLAB выполняет первый оператор, он создает массив ячеек, содержащий 4 указателя, каждый из которых может указывать на произвольный тип. Таким образом, B уже использует 16 байтов (предполагая 32-разрядные указатели). Следующая строка создает матрицу 1x1, содержащую значение 10, и присваивает ее первому элементу ячейки ячейки. Этот процесс аналогичен описанному выше для создания матрицы 1x4, за исключением того, что выделенная память достаточно велика, чтобы удерживать один двойной (8 байтов). Это повторяется для каждого из оставшихся 3 операторов. Таким образом, на минимальном уровне во втором примере используются 16 + 8 x 4 = 48 байты.

Обратите внимание, что каждая переменная в MATLAB также содержит накладные расходы памяти для структуры, называемой mxArray, которая хранит информацию, такую ​​как размерность, тип данных и многое другое об этой переменной. Я просто проигнорировал эти накладные расходы ради простоты.