MATLAB: многомерность линейной индексации

#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] , которую я считал больной, все же;)