#arrays #matlab #multidimensional-array
#массивы #matlab #многомерный массив
Вопрос:
Я пытаюсь присвоить некоторые значения матрице.В случае 2 или 3 измерений легко использовать sub2ind. Однако данные, которые я использую, имеют 23 измерения. Ситуацию можно было бы лучше объяснить на примере. A
это матрица, которая имеет 3x4x5x6x7
размеры. Я хочу назначить что-то A(1,2,3,4,5)
с линейной индексацией. Обычно это возможно с помощью sub2ind, например:
A(sub2ind(siz,1,2,3,4,5)) = any_var;
Однако я хочу, чтобы ввод sub2ind присваивался массиву вместо запятых. Есть ли что-нибудь, что удовлетворяет этому в MATLAB?
A(sub2ind(siz,[1 2 3 4 5])) = any_var; % I want something like this.
Ответ №1:
Определите вектор со значениями индекса
x = [1 2 3 4 5];
Затем вы можете преобразовать в ячейку (используя num2cell
) и из нее в список, разделенный запятыми:
xc = num2cell(x);
A(sub2ind(siz, xc{:})) = any_var;
Или вы могли бы выполнить вычисления напрямую и избежать sub2ind
. Чтобы преобразовать в линейный индекс, вычтите 1 из индекса по k-му измерению и умножьте на совокупное произведение размеров предыдущих измерений. Сумма для всех k плюс 1 является линейным индексом:
A(x(1) sum((x(2:end)-1).*cumprod(siz(1:end-1)))) = any_var;
Комментарии:
1. Это быстрее? (Второе решение)
2. Идея
cumprod
выглядит правильно для меня. Я использовал ту же стратегию, чтобы свернуть строки 2D-массива в скалярные, чтобы получить 1D-массив, так что предполагается, что каждая строка представляет эквиваленты линейных индексов при сопоставлении с n-dim сеткой, гдеn
— количество столбцов. Итак, в NumPy это стало бы сумасшедшим однострочным :a.dot(np.append((a.max(0) 1)[:0:-1].cumprod()[::-1],1))
! Эта часть индексации[:0:-1]
, которую я считал больной, все же;)