Как выбрать подматрицу (не в каком-либо конкретном шаблоне) в Matlab - программирование
Подтвердить что ты не робот

Как выбрать подматрицу (не в каком-либо конкретном шаблоне) в Matlab

Как выбрать подматрицу (не в любом шаблоне) в Matlab? Например, для матрицы размером 10 на 10, как выбрать подматрицу, состоящую из пересечения 1-й 2-й и 9-й строк и 4-го и 6-го столбцов?

Спасибо за полезные ответы!

4b9b3361

Ответ 1

TL;DR: короткий ответ

Что касается вашего вопроса, предположим, что у вас есть произвольная матрица размером 10 на 10 A. Самый простой способ извлечь нужную подматрицу будет с индексом:

B = A([1 2 9], [4 6]);


Индексирование в MATLAB

В официальной документации есть интересная статья, которая всесторонне объясняет индексацию в MATLAB. В принципе, есть несколько способов извлечь подмножество значений, я подведу их для вас:

1. Индексирующие векторы

Индексирующие векторы указывают индексы подлежащего извлечению элемента. Они могут содержать либо один индекс, либо несколько, например:

A = [10 20 30 40 50 60 70 80 90]

%# Extracts the third and the ninth element
B = A([3 9])  %# B = [30 90]

Индексирующие векторы могут быть указаны для каждого измерения отдельно, например:

A = [10 20 30; 40 50 60; 70 80 90];

%# Extract the first and third rows, and the first and second columns
B = A([1 3], [1 2])  %# B = [10 30; 40 60]

Есть также два специальных индекса: end и двоеточие (:):

  • end просто указывает последний индекс в этом измерении.
  • Двоеточие - это всего лишь короткая нотация для "1: конец".

Например, вместо записи A([1 2 3], [2 3]) вы можете написать A(:, 2:end). Это особенно полезно для больших матриц.

2. Линейное индексирование

Линейное индексирование обрабатывает любую матрицу, как если бы она была вектором столбца, объединяя столбцы в один вектор столбца и присваивая индексы элементам соответственно. Например, мы имеем:

A = [10 20 30; 40 50 60; 70 80 90];

и мы хотим вычислить b = A(2). Эквивалентный вектор столбца:

A = [10;
     40;
     70;
     20;
     50;
     80;
     30;
     60;
     90]

и, следовательно, b равно 40.

Конечно, также разрешены специальные индексы двоеточия и end. По этой причине A(:) преобразует любую матрицу A в вектор-столбец.

Линейная индексация с матричными индексами: Также возможно использовать другую матрицу для линейной индексации. Матрица индексов просто преобразуется в вектор столбца и используется для линейной индексации. Полученная матрица, однако, всегда имеет те же размеры, что и матрица индексов.
Например, если I = [1 3; 1 2], то A(I) совпадает с записью reshape(A(I(:)), size(I)).

Преобразование из матричных индексов в линейные индексы и наоборот: Для этого у вас sub2ind и ind2sub, соответственно. Например, если вы хотите преобразовать индексы [1, 3] в матрице A (соответствующие элементу 30) в линейный индекс, вы можете написать sub2ind(size(A), 1, 3) (результат в этом случае должен быть 7, конечно).

3. Логическая индексация

В логической индексации индексы двоичные, где логический 1 указывает, что выбран соответствующий элемент, а 0 означает, что это не так. Вектор индекса должен быть либо одного и того же размера, как исходная матрица или вектор с таким же количеством элементов. Например, если мы имеем:

A = [10 20 30; 40 50 60; 70 80 90];

и мы хотим извлечь A([1 3], [1 2]) с помощью логической индексации, мы можем сделать следующее:

Ir = logical([1 1 0]);
Ic = logical([1 0 1]);
B = A(Ir, Ic)

или это:

I = logical([1 0 1; 1 0 1; 0 0 0]);
B = A(I)

или это:

I = logical([1 1 0 0 0 0 1 1 0]);
B = A(I)

Заметим, что в последних двух случаях это одномерный вектор, и при необходимости его необходимо преобразовать обратно в матрицу (например, используя reshape).

Ответ 2

Позвольте мне объяснить с помощью примера:

Определим матрицу 6x6

A = magic(6)

A = 
35     1     6    26    19    24
 3    32     7    21    23    25
31     9     2    22    27    20
 8    28    33    17    10    15
30     5    34    12    14    16
 4    36    29    13    18    11

Из этой матрицы вам нужны элементы в строках 1, 2 и 5, а в столбцах 4 и 6

B = A([1 2 5],[4 6])

B = 

26    24
21    25
12    16

Надеюсь, что это поможет.

Ответ 3

function f = sub(A,i,j)
[m,n] = size(A);

row = 1:m;
col = 1:n;

x = row;
x(i) = [];

y=col;
y(j) = [];

f= A(x,y);

Возвращает матрицу A с удаленной i-й строкой и j-м столбцом.