Извлечение ненулевых диагоналей и создание разреженных полосовых и диагональных матриц
Создайте тридиагональную матрицу с помощью трех векторов, измените некоторые диагонали матрицы, а затем извлеките диагонали.
Создайте вектор 9 на 1, а затем с помощью вектора создайте тридиагональную матрицу. Просмотрите элементы матрицы.
n = 9; e = ones(n,1); A = spdiags([e -2*e e],-1:1,n,n); full(A)
ans = 9×9
-2 1 0 0 0 0 0 0 0
1 -2 1 0 0 0 0 0 0
0 1 -2 1 0 0 0 0 0
0 0 1 -2 1 0 0 0 0
0 0 0 1 -2 1 0 0 0
0 0 0 0 1 -2 1 0 0
0 0 0 0 0 1 -2 1 0
0 0 0 0 0 0 1 -2 1
0 0 0 0 0 0 0 1 -2
Измените значения на главном (d = 0) диагональ A.
Bin = abs(-(n-1)/2:(n-1)/2)'; d = 0; A = spdiags(Bin,d,A); full(A)
ans = 9×9
4 1 0 0 0 0 0 0 0
1 3 1 0 0 0 0 0 0
0 1 2 1 0 0 0 0 0
0 0 1 1 1 0 0 0 0
0 0 0 1 0 1 0 0 0
0 0 0 0 1 1 1 0 0
0 0 0 0 0 1 2 1 0
0 0 0 0 0 0 1 3 1
0 0 0 0 0 0 0 1 4
Наконец, восстановите диагонали A в виде столбцов в матрице.
Bout = spdiags(A); full(Bout)
ans = 9×3
1 4 0
1 3 1
1 2 1
1 1 1
1 0 1
1 1 1
1 2 1
1 3 1
0 4 1
Извлеките ненулевые диагонали матрицы и проверьте формат вывода spdiags.
Создайте матрицу, содержащую смесь ненулевых и нулевых диагоналей.
A = [0 5 0 10 0 0
0 0 6 0 11 0
3 0 0 7 0 12
1 4 0 0 8 0
0 2 5 0 0 9];Извлеките ненулевые диагонали из матрицы. Укажите два выхода для возврата диагональных чисел.
[Bout,d] = spdiags(A)
Bout = 5×4
0 0 5 10
0 0 6 11
0 3 7 12
1 4 8 0
2 5 9 0
d = 4×1
-3
-2
1
3
Столбцы первого вывода Bout содержат ненулевые диагонали A. Второй выход d перечисляет индексы ненулевых диагоналей A. Самая длинная ненулевая диагональ в A в столбце 3 Bout. Чтобы дать все столбцы Bout той же длины, другие ненулевые диагонали A добавить дополнительные нули к соответствующим столбцам в Bout. Для mоколо-n матрицы с m < n, правила:
Для ненулевых диагоналей ниже основной диагонали A, дополнительные нули добавляются в вершинах столбцов (как в первых двух столбцах Bout).
Для ненулевых диагоналей над главной диагональю A, дополнительные нули добавляются в нижней части столбцов (как в последнем столбце Bout).
spdiags подушки Bout с нулями таким образом, даже если самая длинная диагональ не возвращается в Bout.
Создайте случайную матрицу 5 на 5.
A = randi(10,5,5)
A = 5×5
9 1 2 2 7
10 3 10 5 1
2 6 10 10 9
10 10 5 8 10
7 10 9 10 7
Извлеките основную диагональ и первые диагонали над и под ней.
d = [-1 0 1]; Bout = spdiags(A,d)
Bout = 5×3
10 9 0
6 3 1
5 10 10
10 8 10
0 7 10
Попробуйте извлечь пятую супердиагональную (d = 5). Поскольку A имеет только четыре супердиагонали, spdiags возвращает диагональ как все нули той же длины, что и основная (d = 0) диагональ.
B5 = spdiags(A,5)
B5 = 5×1
0
0
0
0
0
Изучите, как spdiags создает диагонали, когда столбцы входной матрицы длиннее диагоналей, которые они заменяют.
Создайте матрицу 6 на 7 чисел от 1 до 6.
Bin = repmat((1:6)',[1 7])
Bin = 6×7
1 1 1 1 1 1 1
2 2 2 2 2 2 2
3 3 3 3 3 3 3
4 4 4 4 4 4 4
5 5 5 5 5 5 5
6 6 6 6 6 6 6
Использовать spdiags для создания квадратной матрицы 6 на 6 с несколькими столбцами Bin в виде диагоналей. Поскольку некоторые диагонали имеют только один или два элемента, существует несоответствие в размерах между столбцами в Bin и диагонали в A.
d = [-4 -2 -1 0 3 4 5]; A = spdiags(Bin,d,6,6); full(A)
ans = 6×6
1 0 0 4 5 6
1 2 0 0 5 6
1 2 3 0 0 6
0 2 3 4 0 0
1 0 3 4 5 0
0 2 0 4 5 6
Каждый из столбцов в Bin имеет шесть элементов, но только главную диагональ в A имеет шесть элементов. Поэтому все остальные диагонали в A усечение элементов в столбцах Bin чтобы они умещались на выбранных диагоналях:

Путь spdiags усечение диагоналей зависит от размера mоколо-n матрица A. При поведение выглядит следующим образом:
Диагонали под главной диагональю берут сначала элементы от вершин колонн.
Диагонали над главной диагональю берут сначала элементы из низов колонн.
Такое поведение меняется на обратное, когда n:
A = spdiags(Bin,d,5,6); full(A)
ans = 5×6
1 0 0 1 1 1
2 2 0 0 2 2
3 3 3 0 0 3
0 4 4 4 0 0
5 0 5 5 5 0

Диагонали над главной диагональю берут сначала элементы от вершин колонн.
Диагонали под главной диагональю берут сначала элементы из низов колонн.
A - Входная матрицаВходная матрица. Эта матрица обычно (но не обязательно) разрежена.
Типы данных: single | double | int8 | int16 | int32 | int64 | uint8 | uint16 | uint32 | uint64 | logical
Поддержка комплексного номера: Да
d - Диагональные числаДиагональные числа, заданные как скаляр или вектор положительных целых чисел. Диагональные числа соответствуют тем же правилам, что и diag:
d < 0 находится ниже основной диагонали и удовлетворяет d >= -(m-1).
d = 0 является главной диагональю.
d > 0 находится над главной диагональю и удовлетворяет d <= (n-1).
Один mоколо-n матрица A имеет (m + n - 1) диагонали. Эти диагонали указаны в векторе d использование индексов из -(m-1) кому (n-1). Например, если A равно 5 на 6, имеет 10 диагоналей, которые указаны в векторе d используя индексы -4, -3,... 4, 5. Следующая диаграмма иллюстрирует эту диагональную нумерацию.

Если задать диагональ, лежащую за пределами A (например, d = 7 в примере выше), то spdiags возвращает эту диагональ как все нули.
Пример: spdiags(A,[3 5]) извлекает третью и пятую диагонали из A.
Bin - Диагональные элементыДиагональные элементы, заданные как матрица. Эта матрица обычно (но не обязательно) заполнена. spdiags использует столбцы Bin для замены указанных диагоналей в A. Если запрошенный размер выходного сигнала равен mоколо-n, то Bin должен иметь min(m,n) столбцы.
С синтаксисом S = spdiags(Bin,d,m,n), если столбец Bin имеет больше элементов, чем диагональ, которую он заменяет, и m >= n, то spdiags принимает элементы супердиагоналей из нижней части колонны Binи элементы субдиагоналей из верхней части столбца Bin. Однако, если m < n , то супердиагонали находятся из верхней части столбца Binи субдиагонали из нижней части. Пример этого поведения см. в разделе Столбцы и диагонали различных размеров.
Типы данных: single | double | int8 | int16 | int32 | int64 | uint8 | uint16 | uint32 | uint64 | logical
Поддержка комплексного номера: Да
m, n - РазмерыРазмеры, указанные как неотрицательные скалярные целые числа. spdiags использует эти входные данные для определения размера создаваемой матрицы.
Пример: spdiags(Bin,d,300,400) создает матрицу 300 на 400 со столбцами B размещены вдоль указанных диагоналей d.
Bout - Диагональные элементыДиагональные элементы, возвращаемые в виде полной матрицы. Столбцы Bout содержат диагонали, извлеченные из A. Любые элементы Bout соответствующие позициям за пределами A имеют нулевое значение.
id - Диагональные числаДиагональные числа, возвращаемые в виде вектора столбца. Посмотрите d описание нумерации диагоналей.
S - Выходная матрицаВыходная матрица. S принимает одну из двух форм:
С S = spdiags(Bin,d,A), указанные диагонали в A заменены столбцами в Bin создать S.
С S = spdiags(Bin,d,m,n), mоколо-n разреженная матрица S образуется взятием колонн Bin и размещение их вдоль диагоналей, указанных d.
Примечания и ограничения по использованию:
Первый вход не может быть разреженным.
Дополнительные сведения см. в разделе Запуск функций MATLAB на графическом процессоре (панель инструментов параллельных вычислений).
Эта функция полностью поддерживает распределенные массивы. Дополнительные сведения см. в разделе Запуск функций MATLAB с распределенными массивами (панель инструментов параллельных вычислений).
Имеется измененная версия этого примера. Открыть этот пример с помощью изменений?
1. Если смысл перевода понятен, то лучше оставьте как есть и не придирайтесь к словам, синонимам и тому подобному. О вкусах не спорим.
2. Не дополняйте перевод комментариями “от себя”. В исправлении не должно появляться дополнительных смыслов и комментариев, отсутствующих в оригинале. Такие правки не получится интегрировать в алгоритме автоматического перевода.
3. Сохраняйте структуру оригинального текста - например, не разбивайте одно предложение на два.
4. Не имеет смысла однотипное исправление перевода какого-то термина во всех предложениях. Исправляйте только в одном месте. Когда Вашу правку одобрят, это исправление будет алгоритмически распространено и на другие части документации.
5. По иным вопросам, например если надо исправить заблокированное для перевода слово, обратитесь к редакторам через форму технической поддержки.