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