разложение

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

Описание

decomposition создает допускающие повторное использование матричные разложения (LU, LDL, Холесский, 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)
dA = decomposition(A,type)
dA = decomposition(A,type,triangularFlag)
dA = decomposition(___,Name,Value)

Описание

пример

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' (значение по умолчанию)

Нет данных

Автоматический выбор матричного разложения вводит на основе свойств матрицы коэффициентов. Для получения информации о том, как выбрано разложение, смотрите раздел Algorithms 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 должен появиться в кавычках. Вы можете задать несколько аргументов в виде пар имен и значений в любом порядке, например: Name1, Value1, ..., NameN, ValueN.

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

Общие параметры

развернуть все

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

Типы данных: логический

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

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 (/) производит предупреждения.

Типы данных: логический

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

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

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

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

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

Типы данных: логический

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

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

Типы данных: логический

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

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

Типы данных: логический

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

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

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

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

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

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 12.635409 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.904487 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 s.

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