Извлеките ненулевые диагонали и создайте разреженные полосы и диагональные матрицы
Создайте тридиагональную матрицу с помощью трех векторов, измените некоторые диагонали матрицы, а затем извлеките диагонали.
Создайте вектор 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
-by- 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
-by- n
матрица A
. Когда , поведение такое, как изображено выше:
Диагонали ниже основной диагонали берут сначала элементы с верхних частей столбцов.
Диагонали выше основной диагонали берут сначала элементы из днищ столбцов.
Это поведение отменяется, когда :
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
-by- 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
-by- 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
-by- n
разреженная матрица S
формируется путем взятия столбцов Bin
и размещение их по диагоналям, заданным d
.
Указания и ограничения по применению:
Первый вход не может быть разреженным.
Для получения дополнительной информации смотрите Запуск функций MATLAB на графическом процессоре (Parallel Computing Toolbox).
Эта функция полностью поддерживает распределенные массивы. Для получения дополнительной информации смотрите Запуск функций MATLAB с распределенными массивами (Parallel Computing Toolbox).
У вас есть измененная версия этого примера. Вы хотите открыть этот пример с вашими правками?
1. Если смысл перевода понятен, то лучше оставьте как есть и не придирайтесь к словам, синонимам и тому подобному. О вкусах не спорим.
2. Не дополняйте перевод комментариями “от себя”. В исправлении не должно появляться дополнительных смыслов и комментариев, отсутствующих в оригинале. Такие правки не получится интегрировать в алгоритме автоматического перевода.
3. Сохраняйте структуру оригинального текста - например, не разбивайте одно предложение на два.
4. Не имеет смысла однотипное исправление перевода какого-то термина во всех предложениях. Исправляйте только в одном месте. Когда Вашу правку одобрят, это исправление будет алгоритмически распространено и на другие части документации.
5. По иным вопросам, например если надо исправить заблокированное для перевода слово, обратитесь к редакторам через форму технической поддержки.