Вернуть индексы матрицы переменного размера
Мне нужно иметь возможность возвращать индексы [x1 x2 ... xd] элементов матрицы измерений LxLxL..xL. Число измерений d - это переменная, предоставленная моей функции. Матрица не существует, вместо этого у меня есть линейный массив длины L^d. Для данного индекса i в массиве я хотел бы знать эквивалентные индексы в матрице. Я уже могу сделать это, используя простой цикл for, но мне любопытно узнать, могу ли я как-нибудь использовать ind2sub. У меня проблема в том, что если я делаю
x=zeros(1,d)
x=ind2sub(L,i)
x переназначается одно число, а не массив всех подписок. Есть ли способ сделать это?
1 ответ
Я предполагаю, что под "индексами [x1 x2 ... xd]" вы подразумеваете индексы по каждому измерению эквивалентного d-мерного массива.
Вам необходимо преобразовать L и d в массив измерений, а затем захватить несколько аргументов из ind2sub
, Вот функция, которая делает это. Вы можете назвать это как x = myind2sub(L, d, i)
,
function out = myind2sub(L, d, ix)
sz = repmat(L, [1 d]); %// dimension array for a d-dimension array L long on each side
c = cell([1 d]); %// dynamically sized varargout
[c{:}] = ind2sub(sz, ix);
out = [c{:}];
Но вам также следует спросить, почему вы храните его в линейном массиве и рассчитываете индексы, а не просто сохраняете его в многомерном массиве. В Matlab многомерный массив хранится в непрерывном блоке памяти, поэтому он эффективен, и вы можете индексировать его, используя либо многомерные индексы, либо линейное индексирование. Если у вас есть линейный массив, просто позвоните reshape(myarray, sz)
преобразовать его в многомерный эквивалент.