Доступ к элементам в подматрице в big matrix matlab

#matlab #matrix #sparse-matrix

#matlab #матрица #разреженная матрица

Вопрос:

У меня есть большая матрица, разделенная на подматрицы.

 clear all
clc

X  = [1 2 3; 4 5 6; 7 8 9];
B1 = zeros(3,9);
B2 = zeros(3,3);
m1 = diag([11 12 13]);
m2 = diag([14 15 16]);
m3 = diag([17 18 19]);
G = [ X B1; B2 m1 m2 m3]; 
  

Результатом является

 G =

     1     2     3     0     0     0     0     0     0     0     0     0
     4     5     6     0     0     0     0     0     0     0     0     0
     7     8     9     0     0     0     0     0     0     0     0     0
     0     0     0    11     0     0    14     0     0    17     0     0
     0     0     0     0    12     0     0    15     0     0    18     0
     0     0     0     0     0    13     0     0    16     0     0    19
  

Теперь мой вопрос заключается в том, как получить доступ к диагональным элементам подматриц (m1, m2, m3), начиная с индекса i = 1 до i = 3 или обращаясь к определенному m, например i = 2 для m2? Другой вопрос: возможен ли доступ к подматрицам по их именам в качестве индекса в большой матрице? Например, G(m1(1,1)) ? Сейчас это не работает, но я хочу проиллюстрировать свою точку зрения.

Ответ №1:

Доступ к диагоналям подматриц

Чтобы получить диагональ подматрицы, вы должны выбрать подматрицу, затем использовать функцию diag:

 diag(G(1:3,1:3))
  

Маркировка подматриц

Вы могли бы определить метку следующим образом:

 m1_s={[4:6],[4:6]}
  

что означает строки с 4 по 6, столбцы с 4 по 6. Чтобы получить подматрицу с помощью G(m1_s{:}) .

Очевидно, что вы можете комбинировать оба метода. Например, получаем диагональ подматрицы m1:

 diag(G(m1_s{:}))
  

Как {:} объясняется здесь, он преобразует массив ячеек m1_s в список, разделенный запятыми. Запись G(m1_s{:}) такая же, как G(m1_s{1},m1_s{2})

/обновить:

Более динамичный способ маркировки может быть реализован с использованием дескриптора функции:

 m_s=@(c)({[4:6],[1:3] c*3})
  

Теперь вы можете использовать

 m1_s=m_s(1)
G(m1_s)
  

Комментарии:

1. но ваш подход будет затруднен, если я увеличу m. Что я сделал просто. Я действительно создал функцию function index = m_index(i) for a = 1:i j = 4; k = 1; while (k < a) j = j 3; k = k 1; end end index = j; end , теперь я управляю ms на основе i индексов. В main(), G(4, m_index(i) ) G(5, m_index(i) 1) G(6, m_index(i) 2)

2. @CroCo: Вы правы, есть много способов определить это более динамичным способом, но ваша функция кажется немного усложненной. Разве функция не всегда возвращает (i 1)*3 1 ?

3. (i 1)*3 1 да, но это не обрабатывает первый случай, в котором i=1 . В этом случае он должен возвращать 4 not 7 .

4. Я отследил вывод, и оказалось, что для 1 4; 2 7; 3 10; 4 13 . В этом случае я могу получить доступ к определенным m, не проходя через цикл. Функция обрабатывает этот цикл.