decomposition

Матричное разложение для решения линейных систем

Описание

decomposition создает переиспользуемые матричные декомпозиции (LU, LDL, Cholesky, QR и многое другое), которые позволяют более эффективно решать линейные системы (Ax = b или xA = b). Для примера, после вычисления dA = decomposition(A) вызов dA\b возвращает тот же вектор, что и A\b, но обычно намного быстрее. decomposition объекты хорошо подходят для решения задач, которые требуют повторных решений, поскольку разложение матрицы коэффициентов не нужно выполнять несколько раз.

Можно использовать decomposition dA объекта со многими из тех же операторов, которые можно использовать на исходной матрице коэффициентов A:

  • Комплексный сопряженный транспонирующий dA'

  • Отрицание -dA

  • Умножьте или разделите на скаляр, используя c*dA или dA/c.

  • Решить линейную систему Ax = b используя x = dA\b.

  • Решить линейную систему xA = b используя x = b/dA.

Создание

Описание

пример

dA = decomposition(A) возвращает разложение матрицы A который можно использовать, чтобы решить линейные системы более эффективно. Тип разложения автоматически выбирается на основе свойств матрицы входа.

пример

dA = decomposition(A,type) задает тип выполняемого разложения. type можно 'qr', 'cod', 'lu', 'ldl', 'chol', 'triangular', 'permutedTriangular', 'banded', 'hessenberg', или 'diagonal'.

пример

dA = decomposition(A,type,triangularFlag) задает, что только верхний или нижний треугольный фрагмент A должен использоваться в разложении. triangularFlag можно 'upper' или 'lower'. С помощью этого синтаксиса тип разложения должен быть 'ldl', 'chol', или 'triangular'.

пример

dA = decomposition(___,Name,Value) задает дополнительные опции, используя один или несколько Name,Value пара аргументов с использованием любого из предыдущих синтаксисов. Для примера, dA = decomposition(A,'CheckCondition',false) задает, чтобы предупреждение не выдавалось на основе условия A при решении dA\b.

Входные параметры

расширить все

Матрица коэффициентов. Матрица коэффициентов появляется в системе линейных уравнений слева Ax = b или справа xA = b.

Типы данных: single | double
Поддержка комплексного числа: Да

Тип разложения, заданный как один из опций в этих таблицах.

Эти опции работают для любой матрицы коэффициентов.

Значение

Матричное разложение A

Примечания

'auto' (по умолчанию)

Н/Д

Автоматический выбор типа разложения матрицы на основе свойств матрицы коэффициентов. Для получения информации о том, как выбирается разложение, смотрите раздел Алгоритмы mldivide.

'qr'

AP=QR

Q унитарно, R является верхним треугольным, и P является матрицей сочетаний.

QR-разложение дает решение методом наименьших квадратов.

Если type является 'qr', тогда вы не можете решить A'\B или B/A. Вместо этого используйте 'cod' для проблем с этими формами.

'cod'

A=QRZ*

R является верхним треугольным, и оба Q и Z имеют ортонормальные столбцы.

Полное ортогональное разложение дает минимальную норму решения методом наименьших квадратов.

Для матриц квадратных коэффициентов можно также использовать эти опции.

Значение

Матричное разложение A

Примечания

'lu'

Плотные матрицы:

PA=LU

L нижняя треугольная, U является верхним треугольным, и P является матрицей сочетаний.

Разреженные матрицы:

P(R\A)Q=LU

P и Q являются матрицами сочетаний и R является диагональной матрицей масштабирования.

 

'ldl'

Плотные матрицы:

P*AP=LDL*

L - нижняя треугольная матрица с 1с на диагонали, D является диагональной матрицей, и P является матрицей сочетаний.

Разреженные матрицы:

P*SASP=LDL*

S является масштабирующей матрицей.

A должен быть симметричным.

'chol'

Плотные матрицы:

A=LL*

L - нижний треугольный.

Разреженные матрицы:

A=PLL*P*

P является матрицей сочетаний.

A должен быть симметричным положительным определенным.

'triangular'

A=T

T треугольный.

A должна быть треугольной.

'permutedTriangular'

A=PTQ*

T треугольный, и то и другое P и Q являются матрицами сочетаний.

A должна быть сочетанием треугольной матрицы.

