Matlab - использование двух индексных массивов для работы с подматрицей - PullRequest
0 голосов
/ 02 октября 2018

Я пытаюсь выяснить, как получить доступ к подмассивам Matlab (часть массива) с помощью общего набора векторов индексов.

В общем, проблема определяется как: Учитывая два n-dim конечные точки индекса массива (оба размера nd), один из которых имеет начальный набор индексов (startInd), а другой имеет последний набор индексов (endInd), как получить доступ к подматрице, которая включена между парой индексов-sets?

Например, я хочу заменить это:

Mat=rand(10,10,10,10);
Mat(2:7, 1:6, 1:6, 2:8) = 1.0;

операцией, которая может принимать любой набор из двух n-dim векторов, определяющих индексы для последней операции, которая«абстрактно» выражается в виде:

Mat=rand(10,10,10,10);
startInd=[2 1 1 2];
endInd  =[7 6 6 8];

IndexVar=???
Mat(IndexVar) = 1.0;

Таким образом, я хочу получить доступ к Матрицу подматрицы (2: 7, 1: 6, 1: 6, 2: 8), используя переменную или какой-либо другой универсальныйформа, которая позволяет общий N-DIM.Желательно не цикл (так как он медленный).

Я пытался использовать что-то такого рода:

% Generate each index list separately:
nDims=length(startInd);
ind=cell(nDims,1);
for j=1:nDims
    ind{j}=startInd(j):1:endInd(j);
end

% Access the matrix:
S.type = '()';
S.subs = ind;
Mat=subsasgn(Mat,S,1.0)

Это, кажется, делает работу, но очень медленная и память-экспансивный, но может дать кому-то идею ...

1 Ответ

0 голосов
/ 02 октября 2018

Если вы не возражаете против зацикливания над измерениями (что должно быть намного быстрее, чем зацикливание над массивом записей ):

indexVar = arrayfun(@(a,b) colon(a,b), startInd, endInd, 'UniformOutput', false);
Mat(indexVar{:}) = 1;

Используется arrayfun (по существу, цикл) для создания массива ячеек с индексными векторами, который затем расширяется до списка, разделенного запятыми .


Теперь, когда я вижу ваш код: здесь используется тот же подход, только цикл заменяется на arrayfun, а разделенный запятыми список позволяет использовать более естественный синтаксический индекс вместо subsasgn.

Добро пожаловать на сайт PullRequest, где вы можете задавать вопросы и получать ответы от других членов сообщества.
...