Индексирование матрицы неизвестной размерности

У меня есть матрица 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. легкий выбор

10
задан Gunther Struyf 13 August 2014 в 12:45
поделиться