'banded'

A=P*LU

P является матрицей сочетаний, и то и другое L и U перемычки.

Наиболее эффективен для матриц с низкой пропускной способностью. Посмотрите bandwidth для получения дополнительной информации.

'hessenberg'

A=P*LU

P - матрица сочетаний, L перемычка, и U является верхним треугольным.

A должно иметь нули ниже первой поддиагонали.

'diagonal'

A=D

D является диагональным.

A должен быть диагональным.

Флаг, чтобы использовать только верхний или нижний треугольный фрагмент матрицы коэффициентов, заданную как 'upper' или 'lower'. Эта опция поддерживает 'triangular', 'chol', и 'ldl' типы разложения.

  • 'triangular' - Если и верхняя, и нижняя треугольная матрица сохранены в одной матрице, то используйте triangularFlag для задания только одной из треугольных матриц.

  • 'chol' и 'ldl' - Использовать triangularFlag чтобы избежать симметрии почти симметричной матрицы коэффициентов.

Аргументы в виде пар имя-значение

Задайте необязательные разделенные разделенными запятой парами Name,Value аргументы. Name - имя аргумента и Value - соответствующее значение. Name должны находиться внутри кавычек. Можно задать несколько аргументов в виде пар имен и значений в любом порядке Name1,Value1,...,NameN,ValueN.

Пример: dA = decomposition(A,'qr','CheckCondition',false) выполняет QR-разложение A и отключает предупреждения об условии матрицы коэффициентов, когда она используется для решения линейной системы.
Общие параметры

расширить все

Переключитесь, чтобы проверить условие матрицы коэффициентов, заданное как разделенная разделенными запятой парами, состоящая из 'CheckCondition' и любой логический 1 (true) или логический 0 (false). Если CheckCondition является true и матрица коэффициентов плохо обусловлена или низкого ранга, затем решение линейных систем с помощью mldivide (\) или mrdivide (/) выдает предупреждения.

Типы данных: logical

Ранговый допуск, заданный как неотрицательный скаляр. Установка допуска может помочь предотвратить восприимчивость решения к случайному шуму в матрице коэффициентов.

decomposition вычисляет ранг A как количество диагональных элементов в R матрица QR- [Q,R,p] = qr(A,0) разложения с абсолютным значением больше tol. Если ранг A является k, затем низкоранговое приближение A формируется путем умножения первого k столбцы Q по первому k строки R. Изменение допуска влияет на это низкоранговое приближение A.

Примечание

Эта опция применяется только при 'Type' является 'qr' или 'cod', или когда 'Type' является 'auto' и A прямоугольный. В противном случае эта опция игнорируется.

Разреженные матричные параметры

расширить все

Порог плотности полосы, заданный как скалярное значение в области значений [0 1]. Значение 'BandDensity' определяет, насколько плотной должна быть разреженная, разнесенная матрица коэффициентов, чтобы полосно-распределенный решатель использовался mldivide (\) или mrdivide (/) при решении системы уравнений. Если плотность полосы значений матрицы коэффициентов больше заданной плотности полосы значений, то используется решатель с полосой значений.

