Кратчайшая команда для извлечения подматрицы с использованием вектора, содержащего индексы 2 углов [matlab]

Допустим, у нас есть следующая матрица

A=magic(4)

16     2     3    13
 5    11    10     8
 9     7     6    12
 4    14    15     1

и мы хотим извлечь 3 подматрицы, идентифицированные индексами для левого верхнего и правого нижнего углов. Индексы для подматрицы содержатся в строке матрицы i; столбцы 1 и 2 i являются индексами строк углов, столбцов 3 и 4 i являются индексами столбцов углов.

т.е.

i =

 1     1     1     3
 2     4     1     2
 3     4     3     4

>> A(i(1,1):i(1,2),i(1,3):i(1,4))

ans =

16     2     3

>> A(i(2,1):i(2,2),i(2,3):i(2,4))

ans =

 5    11
 9     7
 4    14

>> A(i(3,1):i(3,2),i(3,3):i(3,4))

ans =

     6    12
    15     1

Команда A(i(,):i(,),i(,):i(,)) который я использовал для извлечения подматриц, не очень удобен, поэтому мне интересно, есть ли лучший способ сделать работу?

1 ответ

Решение

Если вы не хотите печатать все это, тогда почему бы не написать функцию-обертку?

A = magic(4);
S = @(r) A(i(r,1):i(r,2),i(r,3):i(r,4));
S(1)
S(2)
S(3)

Если A может измениться после определения S тогда вам нужно сделать это параметром для функции.

S = @(A,r) A(i(r,1):i(r,2),i(r,3):i(r,4));
A = magic(4)
S(A,1)
S(A,2)
S(A,3)

Точно так же, если i может измениться, тогда вам нужно будет сделать это параметром.

Редактировать К сожалению, вопреки моему комментарию, если вы хотите выполнить назначение, то A(I(r)) не будет работать точно так же, как вы опубликовали, так как это всегда возвращает массив вместо матрицы. Один из возможных способов - использовать массивы ячеек вместо списков, разделенных запятыми, но это не так элегантно, как опция "только для чтения". Например

S = @(r) {i(r,1):i(r,2) , i(r,3):i(r,4)};
s = S(1); A(s{:})
s = S(2); A(s{:})
s = S(3); A(s{:})

Следуя тому же принципу, вы можете предварительно определить массив ячеек из i сделать доступ одной строкой.

s = arrayfun(@(r) {i(r,1):i(r,2),i(r,3):i(r,4)}, 1:size(i,1), 'UniformOutput', false);
A(s{1}{:})
A(s{2}{:})
A(s{3}{:})
Другие вопросы по тегам