У меня есть матрица M с нефиксированной размерностью, из которой я хочу получить доступ к одному элементу. Индексы элемента содержатся в векторе J.
Так, например:
M = rand(6,4,8,2);
J = [5 2 7 1];
output = M(5,2,7,1)
На этот раз M имеет 4 измерения, но это неизвестно заранее. Это зависит от настройки алгоритма, который я пишу. Также может быть, что
M = rand(6,4);
J = [3 1];
output = M(3,1)
поэтому я не могу просто использовать
output=M(J(1),J(2))
Я думал об использовании sub2ind, но для этого также нужны переменные, разделенные запятыми..
@gnovice
this работает, но я намерен довольно часто использовать этот вид извлечения элементов из матрицы M
. Итак, если мне придется создавать временную переменную cellJ
каждый раз, когда я обращаюсь к M
, разве это не сильно замедлит вычисления?
Я мог бы также написать отдельную функцию
function x= getM(M,J)
x=M(J(1),J(2));
% M doesn't change in this function, so no mem copy needed = passed by reference
end
и адаптировать ее для разных конфигураций алгоритма. Это, конечно, соображение скорости и гибкости, которое я не включил в свой вопрос..
НО: это доступно только для получения элемента, для установки нет другого способа, кроме фактического использования индексов (и предпочтительно линейный показатель). Я все еще думаю, что sub2ind - это вариант.Конечный результат, который я рассчитывал, был примерно таким:
function idx = getLinearIdx(J, size_M)
idx = ...
end
function lin_idx = Lidx_ml( J, M )%#eml
%LIDX_ML converts an array of indices J for a multidimensional array M to
%linear indices, directly useable on M
%
% INPUT
% J NxP matrix containing P sets of N indices
% M A example matrix, with same size as on which the indices in J
% will be applicable.
%
% OUTPUT
% lin_idx Px1 array of linear indices
%
% method 1
%lin_idx = zeros(size(J,2),1);
%for ii = 1:size(J,2)
% cellJ = num2cell(J(:,ii));
% lin_idx(ii) = sub2ind(size(M),cellJ{:});
%end
% method 2
sizeM = size(M);
J(2:end,:) = J(2:end,:)-1;
lin_idx = cumprod([1 sizeM(1:end-1)])*J;
end
метод 2 равен 20 (небольшое количество наборов индексов ( =P
) для преобразования) до 80 (большое количество наборов индексов ( =P
)) раза быстрее, чем метод 1. легкий выбор