Плотность полосы определяется как: (# ненули в полосе )/( # элементы в полосе). Значение 1.0 указывает, что никогда не использовать полосно-пропускающий решатель.

Допуск поворота для LDL-разложения, заданный как скалярное значение в интервале [0 0.5]. Использование меньших значений допуска поворота может дать более быстрое время факторизации и меньше записей, но также может привести к менее стабильной факторизации.

Этот допуск поворота тот же, что и ldl использует для реальных разреженных матриц.

Допуск поворота для LU-факторизации, заданный как скаляр или вектор. Задайте скалярное значение, чтобы изменить первый элемент вектора допуска или укажите двухэлементный вектор, чтобы изменить оба значения. Меньшие допуски поворота, как правило, приводят к более разреженным факторам LU, но решение может стать неточным. Большие значения могут привести к более точному решению, но не всегда, и обычно увеличивают общее использование работы и памяти.

Этот допуск поворота тот же, что и lu использует для разреженных матриц.

Свойства

расширить все

Это свойство доступно только для чтения.

Размер матрицы коэффициентов, возвращенный как двухэлементный вектор-строка.

Типы данных: double

Это свойство доступно только для чтения.

Тип разложения, возвращенный как 'qr', 'cod', 'lu', 'ldl', 'chol', 'triangular', 'permutedTriangular', 'banded', 'hessenberg', или 'diagonal'.

Типы данных: char

Переключитесь, чтобы проверить условие матрицы коэффициентов, заданное как логическое 1 (true) или логический 0 (false). Если CheckCondition является true и матрица коэффициентов плохо обусловлена или низкого ранга, затем решение линейных систем с помощью mldivide (\) или mrdivide (/) выдает предупреждения.

Типы данных: logical

Это свойство доступно только для чтения.

Тип данных матрицы коэффициентов, возвращенный как 'double' или 'single'.

Типы данных: char

Это свойство доступно только для чтения.

Индикатор того, что матрица коэффициентов является комплексной сопряженной транспонированной, возвращенной как логическая 1 (true) или логический 0 (false). Этот индикатор false по умолчанию для любого decomposition объект, созданный из матрицы коэффициентов. Однако значение true если вы используете ctranspose оператор на decomposition объект в выражении, таком как dA'\b. В этом случае dA' является тем же самым decomposition объект как dA, но со значением true для IsConjugateTransposed.

Типы данных: logical

Это свойство доступно только для чтения.

Индикатор того, что матрица коэффициентов действительна, возвращается как логический 1 (true) или логический 0 (false). Значение false указывает, что матрица коэффициентов содержит комплексные числа.

Типы данных: logical

Это свойство доступно только для чтения.

Индикатор того, что матрица коэффициентов разрежена, возвращается как логический 1 (true) или логический 0 (false).

Типы данных: logical

Это свойство доступно только для чтения.

Мультипликативный масштабный коэффициент для матрицы коэффициентов, возвращенный как скаляр. Значение по умолчанию 1 указывает, что матрица коэффициентов не масштабируется. Однако, когда вы умножаете или делите decomposition объект скаляром, значение ScaleFactor изменения. Для примера, 3*dA является decomposition объект, эквивалентный dA, но со значением 3 для ScaleFactor.

Типы данных: double
Поддержка комплексного числа: Да

Функции объекта

Основные функции и операторы, которые можно использовать с decomposition объекты связаны с решением линейных систем уравнений. Если тип разложения 'qr', тогда вы не можете решить A'\B или B/A. Вместо этого используйте 'cod' для проблем с этими формами.

ctransposeКомплексная сопряженная транспозиция
mldivideРешите системы линейных уравнений, Ax = B для x
mrdivideРешите системы линейных уравнений, xA = B для x
isIllConditionedОпределите, является ли матрица плохо обусловленной

Можно также проверить число обусловленности или ранг базовой матрицы decomposition объекты. Поскольку используются различные алгоритмы, результаты использования этих функций на decomposition объект может отличаться по сравнению с использованием тех же функций непосредственно на матрице коэффициентов.

rank
  • Только форма с 1 входом rank(dA) поддерживается.

  • Тип разложения должен быть 'qr' или 'cod'.

  • Значение ранга зависит от выбора RankTolerance, если задан.

rcond
  • Запускает ту же проверку условия, что и обратная косая черта \ используется для определения, выдавать ли предупреждение.

  • Поддерживает все типы разложения, кроме 'qr' и 'cod'.

Примеры

свернуть все

Показать, как использовать decomposition объекты могут улучшить эффективность решения Ax=b со многими правыми сторонами.

Обратная итерация является итеративным алгоритмом собственного значения, который решает линейные системы со многими правыми сторонами. Это метод итерационно вычислить собственное значение матрицы, начиная с предположения о соответствующем собственном векторе. Каждая итерация вычисляет x = A\x, а затем масштабируется x по своей норме.

Создайте разреженную матрицу A и случайные стартовые векторы x1 и x2.

n = 1e3;
rng default % for reproducibility
A = sprandn(n,n,0.2) + speye(n);
x1 = randn(n,1);
x2 = x1;

Примените 100 итераций алгоритма обратной итерации, используя обратную косую черту, чтобы вычислить собственное значение A.

tic
for ii=1:100
    x1 = A \ x1;
    x1 = x1 / norm(x1);
end
toc
Elapsed time is 13.154918 seconds.
lambda = x1'*A*x1
lambda = -0.6707

Теперь используйте decomposition объект для решения той же задачи.

tic
dA = decomposition(A); 
for ii=1:100
    x2 = dA \ x2;
    x2 = x2 / norm(x2);
end
toc
Elapsed time is 0.910174 seconds.
lambda = x2'*A*x2
lambda = -0.6707

Эффективность алгоритма значительно улучшается, потому что матрица A не требует факторизации во время каждой итерации. Кроме того, даже если алгоритм обратной косой черты может быть улучшен путем выполнения LU-разложения A перед for-цикл, decomposition объект предоставляет доступ ко всем тем же увеличениям эффективности, не требуя, чтобы вы записывали сложный код.

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

Создайте матрицу коэффициентов и разложите матрицу, используя выбор по умолчанию типа разложения.

A = ones(3);
dA = decomposition(A)
dA = 
  decomposition with properties:

    MatrixSize: [3 3]
          Type: 'ldl'

  Show all properties

Решить линейную систему можно используя вектор таковых для правой оси.

b = ones(3,1);
x = dA\b
Warning: Matrix is singular to working precision.
x = 3×1

   NaN
   NaN
   NaN

Задайте тип разложения, чтобы использовать 'qr' метод вместо стандартного 'ldl' способ. Это заставляет обратная косая черта (\) найти решение задачи методом наименьших квадратов вместо возврата вектора NaNс.

dA_qr = decomposition(A,'qr')
dA_qr = 
  decomposition with properties:

    MatrixSize: [3 3]
          Type: 'qr'

  Show all properties

x = dA_qr\b
Warning: Rank deficient, rank = 1, tol =  1.153778e-15.
x = 3×1

     1
     0
     0

Задайте 'upper' использовать только верхний треугольный фрагмент матрицы входа в разложении.

Создайте матрицу коэффициентов. Создайте треугольное разложение для матрицы, используя только верхний треугольный фрагмент. Эта опция может быть полезна в случаях, когда и верхняя треугольная, и нижняя треугольная матрица сохранены в одной матрице.

A = randi([0 5],10)
A = 10×10

     4     0     3     4     2     1     4     5     2     0
     5     5     0     0     2     4     1     1     4     0
     0     5     5     1     4     3     3     4     3     3
     5     2     5     0     4     0     4     1     3     4
     3     4     4     0     1     0     5     5     5     5
     0     0     4     4     2     2     5     2     1     0
     1     2     4     4     2     5     3     1     4     3
     3     5     2     1     3     2     0     1     4     2
     5     4     3     5     4     3     0     3     2     0
     5     5     1     0     4     1     1     2     3     2

dA = decomposition(A,'triangular','upper')
dA = 
  decomposition with properties:

    MatrixSize: [10 10]
          Type: 'triangular'

  Show all properties

Используйте 'CheckCondition' Пара "имя-значение" отключить предупреждения на основе условия матрицы коэффициентов при решении линейной системы с помощью decomposition.

Создайте матрицу коэффициентов, которая плохо обусловлена. В этой матрице при усреднении двух первых столбцов создается третий столбец.

A = [1 2 1.5; 3 4 3.5; 5 6 5.5]
A = 3×3

    1.0000    2.0000    1.5000
    3.0000    4.0000    3.5000
    5.0000    6.0000    5.5000

Решите линейную систему Ax=b использование вектора 1с для правой оси. mldivide выдает предупреждение об обусловленности матрицы коэффициентов.

b = ones(3,1);
x = A\b
Warning: Matrix is close to singular or badly scaled. Results may be inaccurate. RCOND =  1.850372e-17.
x = 3×1

   -0.6250
    1.3750
   -0.7500

Теперь создайте decomposition объект для матрицы и решить ту же линейную систему. Задайте 'CheckCondition' как false так что mldivide не проверяет условие матрицы коэффициентов. Даже при возвращении того же решения mldivide не отображает предупреждающее сообщение.

dA = decomposition(A,'CheckCondition',false);
x = dA\b
x = 3×1

   -0.6250
    1.3750
   -0.7500

Используйте isIllConditioned функция, чтобы проверить, decomposition ли объект основан на плохо обусловленной матрице.

tf = isIllConditioned(dA)
tf = logical
   1

Расширенные возможности

Введенный в R2017b