<?xml version="1.0"?>
<feed xmlns="http://www.w3.org/2005/Atom" xml:lang="ru">
	<id>https://xn--80aecvaldz.xn--80ahdrnmvk.xn--p1ai/w/ru/api.php?action=feedcontributions&amp;feedformat=atom&amp;user=Davletshuna+Alexandra</id>
	<title>Алговики - Вклад [ru]</title>
	<link rel="self" type="application/atom+xml" href="https://xn--80aecvaldz.xn--80ahdrnmvk.xn--p1ai/w/ru/api.php?action=feedcontributions&amp;feedformat=atom&amp;user=Davletshuna+Alexandra"/>
	<link rel="alternate" type="text/html" href="https://xn--80aecvaldz.xn--80ahdrnmvk.xn--p1ai/ru/%D0%A1%D0%BB%D1%83%D0%B6%D0%B5%D0%B1%D0%BD%D0%B0%D1%8F:%D0%92%D0%BA%D0%BB%D0%B0%D0%B4/Davletshuna_Alexandra"/>
	<updated>2026-10-22T17:17:58Z</updated>
	<subtitle>Вклад</subtitle>
	<generator>MediaWiki 1.43.5</generator>
	<entry>
		<id>https://xn--80aecvaldz.xn--80ahdrnmvk.xn--p1ai/w/ru/index.php?title=%D0%9E%D0%B1%D1%81%D1%83%D0%B6%D0%B4%D0%B5%D0%BD%D0%B8%D0%B5_%D1%83%D1%87%D0%B0%D1%81%D1%82%D0%BD%D0%B8%D0%BA%D0%B0:Davletshuna_Alexandra&amp;diff=21057</id>
		<title>Обсуждение участника:Davletshuna Alexandra</title>
		<link rel="alternate" type="text/html" href="https://xn--80aecvaldz.xn--80ahdrnmvk.xn--p1ai/w/ru/index.php?title=%D0%9E%D0%B1%D1%81%D1%83%D0%B6%D0%B4%D0%B5%D0%BD%D0%B8%D0%B5_%D1%83%D1%87%D0%B0%D1%81%D1%82%D0%BD%D0%B8%D0%BA%D0%B0:Davletshuna_Alexandra&amp;diff=21057"/>
		<updated>2016-12-16T13:14:41Z</updated>

		<summary type="html">&lt;p&gt;Davletshuna Alexandra: /* По существу */&lt;/p&gt;
&lt;hr /&gt;
&lt;div&gt;== Статья [[Участник:Davletshuna Alexandra/Метод Якоби вычисления сингулярных чисел и векторов]] ==&lt;br /&gt;
&lt;br /&gt;
=== По существу ===&lt;br /&gt;
&lt;br /&gt;
* Метод Якоби нахождения сингулярных значений и векторов реализован в таких пакетах, как LAPACK, LINPACK/EISPACK, Intel MKL - и где ссылки? --[[Участник:Frolov|Фролов А.В.]] ([[Обсуждение участника:Frolov|обсуждение]]) 14:09, 10 ноября 2016 (MSK)&lt;br /&gt;
* Односторонние вращения могут быть перестановочными, учтите это при вычислении параллельной сложности.  --[[Участник:Frolov|Фролов А.В.]] ([[Обсуждение участника:Frolov|обсуждение]]) 14:09, 10 ноября 2016 (MSK)&lt;br /&gt;
* Проверьте формулы - в части из них ошибки, исправьте их. --[[Участник:Frolov|Фролов А.В.]] ([[Обсуждение участника:Frolov|обсуждение]]) 14:09, 10 ноября 2016 (MSK)&lt;br /&gt;
** При тау=0 случай не разобран. --[[Участник:Frolov|Фролов А.В.]] ([[Обсуждение участника:Frolov|обсуждение]]) 16:05, 5 декабря 2016 (MSK)&lt;br /&gt;
*** Всё исправили&lt;br /&gt;
&lt;br /&gt;
=== Отсутствующие части ===&lt;br /&gt;
* Не указан вклад каждого из авторов статьи. [[Участник:ASA|Александр Сергеевич Антонов]] ([[Обсуждение участника:ASA|обсуждение]]) 17:16, 25 октября 2016 (MSK)&lt;br /&gt;
** Вклад авторов статьи так и не указан. [[Участник:ASA|Александр Сергеевич Антонов]] ([[Обсуждение участника:ASA|обсуждение]]) 15:53, 2 ноября 2016 (MSK)&lt;br /&gt;
&lt;br /&gt;
=== Замечания по тексту ===&lt;br /&gt;
* На рис.1 представлена трёхмерная структура а в комментарии к ней написано &amp;quot;Первая группа вершин расположена в двумерной области...&amp;quot; - непонятно, как это сочетается. Подпись к Рис.1 совершенно непонятна, чему соответствуют вершины, дуги и оси - не сказано. [[Участник:ASA|Александр Сергеевич Антонов]] ([[Обсуждение участника:ASA|обсуждение]]) 17:16, 25 октября 2016 (MSK)&lt;br /&gt;
* Вторая и третья группа вершин никак не иллюстрируются? [[Участник:ASA|Александр Сергеевич Антонов]] ([[Обсуждение участника:ASA|обсуждение]]) 17:16, 25 октября 2016 (MSK)&lt;br /&gt;
* Рис.2 совершенно непонятен и никак не пояснён. Чему соответствуют разные вершины? Чему соответствуют дуги? Непонятно даже количество вершин в графе. [[Участник:ASA|Александр Сергеевич Антонов]] ([[Обсуждение участника:ASA|обсуждение]]) 17:16, 25 октября 2016 (MSK)&lt;br /&gt;
** Графы стали намного понятнее, но уж очень некрасиво выглядят... [[Участник:ASA|Александр Сергеевич Антонов]] ([[Обсуждение участника:ASA|обсуждение]]) 15:53, 2 ноября 2016 (MSK)&lt;br /&gt;
* Не заполнен раздел 2.4 описания. [[Участник:ASA|Александр Сергеевич Антонов]] ([[Обсуждение участника:ASA|обсуждение]]) 14:59, 16 ноября 2016 (MSK)&lt;br /&gt;
* В разделе 2.4 не приведены все параметры запуска теста - какой компилятор, с какими опциями использовался, какие версии библиотек, на каких узлах проводился запуск и т.д. [[Участник:ASA|Александр Сергеевич Антонов]] ([[Обсуждение участника:ASA|обсуждение]]) 13:56, 18 ноября 2016 (MSK) &lt;br /&gt;
* В разделе 2.4 не приведена использованная в экспериментах реализация алгоритма. [[Участник:ASA|Александр Сергеевич Антонов]] ([[Обсуждение участника:ASA|обсуждение]]) 13:56, 18 ноября 2016 (MSK)&lt;/div&gt;</summary>
		<author><name>Davletshuna Alexandra</name></author>
	</entry>
	<entry>
		<id>https://xn--80aecvaldz.xn--80ahdrnmvk.xn--p1ai/w/ru/index.php?title=%D0%A3%D1%87%D0%B0%D1%81%D1%82%D0%BD%D0%B8%D0%BA:Davletshuna_Alexandra/%D0%9C%D0%B5%D1%82%D0%BE%D0%B4_%D0%AF%D0%BA%D0%BE%D0%B1%D0%B8_%D0%B2%D1%8B%D1%87%D0%B8%D1%81%D0%BB%D0%B5%D0%BD%D0%B8%D1%8F_%D1%81%D0%B8%D0%BD%D0%B3%D1%83%D0%BB%D1%8F%D1%80%D0%BD%D1%8B%D1%85_%D1%87%D0%B8%D1%81%D0%B5%D0%BB_%D0%B8_%D0%B2%D0%B5%D0%BA%D1%82%D0%BE%D1%80%D0%BE%D0%B2&amp;diff=20474</id>
		<title>Участник:Davletshuna Alexandra/Метод Якоби вычисления сингулярных чисел и векторов</title>
		<link rel="alternate" type="text/html" href="https://xn--80aecvaldz.xn--80ahdrnmvk.xn--p1ai/w/ru/index.php?title=%D0%A3%D1%87%D0%B0%D1%81%D1%82%D0%BD%D0%B8%D0%BA:Davletshuna_Alexandra/%D0%9C%D0%B5%D1%82%D0%BE%D0%B4_%D0%AF%D0%BA%D0%BE%D0%B1%D0%B8_%D0%B2%D1%8B%D1%87%D0%B8%D1%81%D0%BB%D0%B5%D0%BD%D0%B8%D1%8F_%D1%81%D0%B8%D0%BD%D0%B3%D1%83%D0%BB%D1%8F%D1%80%D0%BD%D1%8B%D1%85_%D1%87%D0%B8%D1%81%D0%B5%D0%BB_%D0%B8_%D0%B2%D0%B5%D0%BA%D1%82%D0%BE%D1%80%D0%BE%D0%B2&amp;diff=20474"/>
		<updated>2016-12-09T11:07:45Z</updated>

		<summary type="html">&lt;p&gt;Davletshuna Alexandra: &lt;/p&gt;
&lt;hr /&gt;
&lt;div&gt;{{Assignment|ASA}}&lt;br /&gt;
{{Assignment}}&lt;br /&gt;
&lt;br /&gt;
{{algorithm&lt;br /&gt;
| name              = Метод Якоби вычисления сингулярных чисел и векторов&lt;br /&gt;
| serial_complexity = &amp;lt;math&amp;gt;O(n^3)&amp;lt;/math&amp;gt;&lt;br /&gt;
| pf_height         = &amp;lt;math&amp;gt;O(n^2)&amp;lt;/math&amp;gt;&lt;br /&gt;
| pf_width          = &amp;lt;math&amp;gt;O(n)&amp;lt;/math&amp;gt;&lt;br /&gt;
| input_data        = &amp;lt;math&amp;gt;n^2&amp;lt;/math&amp;gt;&lt;br /&gt;
| output_data       = &amp;lt;math&amp;gt;2n^2 + n&amp;lt;/math&amp;gt;&lt;br /&gt;
}}&lt;br /&gt;
&lt;br /&gt;
Авторы статьи: [[Участница:Davletshuna Alexandra|Давлетшина Александра]] (группа 619); [[Участница:Alek sandra|Зайцева Александра]]. Вклад каждого участника считать равноценным.&lt;br /&gt;
&lt;br /&gt;
== Свойства и структура алгоритма ==&lt;br /&gt;
&lt;br /&gt;
=== Общее описание алгоритма ===&lt;br /&gt;
&#039;&#039;&#039;Сингулярным разложением&#039;&#039;&#039; называется разложение прямоугольной вещественной или комплексной матрицы, имеющее широкое применение, в силу своей наглядной геометрической интерпретации, при решении многих прикладных задач. Сингулярное разложение матрицы А позволяет вычислять сингулярные числа данной матрицы, а также, левые и правые сингулярные векторы матрицы А:&lt;br /&gt;
&lt;br /&gt;
•	левые сингулярные векторы матрицы А — это собственные векторы матрицы &amp;lt;math&amp;gt;AA^*&amp;lt;/math&amp;gt;;&lt;br /&gt;
&lt;br /&gt;
•	правые сингулярные векторы матрицы A — это собственные векторы матрицы &amp;lt;math&amp;gt;A^*A&amp;lt;/math&amp;gt;.&lt;br /&gt;
&lt;br /&gt;
Геометрическая интерпретация сингулярного разложения заключается в следующем факте из геометрии: &#039;&#039;Образом любого линейного преобразования, заданного с помощью матрицы &amp;lt;math&amp;gt;m&amp;lt;/math&amp;gt;x&amp;lt;math&amp;gt;n&amp;lt;/math&amp;gt;, примененного к единичной сфере является гиперэллипсоид&#039;&#039;.&lt;br /&gt;
&lt;br /&gt;
Из многочисленных разложений матриц, наиболее удобным является сингулярное разложение матрицы в виде: &amp;lt;math&amp;gt;A=U\Sigma V^*&amp;lt;/math&amp;gt;, где &amp;lt;math&amp;gt;U, V&amp;lt;/math&amp;gt; – унитарные матрицы, а &amp;lt;math&amp;gt;\Sigma&amp;lt;/math&amp;gt; – диагональная матрица с вещественными положительными числами на диагонали &amp;lt;ref&amp;gt;http://algorithms.parallel.ru/&amp;lt;/ref&amp;gt;.&lt;br /&gt;
&lt;br /&gt;
Диагональные элементы матрицы &amp;lt;math&amp;gt;\Sigma&amp;lt;/math&amp;gt; называются сингулярными числами матрицы &amp;lt;math&amp;gt;A&amp;lt;/math&amp;gt;, а столбцы матриц &amp;lt;math&amp;gt;U,V&amp;lt;/math&amp;gt; левыми и правыми сингулярными векторами соответственно.&lt;br /&gt;
&lt;br /&gt;
Алгоритм Якоби сингулярного разложения матрицы был предложен одним из первых в 1846 году. Он приводит прямоугольную матрицу к диагональной матрице с помощью последовательности элементарных вращений. Метод может найти все сингулярные значения с очень высокой точностью. Однако его производительность является довольно низкой, в сравнении с конкурирующими методами.&lt;br /&gt;
&lt;br /&gt;
&#039;&#039;Неявный&#039;&#039;&amp;lt;ref&amp;gt;Дж. Деммель «Вычислительная линейная алгебра» (стр. 261-264)&amp;lt;/ref&amp;gt; метод Якоби математически эквивалентен применению метода Якоби вычисления собственных значений к матрице &amp;lt;math&amp;gt;A = G^TG&amp;lt;/math&amp;gt;.&lt;br /&gt;
Это значит, что на каждом шаге вычисляется вращение Якоби &amp;lt;math&amp;gt;J&amp;lt;/math&amp;gt;, с помощью которого матрица &amp;lt;math&amp;gt;G^TG&amp;lt;/math&amp;gt; неявно пересчитывется в &amp;lt;math&amp;gt;J^TG^TGJ&amp;lt;/math&amp;gt;; вращение выбрано так, чтобы пара внедиагональных элементов из &amp;lt;math&amp;gt;G^TG&amp;lt;/math&amp;gt; обратилась в нули в матрице &amp;lt;math&amp;gt;J^TG^TGJ&amp;lt;/math&amp;gt;. При этом ни &amp;lt;math&amp;gt;G^TG&amp;lt;/math&amp;gt;, ни &amp;lt;math&amp;gt;J^TG^TGJ&amp;lt;/math&amp;gt; не вычисляются в явном виде; вместо них вычисляется матрица &amp;lt;math&amp;gt;GJ&amp;lt;/math&amp;gt;. Поэтому алгоритм называется &#039;&#039;методом односторонних вращений&#039;&#039;.&lt;br /&gt;
&lt;br /&gt;
=== Математическое описание алгоритма ===&lt;br /&gt;
Исходные данные: матрица &amp;lt;math&amp;gt;G&amp;lt;/math&amp;gt; (элементы &amp;lt;math&amp;gt;g_{ij}, i, j = 1, \ldots, n&amp;lt;/math&amp;gt;).&lt;br /&gt;
&lt;br /&gt;
Вычисляемые данные: матрица &amp;lt;math&amp;gt;\Sigma = diag(\sigma_{i})&amp;lt;/math&amp;gt;, где &amp;lt;math&amp;gt;\sigma_{i}&amp;lt;/math&amp;gt; - сингулярные числа, &amp;lt;math&amp;gt;U&amp;lt;/math&amp;gt; - матрица левых сингулярных векторов, &amp;lt;math&amp;gt;V&amp;lt;/math&amp;gt; - матрица правых сингулярных векторов.&lt;br /&gt;
&lt;br /&gt;
симметричную матрицу &amp;lt;math&amp;gt;A = (G^TG)&amp;lt;/math&amp;gt; можно привести к диагональному виду:&lt;br /&gt;
&amp;lt;math&amp;gt;RG^TGR^T&amp;lt;/math&amp;gt;, где&lt;br /&gt;
&lt;br /&gt;
&amp;lt;math&amp;gt;&lt;br /&gt;
R(j,k,\theta) = &lt;br /&gt;
\begin{matrix}&lt;br /&gt;
  \\&lt;br /&gt;
  \\&lt;br /&gt;
  \\&lt;br /&gt;
j \\&lt;br /&gt;
  \\&lt;br /&gt;
k \\&lt;br /&gt;
  \\&lt;br /&gt;
  \\&lt;br /&gt;
  \\&lt;br /&gt;
\end{matrix}&lt;br /&gt;
&amp;lt;/math&amp;gt;  &lt;br /&gt;
&amp;lt;math&amp;gt;&lt;br /&gt;
\begin{bmatrix}&lt;br /&gt;
  &amp;amp; 1 &amp;amp;   &amp;amp;        &amp;amp;              &amp;amp;        &amp;amp;               &amp;amp;         &amp;amp;    &amp;amp;   \\&lt;br /&gt;
  &amp;amp;   &amp;amp; 1 &amp;amp;        &amp;amp;              &amp;amp;        &amp;amp;               &amp;amp;         &amp;amp;    &amp;amp;   \\&lt;br /&gt;
  &amp;amp;   &amp;amp;   &amp;amp; \ddots &amp;amp;              &amp;amp;        &amp;amp;               &amp;amp;         &amp;amp;    &amp;amp;   \\&lt;br /&gt;
  &amp;amp;   &amp;amp;   &amp;amp;        &amp;amp; \cos(\theta) &amp;amp;        &amp;amp; -\sin(\theta) &amp;amp;         &amp;amp;    &amp;amp;   \\&lt;br /&gt;
  &amp;amp;   &amp;amp;   &amp;amp;        &amp;amp;              &amp;amp; \ddots &amp;amp;               &amp;amp;         &amp;amp;    &amp;amp;   \\&lt;br /&gt;
  &amp;amp;   &amp;amp;   &amp;amp;        &amp;amp; \sin(\theta) &amp;amp;        &amp;amp; \cos(\theta)  &amp;amp;         &amp;amp;    &amp;amp;   \\&lt;br /&gt;
  &amp;amp;   &amp;amp;   &amp;amp;        &amp;amp;              &amp;amp;        &amp;amp;               &amp;amp; \ddots  &amp;amp;    &amp;amp;   \\&lt;br /&gt;
  &amp;amp;   &amp;amp;   &amp;amp;        &amp;amp;              &amp;amp;        &amp;amp;               &amp;amp;         &amp;amp; 1  &amp;amp;   \\&lt;br /&gt;
  &amp;amp;   &amp;amp;   &amp;amp;        &amp;amp;              &amp;amp;        &amp;amp;               &amp;amp;         &amp;amp;    &amp;amp; 1 \\&lt;br /&gt;
\end{bmatrix}&lt;br /&gt;
&amp;lt;/math&amp;gt;&lt;br /&gt;
&lt;br /&gt;
Обозначим &amp;lt;math&amp;gt;s = \sin \theta&amp;lt;/math&amp;gt; и &amp;lt;math&amp;gt;c = \cos \theta&amp;lt;/math&amp;gt;.&lt;br /&gt;
&lt;br /&gt;
Перемножив матрицы &amp;lt;math&amp;gt;RG^TGR^T&amp;lt;/math&amp;gt;, получим следующие выражения&amp;lt;ref&amp;gt;http://www.astro.tsu.ru/OsChMet/5_2.html&amp;lt;/ref&amp;gt;:&lt;br /&gt;
&lt;br /&gt;
&amp;lt;math&amp;gt;\begin{align}&lt;br /&gt;
 a_{jj}^{(i+1)} &amp;amp;= c^2\, a_{jj}^{(i)}  -  2\, s c \,a_{jk}^{(i)}  +  s^2\, a_{kk}^{(i)} \\&lt;br /&gt;
 a_{kk}^{(i+1)} &amp;amp;= s^2 \,a_{jj}^{(i)}  +  2 s c\, a_{jk}^{(i)}  +  c^2 \, a_{kk}^{(i)} \\&lt;br /&gt;
 a_{jk}^{(i+1)} &amp;amp;= a_{kj}^{(i+1)} = (c^2 - s^2 ) \, a_{jk}^{(i)}  +  s c \, (a_{kk}^{(i)} - a_{jj}^{(i)} ) \\&lt;br /&gt;
 a_{jm}^{(i+1)} &amp;amp;= a_{mj}^{(i+1)} = c \, a_{jm}^{(i)}  -  s \, a_{km}^{(i)} &amp;amp; m \ne j,k \\&lt;br /&gt;
 a_{km}^{(i+1)} &amp;amp;= a_{mk}^{(i+1)} = s \, a_{jm}^{(i)}  + c \, a_{km}^{(i)} &amp;amp; m \ne j,k \\&lt;br /&gt;
 a_{ml}^{(i+1)} &amp;amp;= a_{ml}^{(i)} &amp;amp;m,l \ne j,k&lt;br /&gt;
\end{align}&amp;lt;/math&amp;gt;&lt;br /&gt;
&lt;br /&gt;
Т.к внедиагональные элементы должны быть равны 0, то выбираем &amp;lt;math&amp;gt;\theta&amp;lt;/math&amp;gt; так, чтобы &amp;lt;math&amp;gt;a_{jk}^{(i+1)} = 0&amp;lt;/math&amp;gt; и &amp;lt;math&amp;gt;a_{kj}^{(i+1)} = 0&amp;lt;/math&amp;gt;.&lt;br /&gt;
&lt;br /&gt;
Тогда решая уравнение получаем, что&lt;br /&gt;
&lt;br /&gt;
&amp;lt;math&amp;gt;&lt;br /&gt;
         \begin{align}&lt;br /&gt;
         \tau &amp;amp;= ({a_{jj} - a_{kk}})/{2a_{jk}} \\&lt;br /&gt;
         t &amp;amp;= {sign(\tau)}/(|\tau| + \sqrt{1 + \tau^2}) \\&lt;br /&gt;
         c &amp;amp;= 1/(\sqrt{1 + t^2}) \\&lt;br /&gt;
         s &amp;amp;= ct \\&lt;br /&gt;
         \end{align}&amp;lt;/math&amp;gt;&lt;br /&gt;
&lt;br /&gt;
Остановка вычислений алгоритма наступает, когда внедиагональные элементы становятся меньше некоторого наперед заданного числа &amp;lt;math&amp;gt;\varepsilon&amp;lt;/math&amp;gt;.&lt;br /&gt;
&lt;br /&gt;
В случае, когда &amp;lt;math&amp;gt; a_{jj} = a_{kk} &amp;lt;/math&amp;gt; считаем &amp;lt;math&amp;gt; sign(\tau) = 1 &amp;lt;/math&amp;gt;, т. е. &amp;lt;math&amp;gt; \theta = &lt;br /&gt;
\pi/4 &amp;lt;/math&amp;gt;.&lt;br /&gt;
&lt;br /&gt;
=== Вычислительное ядро алгоритма ===&lt;br /&gt;
Вычислительное ядро алгоритма составляет непосредственно вычисление одностороннего вращения Якоби, т.е. вычисление элементов матрицы &amp;lt;math&amp;gt;g_{jm}^{(i+1)} = g_{mj}^{(i+1)}&amp;lt;/math&amp;gt; и &amp;lt;math&amp;gt;g_{km}^{(i+1)} = g_{mk}^{(i+1)}&amp;lt;/math&amp;gt;, &amp;lt;math&amp;gt;m \ne j,k&amp;lt;/math&amp;gt;, а также вычисления элементов &amp;lt;math&amp;gt;g_{jj}^{(i+1)} &amp;lt;/math&amp;gt; и &amp;lt;math&amp;gt;g_{kk}^{(i+1)} &amp;lt;/math&amp;gt;, получившихся после умножения промежуточной матрицы на матрицу вращений Якоби:&lt;br /&gt;
&lt;br /&gt;
&amp;lt;math&amp;gt;\begin{align}&lt;br /&gt;
 g_{jj}^{(i+1)} &amp;amp;= c^2\, g_{jj}^{(i)}  -  2\, s c \,g_{jk}^{(i)}  +  s^2\, g_{kk}^{(i)} \\&lt;br /&gt;
 g_{kk}^{(i+1)} &amp;amp;= s^2 \,g_{jj}^{(i)}  +  2 s c\, g_{jk}^{(i)}  +  c^2 \, g_{kk}^{(i)} \\&lt;br /&gt;
 g_{jk}^{(i+1)} &amp;amp;= g_{kj}^{(i+1)} = (c^2 - s^2 ) \, g_{jk}^{(i)}  +  s c \, (g_{kk}^{(i)} - g_{jj}^{(i)} ) \\&lt;br /&gt;
 g_{jm}^{(i+1)} &amp;amp;= g_{mj}^{(i+1)} = c \, g_{jm}^{(i)}  -  s \, g_{km}^{(i)} &amp;amp; m \ne j,k \\&lt;br /&gt;
 g_{km}^{(i+1)} &amp;amp;= g_{mk}^{(i+1)} = s \, g_{jm}^{(i)}  + c \, g_{km}^{(i)} &amp;amp; m \ne j,k \\&lt;br /&gt;
 g_{ml}^{(i+1)} &amp;amp;= g_{ml}^{(i)} &amp;amp;m,l \ne j,k&lt;br /&gt;
\end{align}&amp;lt;/math&amp;gt;&lt;br /&gt;
&lt;br /&gt;
=== Макроструктура алгоритма ===&lt;br /&gt;
Основную часть метода составляет процедура односторонних вращений матрицы, которая в свою очередь состоит из:&lt;br /&gt;
&lt;br /&gt;
#Вычисление &amp;lt;math&amp;gt;\tau, c, s, t&amp;lt;/math&amp;gt;.&lt;br /&gt;
#Одностороннее вращение матрицы. &lt;br /&gt;
&lt;br /&gt;
Что требует &amp;lt;math&amp;gt;O(n)&amp;lt;/math&amp;gt; операций.&lt;br /&gt;
&lt;br /&gt;
После этого необходимо:&lt;br /&gt;
&lt;br /&gt;
#Вычислить сингулярные числа &amp;lt;math&amp;gt;\sigma_i&amp;lt;/math&amp;gt;.  Что требует &amp;lt;math&amp;gt;O(n)&amp;lt;/math&amp;gt; операций.&lt;br /&gt;
#Вычислить &amp;lt;math&amp;gt;U&amp;lt;/math&amp;gt; и &amp;lt;math&amp;gt;V&amp;lt;/math&amp;gt;. Что требует &amp;lt;math&amp;gt;O(n^2)&amp;lt;/math&amp;gt; операций.&lt;br /&gt;
&lt;br /&gt;
=== Схема реализации последовательного алгоритма ===&lt;br /&gt;
Применение метода Якоби к матрице &amp;lt;math&amp;gt;A = (G^TG)&amp;lt;/math&amp;gt; можно описать следующим образом&amp;lt;ref&amp;gt;Дж. Деммель «Вычислительная линейная алгебра» (стр. 261-263)&amp;lt;/ref&amp;gt;:&lt;br /&gt;
&lt;br /&gt;
Если &amp;lt;math&amp;gt;G = U\Sigma V^T&amp;lt;/math&amp;gt; и &amp;lt;math&amp;gt;\Sigma = diag(\sigma_{i})&amp;lt;/math&amp;gt;, то алгоритм вычисляет сингулярные числа &amp;lt;math&amp;gt;\sigma_{i}&amp;lt;/math&amp;gt;, матрицу &amp;lt;math&amp;gt;U&amp;lt;/math&amp;gt; левых сингулярных векторов и матрицу &amp;lt;math&amp;gt;V&amp;lt;/math&amp;gt; правых сингулярных векторов по следующей схеме:&lt;br /&gt;
&lt;br /&gt;
 repeat&lt;br /&gt;
     for &amp;lt;math&amp;gt;j=1&amp;lt;/math&amp;gt; to &amp;lt;math&amp;gt;n-1&amp;lt;/math&amp;gt;&lt;br /&gt;
         for &amp;lt;math&amp;gt;k=j+1&amp;lt;/math&amp;gt; to &amp;lt;math&amp;gt;n&amp;lt;/math&amp;gt;&lt;br /&gt;
             обратиться к процедуре &#039;&#039;&#039;&#039;&#039;One-Sided-Jacobi-Rotation&amp;lt;math&amp;gt;(G,j,k)&amp;lt;/math&amp;gt;&#039;&#039;&#039;&#039;&#039;&lt;br /&gt;
         end for&lt;br /&gt;
     end for&lt;br /&gt;
 пока &amp;lt;math&amp;gt;G^TG&amp;lt;/math&amp;gt; не станет достаточно близка к диагональной матрице&lt;br /&gt;
 Положить &amp;lt;math&amp;gt;\sigma_{i} = ||G(:,i)||_2 &amp;lt;/math&amp;gt; (норма &amp;lt;math&amp;gt;i&amp;lt;/math&amp;gt;-го столбца в &amp;lt;math&amp;gt;G&amp;lt;/math&amp;gt;)&lt;br /&gt;
 Положить &amp;lt;math&amp;gt;U = [u_{1},\dots, u_{n}]&amp;lt;/math&amp;gt;, где &amp;lt;math&amp;gt;u_{i} = G(:,i)/\sigma_{i}&amp;lt;/math&amp;gt;&lt;br /&gt;
 Положить &amp;lt;math&amp;gt;V = J&amp;lt;/math&amp;gt;, где &amp;lt;math&amp;gt;J&amp;lt;/math&amp;gt; - накопленное произведение вращений Якоби.&lt;br /&gt;
&lt;br /&gt;
Где процедура &#039;&#039;&#039;&#039;&#039;One-Sided-Jacobi-Rotation&#039;&#039;&#039;&#039;&#039; является метод односторонних вращений Якоби:&lt;br /&gt;
&lt;br /&gt;
 proc &#039;&#039;&#039;&#039;&#039;One-Sided-Jacobi-Rotation&amp;lt;math&amp;gt;(G,j,k)&amp;lt;/math&amp;gt;&#039;&#039;&#039;&#039;&#039;&lt;br /&gt;
     вычислить &amp;lt;math&amp;gt;a_{jj} = (G^TG)_{jj}, a_{jk} = (G^TG)_{jk}&amp;lt;/math&amp;gt; и &amp;lt;math&amp;gt;a_{kk} = (G^TG)_{kk}&amp;lt;/math&amp;gt;&lt;br /&gt;
     if &amp;lt;math&amp;gt;|a_{jk}|&amp;lt;/math&amp;gt; не слишком мал&lt;br /&gt;
         &amp;lt;math&amp;gt;&lt;br /&gt;
         \begin{align}&lt;br /&gt;
         \tau &amp;amp;= ({a_{jj} - a_{kk}})/{2a_{jk}} \\&lt;br /&gt;
         t &amp;amp;= {sign(\tau)}/(|\tau| + \sqrt{1 + \tau^2}) \\&lt;br /&gt;
         c &amp;amp;= 1/(\sqrt{1 + t^2}) \\&lt;br /&gt;
         s &amp;amp;= ct \\&lt;br /&gt;
         G &amp;amp;= GR(j,k,\theta) \  \dots c=cos\theta, s=sin\theta \end{align}&amp;lt;/math&amp;gt;&lt;br /&gt;
         if нужны правые сингулярные векторы &lt;br /&gt;
             &amp;lt;math&amp;gt;J = JR(j,k,\theta)&amp;lt;/math&amp;gt;&lt;br /&gt;
         end if&lt;br /&gt;
     end if&lt;br /&gt;
&lt;br /&gt;
=== Последовательная сложность алгоритма ===&lt;br /&gt;
Для одного вращения Якоби необходимо выполнить &amp;lt;math&amp;gt;O(n)&amp;lt;/math&amp;gt; операций умножения и сложения. &lt;br /&gt;
&lt;br /&gt;
Всего вариантов выбора &amp;lt;math&amp;gt;j&amp;lt;/math&amp;gt; и &amp;lt;math&amp;gt;k&amp;lt;/math&amp;gt; существует &amp;lt;math&amp;gt;\frac{n(n-1)}{2}&amp;lt;/math&amp;gt;.&lt;br /&gt;
&lt;br /&gt;
Таким образом последовательный алгоритм Якоби вычисления сингулярных чисел и векторов является алгоритмом с кубической сложностью.&lt;br /&gt;
&lt;br /&gt;
=== Информационный граф ===&lt;br /&gt;
Граф алгоритма состоит из четырех групп вершин&lt;br /&gt;
&lt;br /&gt;
(А)Первая группа вершин расположена в двумерной области, соответствующая ей операция - вычисление элементов &amp;lt;math&amp;gt;a_{jj},a_{jk},a_{kk}&amp;lt;/math&amp;gt; матрицы произведения &amp;lt;math&amp;gt;A = (G^TG)&amp;lt;/math&amp;gt;. Где &amp;lt;math&amp;gt;j&amp;lt;/math&amp;gt; изменяется от &amp;lt;math&amp;gt;1&amp;lt;/math&amp;gt; до &amp;lt;math&amp;gt;n-1&amp;lt;/math&amp;gt;, принимая все целочисленные значения, &amp;lt;math&amp;gt;k&amp;lt;/math&amp;gt;  изменяется от &amp;lt;math&amp;gt;j+1&amp;lt;/math&amp;gt; до &amp;lt;math&amp;gt;n&amp;lt;/math&amp;gt;, принимая все целочисленные значения.&lt;br /&gt;
&lt;br /&gt;
Граф вычисления каждого из элементов приведен на рисунке 1, где значениям &amp;lt;math&amp;gt;g_{ij}&amp;lt;/math&amp;gt; соответствуют обозначения &amp;lt;math&amp;gt;x_{ij}&amp;lt;/math&amp;gt;, а элементам &amp;lt;math&amp;gt;g^T_{ij}&amp;lt;/math&amp;gt; обозначения &amp;lt;math&amp;gt;z_{ij}&amp;lt;/math&amp;gt;. Значение &amp;lt;math&amp;gt;s_{ij}&amp;lt;/math&amp;gt; является значением результирующего элемента.&lt;br /&gt;
&lt;br /&gt;
(Б)Вторая группа вершин расположена в двумерной области, соответствующая ей операция – вычисление &amp;lt;math&amp;gt;c&amp;lt;/math&amp;gt; и &amp;lt;math&amp;gt;s&amp;lt;/math&amp;gt;.&lt;br /&gt;
&lt;br /&gt;
Информационный граф с входными и выходными данными вычисления пункта (Б) представлен на рисунке 2.&lt;br /&gt;
&lt;br /&gt;
(В)Третья группа вершин расположена в двумерной области, соответствующая ей операция вычисление значений элементов &amp;lt;math&amp;gt;g_{jm}^{(i+1)} = g_{mj}^{(i+1)}&amp;lt;/math&amp;gt; и &amp;lt;math&amp;gt;g_{km}^{(i+1)} = g_{mk}^{(i+1)}&amp;lt;/math&amp;gt;, &amp;lt;math&amp;gt;m \ne j,k&amp;lt;/math&amp;gt;.&lt;br /&gt;
&lt;br /&gt;
(Г)Четвертая группа вершин расположена в двумерной области, соответствующая ей операция вычисление значений элементов &amp;lt;math&amp;gt;g_{jj}^{(i+1)} &amp;lt;/math&amp;gt; и &amp;lt;math&amp;gt;g_{kk}^{(i+1)} &amp;lt;/math&amp;gt;.&lt;br /&gt;
&lt;br /&gt;
Элементы групп (В) и (Г) вычисляются аналогично вычислению элементов матрицы произведения, т.к. фактически представляют собой перемножение матриц &amp;lt;math&amp;gt;G&amp;lt;/math&amp;gt; и &amp;lt;math&amp;gt;R&amp;lt;/math&amp;gt;&lt;br /&gt;
&lt;br /&gt;
[[File:Jacobi_2.jpg|none|thumb|1000px|Рисунок 1. Информационный граф с входными и выходными параметрами вычисления каждого элемента матрицы произведения.]]&lt;br /&gt;
&lt;br /&gt;
[[File:Jacobi_1.jpg|none|thumb|1000px|Рисунок 2. Информационный граф с входными и выходными параметрами вычисления значений &amp;lt;math&amp;gt;c&amp;lt;/math&amp;gt; и &amp;lt;math&amp;gt;s&amp;lt;/math&amp;gt;.]]&lt;br /&gt;
&lt;br /&gt;
Обобщенный граф метода Якоби представлен на рисунке 3, где буквами А, Б, В и Г обозначено вычисление групп вершин (А), (Б), (В) и (Г).&lt;br /&gt;
&lt;br /&gt;
[[File:Graf21.png|none|thumb|2000px|Рисунок 3. Обобщенный граф алгоритма вычисления сингулярных чисел и векторов методом Якоби.]]&lt;br /&gt;
&lt;br /&gt;
=== Ресурс параллелизма алгоритма ===&lt;br /&gt;
Для выполнения одной итерации метода Якоби требуется последовательно выполнить несколько ярусов:&lt;br /&gt;
# вычислить &amp;lt;math&amp;gt;\tau&amp;lt;/math&amp;gt; &lt;br /&gt;
# вычислить &amp;lt;math&amp;gt;t&amp;lt;/math&amp;gt; &lt;br /&gt;
# вычислить &amp;lt;math&amp;gt;c&amp;lt;/math&amp;gt; &lt;br /&gt;
# вычислить &amp;lt;math&amp;gt;s&amp;lt;/math&amp;gt;&lt;br /&gt;
# выполнить поворот матрицы &amp;lt;math&amp;gt;G&amp;lt;/math&amp;gt; с параллельным выполнением &amp;lt;math&amp;gt;2(n-2)&amp;lt;/math&amp;gt; операций вычисления элементов матрицы &amp;lt;math&amp;gt;g_{jm}^{(i+1)} = g_{mj}^{(i+1)}&amp;lt;/math&amp;gt; и &amp;lt;math&amp;gt;g_{km}^{(i+1)} = g_{mk}^{(i+1)}&amp;lt;/math&amp;gt;, &amp;lt;math&amp;gt;m \ne j,k&amp;lt;/math&amp;gt;, а также вычисления элементов &amp;lt;math&amp;gt;g_{jj}^{(i+1)} &amp;lt;/math&amp;gt; и &amp;lt;math&amp;gt;g_{kk}^{(i+1)} &amp;lt;/math&amp;gt;. &lt;br /&gt;
&lt;br /&gt;
Суммарное количество итераций равно &amp;lt;math&amp;gt;\frac{n(n-1)}{2}&amp;lt;/math&amp;gt; (Различные варианты выбора &amp;lt;math&amp;gt;j&amp;lt;/math&amp;gt; и &amp;lt;math&amp;gt;k&amp;lt;/math&amp;gt;). &lt;br /&gt;
&lt;br /&gt;
Асимптотически метод сходится квадратично. &lt;br /&gt;
&lt;br /&gt;
Таким образом, при классификации по высоте ЯПФ метод Якоби относится к алгоритмам со сложностью &amp;lt;math&amp;gt;O(n^2)&amp;lt;/math&amp;gt;&amp;amp;nbsp;, а при классификации по ширине ЯПФ — к алгоритмам со сложностью &amp;lt;math&amp;gt;O(n)&amp;lt;/math&amp;gt;.&lt;br /&gt;
&lt;br /&gt;
=== Входные и выходные данные алгоритма ===&lt;br /&gt;
&#039;&#039;&#039;Входные данные&#039;&#039;&#039;: плотная матрица &amp;lt;math&amp;gt;G&amp;lt;/math&amp;gt; размера &amp;lt;math&amp;gt;n&amp;lt;/math&amp;gt;х&amp;lt;math&amp;gt;n&amp;lt;/math&amp;gt;, где &amp;lt;math&amp;gt;A= G^TG&amp;lt;/math&amp;gt; – симметрическая матрица.&lt;br /&gt;
&lt;br /&gt;
&#039;&#039;&#039;Объём входных данных&#039;&#039;&#039;: &amp;lt;math&amp;gt;n^2&amp;lt;/math&amp;gt; (т.к. для хранения матрицы &amp;lt;math&amp;gt;G&amp;lt;/math&amp;gt; используем двумерный массив размера &amp;lt;math&amp;gt;n&amp;lt;/math&amp;gt;х&amp;lt;math&amp;gt;n&amp;lt;/math&amp;gt;)&lt;br /&gt;
&lt;br /&gt;
&#039;&#039;&#039;Выходные данные&#039;&#039;&#039;: &amp;lt;math&amp;gt;\sigma_{i}&amp;lt;/math&amp;gt;  - сингулярные числа, матрица &amp;lt;math&amp;gt;U&amp;lt;/math&amp;gt; левых сингулярных векторов и матрица &amp;lt;math&amp;gt;V&amp;lt;/math&amp;gt; правых сингулярных векторов.&lt;br /&gt;
&lt;br /&gt;
&#039;&#039;&#039;Объём выходных данных&#039;&#039;&#039;: &amp;lt;math&amp;gt;2n^2 + n&amp;lt;/math&amp;gt; (т.к. необходимо хранить вектор сингулярных чисел длины &amp;lt;math&amp;gt;n&amp;lt;/math&amp;gt;, а также две матрицы &amp;lt;math&amp;gt;U, V&amp;lt;/math&amp;gt; левых и правых сингулярных векторов размера &amp;lt;math&amp;gt;n&amp;lt;/math&amp;gt;х&amp;lt;math&amp;gt;n&amp;lt;/math&amp;gt;).&lt;br /&gt;
&lt;br /&gt;
=== Свойства алгоритма ===&lt;br /&gt;
Метод Якоби является самым медленным из имеющихся алгоритмов вычисления сингулярных чисел и сингулярных векторов матрицы. Тем не менее, для  матриц &amp;lt;math&amp;gt;G&amp;lt;/math&amp;gt;, которые могут быть представлены в виде &amp;lt;math&amp;gt;G=DX&amp;lt;/math&amp;gt;, где &amp;lt;math&amp;gt;D&amp;lt;/math&amp;gt; - диагональная, а &amp;lt;math&amp;gt;X&amp;lt;/math&amp;gt; - хорошо обусловлена, он способен вычислять сингулярные числа и вектора намного точнее, чем другие методы&amp;lt;ref&amp;gt;Дж. Деммель «Вычислительная линейная алгебра» (стр. 261-264)&amp;lt;/ref&amp;gt;. &lt;br /&gt;
&lt;br /&gt;
Вычислительная мощность алгоритма, как отношение числа операций к суммарному объему входных и выходных данных является линейной.&lt;br /&gt;
&lt;br /&gt;
Метод Якоби не детерминирован, так как является итерационным алгоритмом с выходом по точности (число итераций зависит от входных данных и порогового значения).&lt;br /&gt;
&lt;br /&gt;
== Программная реализация алгоритма ==&lt;br /&gt;
&lt;br /&gt;
=== Особенности реализации последовательного алгоритма ===&lt;br /&gt;
&lt;br /&gt;
=== Локальность данных и вычислений ===&lt;br /&gt;
&lt;br /&gt;
=== Возможные способы и особенности параллельной реализации алгоритма ===&lt;br /&gt;
&lt;br /&gt;
=== Масштабируемость алгоритма и его реализации ===&lt;br /&gt;
Исследование масштабируемости параллельной реализации метода Якоби вычисления сингулярных чисел и векторов проводилось на тестовой средe суперкомпьютера &amp;quot;Ломоносов&amp;quot;, с использованием компилятора ICC и библиотеки impi/4.0.3. Алгоритм реализован на языке программирования C с использованием механизмов MPI.&lt;br /&gt;
&lt;br /&gt;
Алгоритм работает по следующей схеме:&lt;br /&gt;
#На вход всем процессорам подается матрица &amp;lt;math&amp;gt; G &amp;lt;/math&amp;gt;.&lt;br /&gt;
#Для всех &amp;lt;math&amp;gt; j &amp;lt;/math&amp;gt; и &amp;lt;math&amp;gt; k &amp;lt;/math&amp;gt; таких, что &amp;lt;math&amp;gt; j \in [1,n-1] &amp;lt;/math&amp;gt;, &amp;lt;math&amp;gt; k \in [j+1,n] &amp;lt;/math&amp;gt;&lt;br /&gt;
##Вычисляется элемент &amp;lt;math&amp;gt; a_{jk} &amp;lt;/math&amp;gt; путем перемножения матриц &amp;lt;math&amp;gt; G^TG &amp;lt;/math&amp;gt;, где на каждом процессоре вычисляется своя часть матрицы. После чего результат отправляется на все процессоры.&lt;br /&gt;
##Если полученный элемент оказывается больше некоторого значения, то начинается последовательная часть программы: Вычисление элементов &amp;lt;math&amp;gt; \tau, t, c, s &amp;lt;/math&amp;gt;.&lt;br /&gt;
##Затем, выполняется операция поворота, путем перемножения матриц &amp;lt;math&amp;gt; G &amp;lt;/math&amp;gt; и &amp;lt;math&amp;gt; R &amp;lt;/math&amp;gt;. Данная операция выполняется параллельно на нескольких процессорах, где каждый процессор вычисляет свою часть матрицы. После чего результат пересылается всем процессорам.&lt;br /&gt;
&lt;br /&gt;
Данная схема повторяется до тех пор, пока матрица &amp;lt;math&amp;gt; A = G^TG &amp;lt;/math&amp;gt; не станет достаточно близкой к диагональной.&lt;br /&gt;
&lt;br /&gt;
Для проверки этого факта, в конце каждой итерации цикла вычисляется матрица &amp;lt;math&amp;gt; A &amp;lt;/math&amp;gt;. Данная операция выполняется параллельно на нескольких процессорах, где каждый процессор вычисляет свою часть матрицы, после чего результат пересылается всем процессорам.&lt;br /&gt;
&lt;br /&gt;
&lt;br /&gt;
Набор и границы значений изменяемых параметров запуска реализации алгоритма: &lt;br /&gt;
&lt;br /&gt;
*	число процессоров [1 : 128] с шагом равным степени двойки;&lt;br /&gt;
*	размер матрицы [256 : 1792] с шагом 256.&lt;br /&gt;
&lt;br /&gt;
В результате проведённых экспериментов был получен следующий диапазон эффективности реализации алгоритма:&lt;br /&gt;
&lt;br /&gt;
*	минимальная эффективность реализации 0,01%;&lt;br /&gt;
*	максимальная эффективность реализации 16,52%.&lt;br /&gt;
&lt;br /&gt;
На следующих рисунках приведены графики производительности и эффективности выбранной реализации метода Якоби в зависимости от изменяемых параметров запуска.&lt;br /&gt;
&lt;br /&gt;
[[File:Performance.jpg|none|thumb|1000px|Рисунок 1. Параллельная реализация метода Якоби. Изменение производительности в зависимости от числа процессоров и размера матрицы.]]&lt;br /&gt;
&lt;br /&gt;
[[File:Эффективность.png|none|thumb|1000px|Рисунок 1. Параллельная реализация метода Якоби. Изменение эффективности в зависимости от числа процессоров и размера матрицы.]]&lt;br /&gt;
&lt;br /&gt;
Построим оценки масштабируемости данной реализации метода Якоби: &lt;br /&gt;
* По числу процессов: при увеличении числа процессов эффективность на рассмотренной области изменений параметров запуска сначала увеличивается (самый пик достигается при 16 процессах), а затем начинает снижаться. Это характеризуется тем, что накладные расходы на параллельное выполнение (общение между процессами) начинает превалировать над вычислениями.&lt;br /&gt;
&lt;br /&gt;
*По размеру задачи: при увеличении размера задачи эффективность возрастает. Это подтверждает предположение о том, что размер задачи сильно влияет на эффективность выполнения приложения. Оценка показывает, что с ростом размера задачи эффективность на рассмотренной области значений параметров запуска сильно увеличивается. &lt;br /&gt;
&lt;br /&gt;
*По двум направлениям: при рассмотрении увеличения как вычислительной сложности, так и числа процессов на всей рассмотренной области значений эффективность увеличивается, но медленно и с перепадами.&lt;br /&gt;
&lt;br /&gt;
[https://www.dropbox.com/home?preview=mainmpi.c Исследованная параллельная реализация метода Якоби]&lt;br /&gt;
&lt;br /&gt;
=== Динамические характеристики и эффективность реализации алгоритма ===&lt;br /&gt;
&lt;br /&gt;
=== Выводы для классов архитектур ===&lt;br /&gt;
&lt;br /&gt;
=== Существующие реализации алгоритма ===&lt;br /&gt;
Метод Якоби нахождения сингулярных значений и векторов реализован в таких пакетах, как LAPACK &amp;lt;ref&amp;gt;http://www.netlib.org/scalapack/slug/&amp;lt;/ref&amp;gt;, LINPACK/EISPACK &amp;lt;ref&amp;gt; http://www.netlib.org/linpack/ &amp;lt;/ref&amp;gt;, Intel MKL &amp;lt;ref&amp;gt;https://software.intel.com/ru-ru/node/521153#CAF8CA08-1C69-48F8-B0C3-B2B27AFA92FA&amp;lt;/ref&amp;gt;.&lt;br /&gt;
&lt;br /&gt;
Так же функция Якоби реализована в пакете Matlab.&lt;br /&gt;
&lt;br /&gt;
Т. к. алгоритм считается медленным, он не включен во многие известные пакеты.&lt;br /&gt;
&lt;br /&gt;
== Литература ==&lt;br /&gt;
1. Дж. Деммель Вычислительная линейная алгебра. Изд. Мир, 2001.&lt;/div&gt;</summary>
		<author><name>Davletshuna Alexandra</name></author>
	</entry>
	<entry>
		<id>https://xn--80aecvaldz.xn--80ahdrnmvk.xn--p1ai/w/ru/index.php?title=%D0%A3%D1%87%D0%B0%D1%81%D1%82%D0%BD%D0%B8%D0%BA:Davletshuna_Alexandra/%D0%9C%D0%B5%D1%82%D0%BE%D0%B4_%D0%AF%D0%BA%D0%BE%D0%B1%D0%B8_%D0%B2%D1%8B%D1%87%D0%B8%D1%81%D0%BB%D0%B5%D0%BD%D0%B8%D1%8F_%D1%81%D0%B8%D0%BD%D0%B3%D1%83%D0%BB%D1%8F%D1%80%D0%BD%D1%8B%D1%85_%D1%87%D0%B8%D1%81%D0%B5%D0%BB_%D0%B8_%D0%B2%D0%B5%D0%BA%D1%82%D0%BE%D1%80%D0%BE%D0%B2&amp;diff=20473</id>
		<title>Участник:Davletshuna Alexandra/Метод Якоби вычисления сингулярных чисел и векторов</title>
		<link rel="alternate" type="text/html" href="https://xn--80aecvaldz.xn--80ahdrnmvk.xn--p1ai/w/ru/index.php?title=%D0%A3%D1%87%D0%B0%D1%81%D1%82%D0%BD%D0%B8%D0%BA:Davletshuna_Alexandra/%D0%9C%D0%B5%D1%82%D0%BE%D0%B4_%D0%AF%D0%BA%D0%BE%D0%B1%D0%B8_%D0%B2%D1%8B%D1%87%D0%B8%D1%81%D0%BB%D0%B5%D0%BD%D0%B8%D1%8F_%D1%81%D0%B8%D0%BD%D0%B3%D1%83%D0%BB%D1%8F%D1%80%D0%BD%D1%8B%D1%85_%D1%87%D0%B8%D1%81%D0%B5%D0%BB_%D0%B8_%D0%B2%D0%B5%D0%BA%D1%82%D0%BE%D1%80%D0%BE%D0%B2&amp;diff=20473"/>
		<updated>2016-12-09T11:06:50Z</updated>

		<summary type="html">&lt;p&gt;Davletshuna Alexandra: /* Математическое описание алгоритма */&lt;/p&gt;
&lt;hr /&gt;
&lt;div&gt;{{Assignment|ASA}}&lt;br /&gt;
&lt;br /&gt;
{{algorithm&lt;br /&gt;
| name              = Метод Якоби вычисления сингулярных чисел и векторов&lt;br /&gt;
| serial_complexity = &amp;lt;math&amp;gt;O(n^3)&amp;lt;/math&amp;gt;&lt;br /&gt;
| pf_height         = &amp;lt;math&amp;gt;O(n^2)&amp;lt;/math&amp;gt;&lt;br /&gt;
| pf_width          = &amp;lt;math&amp;gt;O(n)&amp;lt;/math&amp;gt;&lt;br /&gt;
| input_data        = &amp;lt;math&amp;gt;n^2&amp;lt;/math&amp;gt;&lt;br /&gt;
| output_data       = &amp;lt;math&amp;gt;2n^2 + n&amp;lt;/math&amp;gt;&lt;br /&gt;
}}&lt;br /&gt;
&lt;br /&gt;
Авторы статьи: [[Участница:Davletshuna Alexandra|Давлетшина Александра]] (группа 619); [[Участница:Alek sandra|Зайцева Александра]]. Вклад каждого участника считать равноценным.&lt;br /&gt;
&lt;br /&gt;
== Свойства и структура алгоритма ==&lt;br /&gt;
&lt;br /&gt;
=== Общее описание алгоритма ===&lt;br /&gt;
&#039;&#039;&#039;Сингулярным разложением&#039;&#039;&#039; называется разложение прямоугольной вещественной или комплексной матрицы, имеющее широкое применение, в силу своей наглядной геометрической интерпретации, при решении многих прикладных задач. Сингулярное разложение матрицы А позволяет вычислять сингулярные числа данной матрицы, а также, левые и правые сингулярные векторы матрицы А:&lt;br /&gt;
&lt;br /&gt;
•	левые сингулярные векторы матрицы А — это собственные векторы матрицы &amp;lt;math&amp;gt;AA^*&amp;lt;/math&amp;gt;;&lt;br /&gt;
&lt;br /&gt;
•	правые сингулярные векторы матрицы A — это собственные векторы матрицы &amp;lt;math&amp;gt;A^*A&amp;lt;/math&amp;gt;.&lt;br /&gt;
&lt;br /&gt;
Геометрическая интерпретация сингулярного разложения заключается в следующем факте из геометрии: &#039;&#039;Образом любого линейного преобразования, заданного с помощью матрицы &amp;lt;math&amp;gt;m&amp;lt;/math&amp;gt;x&amp;lt;math&amp;gt;n&amp;lt;/math&amp;gt;, примененного к единичной сфере является гиперэллипсоид&#039;&#039;.&lt;br /&gt;
&lt;br /&gt;
Из многочисленных разложений матриц, наиболее удобным является сингулярное разложение матрицы в виде: &amp;lt;math&amp;gt;A=U\Sigma V^*&amp;lt;/math&amp;gt;, где &amp;lt;math&amp;gt;U, V&amp;lt;/math&amp;gt; – унитарные матрицы, а &amp;lt;math&amp;gt;\Sigma&amp;lt;/math&amp;gt; – диагональная матрица с вещественными положительными числами на диагонали &amp;lt;ref&amp;gt;http://algorithms.parallel.ru/&amp;lt;/ref&amp;gt;.&lt;br /&gt;
&lt;br /&gt;
Диагональные элементы матрицы &amp;lt;math&amp;gt;\Sigma&amp;lt;/math&amp;gt; называются сингулярными числами матрицы &amp;lt;math&amp;gt;A&amp;lt;/math&amp;gt;, а столбцы матриц &amp;lt;math&amp;gt;U,V&amp;lt;/math&amp;gt; левыми и правыми сингулярными векторами соответственно.&lt;br /&gt;
&lt;br /&gt;
Алгоритм Якоби сингулярного разложения матрицы был предложен одним из первых в 1846 году. Он приводит прямоугольную матрицу к диагональной матрице с помощью последовательности элементарных вращений. Метод может найти все сингулярные значения с очень высокой точностью. Однако его производительность является довольно низкой, в сравнении с конкурирующими методами.&lt;br /&gt;
&lt;br /&gt;
&#039;&#039;Неявный&#039;&#039;&amp;lt;ref&amp;gt;Дж. Деммель «Вычислительная линейная алгебра» (стр. 261-264)&amp;lt;/ref&amp;gt; метод Якоби математически эквивалентен применению метода Якоби вычисления собственных значений к матрице &amp;lt;math&amp;gt;A = G^TG&amp;lt;/math&amp;gt;.&lt;br /&gt;
Это значит, что на каждом шаге вычисляется вращение Якоби &amp;lt;math&amp;gt;J&amp;lt;/math&amp;gt;, с помощью которого матрица &amp;lt;math&amp;gt;G^TG&amp;lt;/math&amp;gt; неявно пересчитывется в &amp;lt;math&amp;gt;J^TG^TGJ&amp;lt;/math&amp;gt;; вращение выбрано так, чтобы пара внедиагональных элементов из &amp;lt;math&amp;gt;G^TG&amp;lt;/math&amp;gt; обратилась в нули в матрице &amp;lt;math&amp;gt;J^TG^TGJ&amp;lt;/math&amp;gt;. При этом ни &amp;lt;math&amp;gt;G^TG&amp;lt;/math&amp;gt;, ни &amp;lt;math&amp;gt;J^TG^TGJ&amp;lt;/math&amp;gt; не вычисляются в явном виде; вместо них вычисляется матрица &amp;lt;math&amp;gt;GJ&amp;lt;/math&amp;gt;. Поэтому алгоритм называется &#039;&#039;методом односторонних вращений&#039;&#039;.&lt;br /&gt;
&lt;br /&gt;
=== Математическое описание алгоритма ===&lt;br /&gt;
Исходные данные: матрица &amp;lt;math&amp;gt;G&amp;lt;/math&amp;gt; (элементы &amp;lt;math&amp;gt;g_{ij}, i, j = 1, \ldots, n&amp;lt;/math&amp;gt;).&lt;br /&gt;
&lt;br /&gt;
Вычисляемые данные: матрица &amp;lt;math&amp;gt;\Sigma = diag(\sigma_{i})&amp;lt;/math&amp;gt;, где &amp;lt;math&amp;gt;\sigma_{i}&amp;lt;/math&amp;gt; - сингулярные числа, &amp;lt;math&amp;gt;U&amp;lt;/math&amp;gt; - матрица левых сингулярных векторов, &amp;lt;math&amp;gt;V&amp;lt;/math&amp;gt; - матрица правых сингулярных векторов.&lt;br /&gt;
&lt;br /&gt;
симметричную матрицу &amp;lt;math&amp;gt;A = (G^TG)&amp;lt;/math&amp;gt; можно привести к диагональному виду:&lt;br /&gt;
&amp;lt;math&amp;gt;RG^TGR^T&amp;lt;/math&amp;gt;, где&lt;br /&gt;
&lt;br /&gt;
&amp;lt;math&amp;gt;&lt;br /&gt;
R(j,k,\theta) = &lt;br /&gt;
\begin{matrix}&lt;br /&gt;
  \\&lt;br /&gt;
  \\&lt;br /&gt;
  \\&lt;br /&gt;
j \\&lt;br /&gt;
  \\&lt;br /&gt;
k \\&lt;br /&gt;
  \\&lt;br /&gt;
  \\&lt;br /&gt;
  \\&lt;br /&gt;
\end{matrix}&lt;br /&gt;
&amp;lt;/math&amp;gt;  &lt;br /&gt;
&amp;lt;math&amp;gt;&lt;br /&gt;
\begin{bmatrix}&lt;br /&gt;
  &amp;amp; 1 &amp;amp;   &amp;amp;        &amp;amp;              &amp;amp;        &amp;amp;               &amp;amp;         &amp;amp;    &amp;amp;   \\&lt;br /&gt;
  &amp;amp;   &amp;amp; 1 &amp;amp;        &amp;amp;              &amp;amp;        &amp;amp;               &amp;amp;         &amp;amp;    &amp;amp;   \\&lt;br /&gt;
  &amp;amp;   &amp;amp;   &amp;amp; \ddots &amp;amp;              &amp;amp;        &amp;amp;               &amp;amp;         &amp;amp;    &amp;amp;   \\&lt;br /&gt;
  &amp;amp;   &amp;amp;   &amp;amp;        &amp;amp; \cos(\theta) &amp;amp;        &amp;amp; -\sin(\theta) &amp;amp;         &amp;amp;    &amp;amp;   \\&lt;br /&gt;
  &amp;amp;   &amp;amp;   &amp;amp;        &amp;amp;              &amp;amp; \ddots &amp;amp;               &amp;amp;         &amp;amp;    &amp;amp;   \\&lt;br /&gt;
  &amp;amp;   &amp;amp;   &amp;amp;        &amp;amp; \sin(\theta) &amp;amp;        &amp;amp; \cos(\theta)  &amp;amp;         &amp;amp;    &amp;amp;   \\&lt;br /&gt;
  &amp;amp;   &amp;amp;   &amp;amp;        &amp;amp;              &amp;amp;        &amp;amp;               &amp;amp; \ddots  &amp;amp;    &amp;amp;   \\&lt;br /&gt;
  &amp;amp;   &amp;amp;   &amp;amp;        &amp;amp;              &amp;amp;        &amp;amp;               &amp;amp;         &amp;amp; 1  &amp;amp;   \\&lt;br /&gt;
  &amp;amp;   &amp;amp;   &amp;amp;        &amp;amp;              &amp;amp;        &amp;amp;               &amp;amp;         &amp;amp;    &amp;amp; 1 \\&lt;br /&gt;
\end{bmatrix}&lt;br /&gt;
&amp;lt;/math&amp;gt;&lt;br /&gt;
&lt;br /&gt;
Обозначим &amp;lt;math&amp;gt;s = \sin \theta&amp;lt;/math&amp;gt; и &amp;lt;math&amp;gt;c = \cos \theta&amp;lt;/math&amp;gt;.&lt;br /&gt;
&lt;br /&gt;
Перемножив матрицы &amp;lt;math&amp;gt;RG^TGR^T&amp;lt;/math&amp;gt;, получим следующие выражения&amp;lt;ref&amp;gt;http://www.astro.tsu.ru/OsChMet/5_2.html&amp;lt;/ref&amp;gt;:&lt;br /&gt;
&lt;br /&gt;
&amp;lt;math&amp;gt;\begin{align}&lt;br /&gt;
 a_{jj}^{(i+1)} &amp;amp;= c^2\, a_{jj}^{(i)}  -  2\, s c \,a_{jk}^{(i)}  +  s^2\, a_{kk}^{(i)} \\&lt;br /&gt;
 a_{kk}^{(i+1)} &amp;amp;= s^2 \,a_{jj}^{(i)}  +  2 s c\, a_{jk}^{(i)}  +  c^2 \, a_{kk}^{(i)} \\&lt;br /&gt;
 a_{jk}^{(i+1)} &amp;amp;= a_{kj}^{(i+1)} = (c^2 - s^2 ) \, a_{jk}^{(i)}  +  s c \, (a_{kk}^{(i)} - a_{jj}^{(i)} ) \\&lt;br /&gt;
 a_{jm}^{(i+1)} &amp;amp;= a_{mj}^{(i+1)} = c \, a_{jm}^{(i)}  -  s \, a_{km}^{(i)} &amp;amp; m \ne j,k \\&lt;br /&gt;
 a_{km}^{(i+1)} &amp;amp;= a_{mk}^{(i+1)} = s \, a_{jm}^{(i)}  + c \, a_{km}^{(i)} &amp;amp; m \ne j,k \\&lt;br /&gt;
 a_{ml}^{(i+1)} &amp;amp;= a_{ml}^{(i)} &amp;amp;m,l \ne j,k&lt;br /&gt;
\end{align}&amp;lt;/math&amp;gt;&lt;br /&gt;
&lt;br /&gt;
Т.к внедиагональные элементы должны быть равны 0, то выбираем &amp;lt;math&amp;gt;\theta&amp;lt;/math&amp;gt; так, чтобы &amp;lt;math&amp;gt;a_{jk}^{(i+1)} = 0&amp;lt;/math&amp;gt; и &amp;lt;math&amp;gt;a_{kj}^{(i+1)} = 0&amp;lt;/math&amp;gt;.&lt;br /&gt;
&lt;br /&gt;
Тогда решая уравнение получаем, что&lt;br /&gt;
&lt;br /&gt;
&amp;lt;math&amp;gt;&lt;br /&gt;
         \begin{align}&lt;br /&gt;
         \tau &amp;amp;= ({a_{jj} - a_{kk}})/{2a_{jk}} \\&lt;br /&gt;
         t &amp;amp;= {sign(\tau)}/(|\tau| + \sqrt{1 + \tau^2}) \\&lt;br /&gt;
         c &amp;amp;= 1/(\sqrt{1 + t^2}) \\&lt;br /&gt;
         s &amp;amp;= ct \\&lt;br /&gt;
         \end{align}&amp;lt;/math&amp;gt;&lt;br /&gt;
&lt;br /&gt;
Остановка вычислений алгоритма наступает, когда внедиагональные элементы становятся меньше некоторого наперед заданного числа &amp;lt;math&amp;gt;\varepsilon&amp;lt;/math&amp;gt;.&lt;br /&gt;
&lt;br /&gt;
В случае, когда &amp;lt;math&amp;gt; a_{jj} = a_{kk} &amp;lt;/math&amp;gt; считаем &amp;lt;math&amp;gt; sign(\tau) = 1 &amp;lt;/math&amp;gt;, т. е. &amp;lt;math&amp;gt; \theta = &lt;br /&gt;
\pi/4 &amp;lt;/math&amp;gt;.&lt;br /&gt;
&lt;br /&gt;
=== Вычислительное ядро алгоритма ===&lt;br /&gt;
Вычислительное ядро алгоритма составляет непосредственно вычисление одностороннего вращения Якоби, т.е. вычисление элементов матрицы &amp;lt;math&amp;gt;g_{jm}^{(i+1)} = g_{mj}^{(i+1)}&amp;lt;/math&amp;gt; и &amp;lt;math&amp;gt;g_{km}^{(i+1)} = g_{mk}^{(i+1)}&amp;lt;/math&amp;gt;, &amp;lt;math&amp;gt;m \ne j,k&amp;lt;/math&amp;gt;, а также вычисления элементов &amp;lt;math&amp;gt;g_{jj}^{(i+1)} &amp;lt;/math&amp;gt; и &amp;lt;math&amp;gt;g_{kk}^{(i+1)} &amp;lt;/math&amp;gt;, получившихся после умножения промежуточной матрицы на матрицу вращений Якоби:&lt;br /&gt;
&lt;br /&gt;
&amp;lt;math&amp;gt;\begin{align}&lt;br /&gt;
 g_{jj}^{(i+1)} &amp;amp;= c^2\, g_{jj}^{(i)}  -  2\, s c \,g_{jk}^{(i)}  +  s^2\, g_{kk}^{(i)} \\&lt;br /&gt;
 g_{kk}^{(i+1)} &amp;amp;= s^2 \,g_{jj}^{(i)}  +  2 s c\, g_{jk}^{(i)}  +  c^2 \, g_{kk}^{(i)} \\&lt;br /&gt;
 g_{jk}^{(i+1)} &amp;amp;= g_{kj}^{(i+1)} = (c^2 - s^2 ) \, g_{jk}^{(i)}  +  s c \, (g_{kk}^{(i)} - g_{jj}^{(i)} ) \\&lt;br /&gt;
 g_{jm}^{(i+1)} &amp;amp;= g_{mj}^{(i+1)} = c \, g_{jm}^{(i)}  -  s \, g_{km}^{(i)} &amp;amp; m \ne j,k \\&lt;br /&gt;
 g_{km}^{(i+1)} &amp;amp;= g_{mk}^{(i+1)} = s \, g_{jm}^{(i)}  + c \, g_{km}^{(i)} &amp;amp; m \ne j,k \\&lt;br /&gt;
 g_{ml}^{(i+1)} &amp;amp;= g_{ml}^{(i)} &amp;amp;m,l \ne j,k&lt;br /&gt;
\end{align}&amp;lt;/math&amp;gt;&lt;br /&gt;
&lt;br /&gt;
=== Макроструктура алгоритма ===&lt;br /&gt;
Основную часть метода составляет процедура односторонних вращений матрицы, которая в свою очередь состоит из:&lt;br /&gt;
&lt;br /&gt;
#Вычисление &amp;lt;math&amp;gt;\tau, c, s, t&amp;lt;/math&amp;gt;.&lt;br /&gt;
#Одностороннее вращение матрицы. &lt;br /&gt;
&lt;br /&gt;
Что требует &amp;lt;math&amp;gt;O(n)&amp;lt;/math&amp;gt; операций.&lt;br /&gt;
&lt;br /&gt;
После этого необходимо:&lt;br /&gt;
&lt;br /&gt;
#Вычислить сингулярные числа &amp;lt;math&amp;gt;\sigma_i&amp;lt;/math&amp;gt;.  Что требует &amp;lt;math&amp;gt;O(n)&amp;lt;/math&amp;gt; операций.&lt;br /&gt;
#Вычислить &amp;lt;math&amp;gt;U&amp;lt;/math&amp;gt; и &amp;lt;math&amp;gt;V&amp;lt;/math&amp;gt;. Что требует &amp;lt;math&amp;gt;O(n^2)&amp;lt;/math&amp;gt; операций.&lt;br /&gt;
&lt;br /&gt;
=== Схема реализации последовательного алгоритма ===&lt;br /&gt;
Применение метода Якоби к матрице &amp;lt;math&amp;gt;A = (G^TG)&amp;lt;/math&amp;gt; можно описать следующим образом&amp;lt;ref&amp;gt;Дж. Деммель «Вычислительная линейная алгебра» (стр. 261-263)&amp;lt;/ref&amp;gt;:&lt;br /&gt;
&lt;br /&gt;
Если &amp;lt;math&amp;gt;G = U\Sigma V^T&amp;lt;/math&amp;gt; и &amp;lt;math&amp;gt;\Sigma = diag(\sigma_{i})&amp;lt;/math&amp;gt;, то алгоритм вычисляет сингулярные числа &amp;lt;math&amp;gt;\sigma_{i}&amp;lt;/math&amp;gt;, матрицу &amp;lt;math&amp;gt;U&amp;lt;/math&amp;gt; левых сингулярных векторов и матрицу &amp;lt;math&amp;gt;V&amp;lt;/math&amp;gt; правых сингулярных векторов по следующей схеме:&lt;br /&gt;
&lt;br /&gt;
 repeat&lt;br /&gt;
     for &amp;lt;math&amp;gt;j=1&amp;lt;/math&amp;gt; to &amp;lt;math&amp;gt;n-1&amp;lt;/math&amp;gt;&lt;br /&gt;
         for &amp;lt;math&amp;gt;k=j+1&amp;lt;/math&amp;gt; to &amp;lt;math&amp;gt;n&amp;lt;/math&amp;gt;&lt;br /&gt;
             обратиться к процедуре &#039;&#039;&#039;&#039;&#039;One-Sided-Jacobi-Rotation&amp;lt;math&amp;gt;(G,j,k)&amp;lt;/math&amp;gt;&#039;&#039;&#039;&#039;&#039;&lt;br /&gt;
         end for&lt;br /&gt;
     end for&lt;br /&gt;
 пока &amp;lt;math&amp;gt;G^TG&amp;lt;/math&amp;gt; не станет достаточно близка к диагональной матрице&lt;br /&gt;
 Положить &amp;lt;math&amp;gt;\sigma_{i} = ||G(:,i)||_2 &amp;lt;/math&amp;gt; (норма &amp;lt;math&amp;gt;i&amp;lt;/math&amp;gt;-го столбца в &amp;lt;math&amp;gt;G&amp;lt;/math&amp;gt;)&lt;br /&gt;
 Положить &amp;lt;math&amp;gt;U = [u_{1},\dots, u_{n}]&amp;lt;/math&amp;gt;, где &amp;lt;math&amp;gt;u_{i} = G(:,i)/\sigma_{i}&amp;lt;/math&amp;gt;&lt;br /&gt;
 Положить &amp;lt;math&amp;gt;V = J&amp;lt;/math&amp;gt;, где &amp;lt;math&amp;gt;J&amp;lt;/math&amp;gt; - накопленное произведение вращений Якоби.&lt;br /&gt;
&lt;br /&gt;
Где процедура &#039;&#039;&#039;&#039;&#039;One-Sided-Jacobi-Rotation&#039;&#039;&#039;&#039;&#039; является метод односторонних вращений Якоби:&lt;br /&gt;
&lt;br /&gt;
 proc &#039;&#039;&#039;&#039;&#039;One-Sided-Jacobi-Rotation&amp;lt;math&amp;gt;(G,j,k)&amp;lt;/math&amp;gt;&#039;&#039;&#039;&#039;&#039;&lt;br /&gt;
     вычислить &amp;lt;math&amp;gt;a_{jj} = (G^TG)_{jj}, a_{jk} = (G^TG)_{jk}&amp;lt;/math&amp;gt; и &amp;lt;math&amp;gt;a_{kk} = (G^TG)_{kk}&amp;lt;/math&amp;gt;&lt;br /&gt;
     if &amp;lt;math&amp;gt;|a_{jk}|&amp;lt;/math&amp;gt; не слишком мал&lt;br /&gt;
         &amp;lt;math&amp;gt;&lt;br /&gt;
         \begin{align}&lt;br /&gt;
         \tau &amp;amp;= ({a_{jj} - a_{kk}})/{2a_{jk}} \\&lt;br /&gt;
         t &amp;amp;= {sign(\tau)}/(|\tau| + \sqrt{1 + \tau^2}) \\&lt;br /&gt;
         c &amp;amp;= 1/(\sqrt{1 + t^2}) \\&lt;br /&gt;
         s &amp;amp;= ct \\&lt;br /&gt;
         G &amp;amp;= GR(j,k,\theta) \  \dots c=cos\theta, s=sin\theta \end{align}&amp;lt;/math&amp;gt;&lt;br /&gt;
         if нужны правые сингулярные векторы &lt;br /&gt;
             &amp;lt;math&amp;gt;J = JR(j,k,\theta)&amp;lt;/math&amp;gt;&lt;br /&gt;
         end if&lt;br /&gt;
     end if&lt;br /&gt;
&lt;br /&gt;
=== Последовательная сложность алгоритма ===&lt;br /&gt;
Для одного вращения Якоби необходимо выполнить &amp;lt;math&amp;gt;O(n)&amp;lt;/math&amp;gt; операций умножения и сложения. &lt;br /&gt;
&lt;br /&gt;
Всего вариантов выбора &amp;lt;math&amp;gt;j&amp;lt;/math&amp;gt; и &amp;lt;math&amp;gt;k&amp;lt;/math&amp;gt; существует &amp;lt;math&amp;gt;\frac{n(n-1)}{2}&amp;lt;/math&amp;gt;.&lt;br /&gt;
&lt;br /&gt;
Таким образом последовательный алгоритм Якоби вычисления сингулярных чисел и векторов является алгоритмом с кубической сложностью.&lt;br /&gt;
&lt;br /&gt;
=== Информационный граф ===&lt;br /&gt;
Граф алгоритма состоит из четырех групп вершин&lt;br /&gt;
&lt;br /&gt;
(А)Первая группа вершин расположена в двумерной области, соответствующая ей операция - вычисление элементов &amp;lt;math&amp;gt;a_{jj},a_{jk},a_{kk}&amp;lt;/math&amp;gt; матрицы произведения &amp;lt;math&amp;gt;A = (G^TG)&amp;lt;/math&amp;gt;. Где &amp;lt;math&amp;gt;j&amp;lt;/math&amp;gt; изменяется от &amp;lt;math&amp;gt;1&amp;lt;/math&amp;gt; до &amp;lt;math&amp;gt;n-1&amp;lt;/math&amp;gt;, принимая все целочисленные значения, &amp;lt;math&amp;gt;k&amp;lt;/math&amp;gt;  изменяется от &amp;lt;math&amp;gt;j+1&amp;lt;/math&amp;gt; до &amp;lt;math&amp;gt;n&amp;lt;/math&amp;gt;, принимая все целочисленные значения.&lt;br /&gt;
&lt;br /&gt;
Граф вычисления каждого из элементов приведен на рисунке 1, где значениям &amp;lt;math&amp;gt;g_{ij}&amp;lt;/math&amp;gt; соответствуют обозначения &amp;lt;math&amp;gt;x_{ij}&amp;lt;/math&amp;gt;, а элементам &amp;lt;math&amp;gt;g^T_{ij}&amp;lt;/math&amp;gt; обозначения &amp;lt;math&amp;gt;z_{ij}&amp;lt;/math&amp;gt;. Значение &amp;lt;math&amp;gt;s_{ij}&amp;lt;/math&amp;gt; является значением результирующего элемента.&lt;br /&gt;
&lt;br /&gt;
(Б)Вторая группа вершин расположена в двумерной области, соответствующая ей операция – вычисление &amp;lt;math&amp;gt;c&amp;lt;/math&amp;gt; и &amp;lt;math&amp;gt;s&amp;lt;/math&amp;gt;.&lt;br /&gt;
&lt;br /&gt;
Информационный граф с входными и выходными данными вычисления пункта (Б) представлен на рисунке 2.&lt;br /&gt;
&lt;br /&gt;
(В)Третья группа вершин расположена в двумерной области, соответствующая ей операция вычисление значений элементов &amp;lt;math&amp;gt;g_{jm}^{(i+1)} = g_{mj}^{(i+1)}&amp;lt;/math&amp;gt; и &amp;lt;math&amp;gt;g_{km}^{(i+1)} = g_{mk}^{(i+1)}&amp;lt;/math&amp;gt;, &amp;lt;math&amp;gt;m \ne j,k&amp;lt;/math&amp;gt;.&lt;br /&gt;
&lt;br /&gt;
(Г)Четвертая группа вершин расположена в двумерной области, соответствующая ей операция вычисление значений элементов &amp;lt;math&amp;gt;g_{jj}^{(i+1)} &amp;lt;/math&amp;gt; и &amp;lt;math&amp;gt;g_{kk}^{(i+1)} &amp;lt;/math&amp;gt;.&lt;br /&gt;
&lt;br /&gt;
Элементы групп (В) и (Г) вычисляются аналогично вычислению элементов матрицы произведения, т.к. фактически представляют собой перемножение матриц &amp;lt;math&amp;gt;G&amp;lt;/math&amp;gt; и &amp;lt;math&amp;gt;R&amp;lt;/math&amp;gt;&lt;br /&gt;
&lt;br /&gt;
[[File:Jacobi_2.jpg|none|thumb|1000px|Рисунок 1. Информационный граф с входными и выходными параметрами вычисления каждого элемента матрицы произведения.]]&lt;br /&gt;
&lt;br /&gt;
[[File:Jacobi_1.jpg|none|thumb|1000px|Рисунок 2. Информационный граф с входными и выходными параметрами вычисления значений &amp;lt;math&amp;gt;c&amp;lt;/math&amp;gt; и &amp;lt;math&amp;gt;s&amp;lt;/math&amp;gt;.]]&lt;br /&gt;
&lt;br /&gt;
Обобщенный граф метода Якоби представлен на рисунке 3, где буквами А, Б, В и Г обозначено вычисление групп вершин (А), (Б), (В) и (Г).&lt;br /&gt;
&lt;br /&gt;
[[File:Graf21.png|none|thumb|2000px|Рисунок 3. Обобщенный граф алгоритма вычисления сингулярных чисел и векторов методом Якоби.]]&lt;br /&gt;
&lt;br /&gt;
=== Ресурс параллелизма алгоритма ===&lt;br /&gt;
Для выполнения одной итерации метода Якоби требуется последовательно выполнить несколько ярусов:&lt;br /&gt;
# вычислить &amp;lt;math&amp;gt;\tau&amp;lt;/math&amp;gt; &lt;br /&gt;
# вычислить &amp;lt;math&amp;gt;t&amp;lt;/math&amp;gt; &lt;br /&gt;
# вычислить &amp;lt;math&amp;gt;c&amp;lt;/math&amp;gt; &lt;br /&gt;
# вычислить &amp;lt;math&amp;gt;s&amp;lt;/math&amp;gt;&lt;br /&gt;
# выполнить поворот матрицы &amp;lt;math&amp;gt;G&amp;lt;/math&amp;gt; с параллельным выполнением &amp;lt;math&amp;gt;2(n-2)&amp;lt;/math&amp;gt; операций вычисления элементов матрицы &amp;lt;math&amp;gt;g_{jm}^{(i+1)} = g_{mj}^{(i+1)}&amp;lt;/math&amp;gt; и &amp;lt;math&amp;gt;g_{km}^{(i+1)} = g_{mk}^{(i+1)}&amp;lt;/math&amp;gt;, &amp;lt;math&amp;gt;m \ne j,k&amp;lt;/math&amp;gt;, а также вычисления элементов &amp;lt;math&amp;gt;g_{jj}^{(i+1)} &amp;lt;/math&amp;gt; и &amp;lt;math&amp;gt;g_{kk}^{(i+1)} &amp;lt;/math&amp;gt;. &lt;br /&gt;
&lt;br /&gt;
Суммарное количество итераций равно &amp;lt;math&amp;gt;\frac{n(n-1)}{2}&amp;lt;/math&amp;gt; (Различные варианты выбора &amp;lt;math&amp;gt;j&amp;lt;/math&amp;gt; и &amp;lt;math&amp;gt;k&amp;lt;/math&amp;gt;). &lt;br /&gt;
&lt;br /&gt;
Асимптотически метод сходится квадратично. &lt;br /&gt;
&lt;br /&gt;
Таким образом, при классификации по высоте ЯПФ метод Якоби относится к алгоритмам со сложностью &amp;lt;math&amp;gt;O(n^2)&amp;lt;/math&amp;gt;&amp;amp;nbsp;, а при классификации по ширине ЯПФ — к алгоритмам со сложностью &amp;lt;math&amp;gt;O(n)&amp;lt;/math&amp;gt;.&lt;br /&gt;
&lt;br /&gt;
=== Входные и выходные данные алгоритма ===&lt;br /&gt;
&#039;&#039;&#039;Входные данные&#039;&#039;&#039;: плотная матрица &amp;lt;math&amp;gt;G&amp;lt;/math&amp;gt; размера &amp;lt;math&amp;gt;n&amp;lt;/math&amp;gt;х&amp;lt;math&amp;gt;n&amp;lt;/math&amp;gt;, где &amp;lt;math&amp;gt;A= G^TG&amp;lt;/math&amp;gt; – симметрическая матрица.&lt;br /&gt;
&lt;br /&gt;
&#039;&#039;&#039;Объём входных данных&#039;&#039;&#039;: &amp;lt;math&amp;gt;n^2&amp;lt;/math&amp;gt; (т.к. для хранения матрицы &amp;lt;math&amp;gt;G&amp;lt;/math&amp;gt; используем двумерный массив размера &amp;lt;math&amp;gt;n&amp;lt;/math&amp;gt;х&amp;lt;math&amp;gt;n&amp;lt;/math&amp;gt;)&lt;br /&gt;
&lt;br /&gt;
&#039;&#039;&#039;Выходные данные&#039;&#039;&#039;: &amp;lt;math&amp;gt;\sigma_{i}&amp;lt;/math&amp;gt;  - сингулярные числа, матрица &amp;lt;math&amp;gt;U&amp;lt;/math&amp;gt; левых сингулярных векторов и матрица &amp;lt;math&amp;gt;V&amp;lt;/math&amp;gt; правых сингулярных векторов.&lt;br /&gt;
&lt;br /&gt;
&#039;&#039;&#039;Объём выходных данных&#039;&#039;&#039;: &amp;lt;math&amp;gt;2n^2 + n&amp;lt;/math&amp;gt; (т.к. необходимо хранить вектор сингулярных чисел длины &amp;lt;math&amp;gt;n&amp;lt;/math&amp;gt;, а также две матрицы &amp;lt;math&amp;gt;U, V&amp;lt;/math&amp;gt; левых и правых сингулярных векторов размера &amp;lt;math&amp;gt;n&amp;lt;/math&amp;gt;х&amp;lt;math&amp;gt;n&amp;lt;/math&amp;gt;).&lt;br /&gt;
&lt;br /&gt;
=== Свойства алгоритма ===&lt;br /&gt;
Метод Якоби является самым медленным из имеющихся алгоритмов вычисления сингулярных чисел и сингулярных векторов матрицы. Тем не менее, для  матриц &amp;lt;math&amp;gt;G&amp;lt;/math&amp;gt;, которые могут быть представлены в виде &amp;lt;math&amp;gt;G=DX&amp;lt;/math&amp;gt;, где &amp;lt;math&amp;gt;D&amp;lt;/math&amp;gt; - диагональная, а &amp;lt;math&amp;gt;X&amp;lt;/math&amp;gt; - хорошо обусловлена, он способен вычислять сингулярные числа и вектора намного точнее, чем другие методы&amp;lt;ref&amp;gt;Дж. Деммель «Вычислительная линейная алгебра» (стр. 261-264)&amp;lt;/ref&amp;gt;. &lt;br /&gt;
&lt;br /&gt;
Вычислительная мощность алгоритма, как отношение числа операций к суммарному объему входных и выходных данных является линейной.&lt;br /&gt;
&lt;br /&gt;
Метод Якоби не детерминирован, так как является итерационным алгоритмом с выходом по точности (число итераций зависит от входных данных и порогового значения).&lt;br /&gt;
&lt;br /&gt;
== Программная реализация алгоритма ==&lt;br /&gt;
&lt;br /&gt;
=== Особенности реализации последовательного алгоритма ===&lt;br /&gt;
&lt;br /&gt;
=== Локальность данных и вычислений ===&lt;br /&gt;
&lt;br /&gt;
=== Возможные способы и особенности параллельной реализации алгоритма ===&lt;br /&gt;
&lt;br /&gt;
=== Масштабируемость алгоритма и его реализации ===&lt;br /&gt;
Исследование масштабируемости параллельной реализации метода Якоби вычисления сингулярных чисел и векторов проводилось на тестовой средe суперкомпьютера &amp;quot;Ломоносов&amp;quot;, с использованием компилятора ICC и библиотеки impi/4.0.3. Алгоритм реализован на языке программирования C с использованием механизмов MPI.&lt;br /&gt;
&lt;br /&gt;
Алгоритм работает по следующей схеме:&lt;br /&gt;
#На вход всем процессорам подается матрица &amp;lt;math&amp;gt; G &amp;lt;/math&amp;gt;.&lt;br /&gt;
#Для всех &amp;lt;math&amp;gt; j &amp;lt;/math&amp;gt; и &amp;lt;math&amp;gt; k &amp;lt;/math&amp;gt; таких, что &amp;lt;math&amp;gt; j \in [1,n-1] &amp;lt;/math&amp;gt;, &amp;lt;math&amp;gt; k \in [j+1,n] &amp;lt;/math&amp;gt;&lt;br /&gt;
##Вычисляется элемент &amp;lt;math&amp;gt; a_{jk} &amp;lt;/math&amp;gt; путем перемножения матриц &amp;lt;math&amp;gt; G^TG &amp;lt;/math&amp;gt;, где на каждом процессоре вычисляется своя часть матрицы. После чего результат отправляется на все процессоры.&lt;br /&gt;
##Если полученный элемент оказывается больше некоторого значения, то начинается последовательная часть программы: Вычисление элементов &amp;lt;math&amp;gt; \tau, t, c, s &amp;lt;/math&amp;gt;.&lt;br /&gt;
##Затем, выполняется операция поворота, путем перемножения матриц &amp;lt;math&amp;gt; G &amp;lt;/math&amp;gt; и &amp;lt;math&amp;gt; R &amp;lt;/math&amp;gt;. Данная операция выполняется параллельно на нескольких процессорах, где каждый процессор вычисляет свою часть матрицы. После чего результат пересылается всем процессорам.&lt;br /&gt;
&lt;br /&gt;
Данная схема повторяется до тех пор, пока матрица &amp;lt;math&amp;gt; A = G^TG &amp;lt;/math&amp;gt; не станет достаточно близкой к диагональной.&lt;br /&gt;
&lt;br /&gt;
Для проверки этого факта, в конце каждой итерации цикла вычисляется матрица &amp;lt;math&amp;gt; A &amp;lt;/math&amp;gt;. Данная операция выполняется параллельно на нескольких процессорах, где каждый процессор вычисляет свою часть матрицы, после чего результат пересылается всем процессорам.&lt;br /&gt;
&lt;br /&gt;
&lt;br /&gt;
Набор и границы значений изменяемых параметров запуска реализации алгоритма: &lt;br /&gt;
&lt;br /&gt;
*	число процессоров [1 : 128] с шагом равным степени двойки;&lt;br /&gt;
*	размер матрицы [256 : 1792] с шагом 256.&lt;br /&gt;
&lt;br /&gt;
В результате проведённых экспериментов был получен следующий диапазон эффективности реализации алгоритма:&lt;br /&gt;
&lt;br /&gt;
*	минимальная эффективность реализации 0,01%;&lt;br /&gt;
*	максимальная эффективность реализации 16,52%.&lt;br /&gt;
&lt;br /&gt;
На следующих рисунках приведены графики производительности и эффективности выбранной реализации метода Якоби в зависимости от изменяемых параметров запуска.&lt;br /&gt;
&lt;br /&gt;
[[File:Performance.jpg|none|thumb|1000px|Рисунок 1. Параллельная реализация метода Якоби. Изменение производительности в зависимости от числа процессоров и размера матрицы.]]&lt;br /&gt;
&lt;br /&gt;
[[File:Эффективность.png|none|thumb|1000px|Рисунок 1. Параллельная реализация метода Якоби. Изменение эффективности в зависимости от числа процессоров и размера матрицы.]]&lt;br /&gt;
&lt;br /&gt;
Построим оценки масштабируемости данной реализации метода Якоби: &lt;br /&gt;
* По числу процессов: при увеличении числа процессов эффективность на рассмотренной области изменений параметров запуска сначала увеличивается (самый пик достигается при 16 процессах), а затем начинает снижаться. Это характеризуется тем, что накладные расходы на параллельное выполнение (общение между процессами) начинает превалировать над вычислениями.&lt;br /&gt;
&lt;br /&gt;
*По размеру задачи: при увеличении размера задачи эффективность возрастает. Это подтверждает предположение о том, что размер задачи сильно влияет на эффективность выполнения приложения. Оценка показывает, что с ростом размера задачи эффективность на рассмотренной области значений параметров запуска сильно увеличивается. &lt;br /&gt;
&lt;br /&gt;
*По двум направлениям: при рассмотрении увеличения как вычислительной сложности, так и числа процессов на всей рассмотренной области значений эффективность увеличивается, но медленно и с перепадами.&lt;br /&gt;
&lt;br /&gt;
[https://www.dropbox.com/home?preview=mainmpi.c Исследованная параллельная реализация метода Якоби]&lt;br /&gt;
&lt;br /&gt;
=== Динамические характеристики и эффективность реализации алгоритма ===&lt;br /&gt;
&lt;br /&gt;
=== Выводы для классов архитектур ===&lt;br /&gt;
&lt;br /&gt;
=== Существующие реализации алгоритма ===&lt;br /&gt;
Метод Якоби нахождения сингулярных значений и векторов реализован в таких пакетах, как LAPACK &amp;lt;ref&amp;gt;http://www.netlib.org/scalapack/slug/&amp;lt;/ref&amp;gt;, LINPACK/EISPACK &amp;lt;ref&amp;gt; http://www.netlib.org/linpack/ &amp;lt;/ref&amp;gt;, Intel MKL &amp;lt;ref&amp;gt;https://software.intel.com/ru-ru/node/521153#CAF8CA08-1C69-48F8-B0C3-B2B27AFA92FA&amp;lt;/ref&amp;gt;.&lt;br /&gt;
&lt;br /&gt;
Так же функция Якоби реализована в пакете Matlab.&lt;br /&gt;
&lt;br /&gt;
Т. к. алгоритм считается медленным, он не включен во многие известные пакеты.&lt;br /&gt;
&lt;br /&gt;
== Литература ==&lt;br /&gt;
1. Дж. Деммель Вычислительная линейная алгебра. Изд. Мир, 2001.&lt;/div&gt;</summary>
		<author><name>Davletshuna Alexandra</name></author>
	</entry>
	<entry>
		<id>https://xn--80aecvaldz.xn--80ahdrnmvk.xn--p1ai/w/ru/index.php?title=%D0%A3%D1%87%D0%B0%D1%81%D1%82%D0%BD%D0%B8%D0%BA:Davletshuna_Alexandra/%D0%9C%D0%B5%D1%82%D0%BE%D0%B4_%D0%AF%D0%BA%D0%BE%D0%B1%D0%B8_%D0%B2%D1%8B%D1%87%D0%B8%D1%81%D0%BB%D0%B5%D0%BD%D0%B8%D1%8F_%D1%81%D0%B8%D0%BD%D0%B3%D1%83%D0%BB%D1%8F%D1%80%D0%BD%D1%8B%D1%85_%D1%87%D0%B8%D1%81%D0%B5%D0%BB_%D0%B8_%D0%B2%D0%B5%D0%BA%D1%82%D0%BE%D1%80%D0%BE%D0%B2&amp;diff=20472</id>
		<title>Участник:Davletshuna Alexandra/Метод Якоби вычисления сингулярных чисел и векторов</title>
		<link rel="alternate" type="text/html" href="https://xn--80aecvaldz.xn--80ahdrnmvk.xn--p1ai/w/ru/index.php?title=%D0%A3%D1%87%D0%B0%D1%81%D1%82%D0%BD%D0%B8%D0%BA:Davletshuna_Alexandra/%D0%9C%D0%B5%D1%82%D0%BE%D0%B4_%D0%AF%D0%BA%D0%BE%D0%B1%D0%B8_%D0%B2%D1%8B%D1%87%D0%B8%D1%81%D0%BB%D0%B5%D0%BD%D0%B8%D1%8F_%D1%81%D0%B8%D0%BD%D0%B3%D1%83%D0%BB%D1%8F%D1%80%D0%BD%D1%8B%D1%85_%D1%87%D0%B8%D1%81%D0%B5%D0%BB_%D0%B8_%D0%B2%D0%B5%D0%BA%D1%82%D0%BE%D1%80%D0%BE%D0%B2&amp;diff=20472"/>
		<updated>2016-12-09T11:05:31Z</updated>

		<summary type="html">&lt;p&gt;Davletshuna Alexandra: /* Математическое описание алгоритма */&lt;/p&gt;
&lt;hr /&gt;
&lt;div&gt;{{Assignment|ASA}}&lt;br /&gt;
&lt;br /&gt;
{{algorithm&lt;br /&gt;
| name              = Метод Якоби вычисления сингулярных чисел и векторов&lt;br /&gt;
| serial_complexity = &amp;lt;math&amp;gt;O(n^3)&amp;lt;/math&amp;gt;&lt;br /&gt;
| pf_height         = &amp;lt;math&amp;gt;O(n^2)&amp;lt;/math&amp;gt;&lt;br /&gt;
| pf_width          = &amp;lt;math&amp;gt;O(n)&amp;lt;/math&amp;gt;&lt;br /&gt;
| input_data        = &amp;lt;math&amp;gt;n^2&amp;lt;/math&amp;gt;&lt;br /&gt;
| output_data       = &amp;lt;math&amp;gt;2n^2 + n&amp;lt;/math&amp;gt;&lt;br /&gt;
}}&lt;br /&gt;
&lt;br /&gt;
Авторы статьи: [[Участница:Davletshuna Alexandra|Давлетшина Александра]] (группа 619); [[Участница:Alek sandra|Зайцева Александра]]. Вклад каждого участника считать равноценным.&lt;br /&gt;
&lt;br /&gt;
== Свойства и структура алгоритма ==&lt;br /&gt;
&lt;br /&gt;
=== Общее описание алгоритма ===&lt;br /&gt;
&#039;&#039;&#039;Сингулярным разложением&#039;&#039;&#039; называется разложение прямоугольной вещественной или комплексной матрицы, имеющее широкое применение, в силу своей наглядной геометрической интерпретации, при решении многих прикладных задач. Сингулярное разложение матрицы А позволяет вычислять сингулярные числа данной матрицы, а также, левые и правые сингулярные векторы матрицы А:&lt;br /&gt;
&lt;br /&gt;
•	левые сингулярные векторы матрицы А — это собственные векторы матрицы &amp;lt;math&amp;gt;AA^*&amp;lt;/math&amp;gt;;&lt;br /&gt;
&lt;br /&gt;
•	правые сингулярные векторы матрицы A — это собственные векторы матрицы &amp;lt;math&amp;gt;A^*A&amp;lt;/math&amp;gt;.&lt;br /&gt;
&lt;br /&gt;
Геометрическая интерпретация сингулярного разложения заключается в следующем факте из геометрии: &#039;&#039;Образом любого линейного преобразования, заданного с помощью матрицы &amp;lt;math&amp;gt;m&amp;lt;/math&amp;gt;x&amp;lt;math&amp;gt;n&amp;lt;/math&amp;gt;, примененного к единичной сфере является гиперэллипсоид&#039;&#039;.&lt;br /&gt;
&lt;br /&gt;
Из многочисленных разложений матриц, наиболее удобным является сингулярное разложение матрицы в виде: &amp;lt;math&amp;gt;A=U\Sigma V^*&amp;lt;/math&amp;gt;, где &amp;lt;math&amp;gt;U, V&amp;lt;/math&amp;gt; – унитарные матрицы, а &amp;lt;math&amp;gt;\Sigma&amp;lt;/math&amp;gt; – диагональная матрица с вещественными положительными числами на диагонали &amp;lt;ref&amp;gt;http://algorithms.parallel.ru/&amp;lt;/ref&amp;gt;.&lt;br /&gt;
&lt;br /&gt;
Диагональные элементы матрицы &amp;lt;math&amp;gt;\Sigma&amp;lt;/math&amp;gt; называются сингулярными числами матрицы &amp;lt;math&amp;gt;A&amp;lt;/math&amp;gt;, а столбцы матриц &amp;lt;math&amp;gt;U,V&amp;lt;/math&amp;gt; левыми и правыми сингулярными векторами соответственно.&lt;br /&gt;
&lt;br /&gt;
Алгоритм Якоби сингулярного разложения матрицы был предложен одним из первых в 1846 году. Он приводит прямоугольную матрицу к диагональной матрице с помощью последовательности элементарных вращений. Метод может найти все сингулярные значения с очень высокой точностью. Однако его производительность является довольно низкой, в сравнении с конкурирующими методами.&lt;br /&gt;
&lt;br /&gt;
&#039;&#039;Неявный&#039;&#039;&amp;lt;ref&amp;gt;Дж. Деммель «Вычислительная линейная алгебра» (стр. 261-264)&amp;lt;/ref&amp;gt; метод Якоби математически эквивалентен применению метода Якоби вычисления собственных значений к матрице &amp;lt;math&amp;gt;A = G^TG&amp;lt;/math&amp;gt;.&lt;br /&gt;
Это значит, что на каждом шаге вычисляется вращение Якоби &amp;lt;math&amp;gt;J&amp;lt;/math&amp;gt;, с помощью которого матрица &amp;lt;math&amp;gt;G^TG&amp;lt;/math&amp;gt; неявно пересчитывется в &amp;lt;math&amp;gt;J^TG^TGJ&amp;lt;/math&amp;gt;; вращение выбрано так, чтобы пара внедиагональных элементов из &amp;lt;math&amp;gt;G^TG&amp;lt;/math&amp;gt; обратилась в нули в матрице &amp;lt;math&amp;gt;J^TG^TGJ&amp;lt;/math&amp;gt;. При этом ни &amp;lt;math&amp;gt;G^TG&amp;lt;/math&amp;gt;, ни &amp;lt;math&amp;gt;J^TG^TGJ&amp;lt;/math&amp;gt; не вычисляются в явном виде; вместо них вычисляется матрица &amp;lt;math&amp;gt;GJ&amp;lt;/math&amp;gt;. Поэтому алгоритм называется &#039;&#039;методом односторонних вращений&#039;&#039;.&lt;br /&gt;
&lt;br /&gt;
=== Математическое описание алгоритма ===&lt;br /&gt;
Исходные данные: матрица &amp;lt;math&amp;gt;G&amp;lt;/math&amp;gt; (элементы &amp;lt;math&amp;gt;g_{ij}, i, j = 1, \ldots, n&amp;lt;/math&amp;gt;).&lt;br /&gt;
&lt;br /&gt;
Вычисляемые данные: матрица &amp;lt;math&amp;gt;\Sigma = diag(\sigma_{i})&amp;lt;/math&amp;gt;, где &amp;lt;math&amp;gt;\sigma_{i}&amp;lt;/math&amp;gt; - сингулярные числа, &amp;lt;math&amp;gt;U&amp;lt;/math&amp;gt; - матрица левых сингулярных векторов, &amp;lt;math&amp;gt;V&amp;lt;/math&amp;gt; - матрица правых сингулярных векторов.&lt;br /&gt;
&lt;br /&gt;
симметричную матрицу &amp;lt;math&amp;gt;A = (G^TG)&amp;lt;/math&amp;gt; можно привести к диагональному виду:&lt;br /&gt;
&amp;lt;math&amp;gt;RG^TGR^T&amp;lt;/math&amp;gt;, где&lt;br /&gt;
&lt;br /&gt;
&amp;lt;math&amp;gt;&lt;br /&gt;
R(j,k,\theta) = &lt;br /&gt;
\begin{matrix}&lt;br /&gt;
  \\&lt;br /&gt;
  \\&lt;br /&gt;
  \\&lt;br /&gt;
j \\&lt;br /&gt;
  \\&lt;br /&gt;
k \\&lt;br /&gt;
  \\&lt;br /&gt;
  \\&lt;br /&gt;
  \\&lt;br /&gt;
\end{matrix}&lt;br /&gt;
&amp;lt;/math&amp;gt;  &lt;br /&gt;
&amp;lt;math&amp;gt;&lt;br /&gt;
\begin{bmatrix}&lt;br /&gt;
  &amp;amp; 1 &amp;amp;   &amp;amp;        &amp;amp;              &amp;amp;        &amp;amp;               &amp;amp;         &amp;amp;    &amp;amp;   \\&lt;br /&gt;
  &amp;amp;   &amp;amp; 1 &amp;amp;        &amp;amp;              &amp;amp;        &amp;amp;               &amp;amp;         &amp;amp;    &amp;amp;   \\&lt;br /&gt;
  &amp;amp;   &amp;amp;   &amp;amp; \ddots &amp;amp;              &amp;amp;        &amp;amp;               &amp;amp;         &amp;amp;    &amp;amp;   \\&lt;br /&gt;
  &amp;amp;   &amp;amp;   &amp;amp;        &amp;amp; \cos(\theta) &amp;amp;        &amp;amp; -\sin(\theta) &amp;amp;         &amp;amp;    &amp;amp;   \\&lt;br /&gt;
  &amp;amp;   &amp;amp;   &amp;amp;        &amp;amp;              &amp;amp; \ddots &amp;amp;               &amp;amp;         &amp;amp;    &amp;amp;   \\&lt;br /&gt;
  &amp;amp;   &amp;amp;   &amp;amp;        &amp;amp; \sin(\theta) &amp;amp;        &amp;amp; \cos(\theta)  &amp;amp;         &amp;amp;    &amp;amp;   \\&lt;br /&gt;
  &amp;amp;   &amp;amp;   &amp;amp;        &amp;amp;              &amp;amp;        &amp;amp;               &amp;amp; \ddots  &amp;amp;    &amp;amp;   \\&lt;br /&gt;
  &amp;amp;   &amp;amp;   &amp;amp;        &amp;amp;              &amp;amp;        &amp;amp;               &amp;amp;         &amp;amp; 1  &amp;amp;   \\&lt;br /&gt;
  &amp;amp;   &amp;amp;   &amp;amp;        &amp;amp;              &amp;amp;        &amp;amp;               &amp;amp;         &amp;amp;    &amp;amp; 1 \\&lt;br /&gt;
\end{bmatrix}&lt;br /&gt;
&amp;lt;/math&amp;gt;&lt;br /&gt;
&lt;br /&gt;
Обозначим &amp;lt;math&amp;gt;s = \sin \theta&amp;lt;/math&amp;gt; и &amp;lt;math&amp;gt;c = \cos \theta&amp;lt;/math&amp;gt;.&lt;br /&gt;
&lt;br /&gt;
Перемножив матрицы &amp;lt;math&amp;gt;RG^TGR^T&amp;lt;/math&amp;gt;, получим следующие выражения&amp;lt;ref&amp;gt;http://www.astro.tsu.ru/OsChMet/5_2.html&amp;lt;/ref&amp;gt;:&lt;br /&gt;
&lt;br /&gt;
&amp;lt;math&amp;gt;\begin{align}&lt;br /&gt;
 a_{jj}^{(i+1)} &amp;amp;= c^2\, a_{jj}^{(i)}  -  2\, s c \,a_{jk}^{(i)}  +  s^2\, a_{kk}^{(i)} \\&lt;br /&gt;
 a_{kk}^{(i+1)} &amp;amp;= s^2 \,a_{jj}^{(i)}  +  2 s c\, a_{jk}^{(i)}  +  c^2 \, a_{kk}^{(i)} \\&lt;br /&gt;
 a_{jk}^{(i+1)} &amp;amp;= a_{kj}^{(i+1)} = (c^2 - s^2 ) \, a_{jk}^{(i)}  +  s c \, (a_{kk}^{(i)} - a_{jj}^{(i)} ) \\&lt;br /&gt;
 a_{jm}^{(i+1)} &amp;amp;= a_{mj}^{(i+1)} = c \, a_{jm}^{(i)}  -  s \, a_{km}^{(i)} &amp;amp; m \ne j,k \\&lt;br /&gt;
 a_{km}^{(i+1)} &amp;amp;= a_{mk}^{(i+1)} = s \, a_{jm}^{(i)}  + c \, a_{km}^{(i)} &amp;amp; m \ne j,k \\&lt;br /&gt;
 a_{ml}^{(i+1)} &amp;amp;= a_{ml}^{(i)} &amp;amp;m,l \ne j,k&lt;br /&gt;
\end{align}&amp;lt;/math&amp;gt;&lt;br /&gt;
&lt;br /&gt;
Т.к внедиагональные элементы должны быть равны 0, то выбираем &amp;lt;math&amp;gt;\theta&amp;lt;/math&amp;gt; так, чтобы &amp;lt;math&amp;gt;a_{jk}^{(i+1)} = 0&amp;lt;/math&amp;gt; и &amp;lt;math&amp;gt;a_{kj}^{(i+1)} = 0&amp;lt;/math&amp;gt;.&lt;br /&gt;
&lt;br /&gt;
Тогда решая уравнение получаем, что&lt;br /&gt;
&lt;br /&gt;
&amp;lt;math&amp;gt;&lt;br /&gt;
         \begin{align}&lt;br /&gt;
         \tau &amp;amp;= ({a_{jj} - a_{kk}})/{2a_{jk}} \\&lt;br /&gt;
         t &amp;amp;= {sign(\tau)}/(|\tau| + \sqrt{1 + \tau^2}) \\&lt;br /&gt;
         c &amp;amp;= 1/(\sqrt{1 + t^2}) \\&lt;br /&gt;
         s &amp;amp;= ct \\&lt;br /&gt;
         \end{align}&amp;lt;/math&amp;gt;&lt;br /&gt;
&lt;br /&gt;
Остановка вычислений алгоритма наступает, когда внедиагональные элементы становятся меньше некоторого наперед заданного числа &amp;lt;math&amp;gt;\varepsilon&amp;lt;/math&amp;gt;.&lt;br /&gt;
&lt;br /&gt;
В случае, когда &amp;lt;math&amp;gt; a_{jj} = a_{kk} &amp;lt;/math&amp;gt; считаем &amp;lt;math&amp;gt; sign(\tau) = 1 &amp;lt;/math&amp;gt;, т. е. &amp;lt;math&amp;gt; \theta = pi/4 &amp;lt;/math&amp;gt;.&lt;br /&gt;
&lt;br /&gt;
=== Вычислительное ядро алгоритма ===&lt;br /&gt;
Вычислительное ядро алгоритма составляет непосредственно вычисление одностороннего вращения Якоби, т.е. вычисление элементов матрицы &amp;lt;math&amp;gt;g_{jm}^{(i+1)} = g_{mj}^{(i+1)}&amp;lt;/math&amp;gt; и &amp;lt;math&amp;gt;g_{km}^{(i+1)} = g_{mk}^{(i+1)}&amp;lt;/math&amp;gt;, &amp;lt;math&amp;gt;m \ne j,k&amp;lt;/math&amp;gt;, а также вычисления элементов &amp;lt;math&amp;gt;g_{jj}^{(i+1)} &amp;lt;/math&amp;gt; и &amp;lt;math&amp;gt;g_{kk}^{(i+1)} &amp;lt;/math&amp;gt;, получившихся после умножения промежуточной матрицы на матрицу вращений Якоби:&lt;br /&gt;
&lt;br /&gt;
&amp;lt;math&amp;gt;\begin{align}&lt;br /&gt;
 g_{jj}^{(i+1)} &amp;amp;= c^2\, g_{jj}^{(i)}  -  2\, s c \,g_{jk}^{(i)}  +  s^2\, g_{kk}^{(i)} \\&lt;br /&gt;
 g_{kk}^{(i+1)} &amp;amp;= s^2 \,g_{jj}^{(i)}  +  2 s c\, g_{jk}^{(i)}  +  c^2 \, g_{kk}^{(i)} \\&lt;br /&gt;
 g_{jk}^{(i+1)} &amp;amp;= g_{kj}^{(i+1)} = (c^2 - s^2 ) \, g_{jk}^{(i)}  +  s c \, (g_{kk}^{(i)} - g_{jj}^{(i)} ) \\&lt;br /&gt;
 g_{jm}^{(i+1)} &amp;amp;= g_{mj}^{(i+1)} = c \, g_{jm}^{(i)}  -  s \, g_{km}^{(i)} &amp;amp; m \ne j,k \\&lt;br /&gt;
 g_{km}^{(i+1)} &amp;amp;= g_{mk}^{(i+1)} = s \, g_{jm}^{(i)}  + c \, g_{km}^{(i)} &amp;amp; m \ne j,k \\&lt;br /&gt;
 g_{ml}^{(i+1)} &amp;amp;= g_{ml}^{(i)} &amp;amp;m,l \ne j,k&lt;br /&gt;
\end{align}&amp;lt;/math&amp;gt;&lt;br /&gt;
&lt;br /&gt;
=== Макроструктура алгоритма ===&lt;br /&gt;
Основную часть метода составляет процедура односторонних вращений матрицы, которая в свою очередь состоит из:&lt;br /&gt;
&lt;br /&gt;
#Вычисление &amp;lt;math&amp;gt;\tau, c, s, t&amp;lt;/math&amp;gt;.&lt;br /&gt;
#Одностороннее вращение матрицы. &lt;br /&gt;
&lt;br /&gt;
Что требует &amp;lt;math&amp;gt;O(n)&amp;lt;/math&amp;gt; операций.&lt;br /&gt;
&lt;br /&gt;
После этого необходимо:&lt;br /&gt;
&lt;br /&gt;
#Вычислить сингулярные числа &amp;lt;math&amp;gt;\sigma_i&amp;lt;/math&amp;gt;.  Что требует &amp;lt;math&amp;gt;O(n)&amp;lt;/math&amp;gt; операций.&lt;br /&gt;
#Вычислить &amp;lt;math&amp;gt;U&amp;lt;/math&amp;gt; и &amp;lt;math&amp;gt;V&amp;lt;/math&amp;gt;. Что требует &amp;lt;math&amp;gt;O(n^2)&amp;lt;/math&amp;gt; операций.&lt;br /&gt;
&lt;br /&gt;
=== Схема реализации последовательного алгоритма ===&lt;br /&gt;
Применение метода Якоби к матрице &amp;lt;math&amp;gt;A = (G^TG)&amp;lt;/math&amp;gt; можно описать следующим образом&amp;lt;ref&amp;gt;Дж. Деммель «Вычислительная линейная алгебра» (стр. 261-263)&amp;lt;/ref&amp;gt;:&lt;br /&gt;
&lt;br /&gt;
Если &amp;lt;math&amp;gt;G = U\Sigma V^T&amp;lt;/math&amp;gt; и &amp;lt;math&amp;gt;\Sigma = diag(\sigma_{i})&amp;lt;/math&amp;gt;, то алгоритм вычисляет сингулярные числа &amp;lt;math&amp;gt;\sigma_{i}&amp;lt;/math&amp;gt;, матрицу &amp;lt;math&amp;gt;U&amp;lt;/math&amp;gt; левых сингулярных векторов и матрицу &amp;lt;math&amp;gt;V&amp;lt;/math&amp;gt; правых сингулярных векторов по следующей схеме:&lt;br /&gt;
&lt;br /&gt;
 repeat&lt;br /&gt;
     for &amp;lt;math&amp;gt;j=1&amp;lt;/math&amp;gt; to &amp;lt;math&amp;gt;n-1&amp;lt;/math&amp;gt;&lt;br /&gt;
         for &amp;lt;math&amp;gt;k=j+1&amp;lt;/math&amp;gt; to &amp;lt;math&amp;gt;n&amp;lt;/math&amp;gt;&lt;br /&gt;
             обратиться к процедуре &#039;&#039;&#039;&#039;&#039;One-Sided-Jacobi-Rotation&amp;lt;math&amp;gt;(G,j,k)&amp;lt;/math&amp;gt;&#039;&#039;&#039;&#039;&#039;&lt;br /&gt;
         end for&lt;br /&gt;
     end for&lt;br /&gt;
 пока &amp;lt;math&amp;gt;G^TG&amp;lt;/math&amp;gt; не станет достаточно близка к диагональной матрице&lt;br /&gt;
 Положить &amp;lt;math&amp;gt;\sigma_{i} = ||G(:,i)||_2 &amp;lt;/math&amp;gt; (норма &amp;lt;math&amp;gt;i&amp;lt;/math&amp;gt;-го столбца в &amp;lt;math&amp;gt;G&amp;lt;/math&amp;gt;)&lt;br /&gt;
 Положить &amp;lt;math&amp;gt;U = [u_{1},\dots, u_{n}]&amp;lt;/math&amp;gt;, где &amp;lt;math&amp;gt;u_{i} = G(:,i)/\sigma_{i}&amp;lt;/math&amp;gt;&lt;br /&gt;
 Положить &amp;lt;math&amp;gt;V = J&amp;lt;/math&amp;gt;, где &amp;lt;math&amp;gt;J&amp;lt;/math&amp;gt; - накопленное произведение вращений Якоби.&lt;br /&gt;
&lt;br /&gt;
Где процедура &#039;&#039;&#039;&#039;&#039;One-Sided-Jacobi-Rotation&#039;&#039;&#039;&#039;&#039; является метод односторонних вращений Якоби:&lt;br /&gt;
&lt;br /&gt;
 proc &#039;&#039;&#039;&#039;&#039;One-Sided-Jacobi-Rotation&amp;lt;math&amp;gt;(G,j,k)&amp;lt;/math&amp;gt;&#039;&#039;&#039;&#039;&#039;&lt;br /&gt;
     вычислить &amp;lt;math&amp;gt;a_{jj} = (G^TG)_{jj}, a_{jk} = (G^TG)_{jk}&amp;lt;/math&amp;gt; и &amp;lt;math&amp;gt;a_{kk} = (G^TG)_{kk}&amp;lt;/math&amp;gt;&lt;br /&gt;
     if &amp;lt;math&amp;gt;|a_{jk}|&amp;lt;/math&amp;gt; не слишком мал&lt;br /&gt;
         &amp;lt;math&amp;gt;&lt;br /&gt;
         \begin{align}&lt;br /&gt;
         \tau &amp;amp;= ({a_{jj} - a_{kk}})/{2a_{jk}} \\&lt;br /&gt;
         t &amp;amp;= {sign(\tau)}/(|\tau| + \sqrt{1 + \tau^2}) \\&lt;br /&gt;
         c &amp;amp;= 1/(\sqrt{1 + t^2}) \\&lt;br /&gt;
         s &amp;amp;= ct \\&lt;br /&gt;
         G &amp;amp;= GR(j,k,\theta) \  \dots c=cos\theta, s=sin\theta \end{align}&amp;lt;/math&amp;gt;&lt;br /&gt;
         if нужны правые сингулярные векторы &lt;br /&gt;
             &amp;lt;math&amp;gt;J = JR(j,k,\theta)&amp;lt;/math&amp;gt;&lt;br /&gt;
         end if&lt;br /&gt;
     end if&lt;br /&gt;
&lt;br /&gt;
=== Последовательная сложность алгоритма ===&lt;br /&gt;
Для одного вращения Якоби необходимо выполнить &amp;lt;math&amp;gt;O(n)&amp;lt;/math&amp;gt; операций умножения и сложения. &lt;br /&gt;
&lt;br /&gt;
Всего вариантов выбора &amp;lt;math&amp;gt;j&amp;lt;/math&amp;gt; и &amp;lt;math&amp;gt;k&amp;lt;/math&amp;gt; существует &amp;lt;math&amp;gt;\frac{n(n-1)}{2}&amp;lt;/math&amp;gt;.&lt;br /&gt;
&lt;br /&gt;
Таким образом последовательный алгоритм Якоби вычисления сингулярных чисел и векторов является алгоритмом с кубической сложностью.&lt;br /&gt;
&lt;br /&gt;
=== Информационный граф ===&lt;br /&gt;
Граф алгоритма состоит из четырех групп вершин&lt;br /&gt;
&lt;br /&gt;
(А)Первая группа вершин расположена в двумерной области, соответствующая ей операция - вычисление элементов &amp;lt;math&amp;gt;a_{jj},a_{jk},a_{kk}&amp;lt;/math&amp;gt; матрицы произведения &amp;lt;math&amp;gt;A = (G^TG)&amp;lt;/math&amp;gt;. Где &amp;lt;math&amp;gt;j&amp;lt;/math&amp;gt; изменяется от &amp;lt;math&amp;gt;1&amp;lt;/math&amp;gt; до &amp;lt;math&amp;gt;n-1&amp;lt;/math&amp;gt;, принимая все целочисленные значения, &amp;lt;math&amp;gt;k&amp;lt;/math&amp;gt;  изменяется от &amp;lt;math&amp;gt;j+1&amp;lt;/math&amp;gt; до &amp;lt;math&amp;gt;n&amp;lt;/math&amp;gt;, принимая все целочисленные значения.&lt;br /&gt;
&lt;br /&gt;
Граф вычисления каждого из элементов приведен на рисунке 1, где значениям &amp;lt;math&amp;gt;g_{ij}&amp;lt;/math&amp;gt; соответствуют обозначения &amp;lt;math&amp;gt;x_{ij}&amp;lt;/math&amp;gt;, а элементам &amp;lt;math&amp;gt;g^T_{ij}&amp;lt;/math&amp;gt; обозначения &amp;lt;math&amp;gt;z_{ij}&amp;lt;/math&amp;gt;. Значение &amp;lt;math&amp;gt;s_{ij}&amp;lt;/math&amp;gt; является значением результирующего элемента.&lt;br /&gt;
&lt;br /&gt;
(Б)Вторая группа вершин расположена в двумерной области, соответствующая ей операция – вычисление &amp;lt;math&amp;gt;c&amp;lt;/math&amp;gt; и &amp;lt;math&amp;gt;s&amp;lt;/math&amp;gt;.&lt;br /&gt;
&lt;br /&gt;
Информационный граф с входными и выходными данными вычисления пункта (Б) представлен на рисунке 2.&lt;br /&gt;
&lt;br /&gt;
(В)Третья группа вершин расположена в двумерной области, соответствующая ей операция вычисление значений элементов &amp;lt;math&amp;gt;g_{jm}^{(i+1)} = g_{mj}^{(i+1)}&amp;lt;/math&amp;gt; и &amp;lt;math&amp;gt;g_{km}^{(i+1)} = g_{mk}^{(i+1)}&amp;lt;/math&amp;gt;, &amp;lt;math&amp;gt;m \ne j,k&amp;lt;/math&amp;gt;.&lt;br /&gt;
&lt;br /&gt;
(Г)Четвертая группа вершин расположена в двумерной области, соответствующая ей операция вычисление значений элементов &amp;lt;math&amp;gt;g_{jj}^{(i+1)} &amp;lt;/math&amp;gt; и &amp;lt;math&amp;gt;g_{kk}^{(i+1)} &amp;lt;/math&amp;gt;.&lt;br /&gt;
&lt;br /&gt;
Элементы групп (В) и (Г) вычисляются аналогично вычислению элементов матрицы произведения, т.к. фактически представляют собой перемножение матриц &amp;lt;math&amp;gt;G&amp;lt;/math&amp;gt; и &amp;lt;math&amp;gt;R&amp;lt;/math&amp;gt;&lt;br /&gt;
&lt;br /&gt;
[[File:Jacobi_2.jpg|none|thumb|1000px|Рисунок 1. Информационный граф с входными и выходными параметрами вычисления каждого элемента матрицы произведения.]]&lt;br /&gt;
&lt;br /&gt;
[[File:Jacobi_1.jpg|none|thumb|1000px|Рисунок 2. Информационный граф с входными и выходными параметрами вычисления значений &amp;lt;math&amp;gt;c&amp;lt;/math&amp;gt; и &amp;lt;math&amp;gt;s&amp;lt;/math&amp;gt;.]]&lt;br /&gt;
&lt;br /&gt;
Обобщенный граф метода Якоби представлен на рисунке 3, где буквами А, Б, В и Г обозначено вычисление групп вершин (А), (Б), (В) и (Г).&lt;br /&gt;
&lt;br /&gt;
[[File:Graf21.png|none|thumb|2000px|Рисунок 3. Обобщенный граф алгоритма вычисления сингулярных чисел и векторов методом Якоби.]]&lt;br /&gt;
&lt;br /&gt;
=== Ресурс параллелизма алгоритма ===&lt;br /&gt;
Для выполнения одной итерации метода Якоби требуется последовательно выполнить несколько ярусов:&lt;br /&gt;
# вычислить &amp;lt;math&amp;gt;\tau&amp;lt;/math&amp;gt; &lt;br /&gt;
# вычислить &amp;lt;math&amp;gt;t&amp;lt;/math&amp;gt; &lt;br /&gt;
# вычислить &amp;lt;math&amp;gt;c&amp;lt;/math&amp;gt; &lt;br /&gt;
# вычислить &amp;lt;math&amp;gt;s&amp;lt;/math&amp;gt;&lt;br /&gt;
# выполнить поворот матрицы &amp;lt;math&amp;gt;G&amp;lt;/math&amp;gt; с параллельным выполнением &amp;lt;math&amp;gt;2(n-2)&amp;lt;/math&amp;gt; операций вычисления элементов матрицы &amp;lt;math&amp;gt;g_{jm}^{(i+1)} = g_{mj}^{(i+1)}&amp;lt;/math&amp;gt; и &amp;lt;math&amp;gt;g_{km}^{(i+1)} = g_{mk}^{(i+1)}&amp;lt;/math&amp;gt;, &amp;lt;math&amp;gt;m \ne j,k&amp;lt;/math&amp;gt;, а также вычисления элементов &amp;lt;math&amp;gt;g_{jj}^{(i+1)} &amp;lt;/math&amp;gt; и &amp;lt;math&amp;gt;g_{kk}^{(i+1)} &amp;lt;/math&amp;gt;. &lt;br /&gt;
&lt;br /&gt;
Суммарное количество итераций равно &amp;lt;math&amp;gt;\frac{n(n-1)}{2}&amp;lt;/math&amp;gt; (Различные варианты выбора &amp;lt;math&amp;gt;j&amp;lt;/math&amp;gt; и &amp;lt;math&amp;gt;k&amp;lt;/math&amp;gt;). &lt;br /&gt;
&lt;br /&gt;
Асимптотически метод сходится квадратично. &lt;br /&gt;
&lt;br /&gt;
Таким образом, при классификации по высоте ЯПФ метод Якоби относится к алгоритмам со сложностью &amp;lt;math&amp;gt;O(n^2)&amp;lt;/math&amp;gt;&amp;amp;nbsp;, а при классификации по ширине ЯПФ — к алгоритмам со сложностью &amp;lt;math&amp;gt;O(n)&amp;lt;/math&amp;gt;.&lt;br /&gt;
&lt;br /&gt;
=== Входные и выходные данные алгоритма ===&lt;br /&gt;
&#039;&#039;&#039;Входные данные&#039;&#039;&#039;: плотная матрица &amp;lt;math&amp;gt;G&amp;lt;/math&amp;gt; размера &amp;lt;math&amp;gt;n&amp;lt;/math&amp;gt;х&amp;lt;math&amp;gt;n&amp;lt;/math&amp;gt;, где &amp;lt;math&amp;gt;A= G^TG&amp;lt;/math&amp;gt; – симметрическая матрица.&lt;br /&gt;
&lt;br /&gt;
&#039;&#039;&#039;Объём входных данных&#039;&#039;&#039;: &amp;lt;math&amp;gt;n^2&amp;lt;/math&amp;gt; (т.к. для хранения матрицы &amp;lt;math&amp;gt;G&amp;lt;/math&amp;gt; используем двумерный массив размера &amp;lt;math&amp;gt;n&amp;lt;/math&amp;gt;х&amp;lt;math&amp;gt;n&amp;lt;/math&amp;gt;)&lt;br /&gt;
&lt;br /&gt;
&#039;&#039;&#039;Выходные данные&#039;&#039;&#039;: &amp;lt;math&amp;gt;\sigma_{i}&amp;lt;/math&amp;gt;  - сингулярные числа, матрица &amp;lt;math&amp;gt;U&amp;lt;/math&amp;gt; левых сингулярных векторов и матрица &amp;lt;math&amp;gt;V&amp;lt;/math&amp;gt; правых сингулярных векторов.&lt;br /&gt;
&lt;br /&gt;
&#039;&#039;&#039;Объём выходных данных&#039;&#039;&#039;: &amp;lt;math&amp;gt;2n^2 + n&amp;lt;/math&amp;gt; (т.к. необходимо хранить вектор сингулярных чисел длины &amp;lt;math&amp;gt;n&amp;lt;/math&amp;gt;, а также две матрицы &amp;lt;math&amp;gt;U, V&amp;lt;/math&amp;gt; левых и правых сингулярных векторов размера &amp;lt;math&amp;gt;n&amp;lt;/math&amp;gt;х&amp;lt;math&amp;gt;n&amp;lt;/math&amp;gt;).&lt;br /&gt;
&lt;br /&gt;
=== Свойства алгоритма ===&lt;br /&gt;
Метод Якоби является самым медленным из имеющихся алгоритмов вычисления сингулярных чисел и сингулярных векторов матрицы. Тем не менее, для  матриц &amp;lt;math&amp;gt;G&amp;lt;/math&amp;gt;, которые могут быть представлены в виде &amp;lt;math&amp;gt;G=DX&amp;lt;/math&amp;gt;, где &amp;lt;math&amp;gt;D&amp;lt;/math&amp;gt; - диагональная, а &amp;lt;math&amp;gt;X&amp;lt;/math&amp;gt; - хорошо обусловлена, он способен вычислять сингулярные числа и вектора намного точнее, чем другие методы&amp;lt;ref&amp;gt;Дж. Деммель «Вычислительная линейная алгебра» (стр. 261-264)&amp;lt;/ref&amp;gt;. &lt;br /&gt;
&lt;br /&gt;
Вычислительная мощность алгоритма, как отношение числа операций к суммарному объему входных и выходных данных является линейной.&lt;br /&gt;
&lt;br /&gt;
Метод Якоби не детерминирован, так как является итерационным алгоритмом с выходом по точности (число итераций зависит от входных данных и порогового значения).&lt;br /&gt;
&lt;br /&gt;
== Программная реализация алгоритма ==&lt;br /&gt;
&lt;br /&gt;
=== Особенности реализации последовательного алгоритма ===&lt;br /&gt;
&lt;br /&gt;
=== Локальность данных и вычислений ===&lt;br /&gt;
&lt;br /&gt;
=== Возможные способы и особенности параллельной реализации алгоритма ===&lt;br /&gt;
&lt;br /&gt;
=== Масштабируемость алгоритма и его реализации ===&lt;br /&gt;
Исследование масштабируемости параллельной реализации метода Якоби вычисления сингулярных чисел и векторов проводилось на тестовой средe суперкомпьютера &amp;quot;Ломоносов&amp;quot;, с использованием компилятора ICC и библиотеки impi/4.0.3. Алгоритм реализован на языке программирования C с использованием механизмов MPI.&lt;br /&gt;
&lt;br /&gt;
Алгоритм работает по следующей схеме:&lt;br /&gt;
#На вход всем процессорам подается матрица &amp;lt;math&amp;gt; G &amp;lt;/math&amp;gt;.&lt;br /&gt;
#Для всех &amp;lt;math&amp;gt; j &amp;lt;/math&amp;gt; и &amp;lt;math&amp;gt; k &amp;lt;/math&amp;gt; таких, что &amp;lt;math&amp;gt; j \in [1,n-1] &amp;lt;/math&amp;gt;, &amp;lt;math&amp;gt; k \in [j+1,n] &amp;lt;/math&amp;gt;&lt;br /&gt;
##Вычисляется элемент &amp;lt;math&amp;gt; a_{jk} &amp;lt;/math&amp;gt; путем перемножения матриц &amp;lt;math&amp;gt; G^TG &amp;lt;/math&amp;gt;, где на каждом процессоре вычисляется своя часть матрицы. После чего результат отправляется на все процессоры.&lt;br /&gt;
##Если полученный элемент оказывается больше некоторого значения, то начинается последовательная часть программы: Вычисление элементов &amp;lt;math&amp;gt; \tau, t, c, s &amp;lt;/math&amp;gt;.&lt;br /&gt;
##Затем, выполняется операция поворота, путем перемножения матриц &amp;lt;math&amp;gt; G &amp;lt;/math&amp;gt; и &amp;lt;math&amp;gt; R &amp;lt;/math&amp;gt;. Данная операция выполняется параллельно на нескольких процессорах, где каждый процессор вычисляет свою часть матрицы. После чего результат пересылается всем процессорам.&lt;br /&gt;
&lt;br /&gt;
Данная схема повторяется до тех пор, пока матрица &amp;lt;math&amp;gt; A = G^TG &amp;lt;/math&amp;gt; не станет достаточно близкой к диагональной.&lt;br /&gt;
&lt;br /&gt;
Для проверки этого факта, в конце каждой итерации цикла вычисляется матрица &amp;lt;math&amp;gt; A &amp;lt;/math&amp;gt;. Данная операция выполняется параллельно на нескольких процессорах, где каждый процессор вычисляет свою часть матрицы, после чего результат пересылается всем процессорам.&lt;br /&gt;
&lt;br /&gt;
&lt;br /&gt;
Набор и границы значений изменяемых параметров запуска реализации алгоритма: &lt;br /&gt;
&lt;br /&gt;
*	число процессоров [1 : 128] с шагом равным степени двойки;&lt;br /&gt;
*	размер матрицы [256 : 1792] с шагом 256.&lt;br /&gt;
&lt;br /&gt;
В результате проведённых экспериментов был получен следующий диапазон эффективности реализации алгоритма:&lt;br /&gt;
&lt;br /&gt;
*	минимальная эффективность реализации 0,01%;&lt;br /&gt;
*	максимальная эффективность реализации 16,52%.&lt;br /&gt;
&lt;br /&gt;
На следующих рисунках приведены графики производительности и эффективности выбранной реализации метода Якоби в зависимости от изменяемых параметров запуска.&lt;br /&gt;
&lt;br /&gt;
[[File:Performance.jpg|none|thumb|1000px|Рисунок 1. Параллельная реализация метода Якоби. Изменение производительности в зависимости от числа процессоров и размера матрицы.]]&lt;br /&gt;
&lt;br /&gt;
[[File:Эффективность.png|none|thumb|1000px|Рисунок 1. Параллельная реализация метода Якоби. Изменение эффективности в зависимости от числа процессоров и размера матрицы.]]&lt;br /&gt;
&lt;br /&gt;
Построим оценки масштабируемости данной реализации метода Якоби: &lt;br /&gt;
* По числу процессов: при увеличении числа процессов эффективность на рассмотренной области изменений параметров запуска сначала увеличивается (самый пик достигается при 16 процессах), а затем начинает снижаться. Это характеризуется тем, что накладные расходы на параллельное выполнение (общение между процессами) начинает превалировать над вычислениями.&lt;br /&gt;
&lt;br /&gt;
*По размеру задачи: при увеличении размера задачи эффективность возрастает. Это подтверждает предположение о том, что размер задачи сильно влияет на эффективность выполнения приложения. Оценка показывает, что с ростом размера задачи эффективность на рассмотренной области значений параметров запуска сильно увеличивается. &lt;br /&gt;
&lt;br /&gt;
*По двум направлениям: при рассмотрении увеличения как вычислительной сложности, так и числа процессов на всей рассмотренной области значений эффективность увеличивается, но медленно и с перепадами.&lt;br /&gt;
&lt;br /&gt;
[https://www.dropbox.com/home?preview=mainmpi.c Исследованная параллельная реализация метода Якоби]&lt;br /&gt;
&lt;br /&gt;
=== Динамические характеристики и эффективность реализации алгоритма ===&lt;br /&gt;
&lt;br /&gt;
=== Выводы для классов архитектур ===&lt;br /&gt;
&lt;br /&gt;
=== Существующие реализации алгоритма ===&lt;br /&gt;
Метод Якоби нахождения сингулярных значений и векторов реализован в таких пакетах, как LAPACK &amp;lt;ref&amp;gt;http://www.netlib.org/scalapack/slug/&amp;lt;/ref&amp;gt;, LINPACK/EISPACK &amp;lt;ref&amp;gt; http://www.netlib.org/linpack/ &amp;lt;/ref&amp;gt;, Intel MKL &amp;lt;ref&amp;gt;https://software.intel.com/ru-ru/node/521153#CAF8CA08-1C69-48F8-B0C3-B2B27AFA92FA&amp;lt;/ref&amp;gt;.&lt;br /&gt;
&lt;br /&gt;
Так же функция Якоби реализована в пакете Matlab.&lt;br /&gt;
&lt;br /&gt;
Т. к. алгоритм считается медленным, он не включен во многие известные пакеты.&lt;br /&gt;
&lt;br /&gt;
== Литература ==&lt;br /&gt;
1. Дж. Деммель Вычислительная линейная алгебра. Изд. Мир, 2001.&lt;/div&gt;</summary>
		<author><name>Davletshuna Alexandra</name></author>
	</entry>
	<entry>
		<id>https://xn--80aecvaldz.xn--80ahdrnmvk.xn--p1ai/w/ru/index.php?title=%D0%A3%D1%87%D0%B0%D1%81%D1%82%D0%BD%D0%B8%D0%BA:Davletshuna_Alexandra/%D0%9C%D0%B5%D1%82%D0%BE%D0%B4_%D0%AF%D0%BA%D0%BE%D0%B1%D0%B8_%D0%B2%D1%8B%D1%87%D0%B8%D1%81%D0%BB%D0%B5%D0%BD%D0%B8%D1%8F_%D1%81%D0%B8%D0%BD%D0%B3%D1%83%D0%BB%D1%8F%D1%80%D0%BD%D1%8B%D1%85_%D1%87%D0%B8%D1%81%D0%B5%D0%BB_%D0%B8_%D0%B2%D0%B5%D0%BA%D1%82%D0%BE%D1%80%D0%BE%D0%B2&amp;diff=18565</id>
		<title>Участник:Davletshuna Alexandra/Метод Якоби вычисления сингулярных чисел и векторов</title>
		<link rel="alternate" type="text/html" href="https://xn--80aecvaldz.xn--80ahdrnmvk.xn--p1ai/w/ru/index.php?title=%D0%A3%D1%87%D0%B0%D1%81%D1%82%D0%BD%D0%B8%D0%BA:Davletshuna_Alexandra/%D0%9C%D0%B5%D1%82%D0%BE%D0%B4_%D0%AF%D0%BA%D0%BE%D0%B1%D0%B8_%D0%B2%D1%8B%D1%87%D0%B8%D1%81%D0%BB%D0%B5%D0%BD%D0%B8%D1%8F_%D1%81%D0%B8%D0%BD%D0%B3%D1%83%D0%BB%D1%8F%D1%80%D0%BD%D1%8B%D1%85_%D1%87%D0%B8%D1%81%D0%B5%D0%BB_%D0%B8_%D0%B2%D0%B5%D0%BA%D1%82%D0%BE%D1%80%D0%BE%D0%B2&amp;diff=18565"/>
		<updated>2016-11-20T08:48:52Z</updated>

		<summary type="html">&lt;p&gt;Davletshuna Alexandra: &lt;/p&gt;
&lt;hr /&gt;
&lt;div&gt;{{Assignment}}&lt;br /&gt;
&lt;br /&gt;
{{algorithm&lt;br /&gt;
| name              = Метод Якоби вычисления сингулярных чисел и векторов&lt;br /&gt;
| serial_complexity = &amp;lt;math&amp;gt;O(n^3)&amp;lt;/math&amp;gt;&lt;br /&gt;
| pf_height         = &amp;lt;math&amp;gt;O(n^2)&amp;lt;/math&amp;gt;&lt;br /&gt;
| pf_width          = &amp;lt;math&amp;gt;O(n)&amp;lt;/math&amp;gt;&lt;br /&gt;
| input_data        = &amp;lt;math&amp;gt;n^2&amp;lt;/math&amp;gt;&lt;br /&gt;
| output_data       = &amp;lt;math&amp;gt;2n^2 + n&amp;lt;/math&amp;gt;&lt;br /&gt;
}}&lt;br /&gt;
&lt;br /&gt;
Авторы статьи: [[Участница:Davletshuna Alexandra|Давлетшина Александра]] (группа 619); [[Участница:Alek sandra|Зайцева Александра]]. Вклад каждого участника считать равноценным.&lt;br /&gt;
&lt;br /&gt;
== Свойства и структура алгоритма ==&lt;br /&gt;
&lt;br /&gt;
=== Общее описание алгоритма ===&lt;br /&gt;
&#039;&#039;&#039;Сингулярным разложением&#039;&#039;&#039; называется разложение прямоугольной вещественной или комплексной матрицы, имеющее широкое применение, в силу своей наглядной геометрической интерпретации, при решении многих прикладных задач. Сингулярное разложение матрицы А позволяет вычислять сингулярные числа данной матрицы, а также, левые и правые сингулярные векторы матрицы А:&lt;br /&gt;
&lt;br /&gt;
•	левые сингулярные векторы матрицы А — это собственные векторы матрицы &amp;lt;math&amp;gt;AA^*&amp;lt;/math&amp;gt;;&lt;br /&gt;
&lt;br /&gt;
•	правые сингулярные векторы матрицы A — это собственные векторы матрицы &amp;lt;math&amp;gt;A^*A&amp;lt;/math&amp;gt;.&lt;br /&gt;
&lt;br /&gt;
Геометрическая интерпретация сингулярного разложения заключается в следующем факте из геометрии: &#039;&#039;Образом любого линейного преобразования, заданного с помощью матрицы &amp;lt;math&amp;gt;m&amp;lt;/math&amp;gt;x&amp;lt;math&amp;gt;n&amp;lt;/math&amp;gt;, примененного к единичной сфере является гиперэллипсоид&#039;&#039;.&lt;br /&gt;
&lt;br /&gt;
Из многочисленных разложений матриц, наиболее удобным является сингулярное разложение матрицы в виде: &amp;lt;math&amp;gt;A=U\Sigma V^*&amp;lt;/math&amp;gt;, где &amp;lt;math&amp;gt;U, V&amp;lt;/math&amp;gt; – унитарные матрицы, а &amp;lt;math&amp;gt;\Sigma&amp;lt;/math&amp;gt; – диагональная матрица с вещественными положительными числами на диагонали &amp;lt;ref&amp;gt;http://algorithms.parallel.ru/&amp;lt;/ref&amp;gt;.&lt;br /&gt;
&lt;br /&gt;
Диагональные элементы матрицы &amp;lt;math&amp;gt;\Sigma&amp;lt;/math&amp;gt; называются сингулярными числами матрицы &amp;lt;math&amp;gt;A&amp;lt;/math&amp;gt;, а столбцы матриц &amp;lt;math&amp;gt;U,V&amp;lt;/math&amp;gt; левыми и правыми сингулярными векторами соответственно.&lt;br /&gt;
&lt;br /&gt;
Алгоритм Якоби сингулярного разложения матрицы был предложен одним из первых в 1846 году. Он приводит прямоугольную матрицу к диагональной матрице с помощью последовательности элементарных вращений. Метод может найти все сингулярные значения с очень высокой точностью. Однако его производительность является довольно низкой, в сравнении с конкурирующими методами.&lt;br /&gt;
&lt;br /&gt;
&#039;&#039;Неявный&#039;&#039;&amp;lt;ref&amp;gt;Дж. Деммель «Вычислительная линейная алгебра» (стр. 261-264)&amp;lt;/ref&amp;gt; метод Якоби математически эквивалентен применению метода Якоби вычисления собственных значений к матрице &amp;lt;math&amp;gt;A = G^TG&amp;lt;/math&amp;gt;.&lt;br /&gt;
Это значит, что на каждом шаге вычисляется вращение Якоби &amp;lt;math&amp;gt;J&amp;lt;/math&amp;gt;, с помощью которого матрица &amp;lt;math&amp;gt;G^TG&amp;lt;/math&amp;gt; неявно пересчитывется в &amp;lt;math&amp;gt;J^TG^TGJ&amp;lt;/math&amp;gt;; вращение выбрано так, чтобы пара внедиагональных элементов из &amp;lt;math&amp;gt;G^TG&amp;lt;/math&amp;gt; обратилась в нули в матрице &amp;lt;math&amp;gt;J^TG^TGJ&amp;lt;/math&amp;gt;. При этом ни &amp;lt;math&amp;gt;G^TG&amp;lt;/math&amp;gt;, ни &amp;lt;math&amp;gt;J^TG^TGJ&amp;lt;/math&amp;gt; не вычисляются в явном виде; вместо них вычисляется матрица &amp;lt;math&amp;gt;GJ&amp;lt;/math&amp;gt;. Поэтому алгоритм называется &#039;&#039;методом односторонних вращений&#039;&#039;.&lt;br /&gt;
&lt;br /&gt;
=== Математическое описание алгоритма ===&lt;br /&gt;
Исходные данные: матрица &amp;lt;math&amp;gt;G&amp;lt;/math&amp;gt; (элементы &amp;lt;math&amp;gt;g_{ij}, i, j = 1, \ldots, n&amp;lt;/math&amp;gt;).&lt;br /&gt;
&lt;br /&gt;
Вычисляемые данные: матрица &amp;lt;math&amp;gt;\Sigma = diag(\sigma_{i})&amp;lt;/math&amp;gt;, где &amp;lt;math&amp;gt;\sigma_{i}&amp;lt;/math&amp;gt; - сингулярные числа, &amp;lt;math&amp;gt;U&amp;lt;/math&amp;gt; - матрица левых сингулярных векторов, &amp;lt;math&amp;gt;V&amp;lt;/math&amp;gt; - матрица правых сингулярных векторов.&lt;br /&gt;
&lt;br /&gt;
симметричную матрицу &amp;lt;math&amp;gt;A = (G^TG)&amp;lt;/math&amp;gt; можно привести к диагональному виду:&lt;br /&gt;
&amp;lt;math&amp;gt;RG^TGR^T&amp;lt;/math&amp;gt;, где&lt;br /&gt;
&lt;br /&gt;
&amp;lt;math&amp;gt;&lt;br /&gt;
R(j,k,\theta) = &lt;br /&gt;
\begin{matrix}&lt;br /&gt;
  \\&lt;br /&gt;
  \\&lt;br /&gt;
  \\&lt;br /&gt;
j \\&lt;br /&gt;
  \\&lt;br /&gt;
k \\&lt;br /&gt;
  \\&lt;br /&gt;
  \\&lt;br /&gt;
  \\&lt;br /&gt;
\end{matrix}&lt;br /&gt;
&amp;lt;/math&amp;gt;  &lt;br /&gt;
&amp;lt;math&amp;gt;&lt;br /&gt;
\begin{bmatrix}&lt;br /&gt;
  &amp;amp; 1 &amp;amp;   &amp;amp;        &amp;amp;              &amp;amp;        &amp;amp;               &amp;amp;         &amp;amp;    &amp;amp;   \\&lt;br /&gt;
  &amp;amp;   &amp;amp; 1 &amp;amp;        &amp;amp;              &amp;amp;        &amp;amp;               &amp;amp;         &amp;amp;    &amp;amp;   \\&lt;br /&gt;
  &amp;amp;   &amp;amp;   &amp;amp; \ddots &amp;amp;              &amp;amp;        &amp;amp;               &amp;amp;         &amp;amp;    &amp;amp;   \\&lt;br /&gt;
  &amp;amp;   &amp;amp;   &amp;amp;        &amp;amp; \cos(\theta) &amp;amp;        &amp;amp; -\sin(\theta) &amp;amp;         &amp;amp;    &amp;amp;   \\&lt;br /&gt;
  &amp;amp;   &amp;amp;   &amp;amp;        &amp;amp;              &amp;amp; \ddots &amp;amp;               &amp;amp;         &amp;amp;    &amp;amp;   \\&lt;br /&gt;
  &amp;amp;   &amp;amp;   &amp;amp;        &amp;amp; \sin(\theta) &amp;amp;        &amp;amp; \cos(\theta)  &amp;amp;         &amp;amp;    &amp;amp;   \\&lt;br /&gt;
  &amp;amp;   &amp;amp;   &amp;amp;        &amp;amp;              &amp;amp;        &amp;amp;               &amp;amp; \ddots  &amp;amp;    &amp;amp;   \\&lt;br /&gt;
  &amp;amp;   &amp;amp;   &amp;amp;        &amp;amp;              &amp;amp;        &amp;amp;               &amp;amp;         &amp;amp; 1  &amp;amp;   \\&lt;br /&gt;
  &amp;amp;   &amp;amp;   &amp;amp;        &amp;amp;              &amp;amp;        &amp;amp;               &amp;amp;         &amp;amp;    &amp;amp; 1 \\&lt;br /&gt;
\end{bmatrix}&lt;br /&gt;
&amp;lt;/math&amp;gt;&lt;br /&gt;
&lt;br /&gt;
Обозначим &amp;lt;math&amp;gt;s = \sin \theta&amp;lt;/math&amp;gt; и &amp;lt;math&amp;gt;c = \cos \theta&amp;lt;/math&amp;gt;.&lt;br /&gt;
&lt;br /&gt;
Перемножив матрицы &amp;lt;math&amp;gt;RG^TGR^T&amp;lt;/math&amp;gt;, получим следующие выражения&amp;lt;ref&amp;gt;http://www.astro.tsu.ru/OsChMet/5_2.html&amp;lt;/ref&amp;gt;:&lt;br /&gt;
&lt;br /&gt;
&amp;lt;math&amp;gt;\begin{align}&lt;br /&gt;
 a_{jj}^{(i+1)} &amp;amp;= c^2\, a_{jj}^{(i)}  -  2\, s c \,a_{jk}^{(i)}  +  s^2\, a_{kk}^{(i)} \\&lt;br /&gt;
 a_{kk}^{(i+1)} &amp;amp;= s^2 \,a_{jj}^{(i)}  +  2 s c\, a_{jk}^{(i)}  +  c^2 \, a_{kk}^{(i)} \\&lt;br /&gt;
 a_{jk}^{(i+1)} &amp;amp;= a_{kj}^{(i+1)} = (c^2 - s^2 ) \, a_{jk}^{(i)}  +  s c \, (a_{kk}^{(i)} - a_{jj}^{(i)} ) \\&lt;br /&gt;
 a_{jm}^{(i+1)} &amp;amp;= a_{mj}^{(i+1)} = c \, a_{jm}^{(i)}  -  s \, a_{km}^{(i)} &amp;amp; m \ne j,k \\&lt;br /&gt;
 a_{km}^{(i+1)} &amp;amp;= a_{mk}^{(i+1)} = s \, a_{jm}^{(i)}  + c \, a_{km}^{(i)} &amp;amp; m \ne j,k \\&lt;br /&gt;
 a_{ml}^{(i+1)} &amp;amp;= a_{ml}^{(i)} &amp;amp;m,l \ne j,k&lt;br /&gt;
\end{align}&amp;lt;/math&amp;gt;&lt;br /&gt;
&lt;br /&gt;
Т.к внедиагональные элементы должны быть равны 0, то выбираем &amp;lt;math&amp;gt;\theta&amp;lt;/math&amp;gt; так, чтобы &amp;lt;math&amp;gt;a_{jk}^{(i+1)} = 0&amp;lt;/math&amp;gt; и &amp;lt;math&amp;gt;a_{kj}^{(i+1)} = 0&amp;lt;/math&amp;gt;.&lt;br /&gt;
&lt;br /&gt;
Тогда решая уравнение получаем, что&lt;br /&gt;
&lt;br /&gt;
&amp;lt;math&amp;gt;&lt;br /&gt;
         \begin{align}&lt;br /&gt;
         \tau &amp;amp;= ({a_{jj} - a_{kk}})/{2a_{jk}} \\&lt;br /&gt;
         t &amp;amp;= {sign(\tau)}/(|\tau| + \sqrt{1 + \tau^2}) \\&lt;br /&gt;
         c &amp;amp;= 1/(\sqrt{1 + t^2}) \\&lt;br /&gt;
         s &amp;amp;= ct \\&lt;br /&gt;
         \end{align}&amp;lt;/math&amp;gt;&lt;br /&gt;
&lt;br /&gt;
Остановка вычислений алгоритма наступает, когда внедиагональные элементы становятся меньше некоторого наперед заданного числа &amp;lt;math&amp;gt;\varepsilon&amp;lt;/math&amp;gt;.&lt;br /&gt;
&lt;br /&gt;
=== Вычислительное ядро алгоритма ===&lt;br /&gt;
Вычислительное ядро алгоритма составляет непосредственно вычисление одностороннего вращения Якоби, т.е. вычисление элементов матрицы &amp;lt;math&amp;gt;g_{jm}^{(i+1)} = g_{mj}^{(i+1)}&amp;lt;/math&amp;gt; и &amp;lt;math&amp;gt;g_{km}^{(i+1)} = g_{mk}^{(i+1)}&amp;lt;/math&amp;gt;, &amp;lt;math&amp;gt;m \ne j,k&amp;lt;/math&amp;gt;, а также вычисления элементов &amp;lt;math&amp;gt;g_{jj}^{(i+1)} &amp;lt;/math&amp;gt; и &amp;lt;math&amp;gt;g_{kk}^{(i+1)} &amp;lt;/math&amp;gt;, получившихся после умножения промежуточной матрицы на матрицу вращений Якоби:&lt;br /&gt;
&lt;br /&gt;
&amp;lt;math&amp;gt;\begin{align}&lt;br /&gt;
 g_{jj}^{(i+1)} &amp;amp;= c^2\, g_{jj}^{(i)}  -  2\, s c \,g_{jk}^{(i)}  +  s^2\, g_{kk}^{(i)} \\&lt;br /&gt;
 g_{kk}^{(i+1)} &amp;amp;= s^2 \,g_{jj}^{(i)}  +  2 s c\, g_{jk}^{(i)}  +  c^2 \, g_{kk}^{(i)} \\&lt;br /&gt;
 g_{jk}^{(i+1)} &amp;amp;= g_{kj}^{(i+1)} = (c^2 - s^2 ) \, g_{jk}^{(i)}  +  s c \, (g_{kk}^{(i)} - g_{jj}^{(i)} ) \\&lt;br /&gt;
 g_{jm}^{(i+1)} &amp;amp;= g_{mj}^{(i+1)} = c \, g_{jm}^{(i)}  -  s \, g_{km}^{(i)} &amp;amp; m \ne j,k \\&lt;br /&gt;
 g_{km}^{(i+1)} &amp;amp;= g_{mk}^{(i+1)} = s \, g_{jm}^{(i)}  + c \, g_{km}^{(i)} &amp;amp; m \ne j,k \\&lt;br /&gt;
 g_{ml}^{(i+1)} &amp;amp;= g_{ml}^{(i)} &amp;amp;m,l \ne j,k&lt;br /&gt;
\end{align}&amp;lt;/math&amp;gt;&lt;br /&gt;
&lt;br /&gt;
=== Макроструктура алгоритма ===&lt;br /&gt;
Основную часть метода составляет процедура односторонних вращений матрицы, которая в свою очередь состоит из:&lt;br /&gt;
&lt;br /&gt;
#Вычисление &amp;lt;math&amp;gt;\tau, c, s, t&amp;lt;/math&amp;gt;.&lt;br /&gt;
#Одностороннее вращение матрицы. &lt;br /&gt;
&lt;br /&gt;
Что требует &amp;lt;math&amp;gt;O(n)&amp;lt;/math&amp;gt; операций.&lt;br /&gt;
&lt;br /&gt;
После этого необходимо:&lt;br /&gt;
&lt;br /&gt;
#Вычислить сингулярные числа &amp;lt;math&amp;gt;\sigma_i&amp;lt;/math&amp;gt;.  Что требует &amp;lt;math&amp;gt;O(n)&amp;lt;/math&amp;gt; операций.&lt;br /&gt;
#Вычислить &amp;lt;math&amp;gt;U&amp;lt;/math&amp;gt; и &amp;lt;math&amp;gt;V&amp;lt;/math&amp;gt;. Что требует &amp;lt;math&amp;gt;O(n^2)&amp;lt;/math&amp;gt; операций.&lt;br /&gt;
&lt;br /&gt;
=== Схема реализации последовательного алгоритма ===&lt;br /&gt;
Применение метода Якоби к матрице &amp;lt;math&amp;gt;A = (G^TG)&amp;lt;/math&amp;gt; можно описать следующим образом&amp;lt;ref&amp;gt;Дж. Деммель «Вычислительная линейная алгебра» (стр. 261-263)&amp;lt;/ref&amp;gt;:&lt;br /&gt;
&lt;br /&gt;
Если &amp;lt;math&amp;gt;G = U\Sigma V^T&amp;lt;/math&amp;gt; и &amp;lt;math&amp;gt;\Sigma = diag(\sigma_{i})&amp;lt;/math&amp;gt;, то алгоритм вычисляет сингулярные числа &amp;lt;math&amp;gt;\sigma_{i}&amp;lt;/math&amp;gt;, матрицу &amp;lt;math&amp;gt;U&amp;lt;/math&amp;gt; левых сингулярных векторов и матрицу &amp;lt;math&amp;gt;V&amp;lt;/math&amp;gt; правых сингулярных векторов по следующей схеме:&lt;br /&gt;
&lt;br /&gt;
 repeat&lt;br /&gt;
     for &amp;lt;math&amp;gt;j=1&amp;lt;/math&amp;gt; to &amp;lt;math&amp;gt;n-1&amp;lt;/math&amp;gt;&lt;br /&gt;
         for &amp;lt;math&amp;gt;k=j+1&amp;lt;/math&amp;gt; to &amp;lt;math&amp;gt;n&amp;lt;/math&amp;gt;&lt;br /&gt;
             обратиться к процедуре &#039;&#039;&#039;&#039;&#039;One-Sided-Jacobi-Rotation&amp;lt;math&amp;gt;(G,j,k)&amp;lt;/math&amp;gt;&#039;&#039;&#039;&#039;&#039;&lt;br /&gt;
         end for&lt;br /&gt;
     end for&lt;br /&gt;
 пока &amp;lt;math&amp;gt;G^TG&amp;lt;/math&amp;gt; не станет достаточно близка к диагональной матрице&lt;br /&gt;
 Положить &amp;lt;math&amp;gt;\sigma_{i} = ||G(:,i)||_2 &amp;lt;/math&amp;gt; (норма &amp;lt;math&amp;gt;i&amp;lt;/math&amp;gt;-го столбца в &amp;lt;math&amp;gt;G&amp;lt;/math&amp;gt;)&lt;br /&gt;
 Положить &amp;lt;math&amp;gt;U = [u_{1},\dots, u_{n}]&amp;lt;/math&amp;gt;, где &amp;lt;math&amp;gt;u_{i} = G(:,i)/\sigma_{i}&amp;lt;/math&amp;gt;&lt;br /&gt;
 Положить &amp;lt;math&amp;gt;V = J&amp;lt;/math&amp;gt;, где &amp;lt;math&amp;gt;J&amp;lt;/math&amp;gt; - накопленное произведение вращений Якоби.&lt;br /&gt;
&lt;br /&gt;
Где процедура &#039;&#039;&#039;&#039;&#039;One-Sided-Jacobi-Rotation&#039;&#039;&#039;&#039;&#039; является метод односторонних вращений Якоби:&lt;br /&gt;
&lt;br /&gt;
 proc &#039;&#039;&#039;&#039;&#039;One-Sided-Jacobi-Rotation&amp;lt;math&amp;gt;(G,j,k)&amp;lt;/math&amp;gt;&#039;&#039;&#039;&#039;&#039;&lt;br /&gt;
     вычислить &amp;lt;math&amp;gt;a_{jj} = (G^TG)_{jj}, a_{jk} = (G^TG)_{jk}&amp;lt;/math&amp;gt; и &amp;lt;math&amp;gt;a_{kk} = (G^TG)_{kk}&amp;lt;/math&amp;gt;&lt;br /&gt;
     if &amp;lt;math&amp;gt;|a_{jk}|&amp;lt;/math&amp;gt; не слишком мал&lt;br /&gt;
         &amp;lt;math&amp;gt;&lt;br /&gt;
         \begin{align}&lt;br /&gt;
         \tau &amp;amp;= ({a_{jj} - a_{kk}})/{2a_{jk}} \\&lt;br /&gt;
         t &amp;amp;= {sign(\tau)}/(|\tau| + \sqrt{1 + \tau^2}) \\&lt;br /&gt;
         c &amp;amp;= 1/(\sqrt{1 + t^2}) \\&lt;br /&gt;
         s &amp;amp;= ct \\&lt;br /&gt;
         G &amp;amp;= GR(j,k,\theta) \  \dots c=cos\theta, s=sin\theta \end{align}&amp;lt;/math&amp;gt;&lt;br /&gt;
         if нужны правые сингулярные векторы &lt;br /&gt;
             &amp;lt;math&amp;gt;J = JR(j,k,\theta)&amp;lt;/math&amp;gt;&lt;br /&gt;
         end if&lt;br /&gt;
     end if&lt;br /&gt;
&lt;br /&gt;
=== Последовательная сложность алгоритма ===&lt;br /&gt;
Для одного вращения Якоби необходимо выполнить &amp;lt;math&amp;gt;O(n)&amp;lt;/math&amp;gt; операций умножения и сложения. &lt;br /&gt;
&lt;br /&gt;
Всего вариантов выбора &amp;lt;math&amp;gt;j&amp;lt;/math&amp;gt; и &amp;lt;math&amp;gt;k&amp;lt;/math&amp;gt; существует &amp;lt;math&amp;gt;\frac{n(n-1)}{2}&amp;lt;/math&amp;gt;.&lt;br /&gt;
&lt;br /&gt;
Таким образом последовательный алгоритм Якоби вычисления сингулярных чисел и векторов является алгоритмом с кубической сложностью.&lt;br /&gt;
&lt;br /&gt;
=== Информационный граф ===&lt;br /&gt;
Граф алгоритма состоит из четырех групп вершин&lt;br /&gt;
&lt;br /&gt;
(А)Первая группа вершин расположена в двумерной области, соответствующая ей операция - вычисление элементов &amp;lt;math&amp;gt;a_{jj},a_{jk},a_{kk}&amp;lt;/math&amp;gt; матрицы произведения &amp;lt;math&amp;gt;A = (G^TG)&amp;lt;/math&amp;gt;. Где &amp;lt;math&amp;gt;j&amp;lt;/math&amp;gt; изменяется от &amp;lt;math&amp;gt;1&amp;lt;/math&amp;gt; до &amp;lt;math&amp;gt;n-1&amp;lt;/math&amp;gt;, принимая все целочисленные значения, &amp;lt;math&amp;gt;k&amp;lt;/math&amp;gt;  изменяется от &amp;lt;math&amp;gt;j+1&amp;lt;/math&amp;gt; до &amp;lt;math&amp;gt;n&amp;lt;/math&amp;gt;, принимая все целочисленные значения.&lt;br /&gt;
&lt;br /&gt;
Граф вычисления каждого из элементов приведен на рисунке 1, где значениям &amp;lt;math&amp;gt;g_{ij}&amp;lt;/math&amp;gt; соответствуют обозначения &amp;lt;math&amp;gt;x_{ij}&amp;lt;/math&amp;gt;, а элементам &amp;lt;math&amp;gt;g^T_{ij}&amp;lt;/math&amp;gt; обозначения &amp;lt;math&amp;gt;z_{ij}&amp;lt;/math&amp;gt;. Значение &amp;lt;math&amp;gt;s_{ij}&amp;lt;/math&amp;gt; является значением результирующего элемента.&lt;br /&gt;
&lt;br /&gt;
(Б)Вторая группа вершин расположена в двумерной области, соответствующая ей операция – вычисление &amp;lt;math&amp;gt;c&amp;lt;/math&amp;gt; и &amp;lt;math&amp;gt;s&amp;lt;/math&amp;gt;.&lt;br /&gt;
&lt;br /&gt;
Информационный граф с входными и выходными данными вычисления пункта (Б) представлен на рисунке 2.&lt;br /&gt;
&lt;br /&gt;
(В)Третья группа вершин расположена в двумерной области, соответствующая ей операция вычисление значений элементов &amp;lt;math&amp;gt;g_{jm}^{(i+1)} = g_{mj}^{(i+1)}&amp;lt;/math&amp;gt; и &amp;lt;math&amp;gt;g_{km}^{(i+1)} = g_{mk}^{(i+1)}&amp;lt;/math&amp;gt;, &amp;lt;math&amp;gt;m \ne j,k&amp;lt;/math&amp;gt;.&lt;br /&gt;
&lt;br /&gt;
(Г)Четвертая группа вершин расположена в двумерной области, соответствующая ей операция вычисление значений элементов &amp;lt;math&amp;gt;g_{jj}^{(i+1)} &amp;lt;/math&amp;gt; и &amp;lt;math&amp;gt;g_{kk}^{(i+1)} &amp;lt;/math&amp;gt;.&lt;br /&gt;
&lt;br /&gt;
Элементы групп (В) и (Г) вычисляются аналогично вычислению элементов матрицы произведения, т.к. фактически представляют собой перемножение матриц &amp;lt;math&amp;gt;G&amp;lt;/math&amp;gt; и &amp;lt;math&amp;gt;R&amp;lt;/math&amp;gt;&lt;br /&gt;
&lt;br /&gt;
[[File:Jacobi_2.jpg|none|thumb|1000px|Рисунок 1. Информационный граф с входными и выходными параметрами вычисления каждого элемента матрицы произведения.]]&lt;br /&gt;
&lt;br /&gt;
[[File:Jacobi_1.jpg|none|thumb|1000px|Рисунок 2. Информационный граф с входными и выходными параметрами вычисления значений &amp;lt;math&amp;gt;c&amp;lt;/math&amp;gt; и &amp;lt;math&amp;gt;s&amp;lt;/math&amp;gt;.]]&lt;br /&gt;
&lt;br /&gt;
Обобщенный граф метода Якоби представлен на рисунке 3, где буквами А, Б, В и Г обозначено вычисление групп вершин (А), (Б), (В) и (Г).&lt;br /&gt;
&lt;br /&gt;
[[File:Graf21.png|none|thumb|2000px|Рисунок 3. Обобщенный граф алгоритма вычисления сингулярных чисел и векторов методом Якоби.]]&lt;br /&gt;
&lt;br /&gt;
=== Ресурс параллелизма алгоритма ===&lt;br /&gt;
Для выполнения одной итерации метода Якоби требуется последовательно выполнить несколько ярусов:&lt;br /&gt;
# вычислить &amp;lt;math&amp;gt;\tau&amp;lt;/math&amp;gt; &lt;br /&gt;
# вычислить &amp;lt;math&amp;gt;t&amp;lt;/math&amp;gt; &lt;br /&gt;
# вычислить &amp;lt;math&amp;gt;c&amp;lt;/math&amp;gt; &lt;br /&gt;
# вычислить &amp;lt;math&amp;gt;s&amp;lt;/math&amp;gt;&lt;br /&gt;
# выполнить поворот матрицы &amp;lt;math&amp;gt;G&amp;lt;/math&amp;gt; с параллельным выполнением &amp;lt;math&amp;gt;2(n-2)&amp;lt;/math&amp;gt; операций вычисления элементов матрицы &amp;lt;math&amp;gt;g_{jm}^{(i+1)} = g_{mj}^{(i+1)}&amp;lt;/math&amp;gt; и &amp;lt;math&amp;gt;g_{km}^{(i+1)} = g_{mk}^{(i+1)}&amp;lt;/math&amp;gt;, &amp;lt;math&amp;gt;m \ne j,k&amp;lt;/math&amp;gt;, а также вычисления элементов &amp;lt;math&amp;gt;g_{jj}^{(i+1)} &amp;lt;/math&amp;gt; и &amp;lt;math&amp;gt;g_{kk}^{(i+1)} &amp;lt;/math&amp;gt;. &lt;br /&gt;
&lt;br /&gt;
Суммарное количество итераций равно &amp;lt;math&amp;gt;\frac{n(n-1)}{2}&amp;lt;/math&amp;gt; (Различные варианты выбора &amp;lt;math&amp;gt;j&amp;lt;/math&amp;gt; и &amp;lt;math&amp;gt;k&amp;lt;/math&amp;gt;). &lt;br /&gt;
&lt;br /&gt;
Асимптотически метод сходится квадратично. &lt;br /&gt;
&lt;br /&gt;
Таким образом, при классификации по высоте ЯПФ метод Якоби относится к алгоритмам со сложностью &amp;lt;math&amp;gt;O(n^2)&amp;lt;/math&amp;gt;&amp;amp;nbsp;, а при классификации по ширине ЯПФ — к алгоритмам со сложностью &amp;lt;math&amp;gt;O(n)&amp;lt;/math&amp;gt;.&lt;br /&gt;
&lt;br /&gt;
=== Входные и выходные данные алгоритма ===&lt;br /&gt;
&#039;&#039;&#039;Входные данные&#039;&#039;&#039;: плотная матрица &amp;lt;math&amp;gt;G&amp;lt;/math&amp;gt; размера &amp;lt;math&amp;gt;n&amp;lt;/math&amp;gt;х&amp;lt;math&amp;gt;n&amp;lt;/math&amp;gt;, где &amp;lt;math&amp;gt;A= G^TG&amp;lt;/math&amp;gt; – симметрическая матрица.&lt;br /&gt;
&lt;br /&gt;
&#039;&#039;&#039;Объём входных данных&#039;&#039;&#039;: &amp;lt;math&amp;gt;n^2&amp;lt;/math&amp;gt; (т.к. для хранения матрицы &amp;lt;math&amp;gt;G&amp;lt;/math&amp;gt; используем двумерный массив размера &amp;lt;math&amp;gt;n&amp;lt;/math&amp;gt;х&amp;lt;math&amp;gt;n&amp;lt;/math&amp;gt;)&lt;br /&gt;
&lt;br /&gt;
&#039;&#039;&#039;Выходные данные&#039;&#039;&#039;: &amp;lt;math&amp;gt;\sigma_{i}&amp;lt;/math&amp;gt;  - сингулярные числа, матрица &amp;lt;math&amp;gt;U&amp;lt;/math&amp;gt; левых сингулярных векторов и матрица &amp;lt;math&amp;gt;V&amp;lt;/math&amp;gt; правых сингулярных векторов.&lt;br /&gt;
&lt;br /&gt;
&#039;&#039;&#039;Объём выходных данных&#039;&#039;&#039;: &amp;lt;math&amp;gt;2n^2 + n&amp;lt;/math&amp;gt; (т.к. необходимо хранить вектор сингулярных чисел длины &amp;lt;math&amp;gt;n&amp;lt;/math&amp;gt;, а также две матрицы &amp;lt;math&amp;gt;U, V&amp;lt;/math&amp;gt; левых и правых сингулярных векторов размера &amp;lt;math&amp;gt;n&amp;lt;/math&amp;gt;х&amp;lt;math&amp;gt;n&amp;lt;/math&amp;gt;).&lt;br /&gt;
&lt;br /&gt;
=== Свойства алгоритма ===&lt;br /&gt;
Метод Якоби является самым медленным из имеющихся алгоритмов вычисления сингулярных чисел и сингулярных векторов матрицы. Тем не менее, для  матриц &amp;lt;math&amp;gt;G&amp;lt;/math&amp;gt;, которые могут быть представлены в виде &amp;lt;math&amp;gt;G=DX&amp;lt;/math&amp;gt;, где &amp;lt;math&amp;gt;D&amp;lt;/math&amp;gt; - диагональная, а &amp;lt;math&amp;gt;X&amp;lt;/math&amp;gt; - хорошо обусловлена, он способен вычислять сингулярные числа и вектора намного точнее, чем другие методы&amp;lt;ref&amp;gt;Дж. Деммель «Вычислительная линейная алгебра» (стр. 261-264)&amp;lt;/ref&amp;gt;. &lt;br /&gt;
&lt;br /&gt;
Вычислительная мощность алгоритма, как отношение числа операций к суммарному объему входных и выходных данных является линейной.&lt;br /&gt;
&lt;br /&gt;
Метод Якоби не детерминирован, так как является итерационным алгоритмом с выходом по точности (число итераций зависит от входных данных и порогового значения).&lt;br /&gt;
&lt;br /&gt;
== Программная реализация алгоритма ==&lt;br /&gt;
&lt;br /&gt;
=== Особенности реализации последовательного алгоритма ===&lt;br /&gt;
&lt;br /&gt;
=== Локальность данных и вычислений ===&lt;br /&gt;
&lt;br /&gt;
=== Возможные способы и особенности параллельной реализации алгоритма ===&lt;br /&gt;
&lt;br /&gt;
=== Масштабируемость алгоритма и его реализации ===&lt;br /&gt;
Исследование масштабируемости параллельной реализации метода Якоби вычисления сингулярных чисел и векторов проводилось на тестовой средe суперкомпьютера &amp;quot;Ломоносов&amp;quot;, с использованием компилятора ICC и библиотеки impi/4.0.3. Алгоритм реализован на языке программирования C с использованием механизмов MPI.&lt;br /&gt;
&lt;br /&gt;
Алгоритм работает по следующей схеме:&lt;br /&gt;
#На вход всем процессорам подается матрица &amp;lt;math&amp;gt; G &amp;lt;/math&amp;gt;.&lt;br /&gt;
#Для всех &amp;lt;math&amp;gt; j &amp;lt;/math&amp;gt; и &amp;lt;math&amp;gt; k &amp;lt;/math&amp;gt; таких, что &amp;lt;math&amp;gt; j \in [1,n-1] &amp;lt;/math&amp;gt;, &amp;lt;math&amp;gt; k \in [j+1,n] &amp;lt;/math&amp;gt;&lt;br /&gt;
##Вычисляется элемент &amp;lt;math&amp;gt; a_{jk} &amp;lt;/math&amp;gt; путем перемножения матриц &amp;lt;math&amp;gt; G^TG &amp;lt;/math&amp;gt;, где на каждом процессоре вычисляется своя часть матрицы. После чего результат отправляется на все процессоры.&lt;br /&gt;
##Если полученный элемент оказывается больше некоторого значения, то начинается последовательная часть программы: Вычисление элементов &amp;lt;math&amp;gt; \tau, t, c, s &amp;lt;/math&amp;gt;.&lt;br /&gt;
##Затем, выполняется операция поворота, путем перемножения матриц &amp;lt;math&amp;gt; G &amp;lt;/math&amp;gt; и &amp;lt;math&amp;gt; R &amp;lt;/math&amp;gt;. Данная операция выполняется параллельно на нескольких процессорах, где каждый процессор вычисляет свою часть матрицы. После чего результат пересылается всем процессорам.&lt;br /&gt;
&lt;br /&gt;
Данная схема повторяется до тех пор, пока матрица &amp;lt;math&amp;gt; A = G^TG &amp;lt;/math&amp;gt; не станет достаточно близкой к диагональной.&lt;br /&gt;
&lt;br /&gt;
Для проверки этого факта, в конце каждой итерации цикла вычисляется матрица &amp;lt;math&amp;gt; A &amp;lt;/math&amp;gt;. Данная операция выполняется параллельно на нескольких процессорах, где каждый процессор вычисляет свою часть матрицы, после чего результат пересылается всем процессорам.&lt;br /&gt;
&lt;br /&gt;
&lt;br /&gt;
Набор и границы значений изменяемых параметров запуска реализации алгоритма: &lt;br /&gt;
&lt;br /&gt;
*	число процессоров [1 : 128] с шагом равным степени двойки;&lt;br /&gt;
*	размер матрицы [256 : 1792] с шагом 256.&lt;br /&gt;
&lt;br /&gt;
В результате проведённых экспериментов был получен следующий диапазон эффективности реализации алгоритма:&lt;br /&gt;
&lt;br /&gt;
*	минимальная эффективность реализации 0,01%;&lt;br /&gt;
*	максимальная эффективность реализации 16,52%.&lt;br /&gt;
&lt;br /&gt;
На следующих рисунках приведены графики производительности и эффективности выбранной реализации метода Якоби в зависимости от изменяемых параметров запуска.&lt;br /&gt;
&lt;br /&gt;
[[File:Performance.jpg|none|thumb|1000px|Рисунок 1. Параллельная реализация метода Якоби. Изменение производительности в зависимости от числа процессоров и размера матрицы.]]&lt;br /&gt;
&lt;br /&gt;
[[File:Эффективность.png|none|thumb|1000px|Рисунок 1. Параллельная реализация метода Якоби. Изменение эффективности в зависимости от числа процессоров и размера матрицы.]]&lt;br /&gt;
&lt;br /&gt;
Построим оценки масштабируемости данной реализации метода Якоби: &lt;br /&gt;
* По числу процессов: при увеличении числа процессов эффективность на рассмотренной области изменений параметров запуска сначала увеличивается (самый пик достигается при 16 процессах), а затем начинает снижаться. Это характеризуется тем, что накладные расходы на параллельное выполнение (общение между процессами) начинает превалировать над вычислениями.&lt;br /&gt;
&lt;br /&gt;
*По размеру задачи: при увеличении размера задачи эффективность возрастает. Это подтверждает предположение о том, что размер задачи сильно влияет на эффективность выполнения приложения. Оценка показывает, что с ростом размера задачи эффективность на рассмотренной области значений параметров запуска сильно увеличивается. &lt;br /&gt;
&lt;br /&gt;
*По двум направлениям: при рассмотрении увеличения как вычислительной сложности, так и числа процессов на всей рассмотренной области значений эффективность увеличивается, но медленно и с перепадами.&lt;br /&gt;
&lt;br /&gt;
[https://www.dropbox.com/home?preview=mainmpi.c Исследованная параллельная реализация метода Якоби]&lt;br /&gt;
&lt;br /&gt;
=== Динамические характеристики и эффективность реализации алгоритма ===&lt;br /&gt;
&lt;br /&gt;
=== Выводы для классов архитектур ===&lt;br /&gt;
&lt;br /&gt;
=== Существующие реализации алгоритма ===&lt;br /&gt;
Метод Якоби нахождения сингулярных значений и векторов реализован в таких пакетах, как LAPACK &amp;lt;ref&amp;gt;http://www.netlib.org/scalapack/slug/&amp;lt;/ref&amp;gt;, LINPACK/EISPACK &amp;lt;ref&amp;gt; http://www.netlib.org/linpack/ &amp;lt;/ref&amp;gt;, Intel MKL &amp;lt;ref&amp;gt;https://software.intel.com/ru-ru/node/521153#CAF8CA08-1C69-48F8-B0C3-B2B27AFA92FA&amp;lt;/ref&amp;gt;.&lt;br /&gt;
&lt;br /&gt;
Так же функция Якоби реализована в пакете Matlab.&lt;br /&gt;
&lt;br /&gt;
Т. к. алгоритм считается медленным, он не включен во многие известные пакеты.&lt;br /&gt;
&lt;br /&gt;
== Литература ==&lt;br /&gt;
1. Дж. Деммель Вычислительная линейная алгебра. Изд. Мир, 2001.&lt;/div&gt;</summary>
		<author><name>Davletshuna Alexandra</name></author>
	</entry>
	<entry>
		<id>https://xn--80aecvaldz.xn--80ahdrnmvk.xn--p1ai/w/ru/index.php?title=%D0%A3%D1%87%D0%B0%D1%81%D1%82%D0%BD%D0%B8%D0%BA:Davletshuna_Alexandra/%D0%9C%D0%B5%D1%82%D0%BE%D0%B4_%D0%AF%D0%BA%D0%BE%D0%B1%D0%B8_%D0%B2%D1%8B%D1%87%D0%B8%D1%81%D0%BB%D0%B5%D0%BD%D0%B8%D1%8F_%D1%81%D0%B8%D0%BD%D0%B3%D1%83%D0%BB%D1%8F%D1%80%D0%BD%D1%8B%D1%85_%D1%87%D0%B8%D1%81%D0%B5%D0%BB_%D0%B8_%D0%B2%D0%B5%D0%BA%D1%82%D0%BE%D1%80%D0%BE%D0%B2&amp;diff=18563</id>
		<title>Участник:Davletshuna Alexandra/Метод Якоби вычисления сингулярных чисел и векторов</title>
		<link rel="alternate" type="text/html" href="https://xn--80aecvaldz.xn--80ahdrnmvk.xn--p1ai/w/ru/index.php?title=%D0%A3%D1%87%D0%B0%D1%81%D1%82%D0%BD%D0%B8%D0%BA:Davletshuna_Alexandra/%D0%9C%D0%B5%D1%82%D0%BE%D0%B4_%D0%AF%D0%BA%D0%BE%D0%B1%D0%B8_%D0%B2%D1%8B%D1%87%D0%B8%D1%81%D0%BB%D0%B5%D0%BD%D0%B8%D1%8F_%D1%81%D0%B8%D0%BD%D0%B3%D1%83%D0%BB%D1%8F%D1%80%D0%BD%D1%8B%D1%85_%D1%87%D0%B8%D1%81%D0%B5%D0%BB_%D0%B8_%D0%B2%D0%B5%D0%BA%D1%82%D0%BE%D1%80%D0%BE%D0%B2&amp;diff=18563"/>
		<updated>2016-11-20T08:47:35Z</updated>

		<summary type="html">&lt;p&gt;Davletshuna Alexandra: /* Масштабируемость алгоритма и его реализации */&lt;/p&gt;
&lt;hr /&gt;
&lt;div&gt;{{algorithm&lt;br /&gt;
| name              = Метод Якоби вычисления сингулярных чисел и векторов&lt;br /&gt;
| serial_complexity = &amp;lt;math&amp;gt;O(n^3)&amp;lt;/math&amp;gt;&lt;br /&gt;
| pf_height         = &amp;lt;math&amp;gt;O(n^2)&amp;lt;/math&amp;gt;&lt;br /&gt;
| pf_width          = &amp;lt;math&amp;gt;O(n)&amp;lt;/math&amp;gt;&lt;br /&gt;
| input_data        = &amp;lt;math&amp;gt;n^2&amp;lt;/math&amp;gt;&lt;br /&gt;
| output_data       = &amp;lt;math&amp;gt;2n^2 + n&amp;lt;/math&amp;gt;&lt;br /&gt;
}}&lt;br /&gt;
&lt;br /&gt;
Авторы статьи: [[Участница:Davletshuna Alexandra|Давлетшина Александра]] (группа 619); [[Участница:Alek sandra|Зайцева Александра]]. Вклад каждого участника считать равноценным.&lt;br /&gt;
&lt;br /&gt;
== Свойства и структура алгоритма ==&lt;br /&gt;
&lt;br /&gt;
=== Общее описание алгоритма ===&lt;br /&gt;
&#039;&#039;&#039;Сингулярным разложением&#039;&#039;&#039; называется разложение прямоугольной вещественной или комплексной матрицы, имеющее широкое применение, в силу своей наглядной геометрической интерпретации, при решении многих прикладных задач. Сингулярное разложение матрицы А позволяет вычислять сингулярные числа данной матрицы, а также, левые и правые сингулярные векторы матрицы А:&lt;br /&gt;
&lt;br /&gt;
•	левые сингулярные векторы матрицы А — это собственные векторы матрицы &amp;lt;math&amp;gt;AA^*&amp;lt;/math&amp;gt;;&lt;br /&gt;
&lt;br /&gt;
•	правые сингулярные векторы матрицы A — это собственные векторы матрицы &amp;lt;math&amp;gt;A^*A&amp;lt;/math&amp;gt;.&lt;br /&gt;
&lt;br /&gt;
Геометрическая интерпретация сингулярного разложения заключается в следующем факте из геометрии: &#039;&#039;Образом любого линейного преобразования, заданного с помощью матрицы &amp;lt;math&amp;gt;m&amp;lt;/math&amp;gt;x&amp;lt;math&amp;gt;n&amp;lt;/math&amp;gt;, примененного к единичной сфере является гиперэллипсоид&#039;&#039;.&lt;br /&gt;
&lt;br /&gt;
Из многочисленных разложений матриц, наиболее удобным является сингулярное разложение матрицы в виде: &amp;lt;math&amp;gt;A=U\Sigma V^*&amp;lt;/math&amp;gt;, где &amp;lt;math&amp;gt;U, V&amp;lt;/math&amp;gt; – унитарные матрицы, а &amp;lt;math&amp;gt;\Sigma&amp;lt;/math&amp;gt; – диагональная матрица с вещественными положительными числами на диагонали &amp;lt;ref&amp;gt;http://algorithms.parallel.ru/&amp;lt;/ref&amp;gt;.&lt;br /&gt;
&lt;br /&gt;
Диагональные элементы матрицы &amp;lt;math&amp;gt;\Sigma&amp;lt;/math&amp;gt; называются сингулярными числами матрицы &amp;lt;math&amp;gt;A&amp;lt;/math&amp;gt;, а столбцы матриц &amp;lt;math&amp;gt;U,V&amp;lt;/math&amp;gt; левыми и правыми сингулярными векторами соответственно.&lt;br /&gt;
&lt;br /&gt;
Алгоритм Якоби сингулярного разложения матрицы был предложен одним из первых в 1846 году. Он приводит прямоугольную матрицу к диагональной матрице с помощью последовательности элементарных вращений. Метод может найти все сингулярные значения с очень высокой точностью. Однако его производительность является довольно низкой, в сравнении с конкурирующими методами.&lt;br /&gt;
&lt;br /&gt;
&#039;&#039;Неявный&#039;&#039;&amp;lt;ref&amp;gt;Дж. Деммель «Вычислительная линейная алгебра» (стр. 261-264)&amp;lt;/ref&amp;gt; метод Якоби математически эквивалентен применению метода Якоби вычисления собственных значений к матрице &amp;lt;math&amp;gt;A = G^TG&amp;lt;/math&amp;gt;.&lt;br /&gt;
Это значит, что на каждом шаге вычисляется вращение Якоби &amp;lt;math&amp;gt;J&amp;lt;/math&amp;gt;, с помощью которого матрица &amp;lt;math&amp;gt;G^TG&amp;lt;/math&amp;gt; неявно пересчитывется в &amp;lt;math&amp;gt;J^TG^TGJ&amp;lt;/math&amp;gt;; вращение выбрано так, чтобы пара внедиагональных элементов из &amp;lt;math&amp;gt;G^TG&amp;lt;/math&amp;gt; обратилась в нули в матрице &amp;lt;math&amp;gt;J^TG^TGJ&amp;lt;/math&amp;gt;. При этом ни &amp;lt;math&amp;gt;G^TG&amp;lt;/math&amp;gt;, ни &amp;lt;math&amp;gt;J^TG^TGJ&amp;lt;/math&amp;gt; не вычисляются в явном виде; вместо них вычисляется матрица &amp;lt;math&amp;gt;GJ&amp;lt;/math&amp;gt;. Поэтому алгоритм называется &#039;&#039;методом односторонних вращений&#039;&#039;.&lt;br /&gt;
&lt;br /&gt;
=== Математическое описание алгоритма ===&lt;br /&gt;
Исходные данные: матрица &amp;lt;math&amp;gt;G&amp;lt;/math&amp;gt; (элементы &amp;lt;math&amp;gt;g_{ij}, i, j = 1, \ldots, n&amp;lt;/math&amp;gt;).&lt;br /&gt;
&lt;br /&gt;
Вычисляемые данные: матрица &amp;lt;math&amp;gt;\Sigma = diag(\sigma_{i})&amp;lt;/math&amp;gt;, где &amp;lt;math&amp;gt;\sigma_{i}&amp;lt;/math&amp;gt; - сингулярные числа, &amp;lt;math&amp;gt;U&amp;lt;/math&amp;gt; - матрица левых сингулярных векторов, &amp;lt;math&amp;gt;V&amp;lt;/math&amp;gt; - матрица правых сингулярных векторов.&lt;br /&gt;
&lt;br /&gt;
симметричную матрицу &amp;lt;math&amp;gt;A = (G^TG)&amp;lt;/math&amp;gt; можно привести к диагональному виду:&lt;br /&gt;
&amp;lt;math&amp;gt;RG^TGR^T&amp;lt;/math&amp;gt;, где&lt;br /&gt;
&lt;br /&gt;
&amp;lt;math&amp;gt;&lt;br /&gt;
R(j,k,\theta) = &lt;br /&gt;
\begin{matrix}&lt;br /&gt;
  \\&lt;br /&gt;
  \\&lt;br /&gt;
  \\&lt;br /&gt;
j \\&lt;br /&gt;
  \\&lt;br /&gt;
k \\&lt;br /&gt;
  \\&lt;br /&gt;
  \\&lt;br /&gt;
  \\&lt;br /&gt;
\end{matrix}&lt;br /&gt;
&amp;lt;/math&amp;gt;  &lt;br /&gt;
&amp;lt;math&amp;gt;&lt;br /&gt;
\begin{bmatrix}&lt;br /&gt;
  &amp;amp; 1 &amp;amp;   &amp;amp;        &amp;amp;              &amp;amp;        &amp;amp;               &amp;amp;         &amp;amp;    &amp;amp;   \\&lt;br /&gt;
  &amp;amp;   &amp;amp; 1 &amp;amp;        &amp;amp;              &amp;amp;        &amp;amp;               &amp;amp;         &amp;amp;    &amp;amp;   \\&lt;br /&gt;
  &amp;amp;   &amp;amp;   &amp;amp; \ddots &amp;amp;              &amp;amp;        &amp;amp;               &amp;amp;         &amp;amp;    &amp;amp;   \\&lt;br /&gt;
  &amp;amp;   &amp;amp;   &amp;amp;        &amp;amp; \cos(\theta) &amp;amp;        &amp;amp; -\sin(\theta) &amp;amp;         &amp;amp;    &amp;amp;   \\&lt;br /&gt;
  &amp;amp;   &amp;amp;   &amp;amp;        &amp;amp;              &amp;amp; \ddots &amp;amp;               &amp;amp;         &amp;amp;    &amp;amp;   \\&lt;br /&gt;
  &amp;amp;   &amp;amp;   &amp;amp;        &amp;amp; \sin(\theta) &amp;amp;        &amp;amp; \cos(\theta)  &amp;amp;         &amp;amp;    &amp;amp;   \\&lt;br /&gt;
  &amp;amp;   &amp;amp;   &amp;amp;        &amp;amp;              &amp;amp;        &amp;amp;               &amp;amp; \ddots  &amp;amp;    &amp;amp;   \\&lt;br /&gt;
  &amp;amp;   &amp;amp;   &amp;amp;        &amp;amp;              &amp;amp;        &amp;amp;               &amp;amp;         &amp;amp; 1  &amp;amp;   \\&lt;br /&gt;
  &amp;amp;   &amp;amp;   &amp;amp;        &amp;amp;              &amp;amp;        &amp;amp;               &amp;amp;         &amp;amp;    &amp;amp; 1 \\&lt;br /&gt;
\end{bmatrix}&lt;br /&gt;
&amp;lt;/math&amp;gt;&lt;br /&gt;
&lt;br /&gt;
Обозначим &amp;lt;math&amp;gt;s = \sin \theta&amp;lt;/math&amp;gt; и &amp;lt;math&amp;gt;c = \cos \theta&amp;lt;/math&amp;gt;.&lt;br /&gt;
&lt;br /&gt;
Перемножив матрицы &amp;lt;math&amp;gt;RG^TGR^T&amp;lt;/math&amp;gt;, получим следующие выражения&amp;lt;ref&amp;gt;http://www.astro.tsu.ru/OsChMet/5_2.html&amp;lt;/ref&amp;gt;:&lt;br /&gt;
&lt;br /&gt;
&amp;lt;math&amp;gt;\begin{align}&lt;br /&gt;
 a_{jj}^{(i+1)} &amp;amp;= c^2\, a_{jj}^{(i)}  -  2\, s c \,a_{jk}^{(i)}  +  s^2\, a_{kk}^{(i)} \\&lt;br /&gt;
 a_{kk}^{(i+1)} &amp;amp;= s^2 \,a_{jj}^{(i)}  +  2 s c\, a_{jk}^{(i)}  +  c^2 \, a_{kk}^{(i)} \\&lt;br /&gt;
 a_{jk}^{(i+1)} &amp;amp;= a_{kj}^{(i+1)} = (c^2 - s^2 ) \, a_{jk}^{(i)}  +  s c \, (a_{kk}^{(i)} - a_{jj}^{(i)} ) \\&lt;br /&gt;
 a_{jm}^{(i+1)} &amp;amp;= a_{mj}^{(i+1)} = c \, a_{jm}^{(i)}  -  s \, a_{km}^{(i)} &amp;amp; m \ne j,k \\&lt;br /&gt;
 a_{km}^{(i+1)} &amp;amp;= a_{mk}^{(i+1)} = s \, a_{jm}^{(i)}  + c \, a_{km}^{(i)} &amp;amp; m \ne j,k \\&lt;br /&gt;
 a_{ml}^{(i+1)} &amp;amp;= a_{ml}^{(i)} &amp;amp;m,l \ne j,k&lt;br /&gt;
\end{align}&amp;lt;/math&amp;gt;&lt;br /&gt;
&lt;br /&gt;
Т.к внедиагональные элементы должны быть равны 0, то выбираем &amp;lt;math&amp;gt;\theta&amp;lt;/math&amp;gt; так, чтобы &amp;lt;math&amp;gt;a_{jk}^{(i+1)} = 0&amp;lt;/math&amp;gt; и &amp;lt;math&amp;gt;a_{kj}^{(i+1)} = 0&amp;lt;/math&amp;gt;.&lt;br /&gt;
&lt;br /&gt;
Тогда решая уравнение получаем, что&lt;br /&gt;
&lt;br /&gt;
&amp;lt;math&amp;gt;&lt;br /&gt;
         \begin{align}&lt;br /&gt;
         \tau &amp;amp;= ({a_{jj} - a_{kk}})/{2a_{jk}} \\&lt;br /&gt;
         t &amp;amp;= {sign(\tau)}/(|\tau| + \sqrt{1 + \tau^2}) \\&lt;br /&gt;
         c &amp;amp;= 1/(\sqrt{1 + t^2}) \\&lt;br /&gt;
         s &amp;amp;= ct \\&lt;br /&gt;
         \end{align}&amp;lt;/math&amp;gt;&lt;br /&gt;
&lt;br /&gt;
Остановка вычислений алгоритма наступает, когда внедиагональные элементы становятся меньше некоторого наперед заданного числа &amp;lt;math&amp;gt;\varepsilon&amp;lt;/math&amp;gt;.&lt;br /&gt;
&lt;br /&gt;
=== Вычислительное ядро алгоритма ===&lt;br /&gt;
Вычислительное ядро алгоритма составляет непосредственно вычисление одностороннего вращения Якоби, т.е. вычисление элементов матрицы &amp;lt;math&amp;gt;g_{jm}^{(i+1)} = g_{mj}^{(i+1)}&amp;lt;/math&amp;gt; и &amp;lt;math&amp;gt;g_{km}^{(i+1)} = g_{mk}^{(i+1)}&amp;lt;/math&amp;gt;, &amp;lt;math&amp;gt;m \ne j,k&amp;lt;/math&amp;gt;, а также вычисления элементов &amp;lt;math&amp;gt;g_{jj}^{(i+1)} &amp;lt;/math&amp;gt; и &amp;lt;math&amp;gt;g_{kk}^{(i+1)} &amp;lt;/math&amp;gt;, получившихся после умножения промежуточной матрицы на матрицу вращений Якоби:&lt;br /&gt;
&lt;br /&gt;
&amp;lt;math&amp;gt;\begin{align}&lt;br /&gt;
 g_{jj}^{(i+1)} &amp;amp;= c^2\, g_{jj}^{(i)}  -  2\, s c \,g_{jk}^{(i)}  +  s^2\, g_{kk}^{(i)} \\&lt;br /&gt;
 g_{kk}^{(i+1)} &amp;amp;= s^2 \,g_{jj}^{(i)}  +  2 s c\, g_{jk}^{(i)}  +  c^2 \, g_{kk}^{(i)} \\&lt;br /&gt;
 g_{jk}^{(i+1)} &amp;amp;= g_{kj}^{(i+1)} = (c^2 - s^2 ) \, g_{jk}^{(i)}  +  s c \, (g_{kk}^{(i)} - g_{jj}^{(i)} ) \\&lt;br /&gt;
 g_{jm}^{(i+1)} &amp;amp;= g_{mj}^{(i+1)} = c \, g_{jm}^{(i)}  -  s \, g_{km}^{(i)} &amp;amp; m \ne j,k \\&lt;br /&gt;
 g_{km}^{(i+1)} &amp;amp;= g_{mk}^{(i+1)} = s \, g_{jm}^{(i)}  + c \, g_{km}^{(i)} &amp;amp; m \ne j,k \\&lt;br /&gt;
 g_{ml}^{(i+1)} &amp;amp;= g_{ml}^{(i)} &amp;amp;m,l \ne j,k&lt;br /&gt;
\end{align}&amp;lt;/math&amp;gt;&lt;br /&gt;
&lt;br /&gt;
=== Макроструктура алгоритма ===&lt;br /&gt;
Основную часть метода составляет процедура односторонних вращений матрицы, которая в свою очередь состоит из:&lt;br /&gt;
&lt;br /&gt;
#Вычисление &amp;lt;math&amp;gt;\tau, c, s, t&amp;lt;/math&amp;gt;.&lt;br /&gt;
#Одностороннее вращение матрицы. &lt;br /&gt;
&lt;br /&gt;
Что требует &amp;lt;math&amp;gt;O(n)&amp;lt;/math&amp;gt; операций.&lt;br /&gt;
&lt;br /&gt;
После этого необходимо:&lt;br /&gt;
&lt;br /&gt;
#Вычислить сингулярные числа &amp;lt;math&amp;gt;\sigma_i&amp;lt;/math&amp;gt;.  Что требует &amp;lt;math&amp;gt;O(n)&amp;lt;/math&amp;gt; операций.&lt;br /&gt;
#Вычислить &amp;lt;math&amp;gt;U&amp;lt;/math&amp;gt; и &amp;lt;math&amp;gt;V&amp;lt;/math&amp;gt;. Что требует &amp;lt;math&amp;gt;O(n^2)&amp;lt;/math&amp;gt; операций.&lt;br /&gt;
&lt;br /&gt;
=== Схема реализации последовательного алгоритма ===&lt;br /&gt;
Применение метода Якоби к матрице &amp;lt;math&amp;gt;A = (G^TG)&amp;lt;/math&amp;gt; можно описать следующим образом&amp;lt;ref&amp;gt;Дж. Деммель «Вычислительная линейная алгебра» (стр. 261-263)&amp;lt;/ref&amp;gt;:&lt;br /&gt;
&lt;br /&gt;
Если &amp;lt;math&amp;gt;G = U\Sigma V^T&amp;lt;/math&amp;gt; и &amp;lt;math&amp;gt;\Sigma = diag(\sigma_{i})&amp;lt;/math&amp;gt;, то алгоритм вычисляет сингулярные числа &amp;lt;math&amp;gt;\sigma_{i}&amp;lt;/math&amp;gt;, матрицу &amp;lt;math&amp;gt;U&amp;lt;/math&amp;gt; левых сингулярных векторов и матрицу &amp;lt;math&amp;gt;V&amp;lt;/math&amp;gt; правых сингулярных векторов по следующей схеме:&lt;br /&gt;
&lt;br /&gt;
 repeat&lt;br /&gt;
     for &amp;lt;math&amp;gt;j=1&amp;lt;/math&amp;gt; to &amp;lt;math&amp;gt;n-1&amp;lt;/math&amp;gt;&lt;br /&gt;
         for &amp;lt;math&amp;gt;k=j+1&amp;lt;/math&amp;gt; to &amp;lt;math&amp;gt;n&amp;lt;/math&amp;gt;&lt;br /&gt;
             обратиться к процедуре &#039;&#039;&#039;&#039;&#039;One-Sided-Jacobi-Rotation&amp;lt;math&amp;gt;(G,j,k)&amp;lt;/math&amp;gt;&#039;&#039;&#039;&#039;&#039;&lt;br /&gt;
         end for&lt;br /&gt;
     end for&lt;br /&gt;
 пока &amp;lt;math&amp;gt;G^TG&amp;lt;/math&amp;gt; не станет достаточно близка к диагональной матрице&lt;br /&gt;
 Положить &amp;lt;math&amp;gt;\sigma_{i} = ||G(:,i)||_2 &amp;lt;/math&amp;gt; (норма &amp;lt;math&amp;gt;i&amp;lt;/math&amp;gt;-го столбца в &amp;lt;math&amp;gt;G&amp;lt;/math&amp;gt;)&lt;br /&gt;
 Положить &amp;lt;math&amp;gt;U = [u_{1},\dots, u_{n}]&amp;lt;/math&amp;gt;, где &amp;lt;math&amp;gt;u_{i} = G(:,i)/\sigma_{i}&amp;lt;/math&amp;gt;&lt;br /&gt;
 Положить &amp;lt;math&amp;gt;V = J&amp;lt;/math&amp;gt;, где &amp;lt;math&amp;gt;J&amp;lt;/math&amp;gt; - накопленное произведение вращений Якоби.&lt;br /&gt;
&lt;br /&gt;
Где процедура &#039;&#039;&#039;&#039;&#039;One-Sided-Jacobi-Rotation&#039;&#039;&#039;&#039;&#039; является метод односторонних вращений Якоби:&lt;br /&gt;
&lt;br /&gt;
 proc &#039;&#039;&#039;&#039;&#039;One-Sided-Jacobi-Rotation&amp;lt;math&amp;gt;(G,j,k)&amp;lt;/math&amp;gt;&#039;&#039;&#039;&#039;&#039;&lt;br /&gt;
     вычислить &amp;lt;math&amp;gt;a_{jj} = (G^TG)_{jj}, a_{jk} = (G^TG)_{jk}&amp;lt;/math&amp;gt; и &amp;lt;math&amp;gt;a_{kk} = (G^TG)_{kk}&amp;lt;/math&amp;gt;&lt;br /&gt;
     if &amp;lt;math&amp;gt;|a_{jk}|&amp;lt;/math&amp;gt; не слишком мал&lt;br /&gt;
         &amp;lt;math&amp;gt;&lt;br /&gt;
         \begin{align}&lt;br /&gt;
         \tau &amp;amp;= ({a_{jj} - a_{kk}})/{2a_{jk}} \\&lt;br /&gt;
         t &amp;amp;= {sign(\tau)}/(|\tau| + \sqrt{1 + \tau^2}) \\&lt;br /&gt;
         c &amp;amp;= 1/(\sqrt{1 + t^2}) \\&lt;br /&gt;
         s &amp;amp;= ct \\&lt;br /&gt;
         G &amp;amp;= GR(j,k,\theta) \  \dots c=cos\theta, s=sin\theta \end{align}&amp;lt;/math&amp;gt;&lt;br /&gt;
         if нужны правые сингулярные векторы &lt;br /&gt;
             &amp;lt;math&amp;gt;J = JR(j,k,\theta)&amp;lt;/math&amp;gt;&lt;br /&gt;
         end if&lt;br /&gt;
     end if&lt;br /&gt;
&lt;br /&gt;
=== Последовательная сложность алгоритма ===&lt;br /&gt;
Для одного вращения Якоби необходимо выполнить &amp;lt;math&amp;gt;O(n)&amp;lt;/math&amp;gt; операций умножения и сложения. &lt;br /&gt;
&lt;br /&gt;
Всего вариантов выбора &amp;lt;math&amp;gt;j&amp;lt;/math&amp;gt; и &amp;lt;math&amp;gt;k&amp;lt;/math&amp;gt; существует &amp;lt;math&amp;gt;\frac{n(n-1)}{2}&amp;lt;/math&amp;gt;.&lt;br /&gt;
&lt;br /&gt;
Таким образом последовательный алгоритм Якоби вычисления сингулярных чисел и векторов является алгоритмом с кубической сложностью.&lt;br /&gt;
&lt;br /&gt;
=== Информационный граф ===&lt;br /&gt;
Граф алгоритма состоит из четырех групп вершин&lt;br /&gt;
&lt;br /&gt;
(А)Первая группа вершин расположена в двумерной области, соответствующая ей операция - вычисление элементов &amp;lt;math&amp;gt;a_{jj},a_{jk},a_{kk}&amp;lt;/math&amp;gt; матрицы произведения &amp;lt;math&amp;gt;A = (G^TG)&amp;lt;/math&amp;gt;. Где &amp;lt;math&amp;gt;j&amp;lt;/math&amp;gt; изменяется от &amp;lt;math&amp;gt;1&amp;lt;/math&amp;gt; до &amp;lt;math&amp;gt;n-1&amp;lt;/math&amp;gt;, принимая все целочисленные значения, &amp;lt;math&amp;gt;k&amp;lt;/math&amp;gt;  изменяется от &amp;lt;math&amp;gt;j+1&amp;lt;/math&amp;gt; до &amp;lt;math&amp;gt;n&amp;lt;/math&amp;gt;, принимая все целочисленные значения.&lt;br /&gt;
&lt;br /&gt;
Граф вычисления каждого из элементов приведен на рисунке 1, где значениям &amp;lt;math&amp;gt;g_{ij}&amp;lt;/math&amp;gt; соответствуют обозначения &amp;lt;math&amp;gt;x_{ij}&amp;lt;/math&amp;gt;, а элементам &amp;lt;math&amp;gt;g^T_{ij}&amp;lt;/math&amp;gt; обозначения &amp;lt;math&amp;gt;z_{ij}&amp;lt;/math&amp;gt;. Значение &amp;lt;math&amp;gt;s_{ij}&amp;lt;/math&amp;gt; является значением результирующего элемента.&lt;br /&gt;
&lt;br /&gt;
(Б)Вторая группа вершин расположена в двумерной области, соответствующая ей операция – вычисление &amp;lt;math&amp;gt;c&amp;lt;/math&amp;gt; и &amp;lt;math&amp;gt;s&amp;lt;/math&amp;gt;.&lt;br /&gt;
&lt;br /&gt;
Информационный граф с входными и выходными данными вычисления пункта (Б) представлен на рисунке 2.&lt;br /&gt;
&lt;br /&gt;
(В)Третья группа вершин расположена в двумерной области, соответствующая ей операция вычисление значений элементов &amp;lt;math&amp;gt;g_{jm}^{(i+1)} = g_{mj}^{(i+1)}&amp;lt;/math&amp;gt; и &amp;lt;math&amp;gt;g_{km}^{(i+1)} = g_{mk}^{(i+1)}&amp;lt;/math&amp;gt;, &amp;lt;math&amp;gt;m \ne j,k&amp;lt;/math&amp;gt;.&lt;br /&gt;
&lt;br /&gt;
(Г)Четвертая группа вершин расположена в двумерной области, соответствующая ей операция вычисление значений элементов &amp;lt;math&amp;gt;g_{jj}^{(i+1)} &amp;lt;/math&amp;gt; и &amp;lt;math&amp;gt;g_{kk}^{(i+1)} &amp;lt;/math&amp;gt;.&lt;br /&gt;
&lt;br /&gt;
Элементы групп (В) и (Г) вычисляются аналогично вычислению элементов матрицы произведения, т.к. фактически представляют собой перемножение матриц &amp;lt;math&amp;gt;G&amp;lt;/math&amp;gt; и &amp;lt;math&amp;gt;R&amp;lt;/math&amp;gt;&lt;br /&gt;
&lt;br /&gt;
[[File:Jacobi_2.jpg|none|thumb|1000px|Рисунок 1. Информационный граф с входными и выходными параметрами вычисления каждого элемента матрицы произведения.]]&lt;br /&gt;
&lt;br /&gt;
[[File:Jacobi_1.jpg|none|thumb|1000px|Рисунок 2. Информационный граф с входными и выходными параметрами вычисления значений &amp;lt;math&amp;gt;c&amp;lt;/math&amp;gt; и &amp;lt;math&amp;gt;s&amp;lt;/math&amp;gt;.]]&lt;br /&gt;
&lt;br /&gt;
Обобщенный граф метода Якоби представлен на рисунке 3, где буквами А, Б, В и Г обозначено вычисление групп вершин (А), (Б), (В) и (Г).&lt;br /&gt;
&lt;br /&gt;
[[File:Graf21.png|none|thumb|2000px|Рисунок 3. Обобщенный граф алгоритма вычисления сингулярных чисел и векторов методом Якоби.]]&lt;br /&gt;
&lt;br /&gt;
=== Ресурс параллелизма алгоритма ===&lt;br /&gt;
Для выполнения одной итерации метода Якоби требуется последовательно выполнить несколько ярусов:&lt;br /&gt;
# вычислить &amp;lt;math&amp;gt;\tau&amp;lt;/math&amp;gt; &lt;br /&gt;
# вычислить &amp;lt;math&amp;gt;t&amp;lt;/math&amp;gt; &lt;br /&gt;
# вычислить &amp;lt;math&amp;gt;c&amp;lt;/math&amp;gt; &lt;br /&gt;
# вычислить &amp;lt;math&amp;gt;s&amp;lt;/math&amp;gt;&lt;br /&gt;
# выполнить поворот матрицы &amp;lt;math&amp;gt;G&amp;lt;/math&amp;gt; с параллельным выполнением &amp;lt;math&amp;gt;2(n-2)&amp;lt;/math&amp;gt; операций вычисления элементов матрицы &amp;lt;math&amp;gt;g_{jm}^{(i+1)} = g_{mj}^{(i+1)}&amp;lt;/math&amp;gt; и &amp;lt;math&amp;gt;g_{km}^{(i+1)} = g_{mk}^{(i+1)}&amp;lt;/math&amp;gt;, &amp;lt;math&amp;gt;m \ne j,k&amp;lt;/math&amp;gt;, а также вычисления элементов &amp;lt;math&amp;gt;g_{jj}^{(i+1)} &amp;lt;/math&amp;gt; и &amp;lt;math&amp;gt;g_{kk}^{(i+1)} &amp;lt;/math&amp;gt;. &lt;br /&gt;
&lt;br /&gt;
Суммарное количество итераций равно &amp;lt;math&amp;gt;\frac{n(n-1)}{2}&amp;lt;/math&amp;gt; (Различные варианты выбора &amp;lt;math&amp;gt;j&amp;lt;/math&amp;gt; и &amp;lt;math&amp;gt;k&amp;lt;/math&amp;gt;). &lt;br /&gt;
&lt;br /&gt;
Асимптотически метод сходится квадратично. &lt;br /&gt;
&lt;br /&gt;
Таким образом, при классификации по высоте ЯПФ метод Якоби относится к алгоритмам со сложностью &amp;lt;math&amp;gt;O(n^2)&amp;lt;/math&amp;gt;&amp;amp;nbsp;, а при классификации по ширине ЯПФ — к алгоритмам со сложностью &amp;lt;math&amp;gt;O(n)&amp;lt;/math&amp;gt;.&lt;br /&gt;
&lt;br /&gt;
=== Входные и выходные данные алгоритма ===&lt;br /&gt;
&#039;&#039;&#039;Входные данные&#039;&#039;&#039;: плотная матрица &amp;lt;math&amp;gt;G&amp;lt;/math&amp;gt; размера &amp;lt;math&amp;gt;n&amp;lt;/math&amp;gt;х&amp;lt;math&amp;gt;n&amp;lt;/math&amp;gt;, где &amp;lt;math&amp;gt;A= G^TG&amp;lt;/math&amp;gt; – симметрическая матрица.&lt;br /&gt;
&lt;br /&gt;
&#039;&#039;&#039;Объём входных данных&#039;&#039;&#039;: &amp;lt;math&amp;gt;n^2&amp;lt;/math&amp;gt; (т.к. для хранения матрицы &amp;lt;math&amp;gt;G&amp;lt;/math&amp;gt; используем двумерный массив размера &amp;lt;math&amp;gt;n&amp;lt;/math&amp;gt;х&amp;lt;math&amp;gt;n&amp;lt;/math&amp;gt;)&lt;br /&gt;
&lt;br /&gt;
&#039;&#039;&#039;Выходные данные&#039;&#039;&#039;: &amp;lt;math&amp;gt;\sigma_{i}&amp;lt;/math&amp;gt;  - сингулярные числа, матрица &amp;lt;math&amp;gt;U&amp;lt;/math&amp;gt; левых сингулярных векторов и матрица &amp;lt;math&amp;gt;V&amp;lt;/math&amp;gt; правых сингулярных векторов.&lt;br /&gt;
&lt;br /&gt;
&#039;&#039;&#039;Объём выходных данных&#039;&#039;&#039;: &amp;lt;math&amp;gt;2n^2 + n&amp;lt;/math&amp;gt; (т.к. необходимо хранить вектор сингулярных чисел длины &amp;lt;math&amp;gt;n&amp;lt;/math&amp;gt;, а также две матрицы &amp;lt;math&amp;gt;U, V&amp;lt;/math&amp;gt; левых и правых сингулярных векторов размера &amp;lt;math&amp;gt;n&amp;lt;/math&amp;gt;х&amp;lt;math&amp;gt;n&amp;lt;/math&amp;gt;).&lt;br /&gt;
&lt;br /&gt;
=== Свойства алгоритма ===&lt;br /&gt;
Метод Якоби является самым медленным из имеющихся алгоритмов вычисления сингулярных чисел и сингулярных векторов матрицы. Тем не менее, для  матриц &amp;lt;math&amp;gt;G&amp;lt;/math&amp;gt;, которые могут быть представлены в виде &amp;lt;math&amp;gt;G=DX&amp;lt;/math&amp;gt;, где &amp;lt;math&amp;gt;D&amp;lt;/math&amp;gt; - диагональная, а &amp;lt;math&amp;gt;X&amp;lt;/math&amp;gt; - хорошо обусловлена, он способен вычислять сингулярные числа и вектора намного точнее, чем другие методы&amp;lt;ref&amp;gt;Дж. Деммель «Вычислительная линейная алгебра» (стр. 261-264)&amp;lt;/ref&amp;gt;. &lt;br /&gt;
&lt;br /&gt;
Вычислительная мощность алгоритма, как отношение числа операций к суммарному объему входных и выходных данных является линейной.&lt;br /&gt;
&lt;br /&gt;
Метод Якоби не детерминирован, так как является итерационным алгоритмом с выходом по точности (число итераций зависит от входных данных и порогового значения).&lt;br /&gt;
&lt;br /&gt;
== Программная реализация алгоритма ==&lt;br /&gt;
&lt;br /&gt;
=== Особенности реализации последовательного алгоритма ===&lt;br /&gt;
&lt;br /&gt;
=== Локальность данных и вычислений ===&lt;br /&gt;
&lt;br /&gt;
=== Возможные способы и особенности параллельной реализации алгоритма ===&lt;br /&gt;
&lt;br /&gt;
=== Масштабируемость алгоритма и его реализации ===&lt;br /&gt;
Исследование масштабируемости параллельной реализации метода Якоби вычисления сингулярных чисел и векторов проводилось на тестовой средe суперкомпьютера &amp;quot;Ломоносов&amp;quot;, с использованием компилятора ICC и библиотеки impi/4.0.3. Алгоритм реализован на языке программирования C с использованием механизмов MPI.&lt;br /&gt;
&lt;br /&gt;
Алгоритм работает по следующей схеме:&lt;br /&gt;
#На вход всем процессорам подается матрица &amp;lt;math&amp;gt; G &amp;lt;/math&amp;gt;.&lt;br /&gt;
#Для всех &amp;lt;math&amp;gt; j &amp;lt;/math&amp;gt; и &amp;lt;math&amp;gt; k &amp;lt;/math&amp;gt; таких, что &amp;lt;math&amp;gt; j \in [1,n-1] &amp;lt;/math&amp;gt;, &amp;lt;math&amp;gt; k \in [j+1,n] &amp;lt;/math&amp;gt;&lt;br /&gt;
##Вычисляется элемент &amp;lt;math&amp;gt; a_{jk} &amp;lt;/math&amp;gt; путем перемножения матриц &amp;lt;math&amp;gt; G^TG &amp;lt;/math&amp;gt;, где на каждом процессоре вычисляется своя часть матрицы. После чего результат отправляется на все процессоры.&lt;br /&gt;
##Если полученный элемент оказывается больше некоторого значения, то начинается последовательная часть программы: Вычисление элементов &amp;lt;math&amp;gt; \tau, t, c, s &amp;lt;/math&amp;gt;.&lt;br /&gt;
##Затем, выполняется операция поворота, путем перемножения матриц &amp;lt;math&amp;gt; G &amp;lt;/math&amp;gt; и &amp;lt;math&amp;gt; R &amp;lt;/math&amp;gt;. Данная операция выполняется параллельно на нескольких процессорах, где каждый процессор вычисляет свою часть матрицы. После чего результат пересылается всем процессорам.&lt;br /&gt;
&lt;br /&gt;
Данная схема повторяется до тех пор, пока матрица &amp;lt;math&amp;gt; A = G^TG &amp;lt;/math&amp;gt; не станет достаточно близкой к диагональной.&lt;br /&gt;
&lt;br /&gt;
Для проверки этого факта, в конце каждой итерации цикла вычисляется матрица &amp;lt;math&amp;gt; A &amp;lt;/math&amp;gt;. Данная операция выполняется параллельно на нескольких процессорах, где каждый процессор вычисляет свою часть матрицы, после чего результат пересылается всем процессорам.&lt;br /&gt;
&lt;br /&gt;
&lt;br /&gt;
Набор и границы значений изменяемых параметров запуска реализации алгоритма: &lt;br /&gt;
&lt;br /&gt;
*	число процессоров [1 : 128] с шагом равным степени двойки;&lt;br /&gt;
*	размер матрицы [256 : 1792] с шагом 256.&lt;br /&gt;
&lt;br /&gt;
В результате проведённых экспериментов был получен следующий диапазон эффективности реализации алгоритма:&lt;br /&gt;
&lt;br /&gt;
*	минимальная эффективность реализации 0,01%;&lt;br /&gt;
*	максимальная эффективность реализации 16,52%.&lt;br /&gt;
&lt;br /&gt;
На следующих рисунках приведены графики производительности и эффективности выбранной реализации метода Якоби в зависимости от изменяемых параметров запуска.&lt;br /&gt;
&lt;br /&gt;
[[File:Performance.jpg|none|thumb|1000px|Рисунок 1. Параллельная реализация метода Якоби. Изменение производительности в зависимости от числа процессоров и размера матрицы.]]&lt;br /&gt;
&lt;br /&gt;
[[File:Эффективность.png|none|thumb|1000px|Рисунок 1. Параллельная реализация метода Якоби. Изменение эффективности в зависимости от числа процессоров и размера матрицы.]]&lt;br /&gt;
&lt;br /&gt;
Построим оценки масштабируемости данной реализации метода Якоби: &lt;br /&gt;
* По числу процессов: при увеличении числа процессов эффективность на рассмотренной области изменений параметров запуска сначала увеличивается (самый пик достигается при 16 процессах), а затем начинает снижаться. Это характеризуется тем, что накладные расходы на параллельное выполнение (общение между процессами) начинает превалировать над вычислениями.&lt;br /&gt;
&lt;br /&gt;
*По размеру задачи: при увеличении размера задачи эффективность возрастает. Это подтверждает предположение о том, что размер задачи сильно влияет на эффективность выполнения приложения. Оценка показывает, что с ростом размера задачи эффективность на рассмотренной области значений параметров запуска сильно увеличивается. &lt;br /&gt;
&lt;br /&gt;
*По двум направлениям: при рассмотрении увеличения как вычислительной сложности, так и числа процессов на всей рассмотренной области значений эффективность увеличивается, но медленно и с перепадами.&lt;br /&gt;
&lt;br /&gt;
[https://www.dropbox.com/home?preview=mainmpi.c Исследованная параллельная реализация метода Якоби]&lt;br /&gt;
&lt;br /&gt;
=== Динамические характеристики и эффективность реализации алгоритма ===&lt;br /&gt;
&lt;br /&gt;
=== Выводы для классов архитектур ===&lt;br /&gt;
&lt;br /&gt;
=== Существующие реализации алгоритма ===&lt;br /&gt;
Метод Якоби нахождения сингулярных значений и векторов реализован в таких пакетах, как LAPACK &amp;lt;ref&amp;gt;http://www.netlib.org/scalapack/slug/&amp;lt;/ref&amp;gt;, LINPACK/EISPACK &amp;lt;ref&amp;gt; http://www.netlib.org/linpack/ &amp;lt;/ref&amp;gt;, Intel MKL &amp;lt;ref&amp;gt;https://software.intel.com/ru-ru/node/521153#CAF8CA08-1C69-48F8-B0C3-B2B27AFA92FA&amp;lt;/ref&amp;gt;.&lt;br /&gt;
&lt;br /&gt;
Так же функция Якоби реализована в пакете Matlab.&lt;br /&gt;
&lt;br /&gt;
Т. к. алгоритм считается медленным, он не включен во многие известные пакеты.&lt;br /&gt;
&lt;br /&gt;
== Литература ==&lt;br /&gt;
1. Дж. Деммель Вычислительная линейная алгебра. Изд. Мир, 2001.&lt;/div&gt;</summary>
		<author><name>Davletshuna Alexandra</name></author>
	</entry>
	<entry>
		<id>https://xn--80aecvaldz.xn--80ahdrnmvk.xn--p1ai/w/ru/index.php?title=%D0%A3%D1%87%D0%B0%D1%81%D1%82%D0%BD%D0%B8%D0%BA:Davletshuna_Alexandra/%D0%9C%D0%B5%D1%82%D0%BE%D0%B4_%D0%AF%D0%BA%D0%BE%D0%B1%D0%B8_%D0%B2%D1%8B%D1%87%D0%B8%D1%81%D0%BB%D0%B5%D0%BD%D0%B8%D1%8F_%D1%81%D0%B8%D0%BD%D0%B3%D1%83%D0%BB%D1%8F%D1%80%D0%BD%D1%8B%D1%85_%D1%87%D0%B8%D1%81%D0%B5%D0%BB_%D0%B8_%D0%B2%D0%B5%D0%BA%D1%82%D0%BE%D1%80%D0%BE%D0%B2&amp;diff=18562</id>
		<title>Участник:Davletshuna Alexandra/Метод Якоби вычисления сингулярных чисел и векторов</title>
		<link rel="alternate" type="text/html" href="https://xn--80aecvaldz.xn--80ahdrnmvk.xn--p1ai/w/ru/index.php?title=%D0%A3%D1%87%D0%B0%D1%81%D1%82%D0%BD%D0%B8%D0%BA:Davletshuna_Alexandra/%D0%9C%D0%B5%D1%82%D0%BE%D0%B4_%D0%AF%D0%BA%D0%BE%D0%B1%D0%B8_%D0%B2%D1%8B%D1%87%D0%B8%D1%81%D0%BB%D0%B5%D0%BD%D0%B8%D1%8F_%D1%81%D0%B8%D0%BD%D0%B3%D1%83%D0%BB%D1%8F%D1%80%D0%BD%D1%8B%D1%85_%D1%87%D0%B8%D1%81%D0%B5%D0%BB_%D0%B8_%D0%B2%D0%B5%D0%BA%D1%82%D0%BE%D1%80%D0%BE%D0%B2&amp;diff=18562"/>
		<updated>2016-11-20T08:47:13Z</updated>

		<summary type="html">&lt;p&gt;Davletshuna Alexandra: /* Масштабируемость алгоритма и его реализации */&lt;/p&gt;
&lt;hr /&gt;
&lt;div&gt;{{algorithm&lt;br /&gt;
| name              = Метод Якоби вычисления сингулярных чисел и векторов&lt;br /&gt;
| serial_complexity = &amp;lt;math&amp;gt;O(n^3)&amp;lt;/math&amp;gt;&lt;br /&gt;
| pf_height         = &amp;lt;math&amp;gt;O(n^2)&amp;lt;/math&amp;gt;&lt;br /&gt;
| pf_width          = &amp;lt;math&amp;gt;O(n)&amp;lt;/math&amp;gt;&lt;br /&gt;
| input_data        = &amp;lt;math&amp;gt;n^2&amp;lt;/math&amp;gt;&lt;br /&gt;
| output_data       = &amp;lt;math&amp;gt;2n^2 + n&amp;lt;/math&amp;gt;&lt;br /&gt;
}}&lt;br /&gt;
&lt;br /&gt;
Авторы статьи: [[Участница:Davletshuna Alexandra|Давлетшина Александра]] (группа 619); [[Участница:Alek sandra|Зайцева Александра]]. Вклад каждого участника считать равноценным.&lt;br /&gt;
&lt;br /&gt;
== Свойства и структура алгоритма ==&lt;br /&gt;
&lt;br /&gt;
=== Общее описание алгоритма ===&lt;br /&gt;
&#039;&#039;&#039;Сингулярным разложением&#039;&#039;&#039; называется разложение прямоугольной вещественной или комплексной матрицы, имеющее широкое применение, в силу своей наглядной геометрической интерпретации, при решении многих прикладных задач. Сингулярное разложение матрицы А позволяет вычислять сингулярные числа данной матрицы, а также, левые и правые сингулярные векторы матрицы А:&lt;br /&gt;
&lt;br /&gt;
•	левые сингулярные векторы матрицы А — это собственные векторы матрицы &amp;lt;math&amp;gt;AA^*&amp;lt;/math&amp;gt;;&lt;br /&gt;
&lt;br /&gt;
•	правые сингулярные векторы матрицы A — это собственные векторы матрицы &amp;lt;math&amp;gt;A^*A&amp;lt;/math&amp;gt;.&lt;br /&gt;
&lt;br /&gt;
Геометрическая интерпретация сингулярного разложения заключается в следующем факте из геометрии: &#039;&#039;Образом любого линейного преобразования, заданного с помощью матрицы &amp;lt;math&amp;gt;m&amp;lt;/math&amp;gt;x&amp;lt;math&amp;gt;n&amp;lt;/math&amp;gt;, примененного к единичной сфере является гиперэллипсоид&#039;&#039;.&lt;br /&gt;
&lt;br /&gt;
Из многочисленных разложений матриц, наиболее удобным является сингулярное разложение матрицы в виде: &amp;lt;math&amp;gt;A=U\Sigma V^*&amp;lt;/math&amp;gt;, где &amp;lt;math&amp;gt;U, V&amp;lt;/math&amp;gt; – унитарные матрицы, а &amp;lt;math&amp;gt;\Sigma&amp;lt;/math&amp;gt; – диагональная матрица с вещественными положительными числами на диагонали &amp;lt;ref&amp;gt;http://algorithms.parallel.ru/&amp;lt;/ref&amp;gt;.&lt;br /&gt;
&lt;br /&gt;
Диагональные элементы матрицы &amp;lt;math&amp;gt;\Sigma&amp;lt;/math&amp;gt; называются сингулярными числами матрицы &amp;lt;math&amp;gt;A&amp;lt;/math&amp;gt;, а столбцы матриц &amp;lt;math&amp;gt;U,V&amp;lt;/math&amp;gt; левыми и правыми сингулярными векторами соответственно.&lt;br /&gt;
&lt;br /&gt;
Алгоритм Якоби сингулярного разложения матрицы был предложен одним из первых в 1846 году. Он приводит прямоугольную матрицу к диагональной матрице с помощью последовательности элементарных вращений. Метод может найти все сингулярные значения с очень высокой точностью. Однако его производительность является довольно низкой, в сравнении с конкурирующими методами.&lt;br /&gt;
&lt;br /&gt;
&#039;&#039;Неявный&#039;&#039;&amp;lt;ref&amp;gt;Дж. Деммель «Вычислительная линейная алгебра» (стр. 261-264)&amp;lt;/ref&amp;gt; метод Якоби математически эквивалентен применению метода Якоби вычисления собственных значений к матрице &amp;lt;math&amp;gt;A = G^TG&amp;lt;/math&amp;gt;.&lt;br /&gt;
Это значит, что на каждом шаге вычисляется вращение Якоби &amp;lt;math&amp;gt;J&amp;lt;/math&amp;gt;, с помощью которого матрица &amp;lt;math&amp;gt;G^TG&amp;lt;/math&amp;gt; неявно пересчитывется в &amp;lt;math&amp;gt;J^TG^TGJ&amp;lt;/math&amp;gt;; вращение выбрано так, чтобы пара внедиагональных элементов из &amp;lt;math&amp;gt;G^TG&amp;lt;/math&amp;gt; обратилась в нули в матрице &amp;lt;math&amp;gt;J^TG^TGJ&amp;lt;/math&amp;gt;. При этом ни &amp;lt;math&amp;gt;G^TG&amp;lt;/math&amp;gt;, ни &amp;lt;math&amp;gt;J^TG^TGJ&amp;lt;/math&amp;gt; не вычисляются в явном виде; вместо них вычисляется матрица &amp;lt;math&amp;gt;GJ&amp;lt;/math&amp;gt;. Поэтому алгоритм называется &#039;&#039;методом односторонних вращений&#039;&#039;.&lt;br /&gt;
&lt;br /&gt;
=== Математическое описание алгоритма ===&lt;br /&gt;
Исходные данные: матрица &amp;lt;math&amp;gt;G&amp;lt;/math&amp;gt; (элементы &amp;lt;math&amp;gt;g_{ij}, i, j = 1, \ldots, n&amp;lt;/math&amp;gt;).&lt;br /&gt;
&lt;br /&gt;
Вычисляемые данные: матрица &amp;lt;math&amp;gt;\Sigma = diag(\sigma_{i})&amp;lt;/math&amp;gt;, где &amp;lt;math&amp;gt;\sigma_{i}&amp;lt;/math&amp;gt; - сингулярные числа, &amp;lt;math&amp;gt;U&amp;lt;/math&amp;gt; - матрица левых сингулярных векторов, &amp;lt;math&amp;gt;V&amp;lt;/math&amp;gt; - матрица правых сингулярных векторов.&lt;br /&gt;
&lt;br /&gt;
симметричную матрицу &amp;lt;math&amp;gt;A = (G^TG)&amp;lt;/math&amp;gt; можно привести к диагональному виду:&lt;br /&gt;
&amp;lt;math&amp;gt;RG^TGR^T&amp;lt;/math&amp;gt;, где&lt;br /&gt;
&lt;br /&gt;
&amp;lt;math&amp;gt;&lt;br /&gt;
R(j,k,\theta) = &lt;br /&gt;
\begin{matrix}&lt;br /&gt;
  \\&lt;br /&gt;
  \\&lt;br /&gt;
  \\&lt;br /&gt;
j \\&lt;br /&gt;
  \\&lt;br /&gt;
k \\&lt;br /&gt;
  \\&lt;br /&gt;
  \\&lt;br /&gt;
  \\&lt;br /&gt;
\end{matrix}&lt;br /&gt;
&amp;lt;/math&amp;gt;  &lt;br /&gt;
&amp;lt;math&amp;gt;&lt;br /&gt;
\begin{bmatrix}&lt;br /&gt;
  &amp;amp; 1 &amp;amp;   &amp;amp;        &amp;amp;              &amp;amp;        &amp;amp;               &amp;amp;         &amp;amp;    &amp;amp;   \\&lt;br /&gt;
  &amp;amp;   &amp;amp; 1 &amp;amp;        &amp;amp;              &amp;amp;        &amp;amp;               &amp;amp;         &amp;amp;    &amp;amp;   \\&lt;br /&gt;
  &amp;amp;   &amp;amp;   &amp;amp; \ddots &amp;amp;              &amp;amp;        &amp;amp;               &amp;amp;         &amp;amp;    &amp;amp;   \\&lt;br /&gt;
  &amp;amp;   &amp;amp;   &amp;amp;        &amp;amp; \cos(\theta) &amp;amp;        &amp;amp; -\sin(\theta) &amp;amp;         &amp;amp;    &amp;amp;   \\&lt;br /&gt;
  &amp;amp;   &amp;amp;   &amp;amp;        &amp;amp;              &amp;amp; \ddots &amp;amp;               &amp;amp;         &amp;amp;    &amp;amp;   \\&lt;br /&gt;
  &amp;amp;   &amp;amp;   &amp;amp;        &amp;amp; \sin(\theta) &amp;amp;        &amp;amp; \cos(\theta)  &amp;amp;         &amp;amp;    &amp;amp;   \\&lt;br /&gt;
  &amp;amp;   &amp;amp;   &amp;amp;        &amp;amp;              &amp;amp;        &amp;amp;               &amp;amp; \ddots  &amp;amp;    &amp;amp;   \\&lt;br /&gt;
  &amp;amp;   &amp;amp;   &amp;amp;        &amp;amp;              &amp;amp;        &amp;amp;               &amp;amp;         &amp;amp; 1  &amp;amp;   \\&lt;br /&gt;
  &amp;amp;   &amp;amp;   &amp;amp;        &amp;amp;              &amp;amp;        &amp;amp;               &amp;amp;         &amp;amp;    &amp;amp; 1 \\&lt;br /&gt;
\end{bmatrix}&lt;br /&gt;
&amp;lt;/math&amp;gt;&lt;br /&gt;
&lt;br /&gt;
Обозначим &amp;lt;math&amp;gt;s = \sin \theta&amp;lt;/math&amp;gt; и &amp;lt;math&amp;gt;c = \cos \theta&amp;lt;/math&amp;gt;.&lt;br /&gt;
&lt;br /&gt;
Перемножив матрицы &amp;lt;math&amp;gt;RG^TGR^T&amp;lt;/math&amp;gt;, получим следующие выражения&amp;lt;ref&amp;gt;http://www.astro.tsu.ru/OsChMet/5_2.html&amp;lt;/ref&amp;gt;:&lt;br /&gt;
&lt;br /&gt;
&amp;lt;math&amp;gt;\begin{align}&lt;br /&gt;
 a_{jj}^{(i+1)} &amp;amp;= c^2\, a_{jj}^{(i)}  -  2\, s c \,a_{jk}^{(i)}  +  s^2\, a_{kk}^{(i)} \\&lt;br /&gt;
 a_{kk}^{(i+1)} &amp;amp;= s^2 \,a_{jj}^{(i)}  +  2 s c\, a_{jk}^{(i)}  +  c^2 \, a_{kk}^{(i)} \\&lt;br /&gt;
 a_{jk}^{(i+1)} &amp;amp;= a_{kj}^{(i+1)} = (c^2 - s^2 ) \, a_{jk}^{(i)}  +  s c \, (a_{kk}^{(i)} - a_{jj}^{(i)} ) \\&lt;br /&gt;
 a_{jm}^{(i+1)} &amp;amp;= a_{mj}^{(i+1)} = c \, a_{jm}^{(i)}  -  s \, a_{km}^{(i)} &amp;amp; m \ne j,k \\&lt;br /&gt;
 a_{km}^{(i+1)} &amp;amp;= a_{mk}^{(i+1)} = s \, a_{jm}^{(i)}  + c \, a_{km}^{(i)} &amp;amp; m \ne j,k \\&lt;br /&gt;
 a_{ml}^{(i+1)} &amp;amp;= a_{ml}^{(i)} &amp;amp;m,l \ne j,k&lt;br /&gt;
\end{align}&amp;lt;/math&amp;gt;&lt;br /&gt;
&lt;br /&gt;
Т.к внедиагональные элементы должны быть равны 0, то выбираем &amp;lt;math&amp;gt;\theta&amp;lt;/math&amp;gt; так, чтобы &amp;lt;math&amp;gt;a_{jk}^{(i+1)} = 0&amp;lt;/math&amp;gt; и &amp;lt;math&amp;gt;a_{kj}^{(i+1)} = 0&amp;lt;/math&amp;gt;.&lt;br /&gt;
&lt;br /&gt;
Тогда решая уравнение получаем, что&lt;br /&gt;
&lt;br /&gt;
&amp;lt;math&amp;gt;&lt;br /&gt;
         \begin{align}&lt;br /&gt;
         \tau &amp;amp;= ({a_{jj} - a_{kk}})/{2a_{jk}} \\&lt;br /&gt;
         t &amp;amp;= {sign(\tau)}/(|\tau| + \sqrt{1 + \tau^2}) \\&lt;br /&gt;
         c &amp;amp;= 1/(\sqrt{1 + t^2}) \\&lt;br /&gt;
         s &amp;amp;= ct \\&lt;br /&gt;
         \end{align}&amp;lt;/math&amp;gt;&lt;br /&gt;
&lt;br /&gt;
Остановка вычислений алгоритма наступает, когда внедиагональные элементы становятся меньше некоторого наперед заданного числа &amp;lt;math&amp;gt;\varepsilon&amp;lt;/math&amp;gt;.&lt;br /&gt;
&lt;br /&gt;
=== Вычислительное ядро алгоритма ===&lt;br /&gt;
Вычислительное ядро алгоритма составляет непосредственно вычисление одностороннего вращения Якоби, т.е. вычисление элементов матрицы &amp;lt;math&amp;gt;g_{jm}^{(i+1)} = g_{mj}^{(i+1)}&amp;lt;/math&amp;gt; и &amp;lt;math&amp;gt;g_{km}^{(i+1)} = g_{mk}^{(i+1)}&amp;lt;/math&amp;gt;, &amp;lt;math&amp;gt;m \ne j,k&amp;lt;/math&amp;gt;, а также вычисления элементов &amp;lt;math&amp;gt;g_{jj}^{(i+1)} &amp;lt;/math&amp;gt; и &amp;lt;math&amp;gt;g_{kk}^{(i+1)} &amp;lt;/math&amp;gt;, получившихся после умножения промежуточной матрицы на матрицу вращений Якоби:&lt;br /&gt;
&lt;br /&gt;
&amp;lt;math&amp;gt;\begin{align}&lt;br /&gt;
 g_{jj}^{(i+1)} &amp;amp;= c^2\, g_{jj}^{(i)}  -  2\, s c \,g_{jk}^{(i)}  +  s^2\, g_{kk}^{(i)} \\&lt;br /&gt;
 g_{kk}^{(i+1)} &amp;amp;= s^2 \,g_{jj}^{(i)}  +  2 s c\, g_{jk}^{(i)}  +  c^2 \, g_{kk}^{(i)} \\&lt;br /&gt;
 g_{jk}^{(i+1)} &amp;amp;= g_{kj}^{(i+1)} = (c^2 - s^2 ) \, g_{jk}^{(i)}  +  s c \, (g_{kk}^{(i)} - g_{jj}^{(i)} ) \\&lt;br /&gt;
 g_{jm}^{(i+1)} &amp;amp;= g_{mj}^{(i+1)} = c \, g_{jm}^{(i)}  -  s \, g_{km}^{(i)} &amp;amp; m \ne j,k \\&lt;br /&gt;
 g_{km}^{(i+1)} &amp;amp;= g_{mk}^{(i+1)} = s \, g_{jm}^{(i)}  + c \, g_{km}^{(i)} &amp;amp; m \ne j,k \\&lt;br /&gt;
 g_{ml}^{(i+1)} &amp;amp;= g_{ml}^{(i)} &amp;amp;m,l \ne j,k&lt;br /&gt;
\end{align}&amp;lt;/math&amp;gt;&lt;br /&gt;
&lt;br /&gt;
=== Макроструктура алгоритма ===&lt;br /&gt;
Основную часть метода составляет процедура односторонних вращений матрицы, которая в свою очередь состоит из:&lt;br /&gt;
&lt;br /&gt;
#Вычисление &amp;lt;math&amp;gt;\tau, c, s, t&amp;lt;/math&amp;gt;.&lt;br /&gt;
#Одностороннее вращение матрицы. &lt;br /&gt;
&lt;br /&gt;
Что требует &amp;lt;math&amp;gt;O(n)&amp;lt;/math&amp;gt; операций.&lt;br /&gt;
&lt;br /&gt;
После этого необходимо:&lt;br /&gt;
&lt;br /&gt;
#Вычислить сингулярные числа &amp;lt;math&amp;gt;\sigma_i&amp;lt;/math&amp;gt;.  Что требует &amp;lt;math&amp;gt;O(n)&amp;lt;/math&amp;gt; операций.&lt;br /&gt;
#Вычислить &amp;lt;math&amp;gt;U&amp;lt;/math&amp;gt; и &amp;lt;math&amp;gt;V&amp;lt;/math&amp;gt;. Что требует &amp;lt;math&amp;gt;O(n^2)&amp;lt;/math&amp;gt; операций.&lt;br /&gt;
&lt;br /&gt;
=== Схема реализации последовательного алгоритма ===&lt;br /&gt;
Применение метода Якоби к матрице &amp;lt;math&amp;gt;A = (G^TG)&amp;lt;/math&amp;gt; можно описать следующим образом&amp;lt;ref&amp;gt;Дж. Деммель «Вычислительная линейная алгебра» (стр. 261-263)&amp;lt;/ref&amp;gt;:&lt;br /&gt;
&lt;br /&gt;
Если &amp;lt;math&amp;gt;G = U\Sigma V^T&amp;lt;/math&amp;gt; и &amp;lt;math&amp;gt;\Sigma = diag(\sigma_{i})&amp;lt;/math&amp;gt;, то алгоритм вычисляет сингулярные числа &amp;lt;math&amp;gt;\sigma_{i}&amp;lt;/math&amp;gt;, матрицу &amp;lt;math&amp;gt;U&amp;lt;/math&amp;gt; левых сингулярных векторов и матрицу &amp;lt;math&amp;gt;V&amp;lt;/math&amp;gt; правых сингулярных векторов по следующей схеме:&lt;br /&gt;
&lt;br /&gt;
 repeat&lt;br /&gt;
     for &amp;lt;math&amp;gt;j=1&amp;lt;/math&amp;gt; to &amp;lt;math&amp;gt;n-1&amp;lt;/math&amp;gt;&lt;br /&gt;
         for &amp;lt;math&amp;gt;k=j+1&amp;lt;/math&amp;gt; to &amp;lt;math&amp;gt;n&amp;lt;/math&amp;gt;&lt;br /&gt;
             обратиться к процедуре &#039;&#039;&#039;&#039;&#039;One-Sided-Jacobi-Rotation&amp;lt;math&amp;gt;(G,j,k)&amp;lt;/math&amp;gt;&#039;&#039;&#039;&#039;&#039;&lt;br /&gt;
         end for&lt;br /&gt;
     end for&lt;br /&gt;
 пока &amp;lt;math&amp;gt;G^TG&amp;lt;/math&amp;gt; не станет достаточно близка к диагональной матрице&lt;br /&gt;
 Положить &amp;lt;math&amp;gt;\sigma_{i} = ||G(:,i)||_2 &amp;lt;/math&amp;gt; (норма &amp;lt;math&amp;gt;i&amp;lt;/math&amp;gt;-го столбца в &amp;lt;math&amp;gt;G&amp;lt;/math&amp;gt;)&lt;br /&gt;
 Положить &amp;lt;math&amp;gt;U = [u_{1},\dots, u_{n}]&amp;lt;/math&amp;gt;, где &amp;lt;math&amp;gt;u_{i} = G(:,i)/\sigma_{i}&amp;lt;/math&amp;gt;&lt;br /&gt;
 Положить &amp;lt;math&amp;gt;V = J&amp;lt;/math&amp;gt;, где &amp;lt;math&amp;gt;J&amp;lt;/math&amp;gt; - накопленное произведение вращений Якоби.&lt;br /&gt;
&lt;br /&gt;
Где процедура &#039;&#039;&#039;&#039;&#039;One-Sided-Jacobi-Rotation&#039;&#039;&#039;&#039;&#039; является метод односторонних вращений Якоби:&lt;br /&gt;
&lt;br /&gt;
 proc &#039;&#039;&#039;&#039;&#039;One-Sided-Jacobi-Rotation&amp;lt;math&amp;gt;(G,j,k)&amp;lt;/math&amp;gt;&#039;&#039;&#039;&#039;&#039;&lt;br /&gt;
     вычислить &amp;lt;math&amp;gt;a_{jj} = (G^TG)_{jj}, a_{jk} = (G^TG)_{jk}&amp;lt;/math&amp;gt; и &amp;lt;math&amp;gt;a_{kk} = (G^TG)_{kk}&amp;lt;/math&amp;gt;&lt;br /&gt;
     if &amp;lt;math&amp;gt;|a_{jk}|&amp;lt;/math&amp;gt; не слишком мал&lt;br /&gt;
         &amp;lt;math&amp;gt;&lt;br /&gt;
         \begin{align}&lt;br /&gt;
         \tau &amp;amp;= ({a_{jj} - a_{kk}})/{2a_{jk}} \\&lt;br /&gt;
         t &amp;amp;= {sign(\tau)}/(|\tau| + \sqrt{1 + \tau^2}) \\&lt;br /&gt;
         c &amp;amp;= 1/(\sqrt{1 + t^2}) \\&lt;br /&gt;
         s &amp;amp;= ct \\&lt;br /&gt;
         G &amp;amp;= GR(j,k,\theta) \  \dots c=cos\theta, s=sin\theta \end{align}&amp;lt;/math&amp;gt;&lt;br /&gt;
         if нужны правые сингулярные векторы &lt;br /&gt;
             &amp;lt;math&amp;gt;J = JR(j,k,\theta)&amp;lt;/math&amp;gt;&lt;br /&gt;
         end if&lt;br /&gt;
     end if&lt;br /&gt;
&lt;br /&gt;
=== Последовательная сложность алгоритма ===&lt;br /&gt;
Для одного вращения Якоби необходимо выполнить &amp;lt;math&amp;gt;O(n)&amp;lt;/math&amp;gt; операций умножения и сложения. &lt;br /&gt;
&lt;br /&gt;
Всего вариантов выбора &amp;lt;math&amp;gt;j&amp;lt;/math&amp;gt; и &amp;lt;math&amp;gt;k&amp;lt;/math&amp;gt; существует &amp;lt;math&amp;gt;\frac{n(n-1)}{2}&amp;lt;/math&amp;gt;.&lt;br /&gt;
&lt;br /&gt;
Таким образом последовательный алгоритм Якоби вычисления сингулярных чисел и векторов является алгоритмом с кубической сложностью.&lt;br /&gt;
&lt;br /&gt;
=== Информационный граф ===&lt;br /&gt;
Граф алгоритма состоит из четырех групп вершин&lt;br /&gt;
&lt;br /&gt;
(А)Первая группа вершин расположена в двумерной области, соответствующая ей операция - вычисление элементов &amp;lt;math&amp;gt;a_{jj},a_{jk},a_{kk}&amp;lt;/math&amp;gt; матрицы произведения &amp;lt;math&amp;gt;A = (G^TG)&amp;lt;/math&amp;gt;. Где &amp;lt;math&amp;gt;j&amp;lt;/math&amp;gt; изменяется от &amp;lt;math&amp;gt;1&amp;lt;/math&amp;gt; до &amp;lt;math&amp;gt;n-1&amp;lt;/math&amp;gt;, принимая все целочисленные значения, &amp;lt;math&amp;gt;k&amp;lt;/math&amp;gt;  изменяется от &amp;lt;math&amp;gt;j+1&amp;lt;/math&amp;gt; до &amp;lt;math&amp;gt;n&amp;lt;/math&amp;gt;, принимая все целочисленные значения.&lt;br /&gt;
&lt;br /&gt;
Граф вычисления каждого из элементов приведен на рисунке 1, где значениям &amp;lt;math&amp;gt;g_{ij}&amp;lt;/math&amp;gt; соответствуют обозначения &amp;lt;math&amp;gt;x_{ij}&amp;lt;/math&amp;gt;, а элементам &amp;lt;math&amp;gt;g^T_{ij}&amp;lt;/math&amp;gt; обозначения &amp;lt;math&amp;gt;z_{ij}&amp;lt;/math&amp;gt;. Значение &amp;lt;math&amp;gt;s_{ij}&amp;lt;/math&amp;gt; является значением результирующего элемента.&lt;br /&gt;
&lt;br /&gt;
(Б)Вторая группа вершин расположена в двумерной области, соответствующая ей операция – вычисление &amp;lt;math&amp;gt;c&amp;lt;/math&amp;gt; и &amp;lt;math&amp;gt;s&amp;lt;/math&amp;gt;.&lt;br /&gt;
&lt;br /&gt;
Информационный граф с входными и выходными данными вычисления пункта (Б) представлен на рисунке 2.&lt;br /&gt;
&lt;br /&gt;
(В)Третья группа вершин расположена в двумерной области, соответствующая ей операция вычисление значений элементов &amp;lt;math&amp;gt;g_{jm}^{(i+1)} = g_{mj}^{(i+1)}&amp;lt;/math&amp;gt; и &amp;lt;math&amp;gt;g_{km}^{(i+1)} = g_{mk}^{(i+1)}&amp;lt;/math&amp;gt;, &amp;lt;math&amp;gt;m \ne j,k&amp;lt;/math&amp;gt;.&lt;br /&gt;
&lt;br /&gt;
(Г)Четвертая группа вершин расположена в двумерной области, соответствующая ей операция вычисление значений элементов &amp;lt;math&amp;gt;g_{jj}^{(i+1)} &amp;lt;/math&amp;gt; и &amp;lt;math&amp;gt;g_{kk}^{(i+1)} &amp;lt;/math&amp;gt;.&lt;br /&gt;
&lt;br /&gt;
Элементы групп (В) и (Г) вычисляются аналогично вычислению элементов матрицы произведения, т.к. фактически представляют собой перемножение матриц &amp;lt;math&amp;gt;G&amp;lt;/math&amp;gt; и &amp;lt;math&amp;gt;R&amp;lt;/math&amp;gt;&lt;br /&gt;
&lt;br /&gt;
[[File:Jacobi_2.jpg|none|thumb|1000px|Рисунок 1. Информационный граф с входными и выходными параметрами вычисления каждого элемента матрицы произведения.]]&lt;br /&gt;
&lt;br /&gt;
[[File:Jacobi_1.jpg|none|thumb|1000px|Рисунок 2. Информационный граф с входными и выходными параметрами вычисления значений &amp;lt;math&amp;gt;c&amp;lt;/math&amp;gt; и &amp;lt;math&amp;gt;s&amp;lt;/math&amp;gt;.]]&lt;br /&gt;
&lt;br /&gt;
Обобщенный граф метода Якоби представлен на рисунке 3, где буквами А, Б, В и Г обозначено вычисление групп вершин (А), (Б), (В) и (Г).&lt;br /&gt;
&lt;br /&gt;
[[File:Graf21.png|none|thumb|2000px|Рисунок 3. Обобщенный граф алгоритма вычисления сингулярных чисел и векторов методом Якоби.]]&lt;br /&gt;
&lt;br /&gt;
=== Ресурс параллелизма алгоритма ===&lt;br /&gt;
Для выполнения одной итерации метода Якоби требуется последовательно выполнить несколько ярусов:&lt;br /&gt;
# вычислить &amp;lt;math&amp;gt;\tau&amp;lt;/math&amp;gt; &lt;br /&gt;
# вычислить &amp;lt;math&amp;gt;t&amp;lt;/math&amp;gt; &lt;br /&gt;
# вычислить &amp;lt;math&amp;gt;c&amp;lt;/math&amp;gt; &lt;br /&gt;
# вычислить &amp;lt;math&amp;gt;s&amp;lt;/math&amp;gt;&lt;br /&gt;
# выполнить поворот матрицы &amp;lt;math&amp;gt;G&amp;lt;/math&amp;gt; с параллельным выполнением &amp;lt;math&amp;gt;2(n-2)&amp;lt;/math&amp;gt; операций вычисления элементов матрицы &amp;lt;math&amp;gt;g_{jm}^{(i+1)} = g_{mj}^{(i+1)}&amp;lt;/math&amp;gt; и &amp;lt;math&amp;gt;g_{km}^{(i+1)} = g_{mk}^{(i+1)}&amp;lt;/math&amp;gt;, &amp;lt;math&amp;gt;m \ne j,k&amp;lt;/math&amp;gt;, а также вычисления элементов &amp;lt;math&amp;gt;g_{jj}^{(i+1)} &amp;lt;/math&amp;gt; и &amp;lt;math&amp;gt;g_{kk}^{(i+1)} &amp;lt;/math&amp;gt;. &lt;br /&gt;
&lt;br /&gt;
Суммарное количество итераций равно &amp;lt;math&amp;gt;\frac{n(n-1)}{2}&amp;lt;/math&amp;gt; (Различные варианты выбора &amp;lt;math&amp;gt;j&amp;lt;/math&amp;gt; и &amp;lt;math&amp;gt;k&amp;lt;/math&amp;gt;). &lt;br /&gt;
&lt;br /&gt;
Асимптотически метод сходится квадратично. &lt;br /&gt;
&lt;br /&gt;
Таким образом, при классификации по высоте ЯПФ метод Якоби относится к алгоритмам со сложностью &amp;lt;math&amp;gt;O(n^2)&amp;lt;/math&amp;gt;&amp;amp;nbsp;, а при классификации по ширине ЯПФ — к алгоритмам со сложностью &amp;lt;math&amp;gt;O(n)&amp;lt;/math&amp;gt;.&lt;br /&gt;
&lt;br /&gt;
=== Входные и выходные данные алгоритма ===&lt;br /&gt;
&#039;&#039;&#039;Входные данные&#039;&#039;&#039;: плотная матрица &amp;lt;math&amp;gt;G&amp;lt;/math&amp;gt; размера &amp;lt;math&amp;gt;n&amp;lt;/math&amp;gt;х&amp;lt;math&amp;gt;n&amp;lt;/math&amp;gt;, где &amp;lt;math&amp;gt;A= G^TG&amp;lt;/math&amp;gt; – симметрическая матрица.&lt;br /&gt;
&lt;br /&gt;
&#039;&#039;&#039;Объём входных данных&#039;&#039;&#039;: &amp;lt;math&amp;gt;n^2&amp;lt;/math&amp;gt; (т.к. для хранения матрицы &amp;lt;math&amp;gt;G&amp;lt;/math&amp;gt; используем двумерный массив размера &amp;lt;math&amp;gt;n&amp;lt;/math&amp;gt;х&amp;lt;math&amp;gt;n&amp;lt;/math&amp;gt;)&lt;br /&gt;
&lt;br /&gt;
&#039;&#039;&#039;Выходные данные&#039;&#039;&#039;: &amp;lt;math&amp;gt;\sigma_{i}&amp;lt;/math&amp;gt;  - сингулярные числа, матрица &amp;lt;math&amp;gt;U&amp;lt;/math&amp;gt; левых сингулярных векторов и матрица &amp;lt;math&amp;gt;V&amp;lt;/math&amp;gt; правых сингулярных векторов.&lt;br /&gt;
&lt;br /&gt;
&#039;&#039;&#039;Объём выходных данных&#039;&#039;&#039;: &amp;lt;math&amp;gt;2n^2 + n&amp;lt;/math&amp;gt; (т.к. необходимо хранить вектор сингулярных чисел длины &amp;lt;math&amp;gt;n&amp;lt;/math&amp;gt;, а также две матрицы &amp;lt;math&amp;gt;U, V&amp;lt;/math&amp;gt; левых и правых сингулярных векторов размера &amp;lt;math&amp;gt;n&amp;lt;/math&amp;gt;х&amp;lt;math&amp;gt;n&amp;lt;/math&amp;gt;).&lt;br /&gt;
&lt;br /&gt;
=== Свойства алгоритма ===&lt;br /&gt;
Метод Якоби является самым медленным из имеющихся алгоритмов вычисления сингулярных чисел и сингулярных векторов матрицы. Тем не менее, для  матриц &amp;lt;math&amp;gt;G&amp;lt;/math&amp;gt;, которые могут быть представлены в виде &amp;lt;math&amp;gt;G=DX&amp;lt;/math&amp;gt;, где &amp;lt;math&amp;gt;D&amp;lt;/math&amp;gt; - диагональная, а &amp;lt;math&amp;gt;X&amp;lt;/math&amp;gt; - хорошо обусловлена, он способен вычислять сингулярные числа и вектора намного точнее, чем другие методы&amp;lt;ref&amp;gt;Дж. Деммель «Вычислительная линейная алгебра» (стр. 261-264)&amp;lt;/ref&amp;gt;. &lt;br /&gt;
&lt;br /&gt;
Вычислительная мощность алгоритма, как отношение числа операций к суммарному объему входных и выходных данных является линейной.&lt;br /&gt;
&lt;br /&gt;
Метод Якоби не детерминирован, так как является итерационным алгоритмом с выходом по точности (число итераций зависит от входных данных и порогового значения).&lt;br /&gt;
&lt;br /&gt;
== Программная реализация алгоритма ==&lt;br /&gt;
&lt;br /&gt;
=== Особенности реализации последовательного алгоритма ===&lt;br /&gt;
&lt;br /&gt;
=== Локальность данных и вычислений ===&lt;br /&gt;
&lt;br /&gt;
=== Возможные способы и особенности параллельной реализации алгоритма ===&lt;br /&gt;
&lt;br /&gt;
=== Масштабируемость алгоритма и его реализации ===&lt;br /&gt;
Исследование масштабируемости параллельной реализации метода Якоби вычисления сингулярных чисел и векторов проводилось на тестовой среду суперкомпьютера &amp;quot;Ломоносов&amp;quot;, с использованием компилятора ICC и библиотеки impi/4.0.3. Алгоритм реализован на языке программирования C с использованием механизмов MPI.&lt;br /&gt;
&lt;br /&gt;
Алгоритм работает по следующей схеме:&lt;br /&gt;
#На вход всем процессорам подается матрица &amp;lt;math&amp;gt; G &amp;lt;/math&amp;gt;.&lt;br /&gt;
#Для всех &amp;lt;math&amp;gt; j &amp;lt;/math&amp;gt; и &amp;lt;math&amp;gt; k &amp;lt;/math&amp;gt; таких, что &amp;lt;math&amp;gt; j \in [1,n-1] &amp;lt;/math&amp;gt;, &amp;lt;math&amp;gt; k \in [j+1,n] &amp;lt;/math&amp;gt;&lt;br /&gt;
##Вычисляется элемент &amp;lt;math&amp;gt; a_{jk} &amp;lt;/math&amp;gt; путем перемножения матриц &amp;lt;math&amp;gt; G^TG &amp;lt;/math&amp;gt;, где на каждом процессоре вычисляется своя часть матрицы. После чего результат отправляется на все процессоры.&lt;br /&gt;
##Если полученный элемент оказывается больше некоторого значения, то начинается последовательная часть программы: Вычисление элементов &amp;lt;math&amp;gt; \tau, t, c, s &amp;lt;/math&amp;gt;.&lt;br /&gt;
##Затем, выполняется операция поворота, путем перемножения матриц &amp;lt;math&amp;gt; G &amp;lt;/math&amp;gt; и &amp;lt;math&amp;gt; R &amp;lt;/math&amp;gt;. Данная операция выполняется параллельно на нескольких процессорах, где каждый процессор вычисляет свою часть матрицы. После чего результат пересылается всем процессорам.&lt;br /&gt;
&lt;br /&gt;
Данная схема повторяется до тех пор, пока матрица &amp;lt;math&amp;gt; A = G^TG &amp;lt;/math&amp;gt; не станет достаточно близкой к диагональной.&lt;br /&gt;
&lt;br /&gt;
Для проверки этого факта, в конце каждой итерации цикла вычисляется матрица &amp;lt;math&amp;gt; A &amp;lt;/math&amp;gt;. Данная операция выполняется параллельно на нескольких процессорах, где каждый процессор вычисляет свою часть матрицы, после чего результат пересылается всем процессорам.&lt;br /&gt;
&lt;br /&gt;
&lt;br /&gt;
Набор и границы значений изменяемых параметров запуска реализации алгоритма: &lt;br /&gt;
&lt;br /&gt;
*	число процессоров [1 : 128] с шагом равным степени двойки;&lt;br /&gt;
*	размер матрицы [256 : 1792] с шагом 256.&lt;br /&gt;
&lt;br /&gt;
В результате проведённых экспериментов был получен следующий диапазон эффективности реализации алгоритма:&lt;br /&gt;
&lt;br /&gt;
*	минимальная эффективность реализации 0,01%;&lt;br /&gt;
*	максимальная эффективность реализации 16,52%.&lt;br /&gt;
&lt;br /&gt;
На следующих рисунках приведены графики производительности и эффективности выбранной реализации метода Якоби в зависимости от изменяемых параметров запуска.&lt;br /&gt;
&lt;br /&gt;
[[File:Performance.jpg|none|thumb|1000px|Рисунок 1. Параллельная реализация метода Якоби. Изменение производительности в зависимости от числа процессоров и размера матрицы.]]&lt;br /&gt;
&lt;br /&gt;
[[File:Эффективность.png|none|thumb|1000px|Рисунок 1. Параллельная реализация метода Якоби. Изменение эффективности в зависимости от числа процессоров и размера матрицы.]]&lt;br /&gt;
&lt;br /&gt;
Построим оценки масштабируемости данной реализации метода Якоби: &lt;br /&gt;
* По числу процессов: при увеличении числа процессов эффективность на рассмотренной области изменений параметров запуска сначала увеличивается (самый пик достигается при 16 процессах), а затем начинает снижаться. Это характеризуется тем, что накладные расходы на параллельное выполнение (общение между процессами) начинает превалировать над вычислениями.&lt;br /&gt;
&lt;br /&gt;
*По размеру задачи: при увеличении размера задачи эффективность возрастает. Это подтверждает предположение о том, что размер задачи сильно влияет на эффективность выполнения приложения. Оценка показывает, что с ростом размера задачи эффективность на рассмотренной области значений параметров запуска сильно увеличивается. &lt;br /&gt;
&lt;br /&gt;
*По двум направлениям: при рассмотрении увеличения как вычислительной сложности, так и числа процессов на всей рассмотренной области значений эффективность увеличивается, но медленно и с перепадами.&lt;br /&gt;
&lt;br /&gt;
[https://www.dropbox.com/home?preview=mainmpi.c Исследованная параллельная реализация метода Якоби]&lt;br /&gt;
&lt;br /&gt;
=== Динамические характеристики и эффективность реализации алгоритма ===&lt;br /&gt;
&lt;br /&gt;
=== Выводы для классов архитектур ===&lt;br /&gt;
&lt;br /&gt;
=== Существующие реализации алгоритма ===&lt;br /&gt;
Метод Якоби нахождения сингулярных значений и векторов реализован в таких пакетах, как LAPACK &amp;lt;ref&amp;gt;http://www.netlib.org/scalapack/slug/&amp;lt;/ref&amp;gt;, LINPACK/EISPACK &amp;lt;ref&amp;gt; http://www.netlib.org/linpack/ &amp;lt;/ref&amp;gt;, Intel MKL &amp;lt;ref&amp;gt;https://software.intel.com/ru-ru/node/521153#CAF8CA08-1C69-48F8-B0C3-B2B27AFA92FA&amp;lt;/ref&amp;gt;.&lt;br /&gt;
&lt;br /&gt;
Так же функция Якоби реализована в пакете Matlab.&lt;br /&gt;
&lt;br /&gt;
Т. к. алгоритм считается медленным, он не включен во многие известные пакеты.&lt;br /&gt;
&lt;br /&gt;
== Литература ==&lt;br /&gt;
1. Дж. Деммель Вычислительная линейная алгебра. Изд. Мир, 2001.&lt;/div&gt;</summary>
		<author><name>Davletshuna Alexandra</name></author>
	</entry>
	<entry>
		<id>https://xn--80aecvaldz.xn--80ahdrnmvk.xn--p1ai/w/ru/index.php?title=%D0%A3%D1%87%D0%B0%D1%81%D1%82%D0%BD%D0%B8%D0%BA:Davletshuna_Alexandra/%D0%9C%D0%B5%D1%82%D0%BE%D0%B4_%D0%AF%D0%BA%D0%BE%D0%B1%D0%B8_%D0%B2%D1%8B%D1%87%D0%B8%D1%81%D0%BB%D0%B5%D0%BD%D0%B8%D1%8F_%D1%81%D0%B8%D0%BD%D0%B3%D1%83%D0%BB%D1%8F%D1%80%D0%BD%D1%8B%D1%85_%D1%87%D0%B8%D1%81%D0%B5%D0%BB_%D0%B8_%D0%B2%D0%B5%D0%BA%D1%82%D0%BE%D1%80%D0%BE%D0%B2&amp;diff=17950</id>
		<title>Участник:Davletshuna Alexandra/Метод Якоби вычисления сингулярных чисел и векторов</title>
		<link rel="alternate" type="text/html" href="https://xn--80aecvaldz.xn--80ahdrnmvk.xn--p1ai/w/ru/index.php?title=%D0%A3%D1%87%D0%B0%D1%81%D1%82%D0%BD%D0%B8%D0%BA:Davletshuna_Alexandra/%D0%9C%D0%B5%D1%82%D0%BE%D0%B4_%D0%AF%D0%BA%D0%BE%D0%B1%D0%B8_%D0%B2%D1%8B%D1%87%D0%B8%D1%81%D0%BB%D0%B5%D0%BD%D0%B8%D1%8F_%D1%81%D0%B8%D0%BD%D0%B3%D1%83%D0%BB%D1%8F%D1%80%D0%BD%D1%8B%D1%85_%D1%87%D0%B8%D1%81%D0%B5%D0%BB_%D0%B8_%D0%B2%D0%B5%D0%BA%D1%82%D0%BE%D1%80%D0%BE%D0%B2&amp;diff=17950"/>
		<updated>2016-11-17T16:15:10Z</updated>

		<summary type="html">&lt;p&gt;Davletshuna Alexandra: &lt;/p&gt;
&lt;hr /&gt;
&lt;div&gt;{{Assignment}}&lt;br /&gt;
&lt;br /&gt;
{{algorithm&lt;br /&gt;
| name              = Метод Якоби вычисления сингулярных чисел и векторов&lt;br /&gt;
| serial_complexity = &amp;lt;math&amp;gt;O(n^3)&amp;lt;/math&amp;gt;&lt;br /&gt;
| pf_height         = &amp;lt;math&amp;gt;O(n^2)&amp;lt;/math&amp;gt;&lt;br /&gt;
| pf_width          = &amp;lt;math&amp;gt;O(n)&amp;lt;/math&amp;gt;&lt;br /&gt;
| input_data        = &amp;lt;math&amp;gt;n^2&amp;lt;/math&amp;gt;&lt;br /&gt;
| output_data       = &amp;lt;math&amp;gt;2n^2 + n&amp;lt;/math&amp;gt;&lt;br /&gt;
}}&lt;br /&gt;
&lt;br /&gt;
Авторы статьи: [[Участница:Davletshuna Alexandra|Давлетшина Александра]] (группа 619); [[Участница:Alek sandra|Зайцева Александра]]. Вклад каждого участника считать равноценным.&lt;br /&gt;
&lt;br /&gt;
== Свойства и структура алгоритма ==&lt;br /&gt;
&lt;br /&gt;
=== Общее описание алгоритма ===&lt;br /&gt;
&#039;&#039;&#039;Сингулярным разложением&#039;&#039;&#039; называется разложение прямоугольной вещественной или комплексной матрицы, имеющее широкое применение, в силу своей наглядной геометрической интерпретации, при решении многих прикладных задач. Сингулярное разложение матрицы А позволяет вычислять сингулярные числа данной матрицы, а также, левые и правые сингулярные векторы матрицы А:&lt;br /&gt;
&lt;br /&gt;
•	левые сингулярные векторы матрицы А — это собственные векторы матрицы &amp;lt;math&amp;gt;AA^*&amp;lt;/math&amp;gt;;&lt;br /&gt;
&lt;br /&gt;
•	правые сингулярные векторы матрицы A — это собственные векторы матрицы &amp;lt;math&amp;gt;A^*A&amp;lt;/math&amp;gt;.&lt;br /&gt;
&lt;br /&gt;
Геометрическая интерпретация сингулярного разложения заключается в следующем факте из геометрии: &#039;&#039;Образом любого линейного преобразования, заданного с помощью матрицы &amp;lt;math&amp;gt;m&amp;lt;/math&amp;gt;x&amp;lt;math&amp;gt;n&amp;lt;/math&amp;gt;, примененного к единичной сфере является гиперэллипсоид&#039;&#039;.&lt;br /&gt;
&lt;br /&gt;
Из многочисленных разложений матриц, наиболее удобным является сингулярное разложение матрицы в виде: &amp;lt;math&amp;gt;A=U\Sigma V^*&amp;lt;/math&amp;gt;, где &amp;lt;math&amp;gt;U, V&amp;lt;/math&amp;gt; – унитарные матрицы, а &amp;lt;math&amp;gt;\Sigma&amp;lt;/math&amp;gt; – диагональная матрица с вещественными положительными числами на диагонали &amp;lt;ref&amp;gt;http://algorithms.parallel.ru/&amp;lt;/ref&amp;gt;.&lt;br /&gt;
&lt;br /&gt;
Диагональные элементы матрицы &amp;lt;math&amp;gt;\Sigma&amp;lt;/math&amp;gt; называются сингулярными числами матрицы &amp;lt;math&amp;gt;A&amp;lt;/math&amp;gt;, а столбцы матриц &amp;lt;math&amp;gt;U,V&amp;lt;/math&amp;gt; левыми и правыми сингулярными векторами соответственно.&lt;br /&gt;
&lt;br /&gt;
Алгоритм Якоби сингулярного разложения матрицы был предложен одним из первых в 1846 году. Он приводит прямоугольную матрицу к диагональной матрице с помощью последовательности элементарных вращений. Метод может найти все сингулярные значения с очень высокой точностью. Однако его производительность является довольно низкой, в сравнении с конкурирующими методами.&lt;br /&gt;
&lt;br /&gt;
&#039;&#039;Неявный&#039;&#039;&amp;lt;ref&amp;gt;Дж. Деммель «Вычислительная линейная алгебра» (стр. 261-264)&amp;lt;/ref&amp;gt; метод Якоби математически эквивалентен применению метода Якоби вычисления собственных значений к матрице &amp;lt;math&amp;gt;A = G^TG&amp;lt;/math&amp;gt;.&lt;br /&gt;
Это значит, что на каждом шаге вычисляется вращение Якоби &amp;lt;math&amp;gt;J&amp;lt;/math&amp;gt;, с помощью которого матрица &amp;lt;math&amp;gt;G^TG&amp;lt;/math&amp;gt; неявно пересчитывется в &amp;lt;math&amp;gt;J^TG^TGJ&amp;lt;/math&amp;gt;; вращение выбрано так, чтобы пара внедиагональных элементов из &amp;lt;math&amp;gt;G^TG&amp;lt;/math&amp;gt; обратилась в нули в матрице &amp;lt;math&amp;gt;J^TG^TGJ&amp;lt;/math&amp;gt;. При этом ни &amp;lt;math&amp;gt;G^TG&amp;lt;/math&amp;gt;, ни &amp;lt;math&amp;gt;J^TG^TGJ&amp;lt;/math&amp;gt; не вычисляются в явном виде; вместо них вычисляется матрица &amp;lt;math&amp;gt;GJ&amp;lt;/math&amp;gt;. Поэтому алгоритм называется &#039;&#039;методом односторонних вращений&#039;&#039;.&lt;br /&gt;
&lt;br /&gt;
=== Математическое описание алгоритма ===&lt;br /&gt;
Исходные данные: матрица &amp;lt;math&amp;gt;G&amp;lt;/math&amp;gt; (элементы &amp;lt;math&amp;gt;g_{ij}, i, j = 1, \ldots, n&amp;lt;/math&amp;gt;).&lt;br /&gt;
&lt;br /&gt;
Вычисляемые данные: матрица &amp;lt;math&amp;gt;\Sigma = diag(\sigma_{i})&amp;lt;/math&amp;gt;, где &amp;lt;math&amp;gt;\sigma_{i}&amp;lt;/math&amp;gt; - сингулярные числа, &amp;lt;math&amp;gt;U&amp;lt;/math&amp;gt; - матрица левых сингулярных векторов, &amp;lt;math&amp;gt;V&amp;lt;/math&amp;gt; - матрица правых сингулярных векторов.&lt;br /&gt;
&lt;br /&gt;
симметричную матрицу &amp;lt;math&amp;gt;A = (G^TG)&amp;lt;/math&amp;gt; можно привести к диагональному виду:&lt;br /&gt;
&amp;lt;math&amp;gt;RG^TGR^T&amp;lt;/math&amp;gt;, где&lt;br /&gt;
&lt;br /&gt;
&amp;lt;math&amp;gt;&lt;br /&gt;
R(j,k,\theta) = &lt;br /&gt;
\begin{matrix}&lt;br /&gt;
  \\&lt;br /&gt;
  \\&lt;br /&gt;
  \\&lt;br /&gt;
j \\&lt;br /&gt;
  \\&lt;br /&gt;
k \\&lt;br /&gt;
  \\&lt;br /&gt;
  \\&lt;br /&gt;
  \\&lt;br /&gt;
\end{matrix}&lt;br /&gt;
&amp;lt;/math&amp;gt;  &lt;br /&gt;
&amp;lt;math&amp;gt;&lt;br /&gt;
\begin{bmatrix}&lt;br /&gt;
  &amp;amp; 1 &amp;amp;   &amp;amp;        &amp;amp;              &amp;amp;        &amp;amp;               &amp;amp;         &amp;amp;    &amp;amp;   \\&lt;br /&gt;
  &amp;amp;   &amp;amp; 1 &amp;amp;        &amp;amp;              &amp;amp;        &amp;amp;               &amp;amp;         &amp;amp;    &amp;amp;   \\&lt;br /&gt;
  &amp;amp;   &amp;amp;   &amp;amp; \ddots &amp;amp;              &amp;amp;        &amp;amp;               &amp;amp;         &amp;amp;    &amp;amp;   \\&lt;br /&gt;
  &amp;amp;   &amp;amp;   &amp;amp;        &amp;amp; \cos(\theta) &amp;amp;        &amp;amp; -\sin(\theta) &amp;amp;         &amp;amp;    &amp;amp;   \\&lt;br /&gt;
  &amp;amp;   &amp;amp;   &amp;amp;        &amp;amp;              &amp;amp; \ddots &amp;amp;               &amp;amp;         &amp;amp;    &amp;amp;   \\&lt;br /&gt;
  &amp;amp;   &amp;amp;   &amp;amp;        &amp;amp; \sin(\theta) &amp;amp;        &amp;amp; \cos(\theta)  &amp;amp;         &amp;amp;    &amp;amp;   \\&lt;br /&gt;
  &amp;amp;   &amp;amp;   &amp;amp;        &amp;amp;              &amp;amp;        &amp;amp;               &amp;amp; \ddots  &amp;amp;    &amp;amp;   \\&lt;br /&gt;
  &amp;amp;   &amp;amp;   &amp;amp;        &amp;amp;              &amp;amp;        &amp;amp;               &amp;amp;         &amp;amp; 1  &amp;amp;   \\&lt;br /&gt;
  &amp;amp;   &amp;amp;   &amp;amp;        &amp;amp;              &amp;amp;        &amp;amp;               &amp;amp;         &amp;amp;    &amp;amp; 1 \\&lt;br /&gt;
\end{bmatrix}&lt;br /&gt;
&amp;lt;/math&amp;gt;&lt;br /&gt;
&lt;br /&gt;
Обозначим &amp;lt;math&amp;gt;s = \sin \theta&amp;lt;/math&amp;gt; и &amp;lt;math&amp;gt;c = \cos \theta&amp;lt;/math&amp;gt;.&lt;br /&gt;
&lt;br /&gt;
Перемножив матрицы &amp;lt;math&amp;gt;RG^TGR^T&amp;lt;/math&amp;gt;, получим следующие выражения&amp;lt;ref&amp;gt;http://www.astro.tsu.ru/OsChMet/5_2.html&amp;lt;/ref&amp;gt;:&lt;br /&gt;
&lt;br /&gt;
&amp;lt;math&amp;gt;\begin{align}&lt;br /&gt;
 a_{jj}^{(i+1)} &amp;amp;= c^2\, a_{jj}^{(i)}  -  2\, s c \,a_{jk}^{(i)}  +  s^2\, a_{kk}^{(i)} \\&lt;br /&gt;
 a_{kk}^{(i+1)} &amp;amp;= s^2 \,a_{jj}^{(i)}  +  2 s c\, a_{jk}^{(i)}  +  c^2 \, a_{kk}^{(i)} \\&lt;br /&gt;
 a_{jk}^{(i+1)} &amp;amp;= a_{kj}^{(i+1)} = (c^2 - s^2 ) \, a_{jk}^{(i)}  +  s c \, (a_{kk}^{(i)} - a_{jj}^{(i)} ) \\&lt;br /&gt;
 a_{jm}^{(i+1)} &amp;amp;= a_{mj}^{(i+1)} = c \, a_{jm}^{(i)}  -  s \, a_{km}^{(i)} &amp;amp; m \ne j,k \\&lt;br /&gt;
 a_{km}^{(i+1)} &amp;amp;= a_{mk}^{(i+1)} = s \, a_{jm}^{(i)}  + c \, a_{km}^{(i)} &amp;amp; m \ne j,k \\&lt;br /&gt;
 a_{ml}^{(i+1)} &amp;amp;= a_{ml}^{(i)} &amp;amp;m,l \ne j,k&lt;br /&gt;
\end{align}&amp;lt;/math&amp;gt;&lt;br /&gt;
&lt;br /&gt;
Т.к внедиагональные элементы должны быть равны 0, то выбираем &amp;lt;math&amp;gt;\theta&amp;lt;/math&amp;gt; так, чтобы &amp;lt;math&amp;gt;a_{jk}^{(i+1)} = 0&amp;lt;/math&amp;gt; и &amp;lt;math&amp;gt;a_{kj}^{(i+1)} = 0&amp;lt;/math&amp;gt;.&lt;br /&gt;
&lt;br /&gt;
Тогда решая уравнение получаем, что&lt;br /&gt;
&lt;br /&gt;
&amp;lt;math&amp;gt;&lt;br /&gt;
         \begin{align}&lt;br /&gt;
         \tau &amp;amp;= ({a_{jj} - a_{kk}})/{2a_{jk}} \\&lt;br /&gt;
         t &amp;amp;= {sign(\tau)}/(|\tau| + \sqrt{1 + \tau^2}) \\&lt;br /&gt;
         c &amp;amp;= 1/(\sqrt{1 + t^2}) \\&lt;br /&gt;
         s &amp;amp;= ct \\&lt;br /&gt;
         \end{align}&amp;lt;/math&amp;gt;&lt;br /&gt;
&lt;br /&gt;
Остановка вычислений алгоритма наступает, когда внедиагональные элементы становятся меньше некоторого наперед заданного числа &amp;lt;math&amp;gt;\varepsilon&amp;lt;/math&amp;gt;.&lt;br /&gt;
&lt;br /&gt;
=== Вычислительное ядро алгоритма ===&lt;br /&gt;
Вычислительное ядро алгоритма составляет непосредственно вычисление одностороннего вращения Якоби, т.е. вычисление элементов матрицы &amp;lt;math&amp;gt;g_{jm}^{(i+1)} = g_{mj}^{(i+1)}&amp;lt;/math&amp;gt; и &amp;lt;math&amp;gt;g_{km}^{(i+1)} = g_{mk}^{(i+1)}&amp;lt;/math&amp;gt;, &amp;lt;math&amp;gt;m \ne j,k&amp;lt;/math&amp;gt;, а также вычисления элементов &amp;lt;math&amp;gt;g_{jj}^{(i+1)} &amp;lt;/math&amp;gt; и &amp;lt;math&amp;gt;g_{kk}^{(i+1)} &amp;lt;/math&amp;gt;, получившихся после умножения промежуточной матрицы на матрицу вращений Якоби:&lt;br /&gt;
&lt;br /&gt;
&amp;lt;math&amp;gt;\begin{align}&lt;br /&gt;
 g_{jj}^{(i+1)} &amp;amp;= c^2\, g_{jj}^{(i)}  -  2\, s c \,g_{jk}^{(i)}  +  s^2\, g_{kk}^{(i)} \\&lt;br /&gt;
 g_{kk}^{(i+1)} &amp;amp;= s^2 \,g_{jj}^{(i)}  +  2 s c\, g_{jk}^{(i)}  +  c^2 \, g_{kk}^{(i)} \\&lt;br /&gt;
 g_{jk}^{(i+1)} &amp;amp;= g_{kj}^{(i+1)} = (c^2 - s^2 ) \, g_{jk}^{(i)}  +  s c \, (g_{kk}^{(i)} - g_{jj}^{(i)} ) \\&lt;br /&gt;
 g_{jm}^{(i+1)} &amp;amp;= g_{mj}^{(i+1)} = c \, g_{jm}^{(i)}  -  s \, g_{km}^{(i)} &amp;amp; m \ne j,k \\&lt;br /&gt;
 g_{km}^{(i+1)} &amp;amp;= g_{mk}^{(i+1)} = s \, g_{jm}^{(i)}  + c \, g_{km}^{(i)} &amp;amp; m \ne j,k \\&lt;br /&gt;
 g_{ml}^{(i+1)} &amp;amp;= g_{ml}^{(i)} &amp;amp;m,l \ne j,k&lt;br /&gt;
\end{align}&amp;lt;/math&amp;gt;&lt;br /&gt;
&lt;br /&gt;
=== Макроструктура алгоритма ===&lt;br /&gt;
Основную часть метода составляет процедура односторонних вращений матрицы, которая в свою очередь состоит из:&lt;br /&gt;
&lt;br /&gt;
#Вычисление &amp;lt;math&amp;gt;\tau, c, s, t&amp;lt;/math&amp;gt;.&lt;br /&gt;
#Одностороннее вращение матрицы. &lt;br /&gt;
&lt;br /&gt;
Что требует &amp;lt;math&amp;gt;O(n)&amp;lt;/math&amp;gt; операций.&lt;br /&gt;
&lt;br /&gt;
После этого необходимо:&lt;br /&gt;
&lt;br /&gt;
#Вычислить сингулярные числа &amp;lt;math&amp;gt;\sigma_i&amp;lt;/math&amp;gt;.  Что требует &amp;lt;math&amp;gt;O(n)&amp;lt;/math&amp;gt; операций.&lt;br /&gt;
#Вычислить &amp;lt;math&amp;gt;U&amp;lt;/math&amp;gt; и &amp;lt;math&amp;gt;V&amp;lt;/math&amp;gt;. Что требует &amp;lt;math&amp;gt;O(n^2)&amp;lt;/math&amp;gt; операций.&lt;br /&gt;
&lt;br /&gt;
=== Схема реализации последовательного алгоритма ===&lt;br /&gt;
Применение метода Якоби к матрице &amp;lt;math&amp;gt;A = (G^TG)&amp;lt;/math&amp;gt; можно описать следующим образом&amp;lt;ref&amp;gt;Дж. Деммель «Вычислительная линейная алгебра» (стр. 261-263)&amp;lt;/ref&amp;gt;:&lt;br /&gt;
&lt;br /&gt;
Если &amp;lt;math&amp;gt;G = U\Sigma V^T&amp;lt;/math&amp;gt; и &amp;lt;math&amp;gt;\Sigma = diag(\sigma_{i})&amp;lt;/math&amp;gt;, то алгоритм вычисляет сингулярные числа &amp;lt;math&amp;gt;\sigma_{i}&amp;lt;/math&amp;gt;, матрицу &amp;lt;math&amp;gt;U&amp;lt;/math&amp;gt; левых сингулярных векторов и матрицу &amp;lt;math&amp;gt;V&amp;lt;/math&amp;gt; правых сингулярных векторов по следующей схеме:&lt;br /&gt;
&lt;br /&gt;
 repeat&lt;br /&gt;
     for &amp;lt;math&amp;gt;j=1&amp;lt;/math&amp;gt; to &amp;lt;math&amp;gt;n-1&amp;lt;/math&amp;gt;&lt;br /&gt;
         for &amp;lt;math&amp;gt;k=j+1&amp;lt;/math&amp;gt; to &amp;lt;math&amp;gt;n&amp;lt;/math&amp;gt;&lt;br /&gt;
             обратиться к процедуре &#039;&#039;&#039;&#039;&#039;One-Sided-Jacobi-Rotation&amp;lt;math&amp;gt;(G,j,k)&amp;lt;/math&amp;gt;&#039;&#039;&#039;&#039;&#039;&lt;br /&gt;
         end for&lt;br /&gt;
     end for&lt;br /&gt;
 пока &amp;lt;math&amp;gt;G^TG&amp;lt;/math&amp;gt; не станет достаточно близка к диагональной матрице&lt;br /&gt;
 Положить &amp;lt;math&amp;gt;\sigma_{i} = ||G(:,i)||_2 &amp;lt;/math&amp;gt; (норма &amp;lt;math&amp;gt;i&amp;lt;/math&amp;gt;-го столбца в &amp;lt;math&amp;gt;G&amp;lt;/math&amp;gt;)&lt;br /&gt;
 Положить &amp;lt;math&amp;gt;U = [u_{1},\dots, u_{n}]&amp;lt;/math&amp;gt;, где &amp;lt;math&amp;gt;u_{i} = G(:,i)/\sigma_{i}&amp;lt;/math&amp;gt;&lt;br /&gt;
 Положить &amp;lt;math&amp;gt;V = J&amp;lt;/math&amp;gt;, где &amp;lt;math&amp;gt;J&amp;lt;/math&amp;gt; - накопленное произведение вращений Якоби.&lt;br /&gt;
&lt;br /&gt;
Где процедура &#039;&#039;&#039;&#039;&#039;One-Sided-Jacobi-Rotation&#039;&#039;&#039;&#039;&#039; является метод односторонних вращений Якоби:&lt;br /&gt;
&lt;br /&gt;
 proc &#039;&#039;&#039;&#039;&#039;One-Sided-Jacobi-Rotation&amp;lt;math&amp;gt;(G,j,k)&amp;lt;/math&amp;gt;&#039;&#039;&#039;&#039;&#039;&lt;br /&gt;
     вычислить &amp;lt;math&amp;gt;a_{jj} = (G^TG)_{jj}, a_{jk} = (G^TG)_{jk}&amp;lt;/math&amp;gt; и &amp;lt;math&amp;gt;a_{kk} = (G^TG)_{kk}&amp;lt;/math&amp;gt;&lt;br /&gt;
     if &amp;lt;math&amp;gt;|a_{jk}|&amp;lt;/math&amp;gt; не слишком мал&lt;br /&gt;
         &amp;lt;math&amp;gt;&lt;br /&gt;
         \begin{align}&lt;br /&gt;
         \tau &amp;amp;= ({a_{jj} - a_{kk}})/{2a_{jk}} \\&lt;br /&gt;
         t &amp;amp;= {sign(\tau)}/(|\tau| + \sqrt{1 + \tau^2}) \\&lt;br /&gt;
         c &amp;amp;= 1/(\sqrt{1 + t^2}) \\&lt;br /&gt;
         s &amp;amp;= ct \\&lt;br /&gt;
         G &amp;amp;= GR(j,k,\theta) \  \dots c=cos\theta, s=sin\theta \end{align}&amp;lt;/math&amp;gt;&lt;br /&gt;
         if нужны правые сингулярные векторы &lt;br /&gt;
             &amp;lt;math&amp;gt;J = JR(j,k,\theta)&amp;lt;/math&amp;gt;&lt;br /&gt;
         end if&lt;br /&gt;
     end if&lt;br /&gt;
&lt;br /&gt;
=== Последовательная сложность алгоритма ===&lt;br /&gt;
Для одного вращения Якоби необходимо выполнить &amp;lt;math&amp;gt;O(n)&amp;lt;/math&amp;gt; операций умножения и сложения. &lt;br /&gt;
&lt;br /&gt;
Всего вариантов выбора &amp;lt;math&amp;gt;j&amp;lt;/math&amp;gt; и &amp;lt;math&amp;gt;k&amp;lt;/math&amp;gt; существует &amp;lt;math&amp;gt;\frac{n(n-1)}{2}&amp;lt;/math&amp;gt;.&lt;br /&gt;
&lt;br /&gt;
Таким образом последовательный алгоритм Якоби вычисления сингулярных чисел и векторов является алгоритмом с кубической сложностью.&lt;br /&gt;
&lt;br /&gt;
=== Информационный граф ===&lt;br /&gt;
Граф алгоритма состоит из четырех групп вершин&lt;br /&gt;
&lt;br /&gt;
(А)Первая группа вершин расположена в двумерной области, соответствующая ей операция - вычисление элементов &amp;lt;math&amp;gt;a_{jj},a_{jk},a_{kk}&amp;lt;/math&amp;gt; матрицы произведения &amp;lt;math&amp;gt;A = (G^TG)&amp;lt;/math&amp;gt;. Где &amp;lt;math&amp;gt;j&amp;lt;/math&amp;gt; изменяется от &amp;lt;math&amp;gt;1&amp;lt;/math&amp;gt; до &amp;lt;math&amp;gt;n-1&amp;lt;/math&amp;gt;, принимая все целочисленные значения, &amp;lt;math&amp;gt;k&amp;lt;/math&amp;gt;  изменяется от &amp;lt;math&amp;gt;j+1&amp;lt;/math&amp;gt; до &amp;lt;math&amp;gt;n&amp;lt;/math&amp;gt;, принимая все целочисленные значения.&lt;br /&gt;
&lt;br /&gt;
Граф вычисления каждого из элементов приведен на рисунке 1, где значениям &amp;lt;math&amp;gt;g_{ij}&amp;lt;/math&amp;gt; соответствуют обозначения &amp;lt;math&amp;gt;x_{ij}&amp;lt;/math&amp;gt;, а элементам &amp;lt;math&amp;gt;g^T_{ij}&amp;lt;/math&amp;gt; обозначения &amp;lt;math&amp;gt;z_{ij}&amp;lt;/math&amp;gt;. Значение &amp;lt;math&amp;gt;s_{ij}&amp;lt;/math&amp;gt; является значением результирующего элемента.&lt;br /&gt;
&lt;br /&gt;
(Б)Вторая группа вершин расположена в двумерной области, соответствующая ей операция – вычисление &amp;lt;math&amp;gt;c&amp;lt;/math&amp;gt; и &amp;lt;math&amp;gt;s&amp;lt;/math&amp;gt;.&lt;br /&gt;
&lt;br /&gt;
Информационный граф с входными и выходными данными вычисления пункта (Б) представлен на рисунке 2.&lt;br /&gt;
&lt;br /&gt;
(В)Третья группа вершин расположена в двумерной области, соответствующая ей операция вычисление значений элементов &amp;lt;math&amp;gt;g_{jm}^{(i+1)} = g_{mj}^{(i+1)}&amp;lt;/math&amp;gt; и &amp;lt;math&amp;gt;g_{km}^{(i+1)} = g_{mk}^{(i+1)}&amp;lt;/math&amp;gt;, &amp;lt;math&amp;gt;m \ne j,k&amp;lt;/math&amp;gt;.&lt;br /&gt;
&lt;br /&gt;
(Г)Четвертая группа вершин расположена в двумерной области, соответствующая ей операция вычисление значений элементов &amp;lt;math&amp;gt;g_{jj}^{(i+1)} &amp;lt;/math&amp;gt; и &amp;lt;math&amp;gt;g_{kk}^{(i+1)} &amp;lt;/math&amp;gt;.&lt;br /&gt;
&lt;br /&gt;
Элементы групп (В) и (Г) вычисляются аналогично вычислению элементов матрицы произведения, т.к. фактически представляют собой перемножение матриц &amp;lt;math&amp;gt;G&amp;lt;/math&amp;gt; и &amp;lt;math&amp;gt;R&amp;lt;/math&amp;gt;&lt;br /&gt;
&lt;br /&gt;
[[File:Jacobi_2.jpg|none|thumb|1000px|Рисунок 1. Информационный граф с входными и выходными параметрами вычисления каждого элемента матрицы произведения.]]&lt;br /&gt;
&lt;br /&gt;
[[File:Jacobi_1.jpg|none|thumb|1000px|Рисунок 2. Информационный граф с входными и выходными параметрами вычисления значений &amp;lt;math&amp;gt;c&amp;lt;/math&amp;gt; и &amp;lt;math&amp;gt;s&amp;lt;/math&amp;gt;.]]&lt;br /&gt;
&lt;br /&gt;
Обобщенный граф метода Якоби представлен на рисунке 3, где буквами А, Б, В и Г обозначено вычисление групп вершин (А), (Б), (В) и (Г).&lt;br /&gt;
&lt;br /&gt;
[[File:Graf21.png|none|thumb|2000px|Рисунок 3. Обобщенный граф алгоритма вычисления сингулярных чисел и векторов методом Якоби.]]&lt;br /&gt;
&lt;br /&gt;
=== Ресурс параллелизма алгоритма ===&lt;br /&gt;
Для выполнения одной итерации метода Якоби требуется последовательно выполнить несколько ярусов:&lt;br /&gt;
# вычислить &amp;lt;math&amp;gt;\tau&amp;lt;/math&amp;gt; &lt;br /&gt;
# вычислить &amp;lt;math&amp;gt;t&amp;lt;/math&amp;gt; &lt;br /&gt;
# вычислить &amp;lt;math&amp;gt;c&amp;lt;/math&amp;gt; &lt;br /&gt;
# вычислить &amp;lt;math&amp;gt;s&amp;lt;/math&amp;gt;&lt;br /&gt;
# выполнить поворот матрицы &amp;lt;math&amp;gt;G&amp;lt;/math&amp;gt; с параллельным выполнением &amp;lt;math&amp;gt;2(n-2)&amp;lt;/math&amp;gt; операций вычисления элементов матрицы &amp;lt;math&amp;gt;g_{jm}^{(i+1)} = g_{mj}^{(i+1)}&amp;lt;/math&amp;gt; и &amp;lt;math&amp;gt;g_{km}^{(i+1)} = g_{mk}^{(i+1)}&amp;lt;/math&amp;gt;, &amp;lt;math&amp;gt;m \ne j,k&amp;lt;/math&amp;gt;, а также вычисления элементов &amp;lt;math&amp;gt;g_{jj}^{(i+1)} &amp;lt;/math&amp;gt; и &amp;lt;math&amp;gt;g_{kk}^{(i+1)} &amp;lt;/math&amp;gt;. &lt;br /&gt;
&lt;br /&gt;
Суммарное количество итераций равно &amp;lt;math&amp;gt;\frac{n(n-1)}{2}&amp;lt;/math&amp;gt; (Различные варианты выбора &amp;lt;math&amp;gt;j&amp;lt;/math&amp;gt; и &amp;lt;math&amp;gt;k&amp;lt;/math&amp;gt;). &lt;br /&gt;
&lt;br /&gt;
Асимптотически метод сходится квадратично. &lt;br /&gt;
&lt;br /&gt;
Таким образом, при классификации по высоте ЯПФ метод Якоби относится к алгоритмам со сложностью &amp;lt;math&amp;gt;O(n^2)&amp;lt;/math&amp;gt;&amp;amp;nbsp;, а при классификации по ширине ЯПФ — к алгоритмам со сложностью &amp;lt;math&amp;gt;O(n)&amp;lt;/math&amp;gt;.&lt;br /&gt;
&lt;br /&gt;
=== Входные и выходные данные алгоритма ===&lt;br /&gt;
&#039;&#039;&#039;Входные данные&#039;&#039;&#039;: плотная матрица &amp;lt;math&amp;gt;G&amp;lt;/math&amp;gt; размера &amp;lt;math&amp;gt;n&amp;lt;/math&amp;gt;х&amp;lt;math&amp;gt;n&amp;lt;/math&amp;gt;, где &amp;lt;math&amp;gt;A= G^TG&amp;lt;/math&amp;gt; – симметрическая матрица.&lt;br /&gt;
&lt;br /&gt;
&#039;&#039;&#039;Объём входных данных&#039;&#039;&#039;: &amp;lt;math&amp;gt;n^2&amp;lt;/math&amp;gt; (т.к. для хранения матрицы &amp;lt;math&amp;gt;G&amp;lt;/math&amp;gt; используем двумерный массив размера &amp;lt;math&amp;gt;n&amp;lt;/math&amp;gt;х&amp;lt;math&amp;gt;n&amp;lt;/math&amp;gt;)&lt;br /&gt;
&lt;br /&gt;
&#039;&#039;&#039;Выходные данные&#039;&#039;&#039;: &amp;lt;math&amp;gt;\sigma_{i}&amp;lt;/math&amp;gt;  - сингулярные числа, матрица &amp;lt;math&amp;gt;U&amp;lt;/math&amp;gt; левых сингулярных векторов и матрица &amp;lt;math&amp;gt;V&amp;lt;/math&amp;gt; правых сингулярных векторов.&lt;br /&gt;
&lt;br /&gt;
&#039;&#039;&#039;Объём выходных данных&#039;&#039;&#039;: &amp;lt;math&amp;gt;2n^2 + n&amp;lt;/math&amp;gt; (т.к. необходимо хранить вектор сингулярных чисел длины &amp;lt;math&amp;gt;n&amp;lt;/math&amp;gt;, а также две матрицы &amp;lt;math&amp;gt;U, V&amp;lt;/math&amp;gt; левых и правых сингулярных векторов размера &amp;lt;math&amp;gt;n&amp;lt;/math&amp;gt;х&amp;lt;math&amp;gt;n&amp;lt;/math&amp;gt;).&lt;br /&gt;
&lt;br /&gt;
=== Свойства алгоритма ===&lt;br /&gt;
Метод Якоби является самым медленным из имеющихся алгоритмов вычисления сингулярных чисел и сингулярных векторов матрицы. Тем не менее, для  матриц &amp;lt;math&amp;gt;G&amp;lt;/math&amp;gt;, которые могут быть представлены в виде &amp;lt;math&amp;gt;G=DX&amp;lt;/math&amp;gt;, где &amp;lt;math&amp;gt;D&amp;lt;/math&amp;gt; - диагональная, а &amp;lt;math&amp;gt;X&amp;lt;/math&amp;gt; - хорошо обусловлена, он способен вычислять сингулярные числа и вектора намного точнее, чем другие методы&amp;lt;ref&amp;gt;Дж. Деммель «Вычислительная линейная алгебра» (стр. 261-264)&amp;lt;/ref&amp;gt;. &lt;br /&gt;
&lt;br /&gt;
Вычислительная мощность алгоритма, как отношение числа операций к суммарному объему входных и выходных данных является линейной.&lt;br /&gt;
&lt;br /&gt;
Метод Якоби не детерминирован, так как является итерационным алгоритмом с выходом по точности (число итераций зависит от входных данных и порогового значения).&lt;br /&gt;
&lt;br /&gt;
== Программная реализация алгоритма ==&lt;br /&gt;
&lt;br /&gt;
=== Особенности реализации последовательного алгоритма ===&lt;br /&gt;
&lt;br /&gt;
=== Локальность данных и вычислений ===&lt;br /&gt;
&lt;br /&gt;
=== Возможные способы и особенности параллельной реализации алгоритма ===&lt;br /&gt;
&lt;br /&gt;
=== Масштабируемость алгоритма и его реализации ===&lt;br /&gt;
Исследование масштабируемости параллельной реализации метода Якоби вычисления сингулярных чисел и векторов проводилось на суперкомпьютере &amp;quot;Ломоносов&amp;quot;. Алгоритм реализован на языке программирования C с использованием механизмов MPI.&lt;br /&gt;
&lt;br /&gt;
Алгоритм работает по следующей схеме:&lt;br /&gt;
#На вход всем процессорам подается матрица &amp;lt;math&amp;gt; G &amp;lt;/math&amp;gt;.&lt;br /&gt;
#Для всех &amp;lt;math&amp;gt; j &amp;lt;/math&amp;gt; и &amp;lt;math&amp;gt; k &amp;lt;/math&amp;gt; таких, что &amp;lt;math&amp;gt; j \in [1,n-1] &amp;lt;/math&amp;gt;, &amp;lt;math&amp;gt; k \in [j+1,n] &amp;lt;/math&amp;gt;&lt;br /&gt;
##Вычисляется элемент &amp;lt;math&amp;gt; a_{jk} &amp;lt;/math&amp;gt; путем перемножения матриц &amp;lt;math&amp;gt; G^TG &amp;lt;/math&amp;gt;, где на каждом процессоре вычисляется своя часть матрицы. После чего результат отправляется на все процессоры.&lt;br /&gt;
##Если полученный элемент оказывается больше некоторого значения, то начинается последовательная часть программы: Вычисление элементов &amp;lt;math&amp;gt; \tau, t, c, s &amp;lt;/math&amp;gt;.&lt;br /&gt;
##Затем, выполняется операция поворота, путем перемножения матриц &amp;lt;math&amp;gt; G &amp;lt;/math&amp;gt; и &amp;lt;math&amp;gt; R &amp;lt;/math&amp;gt;. Данная операция выполняется параллельно на нескольких процессорах, где каждый процессор вычисляет свою часть матрицы. После чего результат пересылается всем процессорам.&lt;br /&gt;
&lt;br /&gt;
Данная схема повторяется до тех пор, пока матрица &amp;lt;math&amp;gt; A = G^TG &amp;lt;/math&amp;gt; не станет достаточно близкой к диагональной.&lt;br /&gt;
&lt;br /&gt;
Для проверки этого факта, в конце каждой итерации цикла вычисляется матрица &amp;lt;math&amp;gt; A &amp;lt;/math&amp;gt;. Данная операция выполняется параллельно на нескольких процессорах, где каждый процессор вычисляет свою часть матрицы, после чего результат пересылается всем процессорам.&lt;br /&gt;
&lt;br /&gt;
&lt;br /&gt;
Набор и границы значений изменяемых параметров запуска реализации алгоритма: &lt;br /&gt;
&lt;br /&gt;
*	число процессоров [1 : 128] с шагом равным степени двойки;&lt;br /&gt;
*	размер матрицы [256 : 1792] с шагом 256.&lt;br /&gt;
&lt;br /&gt;
В результате проведённых экспериментов был получен следующий диапазон эффективности реализации алгоритма:&lt;br /&gt;
&lt;br /&gt;
*	минимальная эффективность реализации 0,01%;&lt;br /&gt;
*	максимальная эффективность реализации 16,52%.&lt;br /&gt;
&lt;br /&gt;
На следующих рисунках приведены графики производительности и эффективности выбранной реализации метода Якоби в зависимости от изменяемых параметров запуска.&lt;br /&gt;
&lt;br /&gt;
[[File:Performance.jpg|none|thumb|1000px|Рисунок 1. Параллельная реализация метода Якоби. Изменение производительности в зависимости от числа процессоров и размера матрицы.]]&lt;br /&gt;
&lt;br /&gt;
[[File:Эффективность.png|none|thumb|1000px|Рисунок 1. Параллельная реализация метода Якоби. Изменение эффективности в зависимости от числа процессоров и размера матрицы.]]&lt;br /&gt;
&lt;br /&gt;
Построим оценки масштабируемости данной реализации метода Якоби: &lt;br /&gt;
* По числу процессов: при увеличении числа процессов эффективность на рассмотренной области изменений параметров запуска сначала увеличивается (самый пик достигается при 16 процессах), а затем начинает снижаться. Это характеризуется тем, что накладные расходы на параллельное выполнение (общение между процессами) начинает превалировать над вычислениями.&lt;br /&gt;
&lt;br /&gt;
*По размеру задачи: при увеличении размера задачи эффективность возрастает. Это подтверждает предположение о том, что размер задачи сильно влияет на эффективность выполнения приложения. Оценка показывает, что с ростом размера задачи эффективность на рассмотренной области значений параметров запуска сильно увеличивается. &lt;br /&gt;
&lt;br /&gt;
*По двум направлениям: при рассмотрении увеличения как вычислительной сложности, так и числа процессов на всей рассмотренной области значений эффективность увеличивается, но медленно и с перепадами.&lt;br /&gt;
&lt;br /&gt;
=== Динамические характеристики и эффективность реализации алгоритма ===&lt;br /&gt;
&lt;br /&gt;
=== Выводы для классов архитектур ===&lt;br /&gt;
&lt;br /&gt;
=== Существующие реализации алгоритма ===&lt;br /&gt;
Метод Якоби нахождения сингулярных значений и векторов реализован в таких пакетах, как LAPACK &amp;lt;ref&amp;gt;http://www.netlib.org/scalapack/slug/&amp;lt;/ref&amp;gt;, LINPACK/EISPACK &amp;lt;ref&amp;gt; http://www.netlib.org/linpack/ &amp;lt;/ref&amp;gt;, Intel MKL &amp;lt;ref&amp;gt;https://software.intel.com/ru-ru/node/521153#CAF8CA08-1C69-48F8-B0C3-B2B27AFA92FA&amp;lt;/ref&amp;gt;.&lt;br /&gt;
&lt;br /&gt;
Так же функция Якоби реализована в пакете Matlab.&lt;br /&gt;
&lt;br /&gt;
Т. к. алгоритм считается медленным, он не включен во многие известные пакеты.&lt;br /&gt;
&lt;br /&gt;
== Литература ==&lt;br /&gt;
1. Дж. Деммель Вычислительная линейная алгебра. Изд. Мир, 2001.&lt;/div&gt;</summary>
		<author><name>Davletshuna Alexandra</name></author>
	</entry>
	<entry>
		<id>https://xn--80aecvaldz.xn--80ahdrnmvk.xn--p1ai/w/ru/index.php?title=%D0%A3%D1%87%D0%B0%D1%81%D1%82%D0%BD%D0%B8%D0%BA:Davletshuna_Alexandra/%D0%9C%D0%B5%D1%82%D0%BE%D0%B4_%D0%AF%D0%BA%D0%BE%D0%B1%D0%B8_%D0%B2%D1%8B%D1%87%D0%B8%D1%81%D0%BB%D0%B5%D0%BD%D0%B8%D1%8F_%D1%81%D0%B8%D0%BD%D0%B3%D1%83%D0%BB%D1%8F%D1%80%D0%BD%D1%8B%D1%85_%D1%87%D0%B8%D1%81%D0%B5%D0%BB_%D0%B8_%D0%B2%D0%B5%D0%BA%D1%82%D0%BE%D1%80%D0%BE%D0%B2&amp;diff=17949</id>
		<title>Участник:Davletshuna Alexandra/Метод Якоби вычисления сингулярных чисел и векторов</title>
		<link rel="alternate" type="text/html" href="https://xn--80aecvaldz.xn--80ahdrnmvk.xn--p1ai/w/ru/index.php?title=%D0%A3%D1%87%D0%B0%D1%81%D1%82%D0%BD%D0%B8%D0%BA:Davletshuna_Alexandra/%D0%9C%D0%B5%D1%82%D0%BE%D0%B4_%D0%AF%D0%BA%D0%BE%D0%B1%D0%B8_%D0%B2%D1%8B%D1%87%D0%B8%D1%81%D0%BB%D0%B5%D0%BD%D0%B8%D1%8F_%D1%81%D0%B8%D0%BD%D0%B3%D1%83%D0%BB%D1%8F%D1%80%D0%BD%D1%8B%D1%85_%D1%87%D0%B8%D1%81%D0%B5%D0%BB_%D0%B8_%D0%B2%D0%B5%D0%BA%D1%82%D0%BE%D1%80%D0%BE%D0%B2&amp;diff=17949"/>
		<updated>2016-11-17T16:14:13Z</updated>

		<summary type="html">&lt;p&gt;Davletshuna Alexandra: &lt;/p&gt;
&lt;hr /&gt;
&lt;div&gt;{{Assignment}}&lt;br /&gt;
&lt;br /&gt;
{{algorithm&lt;br /&gt;
| name              = Метод Якоби вычисления сингулярных чисел и векторов&lt;br /&gt;
| serial_complexity = &amp;lt;math&amp;gt;O(n^3)&amp;lt;/math&amp;gt;&lt;br /&gt;
| pf_height         = &amp;lt;math&amp;gt;O(n^2)&amp;lt;/math&amp;gt;&lt;br /&gt;
| pf_width          = &amp;lt;math&amp;gt;O(n)&amp;lt;/math&amp;gt;&lt;br /&gt;
| input_data        = &amp;lt;math&amp;gt;n^2&amp;lt;/math&amp;gt;&lt;br /&gt;
| output_data       = &amp;lt;math&amp;gt;2n^2 + n&amp;lt;/math&amp;gt;&lt;br /&gt;
}}&lt;br /&gt;
&lt;br /&gt;
Авторы статьи: [[Участница:Davletshuna Alexandra|Давлетшина Александра]] (группа 619) пункты 1.1-1.4, 1.6, 2.7; [[Участница:Alek sandra|Зайцева Александра]] (группа 601) пункты 1.5, 1.7-1.10, 2.7.&lt;br /&gt;
&lt;br /&gt;
== Свойства и структура алгоритма ==&lt;br /&gt;
&lt;br /&gt;
=== Общее описание алгоритма ===&lt;br /&gt;
&#039;&#039;&#039;Сингулярным разложением&#039;&#039;&#039; называется разложение прямоугольной вещественной или комплексной матрицы, имеющее широкое применение, в силу своей наглядной геометрической интерпретации, при решении многих прикладных задач. Сингулярное разложение матрицы А позволяет вычислять сингулярные числа данной матрицы, а также, левые и правые сингулярные векторы матрицы А:&lt;br /&gt;
&lt;br /&gt;
•	левые сингулярные векторы матрицы А — это собственные векторы матрицы &amp;lt;math&amp;gt;AA^*&amp;lt;/math&amp;gt;;&lt;br /&gt;
&lt;br /&gt;
•	правые сингулярные векторы матрицы A — это собственные векторы матрицы &amp;lt;math&amp;gt;A^*A&amp;lt;/math&amp;gt;.&lt;br /&gt;
&lt;br /&gt;
Геометрическая интерпретация сингулярного разложения заключается в следующем факте из геометрии: &#039;&#039;Образом любого линейного преобразования, заданного с помощью матрицы &amp;lt;math&amp;gt;m&amp;lt;/math&amp;gt;x&amp;lt;math&amp;gt;n&amp;lt;/math&amp;gt;, примененного к единичной сфере является гиперэллипсоид&#039;&#039;.&lt;br /&gt;
&lt;br /&gt;
Из многочисленных разложений матриц, наиболее удобным является сингулярное разложение матрицы в виде: &amp;lt;math&amp;gt;A=U\Sigma V^*&amp;lt;/math&amp;gt;, где &amp;lt;math&amp;gt;U, V&amp;lt;/math&amp;gt; – унитарные матрицы, а &amp;lt;math&amp;gt;\Sigma&amp;lt;/math&amp;gt; – диагональная матрица с вещественными положительными числами на диагонали &amp;lt;ref&amp;gt;http://algorithms.parallel.ru/&amp;lt;/ref&amp;gt;.&lt;br /&gt;
&lt;br /&gt;
Диагональные элементы матрицы &amp;lt;math&amp;gt;\Sigma&amp;lt;/math&amp;gt; называются сингулярными числами матрицы &amp;lt;math&amp;gt;A&amp;lt;/math&amp;gt;, а столбцы матриц &amp;lt;math&amp;gt;U,V&amp;lt;/math&amp;gt; левыми и правыми сингулярными векторами соответственно.&lt;br /&gt;
&lt;br /&gt;
Алгоритм Якоби сингулярного разложения матрицы был предложен одним из первых в 1846 году. Он приводит прямоугольную матрицу к диагональной матрице с помощью последовательности элементарных вращений. Метод может найти все сингулярные значения с очень высокой точностью. Однако его производительность является довольно низкой, в сравнении с конкурирующими методами.&lt;br /&gt;
&lt;br /&gt;
&#039;&#039;Неявный&#039;&#039;&amp;lt;ref&amp;gt;Дж. Деммель «Вычислительная линейная алгебра» (стр. 261-264)&amp;lt;/ref&amp;gt; метод Якоби математически эквивалентен применению метода Якоби вычисления собственных значений к матрице &amp;lt;math&amp;gt;A = G^TG&amp;lt;/math&amp;gt;.&lt;br /&gt;
Это значит, что на каждом шаге вычисляется вращение Якоби &amp;lt;math&amp;gt;J&amp;lt;/math&amp;gt;, с помощью которого матрица &amp;lt;math&amp;gt;G^TG&amp;lt;/math&amp;gt; неявно пересчитывется в &amp;lt;math&amp;gt;J^TG^TGJ&amp;lt;/math&amp;gt;; вращение выбрано так, чтобы пара внедиагональных элементов из &amp;lt;math&amp;gt;G^TG&amp;lt;/math&amp;gt; обратилась в нули в матрице &amp;lt;math&amp;gt;J^TG^TGJ&amp;lt;/math&amp;gt;. При этом ни &amp;lt;math&amp;gt;G^TG&amp;lt;/math&amp;gt;, ни &amp;lt;math&amp;gt;J^TG^TGJ&amp;lt;/math&amp;gt; не вычисляются в явном виде; вместо них вычисляется матрица &amp;lt;math&amp;gt;GJ&amp;lt;/math&amp;gt;. Поэтому алгоритм называется &#039;&#039;методом односторонних вращений&#039;&#039;.&lt;br /&gt;
&lt;br /&gt;
=== Математическое описание алгоритма ===&lt;br /&gt;
Исходные данные: матрица &amp;lt;math&amp;gt;G&amp;lt;/math&amp;gt; (элементы &amp;lt;math&amp;gt;g_{ij}, i, j = 1, \ldots, n&amp;lt;/math&amp;gt;).&lt;br /&gt;
&lt;br /&gt;
Вычисляемые данные: матрица &amp;lt;math&amp;gt;\Sigma = diag(\sigma_{i})&amp;lt;/math&amp;gt;, где &amp;lt;math&amp;gt;\sigma_{i}&amp;lt;/math&amp;gt; - сингулярные числа, &amp;lt;math&amp;gt;U&amp;lt;/math&amp;gt; - матрица левых сингулярных векторов, &amp;lt;math&amp;gt;V&amp;lt;/math&amp;gt; - матрица правых сингулярных векторов.&lt;br /&gt;
&lt;br /&gt;
симметричную матрицу &amp;lt;math&amp;gt;A = (G^TG)&amp;lt;/math&amp;gt; можно привести к диагональному виду:&lt;br /&gt;
&amp;lt;math&amp;gt;RG^TGR^T&amp;lt;/math&amp;gt;, где&lt;br /&gt;
&lt;br /&gt;
&amp;lt;math&amp;gt;&lt;br /&gt;
R(j,k,\theta) = &lt;br /&gt;
\begin{matrix}&lt;br /&gt;
  \\&lt;br /&gt;
  \\&lt;br /&gt;
  \\&lt;br /&gt;
j \\&lt;br /&gt;
  \\&lt;br /&gt;
k \\&lt;br /&gt;
  \\&lt;br /&gt;
  \\&lt;br /&gt;
  \\&lt;br /&gt;
\end{matrix}&lt;br /&gt;
&amp;lt;/math&amp;gt;  &lt;br /&gt;
&amp;lt;math&amp;gt;&lt;br /&gt;
\begin{bmatrix}&lt;br /&gt;
  &amp;amp; 1 &amp;amp;   &amp;amp;        &amp;amp;              &amp;amp;        &amp;amp;               &amp;amp;         &amp;amp;    &amp;amp;   \\&lt;br /&gt;
  &amp;amp;   &amp;amp; 1 &amp;amp;        &amp;amp;              &amp;amp;        &amp;amp;               &amp;amp;         &amp;amp;    &amp;amp;   \\&lt;br /&gt;
  &amp;amp;   &amp;amp;   &amp;amp; \ddots &amp;amp;              &amp;amp;        &amp;amp;               &amp;amp;         &amp;amp;    &amp;amp;   \\&lt;br /&gt;
  &amp;amp;   &amp;amp;   &amp;amp;        &amp;amp; \cos(\theta) &amp;amp;        &amp;amp; -\sin(\theta) &amp;amp;         &amp;amp;    &amp;amp;   \\&lt;br /&gt;
  &amp;amp;   &amp;amp;   &amp;amp;        &amp;amp;              &amp;amp; \ddots &amp;amp;               &amp;amp;         &amp;amp;    &amp;amp;   \\&lt;br /&gt;
  &amp;amp;   &amp;amp;   &amp;amp;        &amp;amp; \sin(\theta) &amp;amp;        &amp;amp; \cos(\theta)  &amp;amp;         &amp;amp;    &amp;amp;   \\&lt;br /&gt;
  &amp;amp;   &amp;amp;   &amp;amp;        &amp;amp;              &amp;amp;        &amp;amp;               &amp;amp; \ddots  &amp;amp;    &amp;amp;   \\&lt;br /&gt;
  &amp;amp;   &amp;amp;   &amp;amp;        &amp;amp;              &amp;amp;        &amp;amp;               &amp;amp;         &amp;amp; 1  &amp;amp;   \\&lt;br /&gt;
  &amp;amp;   &amp;amp;   &amp;amp;        &amp;amp;              &amp;amp;        &amp;amp;               &amp;amp;         &amp;amp;    &amp;amp; 1 \\&lt;br /&gt;
\end{bmatrix}&lt;br /&gt;
&amp;lt;/math&amp;gt;&lt;br /&gt;
&lt;br /&gt;
Обозначим &amp;lt;math&amp;gt;s = \sin \theta&amp;lt;/math&amp;gt; и &amp;lt;math&amp;gt;c = \cos \theta&amp;lt;/math&amp;gt;.&lt;br /&gt;
&lt;br /&gt;
Перемножив матрицы &amp;lt;math&amp;gt;RG^TGR^T&amp;lt;/math&amp;gt;, получим следующие выражения&amp;lt;ref&amp;gt;http://www.astro.tsu.ru/OsChMet/5_2.html&amp;lt;/ref&amp;gt;:&lt;br /&gt;
&lt;br /&gt;
&amp;lt;math&amp;gt;\begin{align}&lt;br /&gt;
 a_{jj}^{(i+1)} &amp;amp;= c^2\, a_{jj}^{(i)}  -  2\, s c \,a_{jk}^{(i)}  +  s^2\, a_{kk}^{(i)} \\&lt;br /&gt;
 a_{kk}^{(i+1)} &amp;amp;= s^2 \,a_{jj}^{(i)}  +  2 s c\, a_{jk}^{(i)}  +  c^2 \, a_{kk}^{(i)} \\&lt;br /&gt;
 a_{jk}^{(i+1)} &amp;amp;= a_{kj}^{(i+1)} = (c^2 - s^2 ) \, a_{jk}^{(i)}  +  s c \, (a_{kk}^{(i)} - a_{jj}^{(i)} ) \\&lt;br /&gt;
 a_{jm}^{(i+1)} &amp;amp;= a_{mj}^{(i+1)} = c \, a_{jm}^{(i)}  -  s \, a_{km}^{(i)} &amp;amp; m \ne j,k \\&lt;br /&gt;
 a_{km}^{(i+1)} &amp;amp;= a_{mk}^{(i+1)} = s \, a_{jm}^{(i)}  + c \, a_{km}^{(i)} &amp;amp; m \ne j,k \\&lt;br /&gt;
 a_{ml}^{(i+1)} &amp;amp;= a_{ml}^{(i)} &amp;amp;m,l \ne j,k&lt;br /&gt;
\end{align}&amp;lt;/math&amp;gt;&lt;br /&gt;
&lt;br /&gt;
Т.к внедиагональные элементы должны быть равны 0, то выбираем &amp;lt;math&amp;gt;\theta&amp;lt;/math&amp;gt; так, чтобы &amp;lt;math&amp;gt;a_{jk}^{(i+1)} = 0&amp;lt;/math&amp;gt; и &amp;lt;math&amp;gt;a_{kj}^{(i+1)} = 0&amp;lt;/math&amp;gt;.&lt;br /&gt;
&lt;br /&gt;
Тогда решая уравнение получаем, что&lt;br /&gt;
&lt;br /&gt;
&amp;lt;math&amp;gt;&lt;br /&gt;
         \begin{align}&lt;br /&gt;
         \tau &amp;amp;= ({a_{jj} - a_{kk}})/{2a_{jk}} \\&lt;br /&gt;
         t &amp;amp;= {sign(\tau)}/(|\tau| + \sqrt{1 + \tau^2}) \\&lt;br /&gt;
         c &amp;amp;= 1/(\sqrt{1 + t^2}) \\&lt;br /&gt;
         s &amp;amp;= ct \\&lt;br /&gt;
         \end{align}&amp;lt;/math&amp;gt;&lt;br /&gt;
&lt;br /&gt;
Остановка вычислений алгоритма наступает, когда внедиагональные элементы становятся меньше некоторого наперед заданного числа &amp;lt;math&amp;gt;\varepsilon&amp;lt;/math&amp;gt;.&lt;br /&gt;
&lt;br /&gt;
=== Вычислительное ядро алгоритма ===&lt;br /&gt;
Вычислительное ядро алгоритма составляет непосредственно вычисление одностороннего вращения Якоби, т.е. вычисление элементов матрицы &amp;lt;math&amp;gt;g_{jm}^{(i+1)} = g_{mj}^{(i+1)}&amp;lt;/math&amp;gt; и &amp;lt;math&amp;gt;g_{km}^{(i+1)} = g_{mk}^{(i+1)}&amp;lt;/math&amp;gt;, &amp;lt;math&amp;gt;m \ne j,k&amp;lt;/math&amp;gt;, а также вычисления элементов &amp;lt;math&amp;gt;g_{jj}^{(i+1)} &amp;lt;/math&amp;gt; и &amp;lt;math&amp;gt;g_{kk}^{(i+1)} &amp;lt;/math&amp;gt;, получившихся после умножения промежуточной матрицы на матрицу вращений Якоби:&lt;br /&gt;
&lt;br /&gt;
&amp;lt;math&amp;gt;\begin{align}&lt;br /&gt;
 g_{jj}^{(i+1)} &amp;amp;= c^2\, g_{jj}^{(i)}  -  2\, s c \,g_{jk}^{(i)}  +  s^2\, g_{kk}^{(i)} \\&lt;br /&gt;
 g_{kk}^{(i+1)} &amp;amp;= s^2 \,g_{jj}^{(i)}  +  2 s c\, g_{jk}^{(i)}  +  c^2 \, g_{kk}^{(i)} \\&lt;br /&gt;
 g_{jk}^{(i+1)} &amp;amp;= g_{kj}^{(i+1)} = (c^2 - s^2 ) \, g_{jk}^{(i)}  +  s c \, (g_{kk}^{(i)} - g_{jj}^{(i)} ) \\&lt;br /&gt;
 g_{jm}^{(i+1)} &amp;amp;= g_{mj}^{(i+1)} = c \, g_{jm}^{(i)}  -  s \, g_{km}^{(i)} &amp;amp; m \ne j,k \\&lt;br /&gt;
 g_{km}^{(i+1)} &amp;amp;= g_{mk}^{(i+1)} = s \, g_{jm}^{(i)}  + c \, g_{km}^{(i)} &amp;amp; m \ne j,k \\&lt;br /&gt;
 g_{ml}^{(i+1)} &amp;amp;= g_{ml}^{(i)} &amp;amp;m,l \ne j,k&lt;br /&gt;
\end{align}&amp;lt;/math&amp;gt;&lt;br /&gt;
&lt;br /&gt;
=== Макроструктура алгоритма ===&lt;br /&gt;
Основную часть метода составляет процедура односторонних вращений матрицы, которая в свою очередь состоит из:&lt;br /&gt;
&lt;br /&gt;
#Вычисление &amp;lt;math&amp;gt;\tau, c, s, t&amp;lt;/math&amp;gt;.&lt;br /&gt;
#Одностороннее вращение матрицы. &lt;br /&gt;
&lt;br /&gt;
Что требует &amp;lt;math&amp;gt;O(n)&amp;lt;/math&amp;gt; операций.&lt;br /&gt;
&lt;br /&gt;
После этого необходимо:&lt;br /&gt;
&lt;br /&gt;
#Вычислить сингулярные числа &amp;lt;math&amp;gt;\sigma_i&amp;lt;/math&amp;gt;.  Что требует &amp;lt;math&amp;gt;O(n)&amp;lt;/math&amp;gt; операций.&lt;br /&gt;
#Вычислить &amp;lt;math&amp;gt;U&amp;lt;/math&amp;gt; и &amp;lt;math&amp;gt;V&amp;lt;/math&amp;gt;. Что требует &amp;lt;math&amp;gt;O(n^2)&amp;lt;/math&amp;gt; операций.&lt;br /&gt;
&lt;br /&gt;
=== Схема реализации последовательного алгоритма ===&lt;br /&gt;
Применение метода Якоби к матрице &amp;lt;math&amp;gt;A = (G^TG)&amp;lt;/math&amp;gt; можно описать следующим образом&amp;lt;ref&amp;gt;Дж. Деммель «Вычислительная линейная алгебра» (стр. 261-263)&amp;lt;/ref&amp;gt;:&lt;br /&gt;
&lt;br /&gt;
Если &amp;lt;math&amp;gt;G = U\Sigma V^T&amp;lt;/math&amp;gt; и &amp;lt;math&amp;gt;\Sigma = diag(\sigma_{i})&amp;lt;/math&amp;gt;, то алгоритм вычисляет сингулярные числа &amp;lt;math&amp;gt;\sigma_{i}&amp;lt;/math&amp;gt;, матрицу &amp;lt;math&amp;gt;U&amp;lt;/math&amp;gt; левых сингулярных векторов и матрицу &amp;lt;math&amp;gt;V&amp;lt;/math&amp;gt; правых сингулярных векторов по следующей схеме:&lt;br /&gt;
&lt;br /&gt;
 repeat&lt;br /&gt;
     for &amp;lt;math&amp;gt;j=1&amp;lt;/math&amp;gt; to &amp;lt;math&amp;gt;n-1&amp;lt;/math&amp;gt;&lt;br /&gt;
         for &amp;lt;math&amp;gt;k=j+1&amp;lt;/math&amp;gt; to &amp;lt;math&amp;gt;n&amp;lt;/math&amp;gt;&lt;br /&gt;
             обратиться к процедуре &#039;&#039;&#039;&#039;&#039;One-Sided-Jacobi-Rotation&amp;lt;math&amp;gt;(G,j,k)&amp;lt;/math&amp;gt;&#039;&#039;&#039;&#039;&#039;&lt;br /&gt;
         end for&lt;br /&gt;
     end for&lt;br /&gt;
 пока &amp;lt;math&amp;gt;G^TG&amp;lt;/math&amp;gt; не станет достаточно близка к диагональной матрице&lt;br /&gt;
 Положить &amp;lt;math&amp;gt;\sigma_{i} = ||G(:,i)||_2 &amp;lt;/math&amp;gt; (норма &amp;lt;math&amp;gt;i&amp;lt;/math&amp;gt;-го столбца в &amp;lt;math&amp;gt;G&amp;lt;/math&amp;gt;)&lt;br /&gt;
 Положить &amp;lt;math&amp;gt;U = [u_{1},\dots, u_{n}]&amp;lt;/math&amp;gt;, где &amp;lt;math&amp;gt;u_{i} = G(:,i)/\sigma_{i}&amp;lt;/math&amp;gt;&lt;br /&gt;
 Положить &amp;lt;math&amp;gt;V = J&amp;lt;/math&amp;gt;, где &amp;lt;math&amp;gt;J&amp;lt;/math&amp;gt; - накопленное произведение вращений Якоби.&lt;br /&gt;
&lt;br /&gt;
Где процедура &#039;&#039;&#039;&#039;&#039;One-Sided-Jacobi-Rotation&#039;&#039;&#039;&#039;&#039; является метод односторонних вращений Якоби:&lt;br /&gt;
&lt;br /&gt;
 proc &#039;&#039;&#039;&#039;&#039;One-Sided-Jacobi-Rotation&amp;lt;math&amp;gt;(G,j,k)&amp;lt;/math&amp;gt;&#039;&#039;&#039;&#039;&#039;&lt;br /&gt;
     вычислить &amp;lt;math&amp;gt;a_{jj} = (G^TG)_{jj}, a_{jk} = (G^TG)_{jk}&amp;lt;/math&amp;gt; и &amp;lt;math&amp;gt;a_{kk} = (G^TG)_{kk}&amp;lt;/math&amp;gt;&lt;br /&gt;
     if &amp;lt;math&amp;gt;|a_{jk}|&amp;lt;/math&amp;gt; не слишком мал&lt;br /&gt;
         &amp;lt;math&amp;gt;&lt;br /&gt;
         \begin{align}&lt;br /&gt;
         \tau &amp;amp;= ({a_{jj} - a_{kk}})/{2a_{jk}} \\&lt;br /&gt;
         t &amp;amp;= {sign(\tau)}/(|\tau| + \sqrt{1 + \tau^2}) \\&lt;br /&gt;
         c &amp;amp;= 1/(\sqrt{1 + t^2}) \\&lt;br /&gt;
         s &amp;amp;= ct \\&lt;br /&gt;
         G &amp;amp;= GR(j,k,\theta) \  \dots c=cos\theta, s=sin\theta \end{align}&amp;lt;/math&amp;gt;&lt;br /&gt;
         if нужны правые сингулярные векторы &lt;br /&gt;
             &amp;lt;math&amp;gt;J = JR(j,k,\theta)&amp;lt;/math&amp;gt;&lt;br /&gt;
         end if&lt;br /&gt;
     end if&lt;br /&gt;
&lt;br /&gt;
=== Последовательная сложность алгоритма ===&lt;br /&gt;
Для одного вращения Якоби необходимо выполнить &amp;lt;math&amp;gt;O(n)&amp;lt;/math&amp;gt; операций умножения и сложения. &lt;br /&gt;
&lt;br /&gt;
Всего вариантов выбора &amp;lt;math&amp;gt;j&amp;lt;/math&amp;gt; и &amp;lt;math&amp;gt;k&amp;lt;/math&amp;gt; существует &amp;lt;math&amp;gt;\frac{n(n-1)}{2}&amp;lt;/math&amp;gt;.&lt;br /&gt;
&lt;br /&gt;
Таким образом последовательный алгоритм Якоби вычисления сингулярных чисел и векторов является алгоритмом с кубической сложностью.&lt;br /&gt;
&lt;br /&gt;
=== Информационный граф ===&lt;br /&gt;
Граф алгоритма состоит из четырех групп вершин&lt;br /&gt;
&lt;br /&gt;
(А)Первая группа вершин расположена в двумерной области, соответствующая ей операция - вычисление элементов &amp;lt;math&amp;gt;a_{jj},a_{jk},a_{kk}&amp;lt;/math&amp;gt; матрицы произведения &amp;lt;math&amp;gt;A = (G^TG)&amp;lt;/math&amp;gt;. Где &amp;lt;math&amp;gt;j&amp;lt;/math&amp;gt; изменяется от &amp;lt;math&amp;gt;1&amp;lt;/math&amp;gt; до &amp;lt;math&amp;gt;n-1&amp;lt;/math&amp;gt;, принимая все целочисленные значения, &amp;lt;math&amp;gt;k&amp;lt;/math&amp;gt;  изменяется от &amp;lt;math&amp;gt;j+1&amp;lt;/math&amp;gt; до &amp;lt;math&amp;gt;n&amp;lt;/math&amp;gt;, принимая все целочисленные значения.&lt;br /&gt;
&lt;br /&gt;
Граф вычисления каждого из элементов приведен на рисунке 1, где значениям &amp;lt;math&amp;gt;g_{ij}&amp;lt;/math&amp;gt; соответствуют обозначения &amp;lt;math&amp;gt;x_{ij}&amp;lt;/math&amp;gt;, а элементам &amp;lt;math&amp;gt;g^T_{ij}&amp;lt;/math&amp;gt; обозначения &amp;lt;math&amp;gt;z_{ij}&amp;lt;/math&amp;gt;. Значение &amp;lt;math&amp;gt;s_{ij}&amp;lt;/math&amp;gt; является значением результирующего элемента.&lt;br /&gt;
&lt;br /&gt;
(Б)Вторая группа вершин расположена в двумерной области, соответствующая ей операция – вычисление &amp;lt;math&amp;gt;c&amp;lt;/math&amp;gt; и &amp;lt;math&amp;gt;s&amp;lt;/math&amp;gt;.&lt;br /&gt;
&lt;br /&gt;
Информационный граф с входными и выходными данными вычисления пункта (Б) представлен на рисунке 2.&lt;br /&gt;
&lt;br /&gt;
(В)Третья группа вершин расположена в двумерной области, соответствующая ей операция вычисление значений элементов &amp;lt;math&amp;gt;g_{jm}^{(i+1)} = g_{mj}^{(i+1)}&amp;lt;/math&amp;gt; и &amp;lt;math&amp;gt;g_{km}^{(i+1)} = g_{mk}^{(i+1)}&amp;lt;/math&amp;gt;, &amp;lt;math&amp;gt;m \ne j,k&amp;lt;/math&amp;gt;.&lt;br /&gt;
&lt;br /&gt;
(Г)Четвертая группа вершин расположена в двумерной области, соответствующая ей операция вычисление значений элементов &amp;lt;math&amp;gt;g_{jj}^{(i+1)} &amp;lt;/math&amp;gt; и &amp;lt;math&amp;gt;g_{kk}^{(i+1)} &amp;lt;/math&amp;gt;.&lt;br /&gt;
&lt;br /&gt;
Элементы групп (В) и (Г) вычисляются аналогично вычислению элементов матрицы произведения, т.к. фактически представляют собой перемножение матриц &amp;lt;math&amp;gt;G&amp;lt;/math&amp;gt; и &amp;lt;math&amp;gt;R&amp;lt;/math&amp;gt;&lt;br /&gt;
&lt;br /&gt;
[[File:Jacobi_2.jpg|none|thumb|1000px|Рисунок 1. Информационный граф с входными и выходными параметрами вычисления каждого элемента матрицы произведения.]]&lt;br /&gt;
&lt;br /&gt;
[[File:Jacobi_1.jpg|none|thumb|1000px|Рисунок 2. Информационный граф с входными и выходными параметрами вычисления значений &amp;lt;math&amp;gt;c&amp;lt;/math&amp;gt; и &amp;lt;math&amp;gt;s&amp;lt;/math&amp;gt;.]]&lt;br /&gt;
&lt;br /&gt;
Обобщенный граф метода Якоби представлен на рисунке 3, где буквами А, Б, В и Г обозначено вычисление групп вершин (А), (Б), (В) и (Г).&lt;br /&gt;
&lt;br /&gt;
[[File:Graf21.png|none|thumb|2000px|Рисунок 3. Обобщенный граф алгоритма вычисления сингулярных чисел и векторов методом Якоби.]]&lt;br /&gt;
&lt;br /&gt;
=== Ресурс параллелизма алгоритма ===&lt;br /&gt;
Для выполнения одной итерации метода Якоби требуется последовательно выполнить несколько ярусов:&lt;br /&gt;
# вычислить &amp;lt;math&amp;gt;\tau&amp;lt;/math&amp;gt; &lt;br /&gt;
# вычислить &amp;lt;math&amp;gt;t&amp;lt;/math&amp;gt; &lt;br /&gt;
# вычислить &amp;lt;math&amp;gt;c&amp;lt;/math&amp;gt; &lt;br /&gt;
# вычислить &amp;lt;math&amp;gt;s&amp;lt;/math&amp;gt;&lt;br /&gt;
# выполнить поворот матрицы &amp;lt;math&amp;gt;G&amp;lt;/math&amp;gt; с параллельным выполнением &amp;lt;math&amp;gt;2(n-2)&amp;lt;/math&amp;gt; операций вычисления элементов матрицы &amp;lt;math&amp;gt;g_{jm}^{(i+1)} = g_{mj}^{(i+1)}&amp;lt;/math&amp;gt; и &amp;lt;math&amp;gt;g_{km}^{(i+1)} = g_{mk}^{(i+1)}&amp;lt;/math&amp;gt;, &amp;lt;math&amp;gt;m \ne j,k&amp;lt;/math&amp;gt;, а также вычисления элементов &amp;lt;math&amp;gt;g_{jj}^{(i+1)} &amp;lt;/math&amp;gt; и &amp;lt;math&amp;gt;g_{kk}^{(i+1)} &amp;lt;/math&amp;gt;. &lt;br /&gt;
&lt;br /&gt;
Суммарное количество итераций равно &amp;lt;math&amp;gt;\frac{n(n-1)}{2}&amp;lt;/math&amp;gt; (Различные варианты выбора &amp;lt;math&amp;gt;j&amp;lt;/math&amp;gt; и &amp;lt;math&amp;gt;k&amp;lt;/math&amp;gt;). &lt;br /&gt;
&lt;br /&gt;
Асимптотически метод сходится квадратично. &lt;br /&gt;
&lt;br /&gt;
Таким образом, при классификации по высоте ЯПФ метод Якоби относится к алгоритмам со сложностью &amp;lt;math&amp;gt;O(n^2)&amp;lt;/math&amp;gt;&amp;amp;nbsp;, а при классификации по ширине ЯПФ — к алгоритмам со сложностью &amp;lt;math&amp;gt;O(n)&amp;lt;/math&amp;gt;.&lt;br /&gt;
&lt;br /&gt;
=== Входные и выходные данные алгоритма ===&lt;br /&gt;
&#039;&#039;&#039;Входные данные&#039;&#039;&#039;: плотная матрица &amp;lt;math&amp;gt;G&amp;lt;/math&amp;gt; размера &amp;lt;math&amp;gt;n&amp;lt;/math&amp;gt;х&amp;lt;math&amp;gt;n&amp;lt;/math&amp;gt;, где &amp;lt;math&amp;gt;A= G^TG&amp;lt;/math&amp;gt; – симметрическая матрица.&lt;br /&gt;
&lt;br /&gt;
&#039;&#039;&#039;Объём входных данных&#039;&#039;&#039;: &amp;lt;math&amp;gt;n^2&amp;lt;/math&amp;gt; (т.к. для хранения матрицы &amp;lt;math&amp;gt;G&amp;lt;/math&amp;gt; используем двумерный массив размера &amp;lt;math&amp;gt;n&amp;lt;/math&amp;gt;х&amp;lt;math&amp;gt;n&amp;lt;/math&amp;gt;)&lt;br /&gt;
&lt;br /&gt;
&#039;&#039;&#039;Выходные данные&#039;&#039;&#039;: &amp;lt;math&amp;gt;\sigma_{i}&amp;lt;/math&amp;gt;  - сингулярные числа, матрица &amp;lt;math&amp;gt;U&amp;lt;/math&amp;gt; левых сингулярных векторов и матрица &amp;lt;math&amp;gt;V&amp;lt;/math&amp;gt; правых сингулярных векторов.&lt;br /&gt;
&lt;br /&gt;
&#039;&#039;&#039;Объём выходных данных&#039;&#039;&#039;: &amp;lt;math&amp;gt;2n^2 + n&amp;lt;/math&amp;gt; (т.к. необходимо хранить вектор сингулярных чисел длины &amp;lt;math&amp;gt;n&amp;lt;/math&amp;gt;, а также две матрицы &amp;lt;math&amp;gt;U, V&amp;lt;/math&amp;gt; левых и правых сингулярных векторов размера &amp;lt;math&amp;gt;n&amp;lt;/math&amp;gt;х&amp;lt;math&amp;gt;n&amp;lt;/math&amp;gt;).&lt;br /&gt;
&lt;br /&gt;
=== Свойства алгоритма ===&lt;br /&gt;
Метод Якоби является самым медленным из имеющихся алгоритмов вычисления сингулярных чисел и сингулярных векторов матрицы. Тем не менее, для  матриц &amp;lt;math&amp;gt;G&amp;lt;/math&amp;gt;, которые могут быть представлены в виде &amp;lt;math&amp;gt;G=DX&amp;lt;/math&amp;gt;, где &amp;lt;math&amp;gt;D&amp;lt;/math&amp;gt; - диагональная, а &amp;lt;math&amp;gt;X&amp;lt;/math&amp;gt; - хорошо обусловлена, он способен вычислять сингулярные числа и вектора намного точнее, чем другие методы&amp;lt;ref&amp;gt;Дж. Деммель «Вычислительная линейная алгебра» (стр. 261-264)&amp;lt;/ref&amp;gt;. &lt;br /&gt;
&lt;br /&gt;
Вычислительная мощность алгоритма, как отношение числа операций к суммарному объему входных и выходных данных является линейной.&lt;br /&gt;
&lt;br /&gt;
Метод Якоби не детерминирован, так как является итерационным алгоритмом с выходом по точности (число итераций зависит от входных данных и порогового значения).&lt;br /&gt;
&lt;br /&gt;
== Программная реализация алгоритма ==&lt;br /&gt;
&lt;br /&gt;
=== Особенности реализации последовательного алгоритма ===&lt;br /&gt;
&lt;br /&gt;
=== Локальность данных и вычислений ===&lt;br /&gt;
&lt;br /&gt;
=== Возможные способы и особенности параллельной реализации алгоритма ===&lt;br /&gt;
&lt;br /&gt;
=== Масштабируемость алгоритма и его реализации ===&lt;br /&gt;
Исследование масштабируемости параллельной реализации метода Якоби вычисления сингулярных чисел и векторов проводилось на суперкомпьютере &amp;quot;Ломоносов&amp;quot;. Алгоритм реализован на языке программирования C с использованием механизмов MPI.&lt;br /&gt;
&lt;br /&gt;
Алгоритм работает по следующей схеме:&lt;br /&gt;
#На вход всем процессорам подается матрица &amp;lt;math&amp;gt; G &amp;lt;/math&amp;gt;.&lt;br /&gt;
#Для всех &amp;lt;math&amp;gt; j &amp;lt;/math&amp;gt; и &amp;lt;math&amp;gt; k &amp;lt;/math&amp;gt; таких, что &amp;lt;math&amp;gt; j \in [1,n-1] &amp;lt;/math&amp;gt;, &amp;lt;math&amp;gt; k \in [j+1,n] &amp;lt;/math&amp;gt;&lt;br /&gt;
##Вычисляется элемент &amp;lt;math&amp;gt; a_{jk} &amp;lt;/math&amp;gt; путем перемножения матриц &amp;lt;math&amp;gt; G^TG &amp;lt;/math&amp;gt;, где на каждом процессоре вычисляется своя часть матрицы. После чего результат отправляется на все процессоры.&lt;br /&gt;
##Если полученный элемент оказывается больше некоторого значения, то начинается последовательная часть программы: Вычисление элементов &amp;lt;math&amp;gt; \tau, t, c, s &amp;lt;/math&amp;gt;.&lt;br /&gt;
##Затем, выполняется операция поворота, путем перемножения матриц &amp;lt;math&amp;gt; G &amp;lt;/math&amp;gt; и &amp;lt;math&amp;gt; R &amp;lt;/math&amp;gt;. Данная операция выполняется параллельно на нескольких процессорах, где каждый процессор вычисляет свою часть матрицы. После чего результат пересылается всем процессорам.&lt;br /&gt;
&lt;br /&gt;
Данная схема повторяется до тех пор, пока матрица &amp;lt;math&amp;gt; A = G^TG &amp;lt;/math&amp;gt; не станет достаточно близкой к диагональной.&lt;br /&gt;
&lt;br /&gt;
Для проверки этого факта, в конце каждой итерации цикла вычисляется матрица &amp;lt;math&amp;gt; A &amp;lt;/math&amp;gt;. Данная операция выполняется параллельно на нескольких процессорах, где каждый процессор вычисляет свою часть матрицы, после чего результат пересылается всем процессорам.&lt;br /&gt;
&lt;br /&gt;
&lt;br /&gt;
Набор и границы значений изменяемых параметров запуска реализации алгоритма: &lt;br /&gt;
&lt;br /&gt;
*	число процессоров [1 : 128] с шагом равным степени двойки;&lt;br /&gt;
*	размер матрицы [256 : 1792] с шагом 256.&lt;br /&gt;
&lt;br /&gt;
В результате проведённых экспериментов был получен следующий диапазон эффективности реализации алгоритма:&lt;br /&gt;
&lt;br /&gt;
*	минимальная эффективность реализации 0,01%;&lt;br /&gt;
*	максимальная эффективность реализации 16,52%.&lt;br /&gt;
&lt;br /&gt;
На следующих рисунках приведены графики производительности и эффективности выбранной реализации метода Якоби в зависимости от изменяемых параметров запуска.&lt;br /&gt;
&lt;br /&gt;
[[File:Performance.jpg|none|thumb|1000px|Рисунок 1. Параллельная реализация метода Якоби. Изменение производительности в зависимости от числа процессоров и размера матрицы.]]&lt;br /&gt;
&lt;br /&gt;
[[File:Эффективность.png|none|thumb|1000px|Рисунок 1. Параллельная реализация метода Якоби. Изменение эффективности в зависимости от числа процессоров и размера матрицы.]]&lt;br /&gt;
&lt;br /&gt;
Построим оценки масштабируемости данной реализации метода Якоби: &lt;br /&gt;
* По числу процессов: при увеличении числа процессов эффективность на рассмотренной области изменений параметров запуска сначала увеличивается (самый пик достигается при 16 процессах), а затем начинает снижаться. Это характеризуется тем, что накладные расходы на параллельное выполнение (общение между процессами) начинает превалировать над вычислениями.&lt;br /&gt;
&lt;br /&gt;
*По размеру задачи: при увеличении размера задачи эффективность возрастает. Это подтверждает предположение о том, что размер задачи сильно влияет на эффективность выполнения приложения. Оценка показывает, что с ростом размера задачи эффективность на рассмотренной области значений параметров запуска сильно увеличивается. &lt;br /&gt;
&lt;br /&gt;
*По двум направлениям: при рассмотрении увеличения как вычислительной сложности, так и числа процессов на всей рассмотренной области значений эффективность увеличивается, но медленно и с перепадами.&lt;br /&gt;
&lt;br /&gt;
=== Динамические характеристики и эффективность реализации алгоритма ===&lt;br /&gt;
&lt;br /&gt;
=== Выводы для классов архитектур ===&lt;br /&gt;
&lt;br /&gt;
=== Существующие реализации алгоритма ===&lt;br /&gt;
Метод Якоби нахождения сингулярных значений и векторов реализован в таких пакетах, как LAPACK &amp;lt;ref&amp;gt;http://www.netlib.org/scalapack/slug/&amp;lt;/ref&amp;gt;, LINPACK/EISPACK &amp;lt;ref&amp;gt; http://www.netlib.org/linpack/ &amp;lt;/ref&amp;gt;, Intel MKL &amp;lt;ref&amp;gt;https://software.intel.com/ru-ru/node/521153#CAF8CA08-1C69-48F8-B0C3-B2B27AFA92FA&amp;lt;/ref&amp;gt;.&lt;br /&gt;
&lt;br /&gt;
Так же функция Якоби реализована в пакете Matlab.&lt;br /&gt;
&lt;br /&gt;
Т. к. алгоритм считается медленным, он не включен во многие известные пакеты.&lt;br /&gt;
&lt;br /&gt;
== Литература ==&lt;br /&gt;
1. Дж. Деммель Вычислительная линейная алгебра. Изд. Мир, 2001.&lt;/div&gt;</summary>
		<author><name>Davletshuna Alexandra</name></author>
	</entry>
	<entry>
		<id>https://xn--80aecvaldz.xn--80ahdrnmvk.xn--p1ai/w/ru/index.php?title=%D0%A3%D1%87%D0%B0%D1%81%D1%82%D0%BD%D0%B8%D0%BA:Davletshuna_Alexandra/%D0%9C%D0%B5%D1%82%D0%BE%D0%B4_%D0%AF%D0%BA%D0%BE%D0%B1%D0%B8_%D0%B2%D1%8B%D1%87%D0%B8%D1%81%D0%BB%D0%B5%D0%BD%D0%B8%D1%8F_%D1%81%D0%B8%D0%BD%D0%B3%D1%83%D0%BB%D1%8F%D1%80%D0%BD%D1%8B%D1%85_%D1%87%D0%B8%D1%81%D0%B5%D0%BB_%D0%B8_%D0%B2%D0%B5%D0%BA%D1%82%D0%BE%D1%80%D0%BE%D0%B2&amp;diff=17948</id>
		<title>Участник:Davletshuna Alexandra/Метод Якоби вычисления сингулярных чисел и векторов</title>
		<link rel="alternate" type="text/html" href="https://xn--80aecvaldz.xn--80ahdrnmvk.xn--p1ai/w/ru/index.php?title=%D0%A3%D1%87%D0%B0%D1%81%D1%82%D0%BD%D0%B8%D0%BA:Davletshuna_Alexandra/%D0%9C%D0%B5%D1%82%D0%BE%D0%B4_%D0%AF%D0%BA%D0%BE%D0%B1%D0%B8_%D0%B2%D1%8B%D1%87%D0%B8%D1%81%D0%BB%D0%B5%D0%BD%D0%B8%D1%8F_%D1%81%D0%B8%D0%BD%D0%B3%D1%83%D0%BB%D1%8F%D1%80%D0%BD%D1%8B%D1%85_%D1%87%D0%B8%D1%81%D0%B5%D0%BB_%D0%B8_%D0%B2%D0%B5%D0%BA%D1%82%D0%BE%D1%80%D0%BE%D0%B2&amp;diff=17948"/>
		<updated>2016-11-17T16:13:09Z</updated>

		<summary type="html">&lt;p&gt;Davletshuna Alexandra: /* Масштабируемость алгоритма и его реализации */&lt;/p&gt;
&lt;hr /&gt;
&lt;div&gt;{{algorithm&lt;br /&gt;
| name              = Метод Якоби вычисления сингулярных чисел и векторов&lt;br /&gt;
| serial_complexity = &amp;lt;math&amp;gt;O(n^3)&amp;lt;/math&amp;gt;&lt;br /&gt;
| pf_height         = &amp;lt;math&amp;gt;O(n^2)&amp;lt;/math&amp;gt;&lt;br /&gt;
| pf_width          = &amp;lt;math&amp;gt;O(n)&amp;lt;/math&amp;gt;&lt;br /&gt;
| input_data        = &amp;lt;math&amp;gt;n^2&amp;lt;/math&amp;gt;&lt;br /&gt;
| output_data       = &amp;lt;math&amp;gt;2n^2 + n&amp;lt;/math&amp;gt;&lt;br /&gt;
}}&lt;br /&gt;
&lt;br /&gt;
Авторы статьи: [[Участница:Davletshuna Alexandra|Давлетшина Александра]] (группа 619) пункты 1.1-1.4, 1.6, 2.7; [[Участница:Alek sandra|Зайцева Александра]] (группа 601) пункты 1.5, 1.7-1.10, 2.7.&lt;br /&gt;
&lt;br /&gt;
== Свойства и структура алгоритма ==&lt;br /&gt;
&lt;br /&gt;
=== Общее описание алгоритма ===&lt;br /&gt;
&#039;&#039;&#039;Сингулярным разложением&#039;&#039;&#039; называется разложение прямоугольной вещественной или комплексной матрицы, имеющее широкое применение, в силу своей наглядной геометрической интерпретации, при решении многих прикладных задач. Сингулярное разложение матрицы А позволяет вычислять сингулярные числа данной матрицы, а также, левые и правые сингулярные векторы матрицы А:&lt;br /&gt;
&lt;br /&gt;
•	левые сингулярные векторы матрицы А — это собственные векторы матрицы &amp;lt;math&amp;gt;AA^*&amp;lt;/math&amp;gt;;&lt;br /&gt;
&lt;br /&gt;
•	правые сингулярные векторы матрицы A — это собственные векторы матрицы &amp;lt;math&amp;gt;A^*A&amp;lt;/math&amp;gt;.&lt;br /&gt;
&lt;br /&gt;
Геометрическая интерпретация сингулярного разложения заключается в следующем факте из геометрии: &#039;&#039;Образом любого линейного преобразования, заданного с помощью матрицы &amp;lt;math&amp;gt;m&amp;lt;/math&amp;gt;x&amp;lt;math&amp;gt;n&amp;lt;/math&amp;gt;, примененного к единичной сфере является гиперэллипсоид&#039;&#039;.&lt;br /&gt;
&lt;br /&gt;
Из многочисленных разложений матриц, наиболее удобным является сингулярное разложение матрицы в виде: &amp;lt;math&amp;gt;A=U\Sigma V^*&amp;lt;/math&amp;gt;, где &amp;lt;math&amp;gt;U, V&amp;lt;/math&amp;gt; – унитарные матрицы, а &amp;lt;math&amp;gt;\Sigma&amp;lt;/math&amp;gt; – диагональная матрица с вещественными положительными числами на диагонали &amp;lt;ref&amp;gt;http://algorithms.parallel.ru/&amp;lt;/ref&amp;gt;.&lt;br /&gt;
&lt;br /&gt;
Диагональные элементы матрицы &amp;lt;math&amp;gt;\Sigma&amp;lt;/math&amp;gt; называются сингулярными числами матрицы &amp;lt;math&amp;gt;A&amp;lt;/math&amp;gt;, а столбцы матриц &amp;lt;math&amp;gt;U,V&amp;lt;/math&amp;gt; левыми и правыми сингулярными векторами соответственно.&lt;br /&gt;
&lt;br /&gt;
Алгоритм Якоби сингулярного разложения матрицы был предложен одним из первых в 1846 году. Он приводит прямоугольную матрицу к диагональной матрице с помощью последовательности элементарных вращений. Метод может найти все сингулярные значения с очень высокой точностью. Однако его производительность является довольно низкой, в сравнении с конкурирующими методами.&lt;br /&gt;
&lt;br /&gt;
&#039;&#039;Неявный&#039;&#039;&amp;lt;ref&amp;gt;Дж. Деммель «Вычислительная линейная алгебра» (стр. 261-264)&amp;lt;/ref&amp;gt; метод Якоби математически эквивалентен применению метода Якоби вычисления собственных значений к матрице &amp;lt;math&amp;gt;A = G^TG&amp;lt;/math&amp;gt;.&lt;br /&gt;
Это значит, что на каждом шаге вычисляется вращение Якоби &amp;lt;math&amp;gt;J&amp;lt;/math&amp;gt;, с помощью которого матрица &amp;lt;math&amp;gt;G^TG&amp;lt;/math&amp;gt; неявно пересчитывется в &amp;lt;math&amp;gt;J^TG^TGJ&amp;lt;/math&amp;gt;; вращение выбрано так, чтобы пара внедиагональных элементов из &amp;lt;math&amp;gt;G^TG&amp;lt;/math&amp;gt; обратилась в нули в матрице &amp;lt;math&amp;gt;J^TG^TGJ&amp;lt;/math&amp;gt;. При этом ни &amp;lt;math&amp;gt;G^TG&amp;lt;/math&amp;gt;, ни &amp;lt;math&amp;gt;J^TG^TGJ&amp;lt;/math&amp;gt; не вычисляются в явном виде; вместо них вычисляется матрица &amp;lt;math&amp;gt;GJ&amp;lt;/math&amp;gt;. Поэтому алгоритм называется &#039;&#039;методом односторонних вращений&#039;&#039;.&lt;br /&gt;
&lt;br /&gt;
=== Математическое описание алгоритма ===&lt;br /&gt;
Исходные данные: матрица &amp;lt;math&amp;gt;G&amp;lt;/math&amp;gt; (элементы &amp;lt;math&amp;gt;g_{ij}, i, j = 1, \ldots, n&amp;lt;/math&amp;gt;).&lt;br /&gt;
&lt;br /&gt;
Вычисляемые данные: матрица &amp;lt;math&amp;gt;\Sigma = diag(\sigma_{i})&amp;lt;/math&amp;gt;, где &amp;lt;math&amp;gt;\sigma_{i}&amp;lt;/math&amp;gt; - сингулярные числа, &amp;lt;math&amp;gt;U&amp;lt;/math&amp;gt; - матрица левых сингулярных векторов, &amp;lt;math&amp;gt;V&amp;lt;/math&amp;gt; - матрица правых сингулярных векторов.&lt;br /&gt;
&lt;br /&gt;
симметричную матрицу &amp;lt;math&amp;gt;A = (G^TG)&amp;lt;/math&amp;gt; можно привести к диагональному виду:&lt;br /&gt;
&amp;lt;math&amp;gt;RG^TGR^T&amp;lt;/math&amp;gt;, где&lt;br /&gt;
&lt;br /&gt;
&amp;lt;math&amp;gt;&lt;br /&gt;
R(j,k,\theta) = &lt;br /&gt;
\begin{matrix}&lt;br /&gt;
  \\&lt;br /&gt;
  \\&lt;br /&gt;
  \\&lt;br /&gt;
j \\&lt;br /&gt;
  \\&lt;br /&gt;
k \\&lt;br /&gt;
  \\&lt;br /&gt;
  \\&lt;br /&gt;
  \\&lt;br /&gt;
\end{matrix}&lt;br /&gt;
&amp;lt;/math&amp;gt;  &lt;br /&gt;
&amp;lt;math&amp;gt;&lt;br /&gt;
\begin{bmatrix}&lt;br /&gt;
  &amp;amp; 1 &amp;amp;   &amp;amp;        &amp;amp;              &amp;amp;        &amp;amp;               &amp;amp;         &amp;amp;    &amp;amp;   \\&lt;br /&gt;
  &amp;amp;   &amp;amp; 1 &amp;amp;        &amp;amp;              &amp;amp;        &amp;amp;               &amp;amp;         &amp;amp;    &amp;amp;   \\&lt;br /&gt;
  &amp;amp;   &amp;amp;   &amp;amp; \ddots &amp;amp;              &amp;amp;        &amp;amp;               &amp;amp;         &amp;amp;    &amp;amp;   \\&lt;br /&gt;
  &amp;amp;   &amp;amp;   &amp;amp;        &amp;amp; \cos(\theta) &amp;amp;        &amp;amp; -\sin(\theta) &amp;amp;         &amp;amp;    &amp;amp;   \\&lt;br /&gt;
  &amp;amp;   &amp;amp;   &amp;amp;        &amp;amp;              &amp;amp; \ddots &amp;amp;               &amp;amp;         &amp;amp;    &amp;amp;   \\&lt;br /&gt;
  &amp;amp;   &amp;amp;   &amp;amp;        &amp;amp; \sin(\theta) &amp;amp;        &amp;amp; \cos(\theta)  &amp;amp;         &amp;amp;    &amp;amp;   \\&lt;br /&gt;
  &amp;amp;   &amp;amp;   &amp;amp;        &amp;amp;              &amp;amp;        &amp;amp;               &amp;amp; \ddots  &amp;amp;    &amp;amp;   \\&lt;br /&gt;
  &amp;amp;   &amp;amp;   &amp;amp;        &amp;amp;              &amp;amp;        &amp;amp;               &amp;amp;         &amp;amp; 1  &amp;amp;   \\&lt;br /&gt;
  &amp;amp;   &amp;amp;   &amp;amp;        &amp;amp;              &amp;amp;        &amp;amp;               &amp;amp;         &amp;amp;    &amp;amp; 1 \\&lt;br /&gt;
\end{bmatrix}&lt;br /&gt;
&amp;lt;/math&amp;gt;&lt;br /&gt;
&lt;br /&gt;
Обозначим &amp;lt;math&amp;gt;s = \sin \theta&amp;lt;/math&amp;gt; и &amp;lt;math&amp;gt;c = \cos \theta&amp;lt;/math&amp;gt;.&lt;br /&gt;
&lt;br /&gt;
Перемножив матрицы &amp;lt;math&amp;gt;RG^TGR^T&amp;lt;/math&amp;gt;, получим следующие выражения&amp;lt;ref&amp;gt;http://www.astro.tsu.ru/OsChMet/5_2.html&amp;lt;/ref&amp;gt;:&lt;br /&gt;
&lt;br /&gt;
&amp;lt;math&amp;gt;\begin{align}&lt;br /&gt;
 a_{jj}^{(i+1)} &amp;amp;= c^2\, a_{jj}^{(i)}  -  2\, s c \,a_{jk}^{(i)}  +  s^2\, a_{kk}^{(i)} \\&lt;br /&gt;
 a_{kk}^{(i+1)} &amp;amp;= s^2 \,a_{jj}^{(i)}  +  2 s c\, a_{jk}^{(i)}  +  c^2 \, a_{kk}^{(i)} \\&lt;br /&gt;
 a_{jk}^{(i+1)} &amp;amp;= a_{kj}^{(i+1)} = (c^2 - s^2 ) \, a_{jk}^{(i)}  +  s c \, (a_{kk}^{(i)} - a_{jj}^{(i)} ) \\&lt;br /&gt;
 a_{jm}^{(i+1)} &amp;amp;= a_{mj}^{(i+1)} = c \, a_{jm}^{(i)}  -  s \, a_{km}^{(i)} &amp;amp; m \ne j,k \\&lt;br /&gt;
 a_{km}^{(i+1)} &amp;amp;= a_{mk}^{(i+1)} = s \, a_{jm}^{(i)}  + c \, a_{km}^{(i)} &amp;amp; m \ne j,k \\&lt;br /&gt;
 a_{ml}^{(i+1)} &amp;amp;= a_{ml}^{(i)} &amp;amp;m,l \ne j,k&lt;br /&gt;
\end{align}&amp;lt;/math&amp;gt;&lt;br /&gt;
&lt;br /&gt;
Т.к внедиагональные элементы должны быть равны 0, то выбираем &amp;lt;math&amp;gt;\theta&amp;lt;/math&amp;gt; так, чтобы &amp;lt;math&amp;gt;a_{jk}^{(i+1)} = 0&amp;lt;/math&amp;gt; и &amp;lt;math&amp;gt;a_{kj}^{(i+1)} = 0&amp;lt;/math&amp;gt;.&lt;br /&gt;
&lt;br /&gt;
Тогда решая уравнение получаем, что&lt;br /&gt;
&lt;br /&gt;
&amp;lt;math&amp;gt;&lt;br /&gt;
         \begin{align}&lt;br /&gt;
         \tau &amp;amp;= ({a_{jj} - a_{kk}})/{2a_{jk}} \\&lt;br /&gt;
         t &amp;amp;= {sign(\tau)}/(|\tau| + \sqrt{1 + \tau^2}) \\&lt;br /&gt;
         c &amp;amp;= 1/(\sqrt{1 + t^2}) \\&lt;br /&gt;
         s &amp;amp;= ct \\&lt;br /&gt;
         \end{align}&amp;lt;/math&amp;gt;&lt;br /&gt;
&lt;br /&gt;
Остановка вычислений алгоритма наступает, когда внедиагональные элементы становятся меньше некоторого наперед заданного числа &amp;lt;math&amp;gt;\varepsilon&amp;lt;/math&amp;gt;.&lt;br /&gt;
&lt;br /&gt;
=== Вычислительное ядро алгоритма ===&lt;br /&gt;
Вычислительное ядро алгоритма составляет непосредственно вычисление одностороннего вращения Якоби, т.е. вычисление элементов матрицы &amp;lt;math&amp;gt;g_{jm}^{(i+1)} = g_{mj}^{(i+1)}&amp;lt;/math&amp;gt; и &amp;lt;math&amp;gt;g_{km}^{(i+1)} = g_{mk}^{(i+1)}&amp;lt;/math&amp;gt;, &amp;lt;math&amp;gt;m \ne j,k&amp;lt;/math&amp;gt;, а также вычисления элементов &amp;lt;math&amp;gt;g_{jj}^{(i+1)} &amp;lt;/math&amp;gt; и &amp;lt;math&amp;gt;g_{kk}^{(i+1)} &amp;lt;/math&amp;gt;, получившихся после умножения промежуточной матрицы на матрицу вращений Якоби:&lt;br /&gt;
&lt;br /&gt;
&amp;lt;math&amp;gt;\begin{align}&lt;br /&gt;
 g_{jj}^{(i+1)} &amp;amp;= c^2\, g_{jj}^{(i)}  -  2\, s c \,g_{jk}^{(i)}  +  s^2\, g_{kk}^{(i)} \\&lt;br /&gt;
 g_{kk}^{(i+1)} &amp;amp;= s^2 \,g_{jj}^{(i)}  +  2 s c\, g_{jk}^{(i)}  +  c^2 \, g_{kk}^{(i)} \\&lt;br /&gt;
 g_{jk}^{(i+1)} &amp;amp;= g_{kj}^{(i+1)} = (c^2 - s^2 ) \, g_{jk}^{(i)}  +  s c \, (g_{kk}^{(i)} - g_{jj}^{(i)} ) \\&lt;br /&gt;
 g_{jm}^{(i+1)} &amp;amp;= g_{mj}^{(i+1)} = c \, g_{jm}^{(i)}  -  s \, g_{km}^{(i)} &amp;amp; m \ne j,k \\&lt;br /&gt;
 g_{km}^{(i+1)} &amp;amp;= g_{mk}^{(i+1)} = s \, g_{jm}^{(i)}  + c \, g_{km}^{(i)} &amp;amp; m \ne j,k \\&lt;br /&gt;
 g_{ml}^{(i+1)} &amp;amp;= g_{ml}^{(i)} &amp;amp;m,l \ne j,k&lt;br /&gt;
\end{align}&amp;lt;/math&amp;gt;&lt;br /&gt;
&lt;br /&gt;
=== Макроструктура алгоритма ===&lt;br /&gt;
Основную часть метода составляет процедура односторонних вращений матрицы, которая в свою очередь состоит из:&lt;br /&gt;
&lt;br /&gt;
#Вычисление &amp;lt;math&amp;gt;\tau, c, s, t&amp;lt;/math&amp;gt;.&lt;br /&gt;
#Одностороннее вращение матрицы. &lt;br /&gt;
&lt;br /&gt;
Что требует &amp;lt;math&amp;gt;O(n)&amp;lt;/math&amp;gt; операций.&lt;br /&gt;
&lt;br /&gt;
После этого необходимо:&lt;br /&gt;
&lt;br /&gt;
#Вычислить сингулярные числа &amp;lt;math&amp;gt;\sigma_i&amp;lt;/math&amp;gt;.  Что требует &amp;lt;math&amp;gt;O(n)&amp;lt;/math&amp;gt; операций.&lt;br /&gt;
#Вычислить &amp;lt;math&amp;gt;U&amp;lt;/math&amp;gt; и &amp;lt;math&amp;gt;V&amp;lt;/math&amp;gt;. Что требует &amp;lt;math&amp;gt;O(n^2)&amp;lt;/math&amp;gt; операций.&lt;br /&gt;
&lt;br /&gt;
=== Схема реализации последовательного алгоритма ===&lt;br /&gt;
Применение метода Якоби к матрице &amp;lt;math&amp;gt;A = (G^TG)&amp;lt;/math&amp;gt; можно описать следующим образом&amp;lt;ref&amp;gt;Дж. Деммель «Вычислительная линейная алгебра» (стр. 261-263)&amp;lt;/ref&amp;gt;:&lt;br /&gt;
&lt;br /&gt;
Если &amp;lt;math&amp;gt;G = U\Sigma V^T&amp;lt;/math&amp;gt; и &amp;lt;math&amp;gt;\Sigma = diag(\sigma_{i})&amp;lt;/math&amp;gt;, то алгоритм вычисляет сингулярные числа &amp;lt;math&amp;gt;\sigma_{i}&amp;lt;/math&amp;gt;, матрицу &amp;lt;math&amp;gt;U&amp;lt;/math&amp;gt; левых сингулярных векторов и матрицу &amp;lt;math&amp;gt;V&amp;lt;/math&amp;gt; правых сингулярных векторов по следующей схеме:&lt;br /&gt;
&lt;br /&gt;
 repeat&lt;br /&gt;
     for &amp;lt;math&amp;gt;j=1&amp;lt;/math&amp;gt; to &amp;lt;math&amp;gt;n-1&amp;lt;/math&amp;gt;&lt;br /&gt;
         for &amp;lt;math&amp;gt;k=j+1&amp;lt;/math&amp;gt; to &amp;lt;math&amp;gt;n&amp;lt;/math&amp;gt;&lt;br /&gt;
             обратиться к процедуре &#039;&#039;&#039;&#039;&#039;One-Sided-Jacobi-Rotation&amp;lt;math&amp;gt;(G,j,k)&amp;lt;/math&amp;gt;&#039;&#039;&#039;&#039;&#039;&lt;br /&gt;
         end for&lt;br /&gt;
     end for&lt;br /&gt;
 пока &amp;lt;math&amp;gt;G^TG&amp;lt;/math&amp;gt; не станет достаточно близка к диагональной матрице&lt;br /&gt;
 Положить &amp;lt;math&amp;gt;\sigma_{i} = ||G(:,i)||_2 &amp;lt;/math&amp;gt; (норма &amp;lt;math&amp;gt;i&amp;lt;/math&amp;gt;-го столбца в &amp;lt;math&amp;gt;G&amp;lt;/math&amp;gt;)&lt;br /&gt;
 Положить &amp;lt;math&amp;gt;U = [u_{1},\dots, u_{n}]&amp;lt;/math&amp;gt;, где &amp;lt;math&amp;gt;u_{i} = G(:,i)/\sigma_{i}&amp;lt;/math&amp;gt;&lt;br /&gt;
 Положить &amp;lt;math&amp;gt;V = J&amp;lt;/math&amp;gt;, где &amp;lt;math&amp;gt;J&amp;lt;/math&amp;gt; - накопленное произведение вращений Якоби.&lt;br /&gt;
&lt;br /&gt;
Где процедура &#039;&#039;&#039;&#039;&#039;One-Sided-Jacobi-Rotation&#039;&#039;&#039;&#039;&#039; является метод односторонних вращений Якоби:&lt;br /&gt;
&lt;br /&gt;
 proc &#039;&#039;&#039;&#039;&#039;One-Sided-Jacobi-Rotation&amp;lt;math&amp;gt;(G,j,k)&amp;lt;/math&amp;gt;&#039;&#039;&#039;&#039;&#039;&lt;br /&gt;
     вычислить &amp;lt;math&amp;gt;a_{jj} = (G^TG)_{jj}, a_{jk} = (G^TG)_{jk}&amp;lt;/math&amp;gt; и &amp;lt;math&amp;gt;a_{kk} = (G^TG)_{kk}&amp;lt;/math&amp;gt;&lt;br /&gt;
     if &amp;lt;math&amp;gt;|a_{jk}|&amp;lt;/math&amp;gt; не слишком мал&lt;br /&gt;
         &amp;lt;math&amp;gt;&lt;br /&gt;
         \begin{align}&lt;br /&gt;
         \tau &amp;amp;= ({a_{jj} - a_{kk}})/{2a_{jk}} \\&lt;br /&gt;
         t &amp;amp;= {sign(\tau)}/(|\tau| + \sqrt{1 + \tau^2}) \\&lt;br /&gt;
         c &amp;amp;= 1/(\sqrt{1 + t^2}) \\&lt;br /&gt;
         s &amp;amp;= ct \\&lt;br /&gt;
         G &amp;amp;= GR(j,k,\theta) \  \dots c=cos\theta, s=sin\theta \end{align}&amp;lt;/math&amp;gt;&lt;br /&gt;
         if нужны правые сингулярные векторы &lt;br /&gt;
             &amp;lt;math&amp;gt;J = JR(j,k,\theta)&amp;lt;/math&amp;gt;&lt;br /&gt;
         end if&lt;br /&gt;
     end if&lt;br /&gt;
&lt;br /&gt;
=== Последовательная сложность алгоритма ===&lt;br /&gt;
Для одного вращения Якоби необходимо выполнить &amp;lt;math&amp;gt;O(n)&amp;lt;/math&amp;gt; операций умножения и сложения. &lt;br /&gt;
&lt;br /&gt;
Всего вариантов выбора &amp;lt;math&amp;gt;j&amp;lt;/math&amp;gt; и &amp;lt;math&amp;gt;k&amp;lt;/math&amp;gt; существует &amp;lt;math&amp;gt;\frac{n(n-1)}{2}&amp;lt;/math&amp;gt;.&lt;br /&gt;
&lt;br /&gt;
Таким образом последовательный алгоритм Якоби вычисления сингулярных чисел и векторов является алгоритмом с кубической сложностью.&lt;br /&gt;
&lt;br /&gt;
=== Информационный граф ===&lt;br /&gt;
Граф алгоритма состоит из четырех групп вершин&lt;br /&gt;
&lt;br /&gt;
(А)Первая группа вершин расположена в двумерной области, соответствующая ей операция - вычисление элементов &amp;lt;math&amp;gt;a_{jj},a_{jk},a_{kk}&amp;lt;/math&amp;gt; матрицы произведения &amp;lt;math&amp;gt;A = (G^TG)&amp;lt;/math&amp;gt;. Где &amp;lt;math&amp;gt;j&amp;lt;/math&amp;gt; изменяется от &amp;lt;math&amp;gt;1&amp;lt;/math&amp;gt; до &amp;lt;math&amp;gt;n-1&amp;lt;/math&amp;gt;, принимая все целочисленные значения, &amp;lt;math&amp;gt;k&amp;lt;/math&amp;gt;  изменяется от &amp;lt;math&amp;gt;j+1&amp;lt;/math&amp;gt; до &amp;lt;math&amp;gt;n&amp;lt;/math&amp;gt;, принимая все целочисленные значения.&lt;br /&gt;
&lt;br /&gt;
Граф вычисления каждого из элементов приведен на рисунке 1, где значениям &amp;lt;math&amp;gt;g_{ij}&amp;lt;/math&amp;gt; соответствуют обозначения &amp;lt;math&amp;gt;x_{ij}&amp;lt;/math&amp;gt;, а элементам &amp;lt;math&amp;gt;g^T_{ij}&amp;lt;/math&amp;gt; обозначения &amp;lt;math&amp;gt;z_{ij}&amp;lt;/math&amp;gt;. Значение &amp;lt;math&amp;gt;s_{ij}&amp;lt;/math&amp;gt; является значением результирующего элемента.&lt;br /&gt;
&lt;br /&gt;
(Б)Вторая группа вершин расположена в двумерной области, соответствующая ей операция – вычисление &amp;lt;math&amp;gt;c&amp;lt;/math&amp;gt; и &amp;lt;math&amp;gt;s&amp;lt;/math&amp;gt;.&lt;br /&gt;
&lt;br /&gt;
Информационный граф с входными и выходными данными вычисления пункта (Б) представлен на рисунке 2.&lt;br /&gt;
&lt;br /&gt;
(В)Третья группа вершин расположена в двумерной области, соответствующая ей операция вычисление значений элементов &amp;lt;math&amp;gt;g_{jm}^{(i+1)} = g_{mj}^{(i+1)}&amp;lt;/math&amp;gt; и &amp;lt;math&amp;gt;g_{km}^{(i+1)} = g_{mk}^{(i+1)}&amp;lt;/math&amp;gt;, &amp;lt;math&amp;gt;m \ne j,k&amp;lt;/math&amp;gt;.&lt;br /&gt;
&lt;br /&gt;
(Г)Четвертая группа вершин расположена в двумерной области, соответствующая ей операция вычисление значений элементов &amp;lt;math&amp;gt;g_{jj}^{(i+1)} &amp;lt;/math&amp;gt; и &amp;lt;math&amp;gt;g_{kk}^{(i+1)} &amp;lt;/math&amp;gt;.&lt;br /&gt;
&lt;br /&gt;
Элементы групп (В) и (Г) вычисляются аналогично вычислению элементов матрицы произведения, т.к. фактически представляют собой перемножение матриц &amp;lt;math&amp;gt;G&amp;lt;/math&amp;gt; и &amp;lt;math&amp;gt;R&amp;lt;/math&amp;gt;&lt;br /&gt;
&lt;br /&gt;
[[File:Jacobi_2.jpg|none|thumb|1000px|Рисунок 1. Информационный граф с входными и выходными параметрами вычисления каждого элемента матрицы произведения.]]&lt;br /&gt;
&lt;br /&gt;
[[File:Jacobi_1.jpg|none|thumb|1000px|Рисунок 2. Информационный граф с входными и выходными параметрами вычисления значений &amp;lt;math&amp;gt;c&amp;lt;/math&amp;gt; и &amp;lt;math&amp;gt;s&amp;lt;/math&amp;gt;.]]&lt;br /&gt;
&lt;br /&gt;
Обобщенный граф метода Якоби представлен на рисунке 3, где буквами А, Б, В и Г обозначено вычисление групп вершин (А), (Б), (В) и (Г).&lt;br /&gt;
&lt;br /&gt;
[[File:Graf21.png|none|thumb|2000px|Рисунок 3. Обобщенный граф алгоритма вычисления сингулярных чисел и векторов методом Якоби.]]&lt;br /&gt;
&lt;br /&gt;
=== Ресурс параллелизма алгоритма ===&lt;br /&gt;
Для выполнения одной итерации метода Якоби требуется последовательно выполнить несколько ярусов:&lt;br /&gt;
# вычислить &amp;lt;math&amp;gt;\tau&amp;lt;/math&amp;gt; &lt;br /&gt;
# вычислить &amp;lt;math&amp;gt;t&amp;lt;/math&amp;gt; &lt;br /&gt;
# вычислить &amp;lt;math&amp;gt;c&amp;lt;/math&amp;gt; &lt;br /&gt;
# вычислить &amp;lt;math&amp;gt;s&amp;lt;/math&amp;gt;&lt;br /&gt;
# выполнить поворот матрицы &amp;lt;math&amp;gt;G&amp;lt;/math&amp;gt; с параллельным выполнением &amp;lt;math&amp;gt;2(n-2)&amp;lt;/math&amp;gt; операций вычисления элементов матрицы &amp;lt;math&amp;gt;g_{jm}^{(i+1)} = g_{mj}^{(i+1)}&amp;lt;/math&amp;gt; и &amp;lt;math&amp;gt;g_{km}^{(i+1)} = g_{mk}^{(i+1)}&amp;lt;/math&amp;gt;, &amp;lt;math&amp;gt;m \ne j,k&amp;lt;/math&amp;gt;, а также вычисления элементов &amp;lt;math&amp;gt;g_{jj}^{(i+1)} &amp;lt;/math&amp;gt; и &amp;lt;math&amp;gt;g_{kk}^{(i+1)} &amp;lt;/math&amp;gt;. &lt;br /&gt;
&lt;br /&gt;
Суммарное количество итераций равно &amp;lt;math&amp;gt;\frac{n(n-1)}{2}&amp;lt;/math&amp;gt; (Различные варианты выбора &amp;lt;math&amp;gt;j&amp;lt;/math&amp;gt; и &amp;lt;math&amp;gt;k&amp;lt;/math&amp;gt;). &lt;br /&gt;
&lt;br /&gt;
Асимптотически метод сходится квадратично. &lt;br /&gt;
&lt;br /&gt;
Таким образом, при классификации по высоте ЯПФ метод Якоби относится к алгоритмам со сложностью &amp;lt;math&amp;gt;O(n^2)&amp;lt;/math&amp;gt;&amp;amp;nbsp;, а при классификации по ширине ЯПФ — к алгоритмам со сложностью &amp;lt;math&amp;gt;O(n)&amp;lt;/math&amp;gt;.&lt;br /&gt;
&lt;br /&gt;
=== Входные и выходные данные алгоритма ===&lt;br /&gt;
&#039;&#039;&#039;Входные данные&#039;&#039;&#039;: плотная матрица &amp;lt;math&amp;gt;G&amp;lt;/math&amp;gt; размера &amp;lt;math&amp;gt;n&amp;lt;/math&amp;gt;х&amp;lt;math&amp;gt;n&amp;lt;/math&amp;gt;, где &amp;lt;math&amp;gt;A= G^TG&amp;lt;/math&amp;gt; – симметрическая матрица.&lt;br /&gt;
&lt;br /&gt;
&#039;&#039;&#039;Объём входных данных&#039;&#039;&#039;: &amp;lt;math&amp;gt;n^2&amp;lt;/math&amp;gt; (т.к. для хранения матрицы &amp;lt;math&amp;gt;G&amp;lt;/math&amp;gt; используем двумерный массив размера &amp;lt;math&amp;gt;n&amp;lt;/math&amp;gt;х&amp;lt;math&amp;gt;n&amp;lt;/math&amp;gt;)&lt;br /&gt;
&lt;br /&gt;
&#039;&#039;&#039;Выходные данные&#039;&#039;&#039;: &amp;lt;math&amp;gt;\sigma_{i}&amp;lt;/math&amp;gt;  - сингулярные числа, матрица &amp;lt;math&amp;gt;U&amp;lt;/math&amp;gt; левых сингулярных векторов и матрица &amp;lt;math&amp;gt;V&amp;lt;/math&amp;gt; правых сингулярных векторов.&lt;br /&gt;
&lt;br /&gt;
&#039;&#039;&#039;Объём выходных данных&#039;&#039;&#039;: &amp;lt;math&amp;gt;2n^2 + n&amp;lt;/math&amp;gt; (т.к. необходимо хранить вектор сингулярных чисел длины &amp;lt;math&amp;gt;n&amp;lt;/math&amp;gt;, а также две матрицы &amp;lt;math&amp;gt;U, V&amp;lt;/math&amp;gt; левых и правых сингулярных векторов размера &amp;lt;math&amp;gt;n&amp;lt;/math&amp;gt;х&amp;lt;math&amp;gt;n&amp;lt;/math&amp;gt;).&lt;br /&gt;
&lt;br /&gt;
=== Свойства алгоритма ===&lt;br /&gt;
Метод Якоби является самым медленным из имеющихся алгоритмов вычисления сингулярных чисел и сингулярных векторов матрицы. Тем не менее, для  матриц &amp;lt;math&amp;gt;G&amp;lt;/math&amp;gt;, которые могут быть представлены в виде &amp;lt;math&amp;gt;G=DX&amp;lt;/math&amp;gt;, где &amp;lt;math&amp;gt;D&amp;lt;/math&amp;gt; - диагональная, а &amp;lt;math&amp;gt;X&amp;lt;/math&amp;gt; - хорошо обусловлена, он способен вычислять сингулярные числа и вектора намного точнее, чем другие методы&amp;lt;ref&amp;gt;Дж. Деммель «Вычислительная линейная алгебра» (стр. 261-264)&amp;lt;/ref&amp;gt;. &lt;br /&gt;
&lt;br /&gt;
Вычислительная мощность алгоритма, как отношение числа операций к суммарному объему входных и выходных данных является линейной.&lt;br /&gt;
&lt;br /&gt;
Метод Якоби не детерминирован, так как является итерационным алгоритмом с выходом по точности (число итераций зависит от входных данных и порогового значения).&lt;br /&gt;
&lt;br /&gt;
== Программная реализация алгоритма ==&lt;br /&gt;
&lt;br /&gt;
=== Особенности реализации последовательного алгоритма ===&lt;br /&gt;
&lt;br /&gt;
=== Локальность данных и вычислений ===&lt;br /&gt;
&lt;br /&gt;
=== Возможные способы и особенности параллельной реализации алгоритма ===&lt;br /&gt;
&lt;br /&gt;
=== Масштабируемость алгоритма и его реализации ===&lt;br /&gt;
Исследование масштабируемости параллельной реализации метода Якоби вычисления сингулярных чисел и векторов проводилось на суперкомпьютере &amp;quot;Ломоносов&amp;quot;. Алгоритм реализован на языке программирования C с использованием механизмов MPI.&lt;br /&gt;
&lt;br /&gt;
Алгоритм работает по следующей схеме:&lt;br /&gt;
#На вход всем процессорам подается матрица &amp;lt;math&amp;gt; G &amp;lt;/math&amp;gt;.&lt;br /&gt;
#Для всех &amp;lt;math&amp;gt; j &amp;lt;/math&amp;gt; и &amp;lt;math&amp;gt; k &amp;lt;/math&amp;gt; таких, что &amp;lt;math&amp;gt; j \in [1,n-1] &amp;lt;/math&amp;gt;, &amp;lt;math&amp;gt; k \in [j+1,n] &amp;lt;/math&amp;gt;&lt;br /&gt;
##Вычисляется элемент &amp;lt;math&amp;gt; a_{jk} &amp;lt;/math&amp;gt; путем перемножения матриц &amp;lt;math&amp;gt; G^TG &amp;lt;/math&amp;gt;, где на каждом процессоре вычисляется своя часть матрицы. После чего результат отправляется на все процессоры.&lt;br /&gt;
##Если полученный элемент оказывается больше некоторого значения, то начинается последовательная часть программы: Вычисление элементов &amp;lt;math&amp;gt; \tau, t, c, s &amp;lt;/math&amp;gt;.&lt;br /&gt;
##Затем, выполняется операция поворота, путем перемножения матриц &amp;lt;math&amp;gt; G &amp;lt;/math&amp;gt; и &amp;lt;math&amp;gt; R &amp;lt;/math&amp;gt;. Данная операция выполняется параллельно на нескольких процессорах, где каждый процессор вычисляет свою часть матрицы. После чего результат пересылается всем процессорам.&lt;br /&gt;
&lt;br /&gt;
Данная схема повторяется до тех пор, пока матрица &amp;lt;math&amp;gt; A = G^TG &amp;lt;/math&amp;gt; не станет достаточно близкой к диагональной.&lt;br /&gt;
&lt;br /&gt;
Для проверки этого факта, в конце каждой итерации цикла вычисляется матрица &amp;lt;math&amp;gt; A &amp;lt;/math&amp;gt;. Данная операция выполняется параллельно на нескольких процессорах, где каждый процессор вычисляет свою часть матрицы, после чего результат пересылается всем процессорам.&lt;br /&gt;
&lt;br /&gt;
&lt;br /&gt;
Набор и границы значений изменяемых параметров запуска реализации алгоритма: &lt;br /&gt;
&lt;br /&gt;
*	число процессоров [1 : 128] с шагом равным степени двойки;&lt;br /&gt;
*	размер матрицы [256 : 1792] с шагом 256.&lt;br /&gt;
&lt;br /&gt;
В результате проведённых экспериментов был получен следующий диапазон эффективности реализации алгоритма:&lt;br /&gt;
&lt;br /&gt;
*	минимальная эффективность реализации 0,01%;&lt;br /&gt;
*	максимальная эффективность реализации 16,52%.&lt;br /&gt;
&lt;br /&gt;
На следующих рисунках приведены графики производительности и эффективности выбранной реализации метода Якоби в зависимости от изменяемых параметров запуска.&lt;br /&gt;
&lt;br /&gt;
[[File:Performance.jpg|none|thumb|1000px|Рисунок 1. Параллельная реализация метода Якоби. Изменение производительности в зависимости от числа процессоров и размера матрицы.]]&lt;br /&gt;
&lt;br /&gt;
[[File:Эффективность.png|none|thumb|1000px|Рисунок 1. Параллельная реализация метода Якоби. Изменение эффективности в зависимости от числа процессоров и размера матрицы.]]&lt;br /&gt;
&lt;br /&gt;
Построим оценки масштабируемости данной реализации метода Якоби: &lt;br /&gt;
* По числу процессов: при увеличении числа процессов эффективность на рассмотренной области изменений параметров запуска сначала увеличивается (самый пик достигается при 16 процессах), а затем начинает снижаться. Это характеризуется тем, что накладные расходы на параллельное выполнение (общение между процессами) начинает превалировать над вычислениями.&lt;br /&gt;
&lt;br /&gt;
*По размеру задачи: при увеличении размера задачи эффективность возрастает. Это подтверждает предположение о том, что размер задачи сильно влияет на эффективность выполнения приложения. Оценка показывает, что с ростом размера задачи эффективность на рассмотренной области значений параметров запуска сильно увеличивается. &lt;br /&gt;
&lt;br /&gt;
*По двум направлениям: при рассмотрении увеличения как вычислительной сложности, так и числа процессов на всей рассмотренной области значений эффективность увеличивается, но медленно и с перепадами.&lt;br /&gt;
&lt;br /&gt;
=== Динамические характеристики и эффективность реализации алгоритма ===&lt;br /&gt;
&lt;br /&gt;
=== Выводы для классов архитектур ===&lt;br /&gt;
&lt;br /&gt;
=== Существующие реализации алгоритма ===&lt;br /&gt;
Метод Якоби нахождения сингулярных значений и векторов реализован в таких пакетах, как LAPACK &amp;lt;ref&amp;gt;http://www.netlib.org/scalapack/slug/&amp;lt;/ref&amp;gt;, LINPACK/EISPACK &amp;lt;ref&amp;gt; http://www.netlib.org/linpack/ &amp;lt;/ref&amp;gt;, Intel MKL &amp;lt;ref&amp;gt;https://software.intel.com/ru-ru/node/521153#CAF8CA08-1C69-48F8-B0C3-B2B27AFA92FA&amp;lt;/ref&amp;gt;.&lt;br /&gt;
&lt;br /&gt;
Так же функция Якоби реализована в пакете Matlab.&lt;br /&gt;
&lt;br /&gt;
Т. к. алгоритм считается медленным, он не включен во многие известные пакеты.&lt;br /&gt;
&lt;br /&gt;
== Литература ==&lt;br /&gt;
1. Дж. Деммель Вычислительная линейная алгебра. Изд. Мир, 2001.&lt;/div&gt;</summary>
		<author><name>Davletshuna Alexandra</name></author>
	</entry>
	<entry>
		<id>https://xn--80aecvaldz.xn--80ahdrnmvk.xn--p1ai/w/ru/index.php?title=%D0%A3%D1%87%D0%B0%D1%81%D1%82%D0%BD%D0%B8%D0%BA:Davletshuna_Alexandra/%D0%9C%D0%B5%D1%82%D0%BE%D0%B4_%D0%AF%D0%BA%D0%BE%D0%B1%D0%B8_%D0%B2%D1%8B%D1%87%D0%B8%D1%81%D0%BB%D0%B5%D0%BD%D0%B8%D1%8F_%D1%81%D0%B8%D0%BD%D0%B3%D1%83%D0%BB%D1%8F%D1%80%D0%BD%D1%8B%D1%85_%D1%87%D0%B8%D1%81%D0%B5%D0%BB_%D0%B8_%D0%B2%D0%B5%D0%BA%D1%82%D0%BE%D1%80%D0%BE%D0%B2&amp;diff=17939</id>
		<title>Участник:Davletshuna Alexandra/Метод Якоби вычисления сингулярных чисел и векторов</title>
		<link rel="alternate" type="text/html" href="https://xn--80aecvaldz.xn--80ahdrnmvk.xn--p1ai/w/ru/index.php?title=%D0%A3%D1%87%D0%B0%D1%81%D1%82%D0%BD%D0%B8%D0%BA:Davletshuna_Alexandra/%D0%9C%D0%B5%D1%82%D0%BE%D0%B4_%D0%AF%D0%BA%D0%BE%D0%B1%D0%B8_%D0%B2%D1%8B%D1%87%D0%B8%D1%81%D0%BB%D0%B5%D0%BD%D0%B8%D1%8F_%D1%81%D0%B8%D0%BD%D0%B3%D1%83%D0%BB%D1%8F%D1%80%D0%BD%D1%8B%D1%85_%D1%87%D0%B8%D1%81%D0%B5%D0%BB_%D0%B8_%D0%B2%D0%B5%D0%BA%D1%82%D0%BE%D1%80%D0%BE%D0%B2&amp;diff=17939"/>
		<updated>2016-11-17T15:56:33Z</updated>

		<summary type="html">&lt;p&gt;Davletshuna Alexandra: /* Масштабируемость алгоритма и его реализации */&lt;/p&gt;
&lt;hr /&gt;
&lt;div&gt;{{algorithm&lt;br /&gt;
| name              = Метод Якоби вычисления сингулярных чисел и векторов&lt;br /&gt;
| serial_complexity = &amp;lt;math&amp;gt;O(n^3)&amp;lt;/math&amp;gt;&lt;br /&gt;
| pf_height         = &amp;lt;math&amp;gt;O(n^2)&amp;lt;/math&amp;gt;&lt;br /&gt;
| pf_width          = &amp;lt;math&amp;gt;O(n)&amp;lt;/math&amp;gt;&lt;br /&gt;
| input_data        = &amp;lt;math&amp;gt;n^2&amp;lt;/math&amp;gt;&lt;br /&gt;
| output_data       = &amp;lt;math&amp;gt;2n^2 + n&amp;lt;/math&amp;gt;&lt;br /&gt;
}}&lt;br /&gt;
&lt;br /&gt;
Авторы статьи: [[Участница:Davletshuna Alexandra|Давлетшина Александра]] (группа 619) пункты 1.1-1.4, 1.6, 2.7; [[Участница:Alek sandra|Зайцева Александра]] (группа 601) пункты 1.5, 1.7-1.10, 2.7.&lt;br /&gt;
&lt;br /&gt;
== Свойства и структура алгоритма ==&lt;br /&gt;
&lt;br /&gt;
=== Общее описание алгоритма ===&lt;br /&gt;
&#039;&#039;&#039;Сингулярным разложением&#039;&#039;&#039; называется разложение прямоугольной вещественной или комплексной матрицы, имеющее широкое применение, в силу своей наглядной геометрической интерпретации, при решении многих прикладных задач. Сингулярное разложение матрицы А позволяет вычислять сингулярные числа данной матрицы, а также, левые и правые сингулярные векторы матрицы А:&lt;br /&gt;
&lt;br /&gt;
•	левые сингулярные векторы матрицы А — это собственные векторы матрицы &amp;lt;math&amp;gt;AA^*&amp;lt;/math&amp;gt;;&lt;br /&gt;
&lt;br /&gt;
•	правые сингулярные векторы матрицы A — это собственные векторы матрицы &amp;lt;math&amp;gt;A^*A&amp;lt;/math&amp;gt;.&lt;br /&gt;
&lt;br /&gt;
Геометрическая интерпретация сингулярного разложения заключается в следующем факте из геометрии: &#039;&#039;Образом любого линейного преобразования, заданного с помощью матрицы &amp;lt;math&amp;gt;m&amp;lt;/math&amp;gt;x&amp;lt;math&amp;gt;n&amp;lt;/math&amp;gt;, примененного к единичной сфере является гиперэллипсоид&#039;&#039;.&lt;br /&gt;
&lt;br /&gt;
Из многочисленных разложений матриц, наиболее удобным является сингулярное разложение матрицы в виде: &amp;lt;math&amp;gt;A=U\Sigma V^*&amp;lt;/math&amp;gt;, где &amp;lt;math&amp;gt;U, V&amp;lt;/math&amp;gt; – унитарные матрицы, а &amp;lt;math&amp;gt;\Sigma&amp;lt;/math&amp;gt; – диагональная матрица с вещественными положительными числами на диагонали &amp;lt;ref&amp;gt;http://algorithms.parallel.ru/&amp;lt;/ref&amp;gt;.&lt;br /&gt;
&lt;br /&gt;
Диагональные элементы матрицы &amp;lt;math&amp;gt;\Sigma&amp;lt;/math&amp;gt; называются сингулярными числами матрицы &amp;lt;math&amp;gt;A&amp;lt;/math&amp;gt;, а столбцы матриц &amp;lt;math&amp;gt;U,V&amp;lt;/math&amp;gt; левыми и правыми сингулярными векторами соответственно.&lt;br /&gt;
&lt;br /&gt;
Алгоритм Якоби сингулярного разложения матрицы был предложен одним из первых в 1846 году. Он приводит прямоугольную матрицу к диагональной матрице с помощью последовательности элементарных вращений. Метод может найти все сингулярные значения с очень высокой точностью. Однако его производительность является довольно низкой, в сравнении с конкурирующими методами.&lt;br /&gt;
&lt;br /&gt;
&#039;&#039;Неявный&#039;&#039;&amp;lt;ref&amp;gt;Дж. Деммель «Вычислительная линейная алгебра» (стр. 261-264)&amp;lt;/ref&amp;gt; метод Якоби математически эквивалентен применению метода Якоби вычисления собственных значений к матрице &amp;lt;math&amp;gt;A = G^TG&amp;lt;/math&amp;gt;.&lt;br /&gt;
Это значит, что на каждом шаге вычисляется вращение Якоби &amp;lt;math&amp;gt;J&amp;lt;/math&amp;gt;, с помощью которого матрица &amp;lt;math&amp;gt;G^TG&amp;lt;/math&amp;gt; неявно пересчитывется в &amp;lt;math&amp;gt;J^TG^TGJ&amp;lt;/math&amp;gt;; вращение выбрано так, чтобы пара внедиагональных элементов из &amp;lt;math&amp;gt;G^TG&amp;lt;/math&amp;gt; обратилась в нули в матрице &amp;lt;math&amp;gt;J^TG^TGJ&amp;lt;/math&amp;gt;. При этом ни &amp;lt;math&amp;gt;G^TG&amp;lt;/math&amp;gt;, ни &amp;lt;math&amp;gt;J^TG^TGJ&amp;lt;/math&amp;gt; не вычисляются в явном виде; вместо них вычисляется матрица &amp;lt;math&amp;gt;GJ&amp;lt;/math&amp;gt;. Поэтому алгоритм называется &#039;&#039;методом односторонних вращений&#039;&#039;.&lt;br /&gt;
&lt;br /&gt;
=== Математическое описание алгоритма ===&lt;br /&gt;
Исходные данные: матрица &amp;lt;math&amp;gt;G&amp;lt;/math&amp;gt; (элементы &amp;lt;math&amp;gt;g_{ij}, i, j = 1, \ldots, n&amp;lt;/math&amp;gt;).&lt;br /&gt;
&lt;br /&gt;
Вычисляемые данные: матрица &amp;lt;math&amp;gt;\Sigma = diag(\sigma_{i})&amp;lt;/math&amp;gt;, где &amp;lt;math&amp;gt;\sigma_{i}&amp;lt;/math&amp;gt; - сингулярные числа, &amp;lt;math&amp;gt;U&amp;lt;/math&amp;gt; - матрица левых сингулярных векторов, &amp;lt;math&amp;gt;V&amp;lt;/math&amp;gt; - матрица правых сингулярных векторов.&lt;br /&gt;
&lt;br /&gt;
симметричную матрицу &amp;lt;math&amp;gt;A = (G^TG)&amp;lt;/math&amp;gt; можно привести к диагональному виду:&lt;br /&gt;
&amp;lt;math&amp;gt;RG^TGR^T&amp;lt;/math&amp;gt;, где&lt;br /&gt;
&lt;br /&gt;
&amp;lt;math&amp;gt;&lt;br /&gt;
R(j,k,\theta) = &lt;br /&gt;
\begin{matrix}&lt;br /&gt;
  \\&lt;br /&gt;
  \\&lt;br /&gt;
  \\&lt;br /&gt;
j \\&lt;br /&gt;
  \\&lt;br /&gt;
k \\&lt;br /&gt;
  \\&lt;br /&gt;
  \\&lt;br /&gt;
  \\&lt;br /&gt;
\end{matrix}&lt;br /&gt;
&amp;lt;/math&amp;gt;  &lt;br /&gt;
&amp;lt;math&amp;gt;&lt;br /&gt;
\begin{bmatrix}&lt;br /&gt;
  &amp;amp; 1 &amp;amp;   &amp;amp;        &amp;amp;              &amp;amp;        &amp;amp;               &amp;amp;         &amp;amp;    &amp;amp;   \\&lt;br /&gt;
  &amp;amp;   &amp;amp; 1 &amp;amp;        &amp;amp;              &amp;amp;        &amp;amp;               &amp;amp;         &amp;amp;    &amp;amp;   \\&lt;br /&gt;
  &amp;amp;   &amp;amp;   &amp;amp; \ddots &amp;amp;              &amp;amp;        &amp;amp;               &amp;amp;         &amp;amp;    &amp;amp;   \\&lt;br /&gt;
  &amp;amp;   &amp;amp;   &amp;amp;        &amp;amp; \cos(\theta) &amp;amp;        &amp;amp; -\sin(\theta) &amp;amp;         &amp;amp;    &amp;amp;   \\&lt;br /&gt;
  &amp;amp;   &amp;amp;   &amp;amp;        &amp;amp;              &amp;amp; \ddots &amp;amp;               &amp;amp;         &amp;amp;    &amp;amp;   \\&lt;br /&gt;
  &amp;amp;   &amp;amp;   &amp;amp;        &amp;amp; \sin(\theta) &amp;amp;        &amp;amp; \cos(\theta)  &amp;amp;         &amp;amp;    &amp;amp;   \\&lt;br /&gt;
  &amp;amp;   &amp;amp;   &amp;amp;        &amp;amp;              &amp;amp;        &amp;amp;               &amp;amp; \ddots  &amp;amp;    &amp;amp;   \\&lt;br /&gt;
  &amp;amp;   &amp;amp;   &amp;amp;        &amp;amp;              &amp;amp;        &amp;amp;               &amp;amp;         &amp;amp; 1  &amp;amp;   \\&lt;br /&gt;
  &amp;amp;   &amp;amp;   &amp;amp;        &amp;amp;              &amp;amp;        &amp;amp;               &amp;amp;         &amp;amp;    &amp;amp; 1 \\&lt;br /&gt;
\end{bmatrix}&lt;br /&gt;
&amp;lt;/math&amp;gt;&lt;br /&gt;
&lt;br /&gt;
Обозначим &amp;lt;math&amp;gt;s = \sin \theta&amp;lt;/math&amp;gt; и &amp;lt;math&amp;gt;c = \cos \theta&amp;lt;/math&amp;gt;.&lt;br /&gt;
&lt;br /&gt;
Перемножив матрицы &amp;lt;math&amp;gt;RG^TGR^T&amp;lt;/math&amp;gt;, получим следующие выражения&amp;lt;ref&amp;gt;http://www.astro.tsu.ru/OsChMet/5_2.html&amp;lt;/ref&amp;gt;:&lt;br /&gt;
&lt;br /&gt;
&amp;lt;math&amp;gt;\begin{align}&lt;br /&gt;
 a_{jj}^{(i+1)} &amp;amp;= c^2\, a_{jj}^{(i)}  -  2\, s c \,a_{jk}^{(i)}  +  s^2\, a_{kk}^{(i)} \\&lt;br /&gt;
 a_{kk}^{(i+1)} &amp;amp;= s^2 \,a_{jj}^{(i)}  +  2 s c\, a_{jk}^{(i)}  +  c^2 \, a_{kk}^{(i)} \\&lt;br /&gt;
 a_{jk}^{(i+1)} &amp;amp;= a_{kj}^{(i+1)} = (c^2 - s^2 ) \, a_{jk}^{(i)}  +  s c \, (a_{kk}^{(i)} - a_{jj}^{(i)} ) \\&lt;br /&gt;
 a_{jm}^{(i+1)} &amp;amp;= a_{mj}^{(i+1)} = c \, a_{jm}^{(i)}  -  s \, a_{km}^{(i)} &amp;amp; m \ne j,k \\&lt;br /&gt;
 a_{km}^{(i+1)} &amp;amp;= a_{mk}^{(i+1)} = s \, a_{jm}^{(i)}  + c \, a_{km}^{(i)} &amp;amp; m \ne j,k \\&lt;br /&gt;
 a_{ml}^{(i+1)} &amp;amp;= a_{ml}^{(i)} &amp;amp;m,l \ne j,k&lt;br /&gt;
\end{align}&amp;lt;/math&amp;gt;&lt;br /&gt;
&lt;br /&gt;
Т.к внедиагональные элементы должны быть равны 0, то выбираем &amp;lt;math&amp;gt;\theta&amp;lt;/math&amp;gt; так, чтобы &amp;lt;math&amp;gt;a_{jk}^{(i+1)} = 0&amp;lt;/math&amp;gt; и &amp;lt;math&amp;gt;a_{kj}^{(i+1)} = 0&amp;lt;/math&amp;gt;.&lt;br /&gt;
&lt;br /&gt;
Тогда решая уравнение получаем, что&lt;br /&gt;
&lt;br /&gt;
&amp;lt;math&amp;gt;&lt;br /&gt;
         \begin{align}&lt;br /&gt;
         \tau &amp;amp;= ({a_{jj} - a_{kk}})/{2a_{jk}} \\&lt;br /&gt;
         t &amp;amp;= {sign(\tau)}/(|\tau| + \sqrt{1 + \tau^2}) \\&lt;br /&gt;
         c &amp;amp;= 1/(\sqrt{1 + t^2}) \\&lt;br /&gt;
         s &amp;amp;= ct \\&lt;br /&gt;
         \end{align}&amp;lt;/math&amp;gt;&lt;br /&gt;
&lt;br /&gt;
Остановка вычислений алгоритма наступает, когда внедиагональные элементы становятся меньше некоторого наперед заданного числа &amp;lt;math&amp;gt;\varepsilon&amp;lt;/math&amp;gt;.&lt;br /&gt;
&lt;br /&gt;
=== Вычислительное ядро алгоритма ===&lt;br /&gt;
Вычислительное ядро алгоритма составляет непосредственно вычисление одностороннего вращения Якоби, т.е. вычисление элементов матрицы &amp;lt;math&amp;gt;g_{jm}^{(i+1)} = g_{mj}^{(i+1)}&amp;lt;/math&amp;gt; и &amp;lt;math&amp;gt;g_{km}^{(i+1)} = g_{mk}^{(i+1)}&amp;lt;/math&amp;gt;, &amp;lt;math&amp;gt;m \ne j,k&amp;lt;/math&amp;gt;, а также вычисления элементов &amp;lt;math&amp;gt;g_{jj}^{(i+1)} &amp;lt;/math&amp;gt; и &amp;lt;math&amp;gt;g_{kk}^{(i+1)} &amp;lt;/math&amp;gt;, получившихся после умножения промежуточной матрицы на матрицу вращений Якоби:&lt;br /&gt;
&lt;br /&gt;
&amp;lt;math&amp;gt;\begin{align}&lt;br /&gt;
 g_{jj}^{(i+1)} &amp;amp;= c^2\, g_{jj}^{(i)}  -  2\, s c \,g_{jk}^{(i)}  +  s^2\, g_{kk}^{(i)} \\&lt;br /&gt;
 g_{kk}^{(i+1)} &amp;amp;= s^2 \,g_{jj}^{(i)}  +  2 s c\, g_{jk}^{(i)}  +  c^2 \, g_{kk}^{(i)} \\&lt;br /&gt;
 g_{jk}^{(i+1)} &amp;amp;= g_{kj}^{(i+1)} = (c^2 - s^2 ) \, g_{jk}^{(i)}  +  s c \, (g_{kk}^{(i)} - g_{jj}^{(i)} ) \\&lt;br /&gt;
 g_{jm}^{(i+1)} &amp;amp;= g_{mj}^{(i+1)} = c \, g_{jm}^{(i)}  -  s \, g_{km}^{(i)} &amp;amp; m \ne j,k \\&lt;br /&gt;
 g_{km}^{(i+1)} &amp;amp;= g_{mk}^{(i+1)} = s \, g_{jm}^{(i)}  + c \, g_{km}^{(i)} &amp;amp; m \ne j,k \\&lt;br /&gt;
 g_{ml}^{(i+1)} &amp;amp;= g_{ml}^{(i)} &amp;amp;m,l \ne j,k&lt;br /&gt;
\end{align}&amp;lt;/math&amp;gt;&lt;br /&gt;
&lt;br /&gt;
=== Макроструктура алгоритма ===&lt;br /&gt;
Основную часть метода составляет процедура односторонних вращений матрицы, которая в свою очередь состоит из:&lt;br /&gt;
&lt;br /&gt;
#Вычисление &amp;lt;math&amp;gt;\tau, c, s, t&amp;lt;/math&amp;gt;.&lt;br /&gt;
#Одностороннее вращение матрицы. &lt;br /&gt;
&lt;br /&gt;
Что требует &amp;lt;math&amp;gt;O(n)&amp;lt;/math&amp;gt; операций.&lt;br /&gt;
&lt;br /&gt;
После этого необходимо:&lt;br /&gt;
&lt;br /&gt;
#Вычислить сингулярные числа &amp;lt;math&amp;gt;\sigma_i&amp;lt;/math&amp;gt;.  Что требует &amp;lt;math&amp;gt;O(n)&amp;lt;/math&amp;gt; операций.&lt;br /&gt;
#Вычислить &amp;lt;math&amp;gt;U&amp;lt;/math&amp;gt; и &amp;lt;math&amp;gt;V&amp;lt;/math&amp;gt;. Что требует &amp;lt;math&amp;gt;O(n^2)&amp;lt;/math&amp;gt; операций.&lt;br /&gt;
&lt;br /&gt;
=== Схема реализации последовательного алгоритма ===&lt;br /&gt;
Применение метода Якоби к матрице &amp;lt;math&amp;gt;A = (G^TG)&amp;lt;/math&amp;gt; можно описать следующим образом&amp;lt;ref&amp;gt;Дж. Деммель «Вычислительная линейная алгебра» (стр. 261-263)&amp;lt;/ref&amp;gt;:&lt;br /&gt;
&lt;br /&gt;
Если &amp;lt;math&amp;gt;G = U\Sigma V^T&amp;lt;/math&amp;gt; и &amp;lt;math&amp;gt;\Sigma = diag(\sigma_{i})&amp;lt;/math&amp;gt;, то алгоритм вычисляет сингулярные числа &amp;lt;math&amp;gt;\sigma_{i}&amp;lt;/math&amp;gt;, матрицу &amp;lt;math&amp;gt;U&amp;lt;/math&amp;gt; левых сингулярных векторов и матрицу &amp;lt;math&amp;gt;V&amp;lt;/math&amp;gt; правых сингулярных векторов по следующей схеме:&lt;br /&gt;
&lt;br /&gt;
 repeat&lt;br /&gt;
     for &amp;lt;math&amp;gt;j=1&amp;lt;/math&amp;gt; to &amp;lt;math&amp;gt;n-1&amp;lt;/math&amp;gt;&lt;br /&gt;
         for &amp;lt;math&amp;gt;k=j+1&amp;lt;/math&amp;gt; to &amp;lt;math&amp;gt;n&amp;lt;/math&amp;gt;&lt;br /&gt;
             обратиться к процедуре &#039;&#039;&#039;&#039;&#039;One-Sided-Jacobi-Rotation&amp;lt;math&amp;gt;(G,j,k)&amp;lt;/math&amp;gt;&#039;&#039;&#039;&#039;&#039;&lt;br /&gt;
         end for&lt;br /&gt;
     end for&lt;br /&gt;
 пока &amp;lt;math&amp;gt;G^TG&amp;lt;/math&amp;gt; не станет достаточно близка к диагональной матрице&lt;br /&gt;
 Положить &amp;lt;math&amp;gt;\sigma_{i} = ||G(:,i)||_2 &amp;lt;/math&amp;gt; (норма &amp;lt;math&amp;gt;i&amp;lt;/math&amp;gt;-го столбца в &amp;lt;math&amp;gt;G&amp;lt;/math&amp;gt;)&lt;br /&gt;
 Положить &amp;lt;math&amp;gt;U = [u_{1},\dots, u_{n}]&amp;lt;/math&amp;gt;, где &amp;lt;math&amp;gt;u_{i} = G(:,i)/\sigma_{i}&amp;lt;/math&amp;gt;&lt;br /&gt;
 Положить &amp;lt;math&amp;gt;V = J&amp;lt;/math&amp;gt;, где &amp;lt;math&amp;gt;J&amp;lt;/math&amp;gt; - накопленное произведение вращений Якоби.&lt;br /&gt;
&lt;br /&gt;
Где процедура &#039;&#039;&#039;&#039;&#039;One-Sided-Jacobi-Rotation&#039;&#039;&#039;&#039;&#039; является метод односторонних вращений Якоби:&lt;br /&gt;
&lt;br /&gt;
 proc &#039;&#039;&#039;&#039;&#039;One-Sided-Jacobi-Rotation&amp;lt;math&amp;gt;(G,j,k)&amp;lt;/math&amp;gt;&#039;&#039;&#039;&#039;&#039;&lt;br /&gt;
     вычислить &amp;lt;math&amp;gt;a_{jj} = (G^TG)_{jj}, a_{jk} = (G^TG)_{jk}&amp;lt;/math&amp;gt; и &amp;lt;math&amp;gt;a_{kk} = (G^TG)_{kk}&amp;lt;/math&amp;gt;&lt;br /&gt;
     if &amp;lt;math&amp;gt;|a_{jk}|&amp;lt;/math&amp;gt; не слишком мал&lt;br /&gt;
         &amp;lt;math&amp;gt;&lt;br /&gt;
         \begin{align}&lt;br /&gt;
         \tau &amp;amp;= ({a_{jj} - a_{kk}})/{2a_{jk}} \\&lt;br /&gt;
         t &amp;amp;= {sign(\tau)}/(|\tau| + \sqrt{1 + \tau^2}) \\&lt;br /&gt;
         c &amp;amp;= 1/(\sqrt{1 + t^2}) \\&lt;br /&gt;
         s &amp;amp;= ct \\&lt;br /&gt;
         G &amp;amp;= GR(j,k,\theta) \  \dots c=cos\theta, s=sin\theta \end{align}&amp;lt;/math&amp;gt;&lt;br /&gt;
         if нужны правые сингулярные векторы &lt;br /&gt;
             &amp;lt;math&amp;gt;J = JR(j,k,\theta)&amp;lt;/math&amp;gt;&lt;br /&gt;
         end if&lt;br /&gt;
     end if&lt;br /&gt;
&lt;br /&gt;
=== Последовательная сложность алгоритма ===&lt;br /&gt;
Для одного вращения Якоби необходимо выполнить &amp;lt;math&amp;gt;O(n)&amp;lt;/math&amp;gt; операций умножения и сложения. &lt;br /&gt;
&lt;br /&gt;
Всего вариантов выбора &amp;lt;math&amp;gt;j&amp;lt;/math&amp;gt; и &amp;lt;math&amp;gt;k&amp;lt;/math&amp;gt; существует &amp;lt;math&amp;gt;\frac{n(n-1)}{2}&amp;lt;/math&amp;gt;.&lt;br /&gt;
&lt;br /&gt;
Таким образом последовательный алгоритм Якоби вычисления сингулярных чисел и векторов является алгоритмом с кубической сложностью.&lt;br /&gt;
&lt;br /&gt;
=== Информационный граф ===&lt;br /&gt;
Граф алгоритма состоит из четырех групп вершин&lt;br /&gt;
&lt;br /&gt;
(А)Первая группа вершин расположена в двумерной области, соответствующая ей операция - вычисление элементов &amp;lt;math&amp;gt;a_{jj},a_{jk},a_{kk}&amp;lt;/math&amp;gt; матрицы произведения &amp;lt;math&amp;gt;A = (G^TG)&amp;lt;/math&amp;gt;. Где &amp;lt;math&amp;gt;j&amp;lt;/math&amp;gt; изменяется от &amp;lt;math&amp;gt;1&amp;lt;/math&amp;gt; до &amp;lt;math&amp;gt;n-1&amp;lt;/math&amp;gt;, принимая все целочисленные значения, &amp;lt;math&amp;gt;k&amp;lt;/math&amp;gt;  изменяется от &amp;lt;math&amp;gt;j+1&amp;lt;/math&amp;gt; до &amp;lt;math&amp;gt;n&amp;lt;/math&amp;gt;, принимая все целочисленные значения.&lt;br /&gt;
&lt;br /&gt;
Граф вычисления каждого из элементов приведен на рисунке 1, где значениям &amp;lt;math&amp;gt;g_{ij}&amp;lt;/math&amp;gt; соответствуют обозначения &amp;lt;math&amp;gt;x_{ij}&amp;lt;/math&amp;gt;, а элементам &amp;lt;math&amp;gt;g^T_{ij}&amp;lt;/math&amp;gt; обозначения &amp;lt;math&amp;gt;z_{ij}&amp;lt;/math&amp;gt;. Значение &amp;lt;math&amp;gt;s_{ij}&amp;lt;/math&amp;gt; является значением результирующего элемента.&lt;br /&gt;
&lt;br /&gt;
(Б)Вторая группа вершин расположена в двумерной области, соответствующая ей операция – вычисление &amp;lt;math&amp;gt;c&amp;lt;/math&amp;gt; и &amp;lt;math&amp;gt;s&amp;lt;/math&amp;gt;.&lt;br /&gt;
&lt;br /&gt;
Информационный граф с входными и выходными данными вычисления пункта (Б) представлен на рисунке 2.&lt;br /&gt;
&lt;br /&gt;
(В)Третья группа вершин расположена в двумерной области, соответствующая ей операция вычисление значений элементов &amp;lt;math&amp;gt;g_{jm}^{(i+1)} = g_{mj}^{(i+1)}&amp;lt;/math&amp;gt; и &amp;lt;math&amp;gt;g_{km}^{(i+1)} = g_{mk}^{(i+1)}&amp;lt;/math&amp;gt;, &amp;lt;math&amp;gt;m \ne j,k&amp;lt;/math&amp;gt;.&lt;br /&gt;
&lt;br /&gt;
(Г)Четвертая группа вершин расположена в двумерной области, соответствующая ей операция вычисление значений элементов &amp;lt;math&amp;gt;g_{jj}^{(i+1)} &amp;lt;/math&amp;gt; и &amp;lt;math&amp;gt;g_{kk}^{(i+1)} &amp;lt;/math&amp;gt;.&lt;br /&gt;
&lt;br /&gt;
Элементы групп (В) и (Г) вычисляются аналогично вычислению элементов матрицы произведения, т.к. фактически представляют собой перемножение матриц &amp;lt;math&amp;gt;G&amp;lt;/math&amp;gt; и &amp;lt;math&amp;gt;R&amp;lt;/math&amp;gt;&lt;br /&gt;
&lt;br /&gt;
[[File:Jacobi_2.jpg|none|thumb|1000px|Рисунок 1. Информационный граф с входными и выходными параметрами вычисления каждого элемента матрицы произведения.]]&lt;br /&gt;
&lt;br /&gt;
[[File:Jacobi_1.jpg|none|thumb|1000px|Рисунок 2. Информационный граф с входными и выходными параметрами вычисления значений &amp;lt;math&amp;gt;c&amp;lt;/math&amp;gt; и &amp;lt;math&amp;gt;s&amp;lt;/math&amp;gt;.]]&lt;br /&gt;
&lt;br /&gt;
Обобщенный граф метода Якоби представлен на рисунке 3, где буквами А, Б, В и Г обозначено вычисление групп вершин (А), (Б), (В) и (Г).&lt;br /&gt;
&lt;br /&gt;
[[File:Graf21.png|none|thumb|2000px|Рисунок 3. Обобщенный граф алгоритма вычисления сингулярных чисел и векторов методом Якоби.]]&lt;br /&gt;
&lt;br /&gt;
=== Ресурс параллелизма алгоритма ===&lt;br /&gt;
Для выполнения одной итерации метода Якоби требуется последовательно выполнить несколько ярусов:&lt;br /&gt;
# вычислить &amp;lt;math&amp;gt;\tau&amp;lt;/math&amp;gt; &lt;br /&gt;
# вычислить &amp;lt;math&amp;gt;t&amp;lt;/math&amp;gt; &lt;br /&gt;
# вычислить &amp;lt;math&amp;gt;c&amp;lt;/math&amp;gt; &lt;br /&gt;
# вычислить &amp;lt;math&amp;gt;s&amp;lt;/math&amp;gt;&lt;br /&gt;
# выполнить поворот матрицы &amp;lt;math&amp;gt;G&amp;lt;/math&amp;gt; с параллельным выполнением &amp;lt;math&amp;gt;2(n-2)&amp;lt;/math&amp;gt; операций вычисления элементов матрицы &amp;lt;math&amp;gt;g_{jm}^{(i+1)} = g_{mj}^{(i+1)}&amp;lt;/math&amp;gt; и &amp;lt;math&amp;gt;g_{km}^{(i+1)} = g_{mk}^{(i+1)}&amp;lt;/math&amp;gt;, &amp;lt;math&amp;gt;m \ne j,k&amp;lt;/math&amp;gt;, а также вычисления элементов &amp;lt;math&amp;gt;g_{jj}^{(i+1)} &amp;lt;/math&amp;gt; и &amp;lt;math&amp;gt;g_{kk}^{(i+1)} &amp;lt;/math&amp;gt;. &lt;br /&gt;
&lt;br /&gt;
Суммарное количество итераций равно &amp;lt;math&amp;gt;\frac{n(n-1)}{2}&amp;lt;/math&amp;gt; (Различные варианты выбора &amp;lt;math&amp;gt;j&amp;lt;/math&amp;gt; и &amp;lt;math&amp;gt;k&amp;lt;/math&amp;gt;). &lt;br /&gt;
&lt;br /&gt;
Асимптотически метод сходится квадратично. &lt;br /&gt;
&lt;br /&gt;
Таким образом, при классификации по высоте ЯПФ метод Якоби относится к алгоритмам со сложностью &amp;lt;math&amp;gt;O(n^2)&amp;lt;/math&amp;gt;&amp;amp;nbsp;, а при классификации по ширине ЯПФ — к алгоритмам со сложностью &amp;lt;math&amp;gt;O(n)&amp;lt;/math&amp;gt;.&lt;br /&gt;
&lt;br /&gt;
=== Входные и выходные данные алгоритма ===&lt;br /&gt;
&#039;&#039;&#039;Входные данные&#039;&#039;&#039;: плотная матрица &amp;lt;math&amp;gt;G&amp;lt;/math&amp;gt; размера &amp;lt;math&amp;gt;n&amp;lt;/math&amp;gt;х&amp;lt;math&amp;gt;n&amp;lt;/math&amp;gt;, где &amp;lt;math&amp;gt;A= G^TG&amp;lt;/math&amp;gt; – симметрическая матрица.&lt;br /&gt;
&lt;br /&gt;
&#039;&#039;&#039;Объём входных данных&#039;&#039;&#039;: &amp;lt;math&amp;gt;n^2&amp;lt;/math&amp;gt; (т.к. для хранения матрицы &amp;lt;math&amp;gt;G&amp;lt;/math&amp;gt; используем двумерный массив размера &amp;lt;math&amp;gt;n&amp;lt;/math&amp;gt;х&amp;lt;math&amp;gt;n&amp;lt;/math&amp;gt;)&lt;br /&gt;
&lt;br /&gt;
&#039;&#039;&#039;Выходные данные&#039;&#039;&#039;: &amp;lt;math&amp;gt;\sigma_{i}&amp;lt;/math&amp;gt;  - сингулярные числа, матрица &amp;lt;math&amp;gt;U&amp;lt;/math&amp;gt; левых сингулярных векторов и матрица &amp;lt;math&amp;gt;V&amp;lt;/math&amp;gt; правых сингулярных векторов.&lt;br /&gt;
&lt;br /&gt;
&#039;&#039;&#039;Объём выходных данных&#039;&#039;&#039;: &amp;lt;math&amp;gt;2n^2 + n&amp;lt;/math&amp;gt; (т.к. необходимо хранить вектор сингулярных чисел длины &amp;lt;math&amp;gt;n&amp;lt;/math&amp;gt;, а также две матрицы &amp;lt;math&amp;gt;U, V&amp;lt;/math&amp;gt; левых и правых сингулярных векторов размера &amp;lt;math&amp;gt;n&amp;lt;/math&amp;gt;х&amp;lt;math&amp;gt;n&amp;lt;/math&amp;gt;).&lt;br /&gt;
&lt;br /&gt;
=== Свойства алгоритма ===&lt;br /&gt;
Метод Якоби является самым медленным из имеющихся алгоритмов вычисления сингулярных чисел и сингулярных векторов матрицы. Тем не менее, для  матриц &amp;lt;math&amp;gt;G&amp;lt;/math&amp;gt;, которые могут быть представлены в виде &amp;lt;math&amp;gt;G=DX&amp;lt;/math&amp;gt;, где &amp;lt;math&amp;gt;D&amp;lt;/math&amp;gt; - диагональная, а &amp;lt;math&amp;gt;X&amp;lt;/math&amp;gt; - хорошо обусловлена, он способен вычислять сингулярные числа и вектора намного точнее, чем другие методы&amp;lt;ref&amp;gt;Дж. Деммель «Вычислительная линейная алгебра» (стр. 261-264)&amp;lt;/ref&amp;gt;. &lt;br /&gt;
&lt;br /&gt;
Вычислительная мощность алгоритма, как отношение числа операций к суммарному объему входных и выходных данных является линейной.&lt;br /&gt;
&lt;br /&gt;
Метод Якоби не детерминирован, так как является итерационным алгоритмом с выходом по точности (число итераций зависит от входных данных и порогового значения).&lt;br /&gt;
&lt;br /&gt;
== Программная реализация алгоритма ==&lt;br /&gt;
&lt;br /&gt;
=== Особенности реализации последовательного алгоритма ===&lt;br /&gt;
&lt;br /&gt;
=== Локальность данных и вычислений ===&lt;br /&gt;
&lt;br /&gt;
=== Возможные способы и особенности параллельной реализации алгоритма ===&lt;br /&gt;
&lt;br /&gt;
=== Масштабируемость алгоритма и его реализации ===&lt;br /&gt;
Исследование масштабируемости параллельной реализации метода Якоби вычисления сингулярных чисел и векторов проводилось на суперкомпьютере &amp;quot;Ломоносов&amp;quot;. Алгоритм реализован на языке программирования C с использованием механизмов MPI.&lt;br /&gt;
&lt;br /&gt;
Алгоритм работает по следующей схеме:&lt;br /&gt;
#На вход всем процессорам подается матрица &amp;lt;math&amp;gt; G &amp;lt;/math&amp;gt;.&lt;br /&gt;
#Для всех &amp;lt;math&amp;gt; j &amp;lt;/math&amp;gt; и &amp;lt;math&amp;gt; k &amp;lt;/math&amp;gt; таких, что &amp;lt;math&amp;gt; j \in [1,n-1] &amp;lt;/math&amp;gt;, &amp;lt;math&amp;gt; k \in [j+1,n] &amp;lt;/math&amp;gt;&lt;br /&gt;
##Вычисляется элемент &amp;lt;math&amp;gt; a_{jk} &amp;lt;/math&amp;gt; путем перемножения матриц &amp;lt;math&amp;gt; G^TG &amp;lt;/math&amp;gt;, где на каждом процессоре вычисляется своя часть матрицы. После чего результат отправляется на все процессоры.&lt;br /&gt;
##Если полученный элемент оказывается больше некоторого значения, то начинается последовательная часть программы: Вычисление элементов &amp;lt;math&amp;gt; \tau, t, c, s &amp;lt;/math&amp;gt;.&lt;br /&gt;
##Затем, выполняется операция поворота, путем перемножения матриц &amp;lt;math&amp;gt; G &amp;lt;/math&amp;gt; и &amp;lt;math&amp;gt; R &amp;lt;/math&amp;gt;. Данная операция выполняется параллельно на нескольких процессорах, где каждый процессор вычисляет свою часть матрицы. После чего результат пересылается всем процессорам.&lt;br /&gt;
&lt;br /&gt;
Данная схема повторяется до тех пор, пока матрица &amp;lt;math&amp;gt; A = G^TG &amp;lt;/math&amp;gt; не станет достаточно близкой к диагональной.&lt;br /&gt;
&lt;br /&gt;
Для проверки этого факта, в конце каждой итерации цикла вычисляется матрица &amp;lt;math&amp;gt; A &amp;lt;/math&amp;gt;. Данная операция выполняется параллельно на нескольких процессорах, где каждый процессор вычисляет свою часть матрицы, после чего результат пересылается всем процессорам.&lt;br /&gt;
&lt;br /&gt;
&lt;br /&gt;
Набор и границы значений изменяемых параметров запуска реализации алгоритма: &lt;br /&gt;
&lt;br /&gt;
*	число процессоров [1 : 128] с шагом равным степени двойки;&lt;br /&gt;
*	размер матрицы [256 : 1792] с шагом 256.&lt;br /&gt;
&lt;br /&gt;
В результате проведённых экспериментов был получен следующий диапазон эффективности реализации алгоритма:&lt;br /&gt;
&lt;br /&gt;
*	минимальная эффективность реализации ;&lt;br /&gt;
*	максимальная эффективность реализации .&lt;br /&gt;
&lt;br /&gt;
На следующих рисунках приведены графики производительности и эффективности выбранной реализации метода Якоби в зависимости от изменяемых параметров запуска.&lt;br /&gt;
&lt;br /&gt;
[[File:Performance.jpg|none|thumb|1000px|Рисунок 1. Параллельная реализация метода Якоби. Изменение производительности в зависимости от числа процессоров и размера матрицы.]]&lt;br /&gt;
&lt;br /&gt;
[[File:Эффективность.png|none|thumb|1000px|Рисунок 1. Параллельная реализация метода Якоби. Изменение эффективности в зависимости от числа процессоров и размера матрицы.]]&lt;br /&gt;
&lt;br /&gt;
=== Динамические характеристики и эффективность реализации алгоритма ===&lt;br /&gt;
&lt;br /&gt;
=== Выводы для классов архитектур ===&lt;br /&gt;
&lt;br /&gt;
=== Существующие реализации алгоритма ===&lt;br /&gt;
Метод Якоби нахождения сингулярных значений и векторов реализован в таких пакетах, как LAPACK &amp;lt;ref&amp;gt;http://www.netlib.org/scalapack/slug/&amp;lt;/ref&amp;gt;, LINPACK/EISPACK &amp;lt;ref&amp;gt; http://www.netlib.org/linpack/ &amp;lt;/ref&amp;gt;, Intel MKL &amp;lt;ref&amp;gt;https://software.intel.com/ru-ru/node/521153#CAF8CA08-1C69-48F8-B0C3-B2B27AFA92FA&amp;lt;/ref&amp;gt;.&lt;br /&gt;
&lt;br /&gt;
Так же функция Якоби реализована в пакете Matlab.&lt;br /&gt;
&lt;br /&gt;
Т. к. алгоритм считается медленным, он не включен во многие известные пакеты.&lt;br /&gt;
&lt;br /&gt;
== Литература ==&lt;br /&gt;
1. Дж. Деммель Вычислительная линейная алгебра. Изд. Мир, 2001.&lt;/div&gt;</summary>
		<author><name>Davletshuna Alexandra</name></author>
	</entry>
	<entry>
		<id>https://xn--80aecvaldz.xn--80ahdrnmvk.xn--p1ai/w/ru/index.php?title=%D0%A3%D1%87%D0%B0%D1%81%D1%82%D0%BD%D0%B8%D0%BA:Davletshuna_Alexandra/%D0%9C%D0%B5%D1%82%D0%BE%D0%B4_%D0%AF%D0%BA%D0%BE%D0%B1%D0%B8_%D0%B2%D1%8B%D1%87%D0%B8%D1%81%D0%BB%D0%B5%D0%BD%D0%B8%D1%8F_%D1%81%D0%B8%D0%BD%D0%B3%D1%83%D0%BB%D1%8F%D1%80%D0%BD%D1%8B%D1%85_%D1%87%D0%B8%D1%81%D0%B5%D0%BB_%D0%B8_%D0%B2%D0%B5%D0%BA%D1%82%D0%BE%D1%80%D0%BE%D0%B2&amp;diff=17913</id>
		<title>Участник:Davletshuna Alexandra/Метод Якоби вычисления сингулярных чисел и векторов</title>
		<link rel="alternate" type="text/html" href="https://xn--80aecvaldz.xn--80ahdrnmvk.xn--p1ai/w/ru/index.php?title=%D0%A3%D1%87%D0%B0%D1%81%D1%82%D0%BD%D0%B8%D0%BA:Davletshuna_Alexandra/%D0%9C%D0%B5%D1%82%D0%BE%D0%B4_%D0%AF%D0%BA%D0%BE%D0%B1%D0%B8_%D0%B2%D1%8B%D1%87%D0%B8%D1%81%D0%BB%D0%B5%D0%BD%D0%B8%D1%8F_%D1%81%D0%B8%D0%BD%D0%B3%D1%83%D0%BB%D1%8F%D1%80%D0%BD%D1%8B%D1%85_%D1%87%D0%B8%D1%81%D0%B5%D0%BB_%D0%B8_%D0%B2%D0%B5%D0%BA%D1%82%D0%BE%D1%80%D0%BE%D0%B2&amp;diff=17913"/>
		<updated>2016-11-17T12:44:45Z</updated>

		<summary type="html">&lt;p&gt;Davletshuna Alexandra: /* Масштабируемость алгоритма и его реализации */&lt;/p&gt;
&lt;hr /&gt;
&lt;div&gt;{{algorithm&lt;br /&gt;
| name              = Метод Якоби вычисления сингулярных чисел и векторов&lt;br /&gt;
| serial_complexity = &amp;lt;math&amp;gt;O(n^3)&amp;lt;/math&amp;gt;&lt;br /&gt;
| pf_height         = &amp;lt;math&amp;gt;O(n^2)&amp;lt;/math&amp;gt;&lt;br /&gt;
| pf_width          = &amp;lt;math&amp;gt;O(n)&amp;lt;/math&amp;gt;&lt;br /&gt;
| input_data        = &amp;lt;math&amp;gt;n^2&amp;lt;/math&amp;gt;&lt;br /&gt;
| output_data       = &amp;lt;math&amp;gt;2n^2 + n&amp;lt;/math&amp;gt;&lt;br /&gt;
}}&lt;br /&gt;
&lt;br /&gt;
Авторы статьи: [[Участница:Davletshuna Alexandra|Давлетшина Александра]] (группа 619) пункты 1.1-1.4, 1.6, 2.7; [[Участница:Alek sandra|Зайцева Александра]] (группа 601) пункты 1.5, 1.7-1.10, 2.7.&lt;br /&gt;
&lt;br /&gt;
== Свойства и структура алгоритма ==&lt;br /&gt;
&lt;br /&gt;
=== Общее описание алгоритма ===&lt;br /&gt;
&#039;&#039;&#039;Сингулярным разложением&#039;&#039;&#039; называется разложение прямоугольной вещественной или комплексной матрицы, имеющее широкое применение, в силу своей наглядной геометрической интерпретации, при решении многих прикладных задач. Сингулярное разложение матрицы А позволяет вычислять сингулярные числа данной матрицы, а также, левые и правые сингулярные векторы матрицы А:&lt;br /&gt;
&lt;br /&gt;
•	левые сингулярные векторы матрицы А — это собственные векторы матрицы &amp;lt;math&amp;gt;AA^*&amp;lt;/math&amp;gt;;&lt;br /&gt;
&lt;br /&gt;
•	правые сингулярные векторы матрицы A — это собственные векторы матрицы &amp;lt;math&amp;gt;A^*A&amp;lt;/math&amp;gt;.&lt;br /&gt;
&lt;br /&gt;
Геометрическая интерпретация сингулярного разложения заключается в следующем факте из геометрии: &#039;&#039;Образом любого линейного преобразования, заданного с помощью матрицы &amp;lt;math&amp;gt;m&amp;lt;/math&amp;gt;x&amp;lt;math&amp;gt;n&amp;lt;/math&amp;gt;, примененного к единичной сфере является гиперэллипсоид&#039;&#039;.&lt;br /&gt;
&lt;br /&gt;
Из многочисленных разложений матриц, наиболее удобным является сингулярное разложение матрицы в виде: &amp;lt;math&amp;gt;A=U\Sigma V^*&amp;lt;/math&amp;gt;, где &amp;lt;math&amp;gt;U, V&amp;lt;/math&amp;gt; – унитарные матрицы, а &amp;lt;math&amp;gt;\Sigma&amp;lt;/math&amp;gt; – диагональная матрица с вещественными положительными числами на диагонали &amp;lt;ref&amp;gt;http://algorithms.parallel.ru/&amp;lt;/ref&amp;gt;.&lt;br /&gt;
&lt;br /&gt;
Диагональные элементы матрицы &amp;lt;math&amp;gt;\Sigma&amp;lt;/math&amp;gt; называются сингулярными числами матрицы &amp;lt;math&amp;gt;A&amp;lt;/math&amp;gt;, а столбцы матриц &amp;lt;math&amp;gt;U,V&amp;lt;/math&amp;gt; левыми и правыми сингулярными векторами соответственно.&lt;br /&gt;
&lt;br /&gt;
Алгоритм Якоби сингулярного разложения матрицы был предложен одним из первых в 1846 году. Он приводит прямоугольную матрицу к диагональной матрице с помощью последовательности элементарных вращений. Метод может найти все сингулярные значения с очень высокой точностью. Однако его производительность является довольно низкой, в сравнении с конкурирующими методами.&lt;br /&gt;
&lt;br /&gt;
&#039;&#039;Неявный&#039;&#039;&amp;lt;ref&amp;gt;Дж. Деммель «Вычислительная линейная алгебра» (стр. 261-264)&amp;lt;/ref&amp;gt; метод Якоби математически эквивалентен применению метода Якоби вычисления собственных значений к матрице &amp;lt;math&amp;gt;A = G^TG&amp;lt;/math&amp;gt;.&lt;br /&gt;
Это значит, что на каждом шаге вычисляется вращение Якоби &amp;lt;math&amp;gt;J&amp;lt;/math&amp;gt;, с помощью которого матрица &amp;lt;math&amp;gt;G^TG&amp;lt;/math&amp;gt; неявно пересчитывется в &amp;lt;math&amp;gt;J^TG^TGJ&amp;lt;/math&amp;gt;; вращение выбрано так, чтобы пара внедиагональных элементов из &amp;lt;math&amp;gt;G^TG&amp;lt;/math&amp;gt; обратилась в нули в матрице &amp;lt;math&amp;gt;J^TG^TGJ&amp;lt;/math&amp;gt;. При этом ни &amp;lt;math&amp;gt;G^TG&amp;lt;/math&amp;gt;, ни &amp;lt;math&amp;gt;J^TG^TGJ&amp;lt;/math&amp;gt; не вычисляются в явном виде; вместо них вычисляется матрица &amp;lt;math&amp;gt;GJ&amp;lt;/math&amp;gt;. Поэтому алгоритм называется &#039;&#039;методом односторонних вращений&#039;&#039;.&lt;br /&gt;
&lt;br /&gt;
=== Математическое описание алгоритма ===&lt;br /&gt;
Исходные данные: матрица &amp;lt;math&amp;gt;G&amp;lt;/math&amp;gt; (элементы &amp;lt;math&amp;gt;g_{ij}, i, j = 1, \ldots, n&amp;lt;/math&amp;gt;).&lt;br /&gt;
&lt;br /&gt;
Вычисляемые данные: матрица &amp;lt;math&amp;gt;\Sigma = diag(\sigma_{i})&amp;lt;/math&amp;gt;, где &amp;lt;math&amp;gt;\sigma_{i}&amp;lt;/math&amp;gt; - сингулярные числа, &amp;lt;math&amp;gt;U&amp;lt;/math&amp;gt; - матрица левых сингулярных векторов, &amp;lt;math&amp;gt;V&amp;lt;/math&amp;gt; - матрица правых сингулярных векторов.&lt;br /&gt;
&lt;br /&gt;
симметричную матрицу &amp;lt;math&amp;gt;A = (G^TG)&amp;lt;/math&amp;gt; можно привести к диагональному виду:&lt;br /&gt;
&amp;lt;math&amp;gt;RG^TGR^T&amp;lt;/math&amp;gt;, где&lt;br /&gt;
&lt;br /&gt;
&amp;lt;math&amp;gt;&lt;br /&gt;
R(j,k,\theta) = &lt;br /&gt;
\begin{matrix}&lt;br /&gt;
  \\&lt;br /&gt;
  \\&lt;br /&gt;
  \\&lt;br /&gt;
j \\&lt;br /&gt;
  \\&lt;br /&gt;
k \\&lt;br /&gt;
  \\&lt;br /&gt;
  \\&lt;br /&gt;
  \\&lt;br /&gt;
\end{matrix}&lt;br /&gt;
&amp;lt;/math&amp;gt;  &lt;br /&gt;
&amp;lt;math&amp;gt;&lt;br /&gt;
\begin{bmatrix}&lt;br /&gt;
  &amp;amp; 1 &amp;amp;   &amp;amp;        &amp;amp;              &amp;amp;        &amp;amp;               &amp;amp;         &amp;amp;    &amp;amp;   \\&lt;br /&gt;
  &amp;amp;   &amp;amp; 1 &amp;amp;        &amp;amp;              &amp;amp;        &amp;amp;               &amp;amp;         &amp;amp;    &amp;amp;   \\&lt;br /&gt;
  &amp;amp;   &amp;amp;   &amp;amp; \ddots &amp;amp;              &amp;amp;        &amp;amp;               &amp;amp;         &amp;amp;    &amp;amp;   \\&lt;br /&gt;
  &amp;amp;   &amp;amp;   &amp;amp;        &amp;amp; \cos(\theta) &amp;amp;        &amp;amp; -\sin(\theta) &amp;amp;         &amp;amp;    &amp;amp;   \\&lt;br /&gt;
  &amp;amp;   &amp;amp;   &amp;amp;        &amp;amp;              &amp;amp; \ddots &amp;amp;               &amp;amp;         &amp;amp;    &amp;amp;   \\&lt;br /&gt;
  &amp;amp;   &amp;amp;   &amp;amp;        &amp;amp; \sin(\theta) &amp;amp;        &amp;amp; \cos(\theta)  &amp;amp;         &amp;amp;    &amp;amp;   \\&lt;br /&gt;
  &amp;amp;   &amp;amp;   &amp;amp;        &amp;amp;              &amp;amp;        &amp;amp;               &amp;amp; \ddots  &amp;amp;    &amp;amp;   \\&lt;br /&gt;
  &amp;amp;   &amp;amp;   &amp;amp;        &amp;amp;              &amp;amp;        &amp;amp;               &amp;amp;         &amp;amp; 1  &amp;amp;   \\&lt;br /&gt;
  &amp;amp;   &amp;amp;   &amp;amp;        &amp;amp;              &amp;amp;        &amp;amp;               &amp;amp;         &amp;amp;    &amp;amp; 1 \\&lt;br /&gt;
\end{bmatrix}&lt;br /&gt;
&amp;lt;/math&amp;gt;&lt;br /&gt;
&lt;br /&gt;
Обозначим &amp;lt;math&amp;gt;s = \sin \theta&amp;lt;/math&amp;gt; и &amp;lt;math&amp;gt;c = \cos \theta&amp;lt;/math&amp;gt;.&lt;br /&gt;
&lt;br /&gt;
Перемножив матрицы &amp;lt;math&amp;gt;RG^TGR^T&amp;lt;/math&amp;gt;, получим следующие выражения&amp;lt;ref&amp;gt;http://www.astro.tsu.ru/OsChMet/5_2.html&amp;lt;/ref&amp;gt;:&lt;br /&gt;
&lt;br /&gt;
&amp;lt;math&amp;gt;\begin{align}&lt;br /&gt;
 a_{jj}^{(i+1)} &amp;amp;= c^2\, a_{jj}^{(i)}  -  2\, s c \,a_{jk}^{(i)}  +  s^2\, a_{kk}^{(i)} \\&lt;br /&gt;
 a_{kk}^{(i+1)} &amp;amp;= s^2 \,a_{jj}^{(i)}  +  2 s c\, a_{jk}^{(i)}  +  c^2 \, a_{kk}^{(i)} \\&lt;br /&gt;
 a_{jk}^{(i+1)} &amp;amp;= a_{kj}^{(i+1)} = (c^2 - s^2 ) \, a_{jk}^{(i)}  +  s c \, (a_{kk}^{(i)} - a_{jj}^{(i)} ) \\&lt;br /&gt;
 a_{jm}^{(i+1)} &amp;amp;= a_{mj}^{(i+1)} = c \, a_{jm}^{(i)}  -  s \, a_{km}^{(i)} &amp;amp; m \ne j,k \\&lt;br /&gt;
 a_{km}^{(i+1)} &amp;amp;= a_{mk}^{(i+1)} = s \, a_{jm}^{(i)}  + c \, a_{km}^{(i)} &amp;amp; m \ne j,k \\&lt;br /&gt;
 a_{ml}^{(i+1)} &amp;amp;= a_{ml}^{(i)} &amp;amp;m,l \ne j,k&lt;br /&gt;
\end{align}&amp;lt;/math&amp;gt;&lt;br /&gt;
&lt;br /&gt;
Т.к внедиагональные элементы должны быть равны 0, то выбираем &amp;lt;math&amp;gt;\theta&amp;lt;/math&amp;gt; так, чтобы &amp;lt;math&amp;gt;a_{jk}^{(i+1)} = 0&amp;lt;/math&amp;gt; и &amp;lt;math&amp;gt;a_{kj}^{(i+1)} = 0&amp;lt;/math&amp;gt;.&lt;br /&gt;
&lt;br /&gt;
Тогда решая уравнение получаем, что&lt;br /&gt;
&lt;br /&gt;
&amp;lt;math&amp;gt;&lt;br /&gt;
         \begin{align}&lt;br /&gt;
         \tau &amp;amp;= ({a_{jj} - a_{kk}})/{2a_{jk}} \\&lt;br /&gt;
         t &amp;amp;= {sign(\tau)}/(|\tau| + \sqrt{1 + \tau^2}) \\&lt;br /&gt;
         c &amp;amp;= 1/(\sqrt{1 + t^2}) \\&lt;br /&gt;
         s &amp;amp;= ct \\&lt;br /&gt;
         \end{align}&amp;lt;/math&amp;gt;&lt;br /&gt;
&lt;br /&gt;
Остановка вычислений алгоритма наступает, когда внедиагональные элементы становятся меньше некоторого наперед заданного числа &amp;lt;math&amp;gt;\varepsilon&amp;lt;/math&amp;gt;.&lt;br /&gt;
&lt;br /&gt;
=== Вычислительное ядро алгоритма ===&lt;br /&gt;
Вычислительное ядро алгоритма составляет непосредственно вычисление одностороннего вращения Якоби, т.е. вычисление элементов матрицы &amp;lt;math&amp;gt;g_{jm}^{(i+1)} = g_{mj}^{(i+1)}&amp;lt;/math&amp;gt; и &amp;lt;math&amp;gt;g_{km}^{(i+1)} = g_{mk}^{(i+1)}&amp;lt;/math&amp;gt;, &amp;lt;math&amp;gt;m \ne j,k&amp;lt;/math&amp;gt;, а также вычисления элементов &amp;lt;math&amp;gt;g_{jj}^{(i+1)} &amp;lt;/math&amp;gt; и &amp;lt;math&amp;gt;g_{kk}^{(i+1)} &amp;lt;/math&amp;gt;, получившихся после умножения промежуточной матрицы на матрицу вращений Якоби:&lt;br /&gt;
&lt;br /&gt;
&amp;lt;math&amp;gt;\begin{align}&lt;br /&gt;
 g_{jj}^{(i+1)} &amp;amp;= c^2\, g_{jj}^{(i)}  -  2\, s c \,g_{jk}^{(i)}  +  s^2\, g_{kk}^{(i)} \\&lt;br /&gt;
 g_{kk}^{(i+1)} &amp;amp;= s^2 \,g_{jj}^{(i)}  +  2 s c\, g_{jk}^{(i)}  +  c^2 \, g_{kk}^{(i)} \\&lt;br /&gt;
 g_{jk}^{(i+1)} &amp;amp;= g_{kj}^{(i+1)} = (c^2 - s^2 ) \, g_{jk}^{(i)}  +  s c \, (g_{kk}^{(i)} - g_{jj}^{(i)} ) \\&lt;br /&gt;
 g_{jm}^{(i+1)} &amp;amp;= g_{mj}^{(i+1)} = c \, g_{jm}^{(i)}  -  s \, g_{km}^{(i)} &amp;amp; m \ne j,k \\&lt;br /&gt;
 g_{km}^{(i+1)} &amp;amp;= g_{mk}^{(i+1)} = s \, g_{jm}^{(i)}  + c \, g_{km}^{(i)} &amp;amp; m \ne j,k \\&lt;br /&gt;
 g_{ml}^{(i+1)} &amp;amp;= g_{ml}^{(i)} &amp;amp;m,l \ne j,k&lt;br /&gt;
\end{align}&amp;lt;/math&amp;gt;&lt;br /&gt;
&lt;br /&gt;
=== Макроструктура алгоритма ===&lt;br /&gt;
Основную часть метода составляет процедура односторонних вращений матрицы, которая в свою очередь состоит из:&lt;br /&gt;
&lt;br /&gt;
#Вычисление &amp;lt;math&amp;gt;\tau, c, s, t&amp;lt;/math&amp;gt;.&lt;br /&gt;
#Одностороннее вращение матрицы. &lt;br /&gt;
&lt;br /&gt;
Что требует &amp;lt;math&amp;gt;O(n)&amp;lt;/math&amp;gt; операций.&lt;br /&gt;
&lt;br /&gt;
После этого необходимо:&lt;br /&gt;
&lt;br /&gt;
#Вычислить сингулярные числа &amp;lt;math&amp;gt;\sigma_i&amp;lt;/math&amp;gt;.  Что требует &amp;lt;math&amp;gt;O(n)&amp;lt;/math&amp;gt; операций.&lt;br /&gt;
#Вычислить &amp;lt;math&amp;gt;U&amp;lt;/math&amp;gt; и &amp;lt;math&amp;gt;V&amp;lt;/math&amp;gt;. Что требует &amp;lt;math&amp;gt;O(n^2)&amp;lt;/math&amp;gt; операций.&lt;br /&gt;
&lt;br /&gt;
=== Схема реализации последовательного алгоритма ===&lt;br /&gt;
Применение метода Якоби к матрице &amp;lt;math&amp;gt;A = (G^TG)&amp;lt;/math&amp;gt; можно описать следующим образом&amp;lt;ref&amp;gt;Дж. Деммель «Вычислительная линейная алгебра» (стр. 261-263)&amp;lt;/ref&amp;gt;:&lt;br /&gt;
&lt;br /&gt;
Если &amp;lt;math&amp;gt;G = U\Sigma V^T&amp;lt;/math&amp;gt; и &amp;lt;math&amp;gt;\Sigma = diag(\sigma_{i})&amp;lt;/math&amp;gt;, то алгоритм вычисляет сингулярные числа &amp;lt;math&amp;gt;\sigma_{i}&amp;lt;/math&amp;gt;, матрицу &amp;lt;math&amp;gt;U&amp;lt;/math&amp;gt; левых сингулярных векторов и матрицу &amp;lt;math&amp;gt;V&amp;lt;/math&amp;gt; правых сингулярных векторов по следующей схеме:&lt;br /&gt;
&lt;br /&gt;
 repeat&lt;br /&gt;
     for &amp;lt;math&amp;gt;j=1&amp;lt;/math&amp;gt; to &amp;lt;math&amp;gt;n-1&amp;lt;/math&amp;gt;&lt;br /&gt;
         for &amp;lt;math&amp;gt;k=j+1&amp;lt;/math&amp;gt; to &amp;lt;math&amp;gt;n&amp;lt;/math&amp;gt;&lt;br /&gt;
             обратиться к процедуре &#039;&#039;&#039;&#039;&#039;One-Sided-Jacobi-Rotation&amp;lt;math&amp;gt;(G,j,k)&amp;lt;/math&amp;gt;&#039;&#039;&#039;&#039;&#039;&lt;br /&gt;
         end for&lt;br /&gt;
     end for&lt;br /&gt;
 пока &amp;lt;math&amp;gt;G^TG&amp;lt;/math&amp;gt; не станет достаточно близка к диагональной матрице&lt;br /&gt;
 Положить &amp;lt;math&amp;gt;\sigma_{i} = ||G(:,i)||_2 &amp;lt;/math&amp;gt; (норма &amp;lt;math&amp;gt;i&amp;lt;/math&amp;gt;-го столбца в &amp;lt;math&amp;gt;G&amp;lt;/math&amp;gt;)&lt;br /&gt;
 Положить &amp;lt;math&amp;gt;U = [u_{1},\dots, u_{n}]&amp;lt;/math&amp;gt;, где &amp;lt;math&amp;gt;u_{i} = G(:,i)/\sigma_{i}&amp;lt;/math&amp;gt;&lt;br /&gt;
 Положить &amp;lt;math&amp;gt;V = J&amp;lt;/math&amp;gt;, где &amp;lt;math&amp;gt;J&amp;lt;/math&amp;gt; - накопленное произведение вращений Якоби.&lt;br /&gt;
&lt;br /&gt;
Где процедура &#039;&#039;&#039;&#039;&#039;One-Sided-Jacobi-Rotation&#039;&#039;&#039;&#039;&#039; является метод односторонних вращений Якоби:&lt;br /&gt;
&lt;br /&gt;
 proc &#039;&#039;&#039;&#039;&#039;One-Sided-Jacobi-Rotation&amp;lt;math&amp;gt;(G,j,k)&amp;lt;/math&amp;gt;&#039;&#039;&#039;&#039;&#039;&lt;br /&gt;
     вычислить &amp;lt;math&amp;gt;a_{jj} = (G^TG)_{jj}, a_{jk} = (G^TG)_{jk}&amp;lt;/math&amp;gt; и &amp;lt;math&amp;gt;a_{kk} = (G^TG)_{kk}&amp;lt;/math&amp;gt;&lt;br /&gt;
     if &amp;lt;math&amp;gt;|a_{jk}|&amp;lt;/math&amp;gt; не слишком мал&lt;br /&gt;
         &amp;lt;math&amp;gt;&lt;br /&gt;
         \begin{align}&lt;br /&gt;
         \tau &amp;amp;= ({a_{jj} - a_{kk}})/{2a_{jk}} \\&lt;br /&gt;
         t &amp;amp;= {sign(\tau)}/(|\tau| + \sqrt{1 + \tau^2}) \\&lt;br /&gt;
         c &amp;amp;= 1/(\sqrt{1 + t^2}) \\&lt;br /&gt;
         s &amp;amp;= ct \\&lt;br /&gt;
         G &amp;amp;= GR(j,k,\theta) \  \dots c=cos\theta, s=sin\theta \end{align}&amp;lt;/math&amp;gt;&lt;br /&gt;
         if нужны правые сингулярные векторы &lt;br /&gt;
             &amp;lt;math&amp;gt;J = JR(j,k,\theta)&amp;lt;/math&amp;gt;&lt;br /&gt;
         end if&lt;br /&gt;
     end if&lt;br /&gt;
&lt;br /&gt;
=== Последовательная сложность алгоритма ===&lt;br /&gt;
Для одного вращения Якоби необходимо выполнить &amp;lt;math&amp;gt;O(n)&amp;lt;/math&amp;gt; операций умножения и сложения. &lt;br /&gt;
&lt;br /&gt;
Всего вариантов выбора &amp;lt;math&amp;gt;j&amp;lt;/math&amp;gt; и &amp;lt;math&amp;gt;k&amp;lt;/math&amp;gt; существует &amp;lt;math&amp;gt;\frac{n(n-1)}{2}&amp;lt;/math&amp;gt;.&lt;br /&gt;
&lt;br /&gt;
Таким образом последовательный алгоритм Якоби вычисления сингулярных чисел и векторов является алгоритмом с кубической сложностью.&lt;br /&gt;
&lt;br /&gt;
=== Информационный граф ===&lt;br /&gt;
Граф алгоритма состоит из четырех групп вершин&lt;br /&gt;
&lt;br /&gt;
(А)Первая группа вершин расположена в двумерной области, соответствующая ей операция - вычисление элементов &amp;lt;math&amp;gt;a_{jj},a_{jk},a_{kk}&amp;lt;/math&amp;gt; матрицы произведения &amp;lt;math&amp;gt;A = (G^TG)&amp;lt;/math&amp;gt;. Где &amp;lt;math&amp;gt;j&amp;lt;/math&amp;gt; изменяется от &amp;lt;math&amp;gt;1&amp;lt;/math&amp;gt; до &amp;lt;math&amp;gt;n-1&amp;lt;/math&amp;gt;, принимая все целочисленные значения, &amp;lt;math&amp;gt;k&amp;lt;/math&amp;gt;  изменяется от &amp;lt;math&amp;gt;j+1&amp;lt;/math&amp;gt; до &amp;lt;math&amp;gt;n&amp;lt;/math&amp;gt;, принимая все целочисленные значения.&lt;br /&gt;
&lt;br /&gt;
Граф вычисления каждого из элементов приведен на рисунке 1, где значениям &amp;lt;math&amp;gt;g_{ij}&amp;lt;/math&amp;gt; соответствуют обозначения &amp;lt;math&amp;gt;x_{ij}&amp;lt;/math&amp;gt;, а элементам &amp;lt;math&amp;gt;g^T_{ij}&amp;lt;/math&amp;gt; обозначения &amp;lt;math&amp;gt;z_{ij}&amp;lt;/math&amp;gt;. Значение &amp;lt;math&amp;gt;s_{ij}&amp;lt;/math&amp;gt; является значением результирующего элемента.&lt;br /&gt;
&lt;br /&gt;
(Б)Вторая группа вершин расположена в двумерной области, соответствующая ей операция – вычисление &amp;lt;math&amp;gt;c&amp;lt;/math&amp;gt; и &amp;lt;math&amp;gt;s&amp;lt;/math&amp;gt;.&lt;br /&gt;
&lt;br /&gt;
Информационный граф с входными и выходными данными вычисления пункта (Б) представлен на рисунке 2.&lt;br /&gt;
&lt;br /&gt;
(В)Третья группа вершин расположена в двумерной области, соответствующая ей операция вычисление значений элементов &amp;lt;math&amp;gt;g_{jm}^{(i+1)} = g_{mj}^{(i+1)}&amp;lt;/math&amp;gt; и &amp;lt;math&amp;gt;g_{km}^{(i+1)} = g_{mk}^{(i+1)}&amp;lt;/math&amp;gt;, &amp;lt;math&amp;gt;m \ne j,k&amp;lt;/math&amp;gt;.&lt;br /&gt;
&lt;br /&gt;
(Г)Четвертая группа вершин расположена в двумерной области, соответствующая ей операция вычисление значений элементов &amp;lt;math&amp;gt;g_{jj}^{(i+1)} &amp;lt;/math&amp;gt; и &amp;lt;math&amp;gt;g_{kk}^{(i+1)} &amp;lt;/math&amp;gt;.&lt;br /&gt;
&lt;br /&gt;
Элементы групп (В) и (Г) вычисляются аналогично вычислению элементов матрицы произведения, т.к. фактически представляют собой перемножение матриц &amp;lt;math&amp;gt;G&amp;lt;/math&amp;gt; и &amp;lt;math&amp;gt;R&amp;lt;/math&amp;gt;&lt;br /&gt;
&lt;br /&gt;
[[File:Jacobi_2.jpg|none|thumb|1000px|Рисунок 1. Информационный граф с входными и выходными параметрами вычисления каждого элемента матрицы произведения.]]&lt;br /&gt;
&lt;br /&gt;
[[File:Jacobi_1.jpg|none|thumb|1000px|Рисунок 2. Информационный граф с входными и выходными параметрами вычисления значений &amp;lt;math&amp;gt;c&amp;lt;/math&amp;gt; и &amp;lt;math&amp;gt;s&amp;lt;/math&amp;gt;.]]&lt;br /&gt;
&lt;br /&gt;
Обобщенный граф метода Якоби представлен на рисунке 3, где буквами А, Б, В и Г обозначено вычисление групп вершин (А), (Б), (В) и (Г).&lt;br /&gt;
&lt;br /&gt;
[[File:Graf21.png|none|thumb|2000px|Рисунок 3. Обобщенный граф алгоритма вычисления сингулярных чисел и векторов методом Якоби.]]&lt;br /&gt;
&lt;br /&gt;
=== Ресурс параллелизма алгоритма ===&lt;br /&gt;
Для выполнения одной итерации метода Якоби требуется последовательно выполнить несколько ярусов:&lt;br /&gt;
# вычислить &amp;lt;math&amp;gt;\tau&amp;lt;/math&amp;gt; &lt;br /&gt;
# вычислить &amp;lt;math&amp;gt;t&amp;lt;/math&amp;gt; &lt;br /&gt;
# вычислить &amp;lt;math&amp;gt;c&amp;lt;/math&amp;gt; &lt;br /&gt;
# вычислить &amp;lt;math&amp;gt;s&amp;lt;/math&amp;gt;&lt;br /&gt;
# выполнить поворот матрицы &amp;lt;math&amp;gt;G&amp;lt;/math&amp;gt; с параллельным выполнением &amp;lt;math&amp;gt;2(n-2)&amp;lt;/math&amp;gt; операций вычисления элементов матрицы &amp;lt;math&amp;gt;g_{jm}^{(i+1)} = g_{mj}^{(i+1)}&amp;lt;/math&amp;gt; и &amp;lt;math&amp;gt;g_{km}^{(i+1)} = g_{mk}^{(i+1)}&amp;lt;/math&amp;gt;, &amp;lt;math&amp;gt;m \ne j,k&amp;lt;/math&amp;gt;, а также вычисления элементов &amp;lt;math&amp;gt;g_{jj}^{(i+1)} &amp;lt;/math&amp;gt; и &amp;lt;math&amp;gt;g_{kk}^{(i+1)} &amp;lt;/math&amp;gt;. &lt;br /&gt;
&lt;br /&gt;
Суммарное количество итераций равно &amp;lt;math&amp;gt;\frac{n(n-1)}{2}&amp;lt;/math&amp;gt; (Различные варианты выбора &amp;lt;math&amp;gt;j&amp;lt;/math&amp;gt; и &amp;lt;math&amp;gt;k&amp;lt;/math&amp;gt;). &lt;br /&gt;
&lt;br /&gt;
Асимптотически метод сходится квадратично. &lt;br /&gt;
&lt;br /&gt;
Таким образом, при классификации по высоте ЯПФ метод Якоби относится к алгоритмам со сложностью &amp;lt;math&amp;gt;O(n^2)&amp;lt;/math&amp;gt;&amp;amp;nbsp;, а при классификации по ширине ЯПФ — к алгоритмам со сложностью &amp;lt;math&amp;gt;O(n)&amp;lt;/math&amp;gt;.&lt;br /&gt;
&lt;br /&gt;
=== Входные и выходные данные алгоритма ===&lt;br /&gt;
&#039;&#039;&#039;Входные данные&#039;&#039;&#039;: плотная матрица &amp;lt;math&amp;gt;G&amp;lt;/math&amp;gt; размера &amp;lt;math&amp;gt;n&amp;lt;/math&amp;gt;х&amp;lt;math&amp;gt;n&amp;lt;/math&amp;gt;, где &amp;lt;math&amp;gt;A= G^TG&amp;lt;/math&amp;gt; – симметрическая матрица.&lt;br /&gt;
&lt;br /&gt;
&#039;&#039;&#039;Объём входных данных&#039;&#039;&#039;: &amp;lt;math&amp;gt;n^2&amp;lt;/math&amp;gt; (т.к. для хранения матрицы &amp;lt;math&amp;gt;G&amp;lt;/math&amp;gt; используем двумерный массив размера &amp;lt;math&amp;gt;n&amp;lt;/math&amp;gt;х&amp;lt;math&amp;gt;n&amp;lt;/math&amp;gt;)&lt;br /&gt;
&lt;br /&gt;
&#039;&#039;&#039;Выходные данные&#039;&#039;&#039;: &amp;lt;math&amp;gt;\sigma_{i}&amp;lt;/math&amp;gt;  - сингулярные числа, матрица &amp;lt;math&amp;gt;U&amp;lt;/math&amp;gt; левых сингулярных векторов и матрица &amp;lt;math&amp;gt;V&amp;lt;/math&amp;gt; правых сингулярных векторов.&lt;br /&gt;
&lt;br /&gt;
&#039;&#039;&#039;Объём выходных данных&#039;&#039;&#039;: &amp;lt;math&amp;gt;2n^2 + n&amp;lt;/math&amp;gt; (т.к. необходимо хранить вектор сингулярных чисел длины &amp;lt;math&amp;gt;n&amp;lt;/math&amp;gt;, а также две матрицы &amp;lt;math&amp;gt;U, V&amp;lt;/math&amp;gt; левых и правых сингулярных векторов размера &amp;lt;math&amp;gt;n&amp;lt;/math&amp;gt;х&amp;lt;math&amp;gt;n&amp;lt;/math&amp;gt;).&lt;br /&gt;
&lt;br /&gt;
=== Свойства алгоритма ===&lt;br /&gt;
Метод Якоби является самым медленным из имеющихся алгоритмов вычисления сингулярных чисел и сингулярных векторов матрицы. Тем не менее, для  матриц &amp;lt;math&amp;gt;G&amp;lt;/math&amp;gt;, которые могут быть представлены в виде &amp;lt;math&amp;gt;G=DX&amp;lt;/math&amp;gt;, где &amp;lt;math&amp;gt;D&amp;lt;/math&amp;gt; - диагональная, а &amp;lt;math&amp;gt;X&amp;lt;/math&amp;gt; - хорошо обусловлена, он способен вычислять сингулярные числа и вектора намного точнее, чем другие методы&amp;lt;ref&amp;gt;Дж. Деммель «Вычислительная линейная алгебра» (стр. 261-264)&amp;lt;/ref&amp;gt;. &lt;br /&gt;
&lt;br /&gt;
Вычислительная мощность алгоритма, как отношение числа операций к суммарному объему входных и выходных данных является линейной.&lt;br /&gt;
&lt;br /&gt;
Метод Якоби не детерминирован, так как является итерационным алгоритмом с выходом по точности (число итераций зависит от входных данных и порогового значения).&lt;br /&gt;
&lt;br /&gt;
== Программная реализация алгоритма ==&lt;br /&gt;
&lt;br /&gt;
=== Особенности реализации последовательного алгоритма ===&lt;br /&gt;
&lt;br /&gt;
=== Локальность данных и вычислений ===&lt;br /&gt;
&lt;br /&gt;
=== Возможные способы и особенности параллельной реализации алгоритма ===&lt;br /&gt;
&lt;br /&gt;
=== Масштабируемость алгоритма и его реализации ===&lt;br /&gt;
Исследование масштабируемости параллельной реализации метода Якоби вычисления сингулярных чисел и векторов проводилось на суперкомпьютере &amp;quot;Ломоносов&amp;quot;. Алгоритм реализован на языке программирования C с использованием механизмов MPI.&lt;br /&gt;
&lt;br /&gt;
Алгоритм работает по следующей схеме:&lt;br /&gt;
#На вход всем процессорам подается матрица &amp;lt;math&amp;gt; G &amp;lt;/math&amp;gt;.&lt;br /&gt;
#Для всех &amp;lt;math&amp;gt; j &amp;lt;/math&amp;gt; и &amp;lt;math&amp;gt; k &amp;lt;/math&amp;gt; таких, что &amp;lt;math&amp;gt; j \in [1,n-1] &amp;lt;/math&amp;gt;, &amp;lt;math&amp;gt; k \in [j+1,n] &amp;lt;/math&amp;gt;&lt;br /&gt;
##Вычисляется элемент &amp;lt;math&amp;gt; a_{jk} &amp;lt;/math&amp;gt; путем перемножения матриц &amp;lt;math&amp;gt; G^TG &amp;lt;/math&amp;gt;, где на каждом процессоре вычисляется своя часть матрицы. После чего результат отправляется на все процессоры.&lt;br /&gt;
##Если полученный элемент оказывается больше некоторого значения, то начинается последовательная часть программы: Вычисление элементов &amp;lt;math&amp;gt; \tau, t, c, s &amp;lt;/math&amp;gt;.&lt;br /&gt;
##Затем, выполняется операция поворота, путем перемножения матриц &amp;lt;math&amp;gt; G &amp;lt;/math&amp;gt; и &amp;lt;math&amp;gt; R &amp;lt;/math&amp;gt;. Данная операция выполняется параллельно на нескольких процессорах, где каждый процессор вычисляет свою часть матрицы. После чего результат пересылается всем процессорам.&lt;br /&gt;
&lt;br /&gt;
Данная схема повторяется до тех пор, пока матрица &amp;lt;math&amp;gt; A = G^TG &amp;lt;/math&amp;gt; не станет достаточно близкой к диагональной.&lt;br /&gt;
&lt;br /&gt;
Для проверки этого факта, в конце каждой итерации цикла вычисляется матрица &amp;lt;math&amp;gt; A &amp;lt;/math&amp;gt;. Данная операция выполняется параллельно на нескольких процессорах, где каждый процессор вычисляет свою часть матрицы, после чего результат пересылается всем процессорам.&lt;br /&gt;
&lt;br /&gt;
&lt;br /&gt;
Набор и границы значений изменяемых параметров запуска реализации алгоритма: &lt;br /&gt;
&lt;br /&gt;
*	число процессоров [1 : 128] с шагом равным степени двойки;&lt;br /&gt;
*	размер матрицы [256 : 1792] с шагом 256.&lt;br /&gt;
&lt;br /&gt;
В результате проведённых экспериментов был получен следующий диапазон эффективности реализации алгоритма:&lt;br /&gt;
&lt;br /&gt;
*	минимальная эффективность реализации ;&lt;br /&gt;
*	максимальная эффективность реализации .&lt;br /&gt;
&lt;br /&gt;
На следующих рисунках приведены графики производительности и эффективности выбранной реализации метода Якоби в зависимости от изменяемых параметров запуска.&lt;br /&gt;
&lt;br /&gt;
[[File:Performance.jpg|none|thumb|1000px|Рисунок 1. Параллельная реализация метода Якоби. Изменение производительности в зависимости от числа процессоров и размера матрицы.]]&lt;br /&gt;
&lt;br /&gt;
=== Динамические характеристики и эффективность реализации алгоритма ===&lt;br /&gt;
&lt;br /&gt;
=== Выводы для классов архитектур ===&lt;br /&gt;
&lt;br /&gt;
=== Существующие реализации алгоритма ===&lt;br /&gt;
Метод Якоби нахождения сингулярных значений и векторов реализован в таких пакетах, как LAPACK &amp;lt;ref&amp;gt;http://www.netlib.org/scalapack/slug/&amp;lt;/ref&amp;gt;, LINPACK/EISPACK &amp;lt;ref&amp;gt; http://www.netlib.org/linpack/ &amp;lt;/ref&amp;gt;, Intel MKL &amp;lt;ref&amp;gt;https://software.intel.com/ru-ru/node/521153#CAF8CA08-1C69-48F8-B0C3-B2B27AFA92FA&amp;lt;/ref&amp;gt;.&lt;br /&gt;
&lt;br /&gt;
Так же функция Якоби реализована в пакете Matlab.&lt;br /&gt;
&lt;br /&gt;
Т. к. алгоритм считается медленным, он не включен во многие известные пакеты.&lt;br /&gt;
&lt;br /&gt;
== Литература ==&lt;br /&gt;
1. Дж. Деммель Вычислительная линейная алгебра. Изд. Мир, 2001.&lt;/div&gt;</summary>
		<author><name>Davletshuna Alexandra</name></author>
	</entry>
	<entry>
		<id>https://xn--80aecvaldz.xn--80ahdrnmvk.xn--p1ai/w/ru/index.php?title=%D0%A3%D1%87%D0%B0%D1%81%D1%82%D0%BD%D0%B8%D0%BA:Davletshuna_Alexandra/%D0%9C%D0%B5%D1%82%D0%BE%D0%B4_%D0%AF%D0%BA%D0%BE%D0%B1%D0%B8_%D0%B2%D1%8B%D1%87%D0%B8%D1%81%D0%BB%D0%B5%D0%BD%D0%B8%D1%8F_%D1%81%D0%B8%D0%BD%D0%B3%D1%83%D0%BB%D1%8F%D1%80%D0%BD%D1%8B%D1%85_%D1%87%D0%B8%D1%81%D0%B5%D0%BB_%D0%B8_%D0%B2%D0%B5%D0%BA%D1%82%D0%BE%D1%80%D0%BE%D0%B2&amp;diff=17912</id>
		<title>Участник:Davletshuna Alexandra/Метод Якоби вычисления сингулярных чисел и векторов</title>
		<link rel="alternate" type="text/html" href="https://xn--80aecvaldz.xn--80ahdrnmvk.xn--p1ai/w/ru/index.php?title=%D0%A3%D1%87%D0%B0%D1%81%D1%82%D0%BD%D0%B8%D0%BA:Davletshuna_Alexandra/%D0%9C%D0%B5%D1%82%D0%BE%D0%B4_%D0%AF%D0%BA%D0%BE%D0%B1%D0%B8_%D0%B2%D1%8B%D1%87%D0%B8%D1%81%D0%BB%D0%B5%D0%BD%D0%B8%D1%8F_%D1%81%D0%B8%D0%BD%D0%B3%D1%83%D0%BB%D1%8F%D1%80%D0%BD%D1%8B%D1%85_%D1%87%D0%B8%D1%81%D0%B5%D0%BB_%D0%B8_%D0%B2%D0%B5%D0%BA%D1%82%D0%BE%D1%80%D0%BE%D0%B2&amp;diff=17912"/>
		<updated>2016-11-17T12:43:24Z</updated>

		<summary type="html">&lt;p&gt;Davletshuna Alexandra: /* Масштабируемость алгоритма и его реализации */&lt;/p&gt;
&lt;hr /&gt;
&lt;div&gt;{{algorithm&lt;br /&gt;
| name              = Метод Якоби вычисления сингулярных чисел и векторов&lt;br /&gt;
| serial_complexity = &amp;lt;math&amp;gt;O(n^3)&amp;lt;/math&amp;gt;&lt;br /&gt;
| pf_height         = &amp;lt;math&amp;gt;O(n^2)&amp;lt;/math&amp;gt;&lt;br /&gt;
| pf_width          = &amp;lt;math&amp;gt;O(n)&amp;lt;/math&amp;gt;&lt;br /&gt;
| input_data        = &amp;lt;math&amp;gt;n^2&amp;lt;/math&amp;gt;&lt;br /&gt;
| output_data       = &amp;lt;math&amp;gt;2n^2 + n&amp;lt;/math&amp;gt;&lt;br /&gt;
}}&lt;br /&gt;
&lt;br /&gt;
Авторы статьи: [[Участница:Davletshuna Alexandra|Давлетшина Александра]] (группа 619) пункты 1.1-1.4, 1.6, 2.7; [[Участница:Alek sandra|Зайцева Александра]] (группа 601) пункты 1.5, 1.7-1.10, 2.7.&lt;br /&gt;
&lt;br /&gt;
== Свойства и структура алгоритма ==&lt;br /&gt;
&lt;br /&gt;
=== Общее описание алгоритма ===&lt;br /&gt;
&#039;&#039;&#039;Сингулярным разложением&#039;&#039;&#039; называется разложение прямоугольной вещественной или комплексной матрицы, имеющее широкое применение, в силу своей наглядной геометрической интерпретации, при решении многих прикладных задач. Сингулярное разложение матрицы А позволяет вычислять сингулярные числа данной матрицы, а также, левые и правые сингулярные векторы матрицы А:&lt;br /&gt;
&lt;br /&gt;
•	левые сингулярные векторы матрицы А — это собственные векторы матрицы &amp;lt;math&amp;gt;AA^*&amp;lt;/math&amp;gt;;&lt;br /&gt;
&lt;br /&gt;
•	правые сингулярные векторы матрицы A — это собственные векторы матрицы &amp;lt;math&amp;gt;A^*A&amp;lt;/math&amp;gt;.&lt;br /&gt;
&lt;br /&gt;
Геометрическая интерпретация сингулярного разложения заключается в следующем факте из геометрии: &#039;&#039;Образом любого линейного преобразования, заданного с помощью матрицы &amp;lt;math&amp;gt;m&amp;lt;/math&amp;gt;x&amp;lt;math&amp;gt;n&amp;lt;/math&amp;gt;, примененного к единичной сфере является гиперэллипсоид&#039;&#039;.&lt;br /&gt;
&lt;br /&gt;
Из многочисленных разложений матриц, наиболее удобным является сингулярное разложение матрицы в виде: &amp;lt;math&amp;gt;A=U\Sigma V^*&amp;lt;/math&amp;gt;, где &amp;lt;math&amp;gt;U, V&amp;lt;/math&amp;gt; – унитарные матрицы, а &amp;lt;math&amp;gt;\Sigma&amp;lt;/math&amp;gt; – диагональная матрица с вещественными положительными числами на диагонали &amp;lt;ref&amp;gt;http://algorithms.parallel.ru/&amp;lt;/ref&amp;gt;.&lt;br /&gt;
&lt;br /&gt;
Диагональные элементы матрицы &amp;lt;math&amp;gt;\Sigma&amp;lt;/math&amp;gt; называются сингулярными числами матрицы &amp;lt;math&amp;gt;A&amp;lt;/math&amp;gt;, а столбцы матриц &amp;lt;math&amp;gt;U,V&amp;lt;/math&amp;gt; левыми и правыми сингулярными векторами соответственно.&lt;br /&gt;
&lt;br /&gt;
Алгоритм Якоби сингулярного разложения матрицы был предложен одним из первых в 1846 году. Он приводит прямоугольную матрицу к диагональной матрице с помощью последовательности элементарных вращений. Метод может найти все сингулярные значения с очень высокой точностью. Однако его производительность является довольно низкой, в сравнении с конкурирующими методами.&lt;br /&gt;
&lt;br /&gt;
&#039;&#039;Неявный&#039;&#039;&amp;lt;ref&amp;gt;Дж. Деммель «Вычислительная линейная алгебра» (стр. 261-264)&amp;lt;/ref&amp;gt; метод Якоби математически эквивалентен применению метода Якоби вычисления собственных значений к матрице &amp;lt;math&amp;gt;A = G^TG&amp;lt;/math&amp;gt;.&lt;br /&gt;
Это значит, что на каждом шаге вычисляется вращение Якоби &amp;lt;math&amp;gt;J&amp;lt;/math&amp;gt;, с помощью которого матрица &amp;lt;math&amp;gt;G^TG&amp;lt;/math&amp;gt; неявно пересчитывется в &amp;lt;math&amp;gt;J^TG^TGJ&amp;lt;/math&amp;gt;; вращение выбрано так, чтобы пара внедиагональных элементов из &amp;lt;math&amp;gt;G^TG&amp;lt;/math&amp;gt; обратилась в нули в матрице &amp;lt;math&amp;gt;J^TG^TGJ&amp;lt;/math&amp;gt;. При этом ни &amp;lt;math&amp;gt;G^TG&amp;lt;/math&amp;gt;, ни &amp;lt;math&amp;gt;J^TG^TGJ&amp;lt;/math&amp;gt; не вычисляются в явном виде; вместо них вычисляется матрица &amp;lt;math&amp;gt;GJ&amp;lt;/math&amp;gt;. Поэтому алгоритм называется &#039;&#039;методом односторонних вращений&#039;&#039;.&lt;br /&gt;
&lt;br /&gt;
=== Математическое описание алгоритма ===&lt;br /&gt;
Исходные данные: матрица &amp;lt;math&amp;gt;G&amp;lt;/math&amp;gt; (элементы &amp;lt;math&amp;gt;g_{ij}, i, j = 1, \ldots, n&amp;lt;/math&amp;gt;).&lt;br /&gt;
&lt;br /&gt;
Вычисляемые данные: матрица &amp;lt;math&amp;gt;\Sigma = diag(\sigma_{i})&amp;lt;/math&amp;gt;, где &amp;lt;math&amp;gt;\sigma_{i}&amp;lt;/math&amp;gt; - сингулярные числа, &amp;lt;math&amp;gt;U&amp;lt;/math&amp;gt; - матрица левых сингулярных векторов, &amp;lt;math&amp;gt;V&amp;lt;/math&amp;gt; - матрица правых сингулярных векторов.&lt;br /&gt;
&lt;br /&gt;
симметричную матрицу &amp;lt;math&amp;gt;A = (G^TG)&amp;lt;/math&amp;gt; можно привести к диагональному виду:&lt;br /&gt;
&amp;lt;math&amp;gt;RG^TGR^T&amp;lt;/math&amp;gt;, где&lt;br /&gt;
&lt;br /&gt;
&amp;lt;math&amp;gt;&lt;br /&gt;
R(j,k,\theta) = &lt;br /&gt;
\begin{matrix}&lt;br /&gt;
  \\&lt;br /&gt;
  \\&lt;br /&gt;
  \\&lt;br /&gt;
j \\&lt;br /&gt;
  \\&lt;br /&gt;
k \\&lt;br /&gt;
  \\&lt;br /&gt;
  \\&lt;br /&gt;
  \\&lt;br /&gt;
\end{matrix}&lt;br /&gt;
&amp;lt;/math&amp;gt;  &lt;br /&gt;
&amp;lt;math&amp;gt;&lt;br /&gt;
\begin{bmatrix}&lt;br /&gt;
  &amp;amp; 1 &amp;amp;   &amp;amp;        &amp;amp;              &amp;amp;        &amp;amp;               &amp;amp;         &amp;amp;    &amp;amp;   \\&lt;br /&gt;
  &amp;amp;   &amp;amp; 1 &amp;amp;        &amp;amp;              &amp;amp;        &amp;amp;               &amp;amp;         &amp;amp;    &amp;amp;   \\&lt;br /&gt;
  &amp;amp;   &amp;amp;   &amp;amp; \ddots &amp;amp;              &amp;amp;        &amp;amp;               &amp;amp;         &amp;amp;    &amp;amp;   \\&lt;br /&gt;
  &amp;amp;   &amp;amp;   &amp;amp;        &amp;amp; \cos(\theta) &amp;amp;        &amp;amp; -\sin(\theta) &amp;amp;         &amp;amp;    &amp;amp;   \\&lt;br /&gt;
  &amp;amp;   &amp;amp;   &amp;amp;        &amp;amp;              &amp;amp; \ddots &amp;amp;               &amp;amp;         &amp;amp;    &amp;amp;   \\&lt;br /&gt;
  &amp;amp;   &amp;amp;   &amp;amp;        &amp;amp; \sin(\theta) &amp;amp;        &amp;amp; \cos(\theta)  &amp;amp;         &amp;amp;    &amp;amp;   \\&lt;br /&gt;
  &amp;amp;   &amp;amp;   &amp;amp;        &amp;amp;              &amp;amp;        &amp;amp;               &amp;amp; \ddots  &amp;amp;    &amp;amp;   \\&lt;br /&gt;
  &amp;amp;   &amp;amp;   &amp;amp;        &amp;amp;              &amp;amp;        &amp;amp;               &amp;amp;         &amp;amp; 1  &amp;amp;   \\&lt;br /&gt;
  &amp;amp;   &amp;amp;   &amp;amp;        &amp;amp;              &amp;amp;        &amp;amp;               &amp;amp;         &amp;amp;    &amp;amp; 1 \\&lt;br /&gt;
\end{bmatrix}&lt;br /&gt;
&amp;lt;/math&amp;gt;&lt;br /&gt;
&lt;br /&gt;
Обозначим &amp;lt;math&amp;gt;s = \sin \theta&amp;lt;/math&amp;gt; и &amp;lt;math&amp;gt;c = \cos \theta&amp;lt;/math&amp;gt;.&lt;br /&gt;
&lt;br /&gt;
Перемножив матрицы &amp;lt;math&amp;gt;RG^TGR^T&amp;lt;/math&amp;gt;, получим следующие выражения&amp;lt;ref&amp;gt;http://www.astro.tsu.ru/OsChMet/5_2.html&amp;lt;/ref&amp;gt;:&lt;br /&gt;
&lt;br /&gt;
&amp;lt;math&amp;gt;\begin{align}&lt;br /&gt;
 a_{jj}^{(i+1)} &amp;amp;= c^2\, a_{jj}^{(i)}  -  2\, s c \,a_{jk}^{(i)}  +  s^2\, a_{kk}^{(i)} \\&lt;br /&gt;
 a_{kk}^{(i+1)} &amp;amp;= s^2 \,a_{jj}^{(i)}  +  2 s c\, a_{jk}^{(i)}  +  c^2 \, a_{kk}^{(i)} \\&lt;br /&gt;
 a_{jk}^{(i+1)} &amp;amp;= a_{kj}^{(i+1)} = (c^2 - s^2 ) \, a_{jk}^{(i)}  +  s c \, (a_{kk}^{(i)} - a_{jj}^{(i)} ) \\&lt;br /&gt;
 a_{jm}^{(i+1)} &amp;amp;= a_{mj}^{(i+1)} = c \, a_{jm}^{(i)}  -  s \, a_{km}^{(i)} &amp;amp; m \ne j,k \\&lt;br /&gt;
 a_{km}^{(i+1)} &amp;amp;= a_{mk}^{(i+1)} = s \, a_{jm}^{(i)}  + c \, a_{km}^{(i)} &amp;amp; m \ne j,k \\&lt;br /&gt;
 a_{ml}^{(i+1)} &amp;amp;= a_{ml}^{(i)} &amp;amp;m,l \ne j,k&lt;br /&gt;
\end{align}&amp;lt;/math&amp;gt;&lt;br /&gt;
&lt;br /&gt;
Т.к внедиагональные элементы должны быть равны 0, то выбираем &amp;lt;math&amp;gt;\theta&amp;lt;/math&amp;gt; так, чтобы &amp;lt;math&amp;gt;a_{jk}^{(i+1)} = 0&amp;lt;/math&amp;gt; и &amp;lt;math&amp;gt;a_{kj}^{(i+1)} = 0&amp;lt;/math&amp;gt;.&lt;br /&gt;
&lt;br /&gt;
Тогда решая уравнение получаем, что&lt;br /&gt;
&lt;br /&gt;
&amp;lt;math&amp;gt;&lt;br /&gt;
         \begin{align}&lt;br /&gt;
         \tau &amp;amp;= ({a_{jj} - a_{kk}})/{2a_{jk}} \\&lt;br /&gt;
         t &amp;amp;= {sign(\tau)}/(|\tau| + \sqrt{1 + \tau^2}) \\&lt;br /&gt;
         c &amp;amp;= 1/(\sqrt{1 + t^2}) \\&lt;br /&gt;
         s &amp;amp;= ct \\&lt;br /&gt;
         \end{align}&amp;lt;/math&amp;gt;&lt;br /&gt;
&lt;br /&gt;
Остановка вычислений алгоритма наступает, когда внедиагональные элементы становятся меньше некоторого наперед заданного числа &amp;lt;math&amp;gt;\varepsilon&amp;lt;/math&amp;gt;.&lt;br /&gt;
&lt;br /&gt;
=== Вычислительное ядро алгоритма ===&lt;br /&gt;
Вычислительное ядро алгоритма составляет непосредственно вычисление одностороннего вращения Якоби, т.е. вычисление элементов матрицы &amp;lt;math&amp;gt;g_{jm}^{(i+1)} = g_{mj}^{(i+1)}&amp;lt;/math&amp;gt; и &amp;lt;math&amp;gt;g_{km}^{(i+1)} = g_{mk}^{(i+1)}&amp;lt;/math&amp;gt;, &amp;lt;math&amp;gt;m \ne j,k&amp;lt;/math&amp;gt;, а также вычисления элементов &amp;lt;math&amp;gt;g_{jj}^{(i+1)} &amp;lt;/math&amp;gt; и &amp;lt;math&amp;gt;g_{kk}^{(i+1)} &amp;lt;/math&amp;gt;, получившихся после умножения промежуточной матрицы на матрицу вращений Якоби:&lt;br /&gt;
&lt;br /&gt;
&amp;lt;math&amp;gt;\begin{align}&lt;br /&gt;
 g_{jj}^{(i+1)} &amp;amp;= c^2\, g_{jj}^{(i)}  -  2\, s c \,g_{jk}^{(i)}  +  s^2\, g_{kk}^{(i)} \\&lt;br /&gt;
 g_{kk}^{(i+1)} &amp;amp;= s^2 \,g_{jj}^{(i)}  +  2 s c\, g_{jk}^{(i)}  +  c^2 \, g_{kk}^{(i)} \\&lt;br /&gt;
 g_{jk}^{(i+1)} &amp;amp;= g_{kj}^{(i+1)} = (c^2 - s^2 ) \, g_{jk}^{(i)}  +  s c \, (g_{kk}^{(i)} - g_{jj}^{(i)} ) \\&lt;br /&gt;
 g_{jm}^{(i+1)} &amp;amp;= g_{mj}^{(i+1)} = c \, g_{jm}^{(i)}  -  s \, g_{km}^{(i)} &amp;amp; m \ne j,k \\&lt;br /&gt;
 g_{km}^{(i+1)} &amp;amp;= g_{mk}^{(i+1)} = s \, g_{jm}^{(i)}  + c \, g_{km}^{(i)} &amp;amp; m \ne j,k \\&lt;br /&gt;
 g_{ml}^{(i+1)} &amp;amp;= g_{ml}^{(i)} &amp;amp;m,l \ne j,k&lt;br /&gt;
\end{align}&amp;lt;/math&amp;gt;&lt;br /&gt;
&lt;br /&gt;
=== Макроструктура алгоритма ===&lt;br /&gt;
Основную часть метода составляет процедура односторонних вращений матрицы, которая в свою очередь состоит из:&lt;br /&gt;
&lt;br /&gt;
#Вычисление &amp;lt;math&amp;gt;\tau, c, s, t&amp;lt;/math&amp;gt;.&lt;br /&gt;
#Одностороннее вращение матрицы. &lt;br /&gt;
&lt;br /&gt;
Что требует &amp;lt;math&amp;gt;O(n)&amp;lt;/math&amp;gt; операций.&lt;br /&gt;
&lt;br /&gt;
После этого необходимо:&lt;br /&gt;
&lt;br /&gt;
#Вычислить сингулярные числа &amp;lt;math&amp;gt;\sigma_i&amp;lt;/math&amp;gt;.  Что требует &amp;lt;math&amp;gt;O(n)&amp;lt;/math&amp;gt; операций.&lt;br /&gt;
#Вычислить &amp;lt;math&amp;gt;U&amp;lt;/math&amp;gt; и &amp;lt;math&amp;gt;V&amp;lt;/math&amp;gt;. Что требует &amp;lt;math&amp;gt;O(n^2)&amp;lt;/math&amp;gt; операций.&lt;br /&gt;
&lt;br /&gt;
=== Схема реализации последовательного алгоритма ===&lt;br /&gt;
Применение метода Якоби к матрице &amp;lt;math&amp;gt;A = (G^TG)&amp;lt;/math&amp;gt; можно описать следующим образом&amp;lt;ref&amp;gt;Дж. Деммель «Вычислительная линейная алгебра» (стр. 261-263)&amp;lt;/ref&amp;gt;:&lt;br /&gt;
&lt;br /&gt;
Если &amp;lt;math&amp;gt;G = U\Sigma V^T&amp;lt;/math&amp;gt; и &amp;lt;math&amp;gt;\Sigma = diag(\sigma_{i})&amp;lt;/math&amp;gt;, то алгоритм вычисляет сингулярные числа &amp;lt;math&amp;gt;\sigma_{i}&amp;lt;/math&amp;gt;, матрицу &amp;lt;math&amp;gt;U&amp;lt;/math&amp;gt; левых сингулярных векторов и матрицу &amp;lt;math&amp;gt;V&amp;lt;/math&amp;gt; правых сингулярных векторов по следующей схеме:&lt;br /&gt;
&lt;br /&gt;
 repeat&lt;br /&gt;
     for &amp;lt;math&amp;gt;j=1&amp;lt;/math&amp;gt; to &amp;lt;math&amp;gt;n-1&amp;lt;/math&amp;gt;&lt;br /&gt;
         for &amp;lt;math&amp;gt;k=j+1&amp;lt;/math&amp;gt; to &amp;lt;math&amp;gt;n&amp;lt;/math&amp;gt;&lt;br /&gt;
             обратиться к процедуре &#039;&#039;&#039;&#039;&#039;One-Sided-Jacobi-Rotation&amp;lt;math&amp;gt;(G,j,k)&amp;lt;/math&amp;gt;&#039;&#039;&#039;&#039;&#039;&lt;br /&gt;
         end for&lt;br /&gt;
     end for&lt;br /&gt;
 пока &amp;lt;math&amp;gt;G^TG&amp;lt;/math&amp;gt; не станет достаточно близка к диагональной матрице&lt;br /&gt;
 Положить &amp;lt;math&amp;gt;\sigma_{i} = ||G(:,i)||_2 &amp;lt;/math&amp;gt; (норма &amp;lt;math&amp;gt;i&amp;lt;/math&amp;gt;-го столбца в &amp;lt;math&amp;gt;G&amp;lt;/math&amp;gt;)&lt;br /&gt;
 Положить &amp;lt;math&amp;gt;U = [u_{1},\dots, u_{n}]&amp;lt;/math&amp;gt;, где &amp;lt;math&amp;gt;u_{i} = G(:,i)/\sigma_{i}&amp;lt;/math&amp;gt;&lt;br /&gt;
 Положить &amp;lt;math&amp;gt;V = J&amp;lt;/math&amp;gt;, где &amp;lt;math&amp;gt;J&amp;lt;/math&amp;gt; - накопленное произведение вращений Якоби.&lt;br /&gt;
&lt;br /&gt;
Где процедура &#039;&#039;&#039;&#039;&#039;One-Sided-Jacobi-Rotation&#039;&#039;&#039;&#039;&#039; является метод односторонних вращений Якоби:&lt;br /&gt;
&lt;br /&gt;
 proc &#039;&#039;&#039;&#039;&#039;One-Sided-Jacobi-Rotation&amp;lt;math&amp;gt;(G,j,k)&amp;lt;/math&amp;gt;&#039;&#039;&#039;&#039;&#039;&lt;br /&gt;
     вычислить &amp;lt;math&amp;gt;a_{jj} = (G^TG)_{jj}, a_{jk} = (G^TG)_{jk}&amp;lt;/math&amp;gt; и &amp;lt;math&amp;gt;a_{kk} = (G^TG)_{kk}&amp;lt;/math&amp;gt;&lt;br /&gt;
     if &amp;lt;math&amp;gt;|a_{jk}|&amp;lt;/math&amp;gt; не слишком мал&lt;br /&gt;
         &amp;lt;math&amp;gt;&lt;br /&gt;
         \begin{align}&lt;br /&gt;
         \tau &amp;amp;= ({a_{jj} - a_{kk}})/{2a_{jk}} \\&lt;br /&gt;
         t &amp;amp;= {sign(\tau)}/(|\tau| + \sqrt{1 + \tau^2}) \\&lt;br /&gt;
         c &amp;amp;= 1/(\sqrt{1 + t^2}) \\&lt;br /&gt;
         s &amp;amp;= ct \\&lt;br /&gt;
         G &amp;amp;= GR(j,k,\theta) \  \dots c=cos\theta, s=sin\theta \end{align}&amp;lt;/math&amp;gt;&lt;br /&gt;
         if нужны правые сингулярные векторы &lt;br /&gt;
             &amp;lt;math&amp;gt;J = JR(j,k,\theta)&amp;lt;/math&amp;gt;&lt;br /&gt;
         end if&lt;br /&gt;
     end if&lt;br /&gt;
&lt;br /&gt;
=== Последовательная сложность алгоритма ===&lt;br /&gt;
Для одного вращения Якоби необходимо выполнить &amp;lt;math&amp;gt;O(n)&amp;lt;/math&amp;gt; операций умножения и сложения. &lt;br /&gt;
&lt;br /&gt;
Всего вариантов выбора &amp;lt;math&amp;gt;j&amp;lt;/math&amp;gt; и &amp;lt;math&amp;gt;k&amp;lt;/math&amp;gt; существует &amp;lt;math&amp;gt;\frac{n(n-1)}{2}&amp;lt;/math&amp;gt;.&lt;br /&gt;
&lt;br /&gt;
Таким образом последовательный алгоритм Якоби вычисления сингулярных чисел и векторов является алгоритмом с кубической сложностью.&lt;br /&gt;
&lt;br /&gt;
=== Информационный граф ===&lt;br /&gt;
Граф алгоритма состоит из четырех групп вершин&lt;br /&gt;
&lt;br /&gt;
(А)Первая группа вершин расположена в двумерной области, соответствующая ей операция - вычисление элементов &amp;lt;math&amp;gt;a_{jj},a_{jk},a_{kk}&amp;lt;/math&amp;gt; матрицы произведения &amp;lt;math&amp;gt;A = (G^TG)&amp;lt;/math&amp;gt;. Где &amp;lt;math&amp;gt;j&amp;lt;/math&amp;gt; изменяется от &amp;lt;math&amp;gt;1&amp;lt;/math&amp;gt; до &amp;lt;math&amp;gt;n-1&amp;lt;/math&amp;gt;, принимая все целочисленные значения, &amp;lt;math&amp;gt;k&amp;lt;/math&amp;gt;  изменяется от &amp;lt;math&amp;gt;j+1&amp;lt;/math&amp;gt; до &amp;lt;math&amp;gt;n&amp;lt;/math&amp;gt;, принимая все целочисленные значения.&lt;br /&gt;
&lt;br /&gt;
Граф вычисления каждого из элементов приведен на рисунке 1, где значениям &amp;lt;math&amp;gt;g_{ij}&amp;lt;/math&amp;gt; соответствуют обозначения &amp;lt;math&amp;gt;x_{ij}&amp;lt;/math&amp;gt;, а элементам &amp;lt;math&amp;gt;g^T_{ij}&amp;lt;/math&amp;gt; обозначения &amp;lt;math&amp;gt;z_{ij}&amp;lt;/math&amp;gt;. Значение &amp;lt;math&amp;gt;s_{ij}&amp;lt;/math&amp;gt; является значением результирующего элемента.&lt;br /&gt;
&lt;br /&gt;
(Б)Вторая группа вершин расположена в двумерной области, соответствующая ей операция – вычисление &amp;lt;math&amp;gt;c&amp;lt;/math&amp;gt; и &amp;lt;math&amp;gt;s&amp;lt;/math&amp;gt;.&lt;br /&gt;
&lt;br /&gt;
Информационный граф с входными и выходными данными вычисления пункта (Б) представлен на рисунке 2.&lt;br /&gt;
&lt;br /&gt;
(В)Третья группа вершин расположена в двумерной области, соответствующая ей операция вычисление значений элементов &amp;lt;math&amp;gt;g_{jm}^{(i+1)} = g_{mj}^{(i+1)}&amp;lt;/math&amp;gt; и &amp;lt;math&amp;gt;g_{km}^{(i+1)} = g_{mk}^{(i+1)}&amp;lt;/math&amp;gt;, &amp;lt;math&amp;gt;m \ne j,k&amp;lt;/math&amp;gt;.&lt;br /&gt;
&lt;br /&gt;
(Г)Четвертая группа вершин расположена в двумерной области, соответствующая ей операция вычисление значений элементов &amp;lt;math&amp;gt;g_{jj}^{(i+1)} &amp;lt;/math&amp;gt; и &amp;lt;math&amp;gt;g_{kk}^{(i+1)} &amp;lt;/math&amp;gt;.&lt;br /&gt;
&lt;br /&gt;
Элементы групп (В) и (Г) вычисляются аналогично вычислению элементов матрицы произведения, т.к. фактически представляют собой перемножение матриц &amp;lt;math&amp;gt;G&amp;lt;/math&amp;gt; и &amp;lt;math&amp;gt;R&amp;lt;/math&amp;gt;&lt;br /&gt;
&lt;br /&gt;
[[File:Jacobi_2.jpg|none|thumb|1000px|Рисунок 1. Информационный граф с входными и выходными параметрами вычисления каждого элемента матрицы произведения.]]&lt;br /&gt;
&lt;br /&gt;
[[File:Jacobi_1.jpg|none|thumb|1000px|Рисунок 2. Информационный граф с входными и выходными параметрами вычисления значений &amp;lt;math&amp;gt;c&amp;lt;/math&amp;gt; и &amp;lt;math&amp;gt;s&amp;lt;/math&amp;gt;.]]&lt;br /&gt;
&lt;br /&gt;
Обобщенный граф метода Якоби представлен на рисунке 3, где буквами А, Б, В и Г обозначено вычисление групп вершин (А), (Б), (В) и (Г).&lt;br /&gt;
&lt;br /&gt;
[[File:Graf21.png|none|thumb|2000px|Рисунок 3. Обобщенный граф алгоритма вычисления сингулярных чисел и векторов методом Якоби.]]&lt;br /&gt;
&lt;br /&gt;
=== Ресурс параллелизма алгоритма ===&lt;br /&gt;
Для выполнения одной итерации метода Якоби требуется последовательно выполнить несколько ярусов:&lt;br /&gt;
# вычислить &amp;lt;math&amp;gt;\tau&amp;lt;/math&amp;gt; &lt;br /&gt;
# вычислить &amp;lt;math&amp;gt;t&amp;lt;/math&amp;gt; &lt;br /&gt;
# вычислить &amp;lt;math&amp;gt;c&amp;lt;/math&amp;gt; &lt;br /&gt;
# вычислить &amp;lt;math&amp;gt;s&amp;lt;/math&amp;gt;&lt;br /&gt;
# выполнить поворот матрицы &amp;lt;math&amp;gt;G&amp;lt;/math&amp;gt; с параллельным выполнением &amp;lt;math&amp;gt;2(n-2)&amp;lt;/math&amp;gt; операций вычисления элементов матрицы &amp;lt;math&amp;gt;g_{jm}^{(i+1)} = g_{mj}^{(i+1)}&amp;lt;/math&amp;gt; и &amp;lt;math&amp;gt;g_{km}^{(i+1)} = g_{mk}^{(i+1)}&amp;lt;/math&amp;gt;, &amp;lt;math&amp;gt;m \ne j,k&amp;lt;/math&amp;gt;, а также вычисления элементов &amp;lt;math&amp;gt;g_{jj}^{(i+1)} &amp;lt;/math&amp;gt; и &amp;lt;math&amp;gt;g_{kk}^{(i+1)} &amp;lt;/math&amp;gt;. &lt;br /&gt;
&lt;br /&gt;
Суммарное количество итераций равно &amp;lt;math&amp;gt;\frac{n(n-1)}{2}&amp;lt;/math&amp;gt; (Различные варианты выбора &amp;lt;math&amp;gt;j&amp;lt;/math&amp;gt; и &amp;lt;math&amp;gt;k&amp;lt;/math&amp;gt;). &lt;br /&gt;
&lt;br /&gt;
Асимптотически метод сходится квадратично. &lt;br /&gt;
&lt;br /&gt;
Таким образом, при классификации по высоте ЯПФ метод Якоби относится к алгоритмам со сложностью &amp;lt;math&amp;gt;O(n^2)&amp;lt;/math&amp;gt;&amp;amp;nbsp;, а при классификации по ширине ЯПФ — к алгоритмам со сложностью &amp;lt;math&amp;gt;O(n)&amp;lt;/math&amp;gt;.&lt;br /&gt;
&lt;br /&gt;
=== Входные и выходные данные алгоритма ===&lt;br /&gt;
&#039;&#039;&#039;Входные данные&#039;&#039;&#039;: плотная матрица &amp;lt;math&amp;gt;G&amp;lt;/math&amp;gt; размера &amp;lt;math&amp;gt;n&amp;lt;/math&amp;gt;х&amp;lt;math&amp;gt;n&amp;lt;/math&amp;gt;, где &amp;lt;math&amp;gt;A= G^TG&amp;lt;/math&amp;gt; – симметрическая матрица.&lt;br /&gt;
&lt;br /&gt;
&#039;&#039;&#039;Объём входных данных&#039;&#039;&#039;: &amp;lt;math&amp;gt;n^2&amp;lt;/math&amp;gt; (т.к. для хранения матрицы &amp;lt;math&amp;gt;G&amp;lt;/math&amp;gt; используем двумерный массив размера &amp;lt;math&amp;gt;n&amp;lt;/math&amp;gt;х&amp;lt;math&amp;gt;n&amp;lt;/math&amp;gt;)&lt;br /&gt;
&lt;br /&gt;
&#039;&#039;&#039;Выходные данные&#039;&#039;&#039;: &amp;lt;math&amp;gt;\sigma_{i}&amp;lt;/math&amp;gt;  - сингулярные числа, матрица &amp;lt;math&amp;gt;U&amp;lt;/math&amp;gt; левых сингулярных векторов и матрица &amp;lt;math&amp;gt;V&amp;lt;/math&amp;gt; правых сингулярных векторов.&lt;br /&gt;
&lt;br /&gt;
&#039;&#039;&#039;Объём выходных данных&#039;&#039;&#039;: &amp;lt;math&amp;gt;2n^2 + n&amp;lt;/math&amp;gt; (т.к. необходимо хранить вектор сингулярных чисел длины &amp;lt;math&amp;gt;n&amp;lt;/math&amp;gt;, а также две матрицы &amp;lt;math&amp;gt;U, V&amp;lt;/math&amp;gt; левых и правых сингулярных векторов размера &amp;lt;math&amp;gt;n&amp;lt;/math&amp;gt;х&amp;lt;math&amp;gt;n&amp;lt;/math&amp;gt;).&lt;br /&gt;
&lt;br /&gt;
=== Свойства алгоритма ===&lt;br /&gt;
Метод Якоби является самым медленным из имеющихся алгоритмов вычисления сингулярных чисел и сингулярных векторов матрицы. Тем не менее, для  матриц &amp;lt;math&amp;gt;G&amp;lt;/math&amp;gt;, которые могут быть представлены в виде &amp;lt;math&amp;gt;G=DX&amp;lt;/math&amp;gt;, где &amp;lt;math&amp;gt;D&amp;lt;/math&amp;gt; - диагональная, а &amp;lt;math&amp;gt;X&amp;lt;/math&amp;gt; - хорошо обусловлена, он способен вычислять сингулярные числа и вектора намного точнее, чем другие методы&amp;lt;ref&amp;gt;Дж. Деммель «Вычислительная линейная алгебра» (стр. 261-264)&amp;lt;/ref&amp;gt;. &lt;br /&gt;
&lt;br /&gt;
Вычислительная мощность алгоритма, как отношение числа операций к суммарному объему входных и выходных данных является линейной.&lt;br /&gt;
&lt;br /&gt;
Метод Якоби не детерминирован, так как является итерационным алгоритмом с выходом по точности (число итераций зависит от входных данных и порогового значения).&lt;br /&gt;
&lt;br /&gt;
== Программная реализация алгоритма ==&lt;br /&gt;
&lt;br /&gt;
=== Особенности реализации последовательного алгоритма ===&lt;br /&gt;
&lt;br /&gt;
=== Локальность данных и вычислений ===&lt;br /&gt;
&lt;br /&gt;
=== Возможные способы и особенности параллельной реализации алгоритма ===&lt;br /&gt;
&lt;br /&gt;
=== Масштабируемость алгоритма и его реализации ===&lt;br /&gt;
Исследование масштабируемости параллельной реализации метода Якоби вычисления сингулярных чисел и векторов проводилось на суперкомпьютере &amp;quot;Ломоносов&amp;quot;. Алгоритм реализован на языке программирования C с использованием механизмов MPI.&lt;br /&gt;
&lt;br /&gt;
Алгоритм работает по следующей схеме:&lt;br /&gt;
#На вход всем процессорам подается матрица &amp;lt;math&amp;gt; G &amp;lt;/math&amp;gt;.&lt;br /&gt;
#Для всех &amp;lt;math&amp;gt; j &amp;lt;/math&amp;gt; и &amp;lt;math&amp;gt; k &amp;lt;/math&amp;gt; таких, что &amp;lt;math&amp;gt; j \in [1,n-1 &amp;lt;/math&amp;gt;.&lt;br /&gt;
##Вычисляется элемент &amp;lt;math&amp;gt; a_{jk} &amp;lt;/math&amp;gt; путем перемножения матриц &amp;lt;math&amp;gt; G^TG &amp;lt;/math&amp;gt;, где на каждом процессоре вычисляется своя часть матрицы. После чего результат отправляется на все процессоры.&lt;br /&gt;
##Если полученный элемент оказывается больше некоторого значения, то начинается последовательная часть программы: Вычисление элементов &amp;lt;math&amp;gt; \tau, t, c, s &amp;lt;/math&amp;gt;.&lt;br /&gt;
##Затем, выполняется операция поворота, путем перемножения матриц &amp;lt;math&amp;gt; G &amp;lt;/math&amp;gt; и &amp;lt;math&amp;gt; R &amp;lt;/math&amp;gt;. Данная операция выполняется параллельно на нескольких процессорах, где каждый процессор вычисляет свою часть матрицы. После чего результат пересылается всем процессорам.&lt;br /&gt;
&lt;br /&gt;
Данная схема повторяется до тех пор, пока матрица &amp;lt;math&amp;gt; A = G^TG &amp;lt;/math&amp;gt; не станет достаточно близкой к диагональной.&lt;br /&gt;
&lt;br /&gt;
Для проверки этого факта, в конце каждой итерации цикла вычисляется матрица &amp;lt;math&amp;gt; A &amp;lt;/math&amp;gt;. Данная операция выполняется параллельно на нескольких процессорах, где каждый процессор вычисляет свою часть матрицы, после чего результат пересылается всем процессорам.&lt;br /&gt;
&lt;br /&gt;
&lt;br /&gt;
Набор и границы значений изменяемых параметров запуска реализации алгоритма: &lt;br /&gt;
&lt;br /&gt;
*	число процессоров [1 : 128] с шагом равным степени двойки;&lt;br /&gt;
*	размер матрицы [256 : 1792] с шагом 256.&lt;br /&gt;
&lt;br /&gt;
В результате проведённых экспериментов был получен следующий диапазон эффективности реализации алгоритма:&lt;br /&gt;
&lt;br /&gt;
*	минимальная эффективность реализации ;&lt;br /&gt;
*	максимальная эффективность реализации .&lt;br /&gt;
&lt;br /&gt;
На следующих рисунках приведены графики производительности и эффективности выбранной реализации метода Якоби в зависимости от изменяемых параметров запуска.&lt;br /&gt;
&lt;br /&gt;
[[File:Performance.jpg|none|thumb|1000px|Рисунок 1. Параллельная реализация метода Якоби. Изменение производительности в зависимости от числа процессоров и размера матрицы.]]&lt;br /&gt;
&lt;br /&gt;
=== Динамические характеристики и эффективность реализации алгоритма ===&lt;br /&gt;
&lt;br /&gt;
=== Выводы для классов архитектур ===&lt;br /&gt;
&lt;br /&gt;
=== Существующие реализации алгоритма ===&lt;br /&gt;
Метод Якоби нахождения сингулярных значений и векторов реализован в таких пакетах, как LAPACK &amp;lt;ref&amp;gt;http://www.netlib.org/scalapack/slug/&amp;lt;/ref&amp;gt;, LINPACK/EISPACK &amp;lt;ref&amp;gt; http://www.netlib.org/linpack/ &amp;lt;/ref&amp;gt;, Intel MKL &amp;lt;ref&amp;gt;https://software.intel.com/ru-ru/node/521153#CAF8CA08-1C69-48F8-B0C3-B2B27AFA92FA&amp;lt;/ref&amp;gt;.&lt;br /&gt;
&lt;br /&gt;
Так же функция Якоби реализована в пакете Matlab.&lt;br /&gt;
&lt;br /&gt;
Т. к. алгоритм считается медленным, он не включен во многие известные пакеты.&lt;br /&gt;
&lt;br /&gt;
== Литература ==&lt;br /&gt;
1. Дж. Деммель Вычислительная линейная алгебра. Изд. Мир, 2001.&lt;/div&gt;</summary>
		<author><name>Davletshuna Alexandra</name></author>
	</entry>
	<entry>
		<id>https://xn--80aecvaldz.xn--80ahdrnmvk.xn--p1ai/w/ru/index.php?title=%D0%A3%D1%87%D0%B0%D1%81%D1%82%D0%BD%D0%B8%D0%BA:Davletshuna_Alexandra/%D0%9C%D0%B5%D1%82%D0%BE%D0%B4_%D0%AF%D0%BA%D0%BE%D0%B1%D0%B8_%D0%B2%D1%8B%D1%87%D0%B8%D1%81%D0%BB%D0%B5%D0%BD%D0%B8%D1%8F_%D1%81%D0%B8%D0%BD%D0%B3%D1%83%D0%BB%D1%8F%D1%80%D0%BD%D1%8B%D1%85_%D1%87%D0%B8%D1%81%D0%B5%D0%BB_%D0%B8_%D0%B2%D0%B5%D0%BA%D1%82%D0%BE%D1%80%D0%BE%D0%B2&amp;diff=17908</id>
		<title>Участник:Davletshuna Alexandra/Метод Якоби вычисления сингулярных чисел и векторов</title>
		<link rel="alternate" type="text/html" href="https://xn--80aecvaldz.xn--80ahdrnmvk.xn--p1ai/w/ru/index.php?title=%D0%A3%D1%87%D0%B0%D1%81%D1%82%D0%BD%D0%B8%D0%BA:Davletshuna_Alexandra/%D0%9C%D0%B5%D1%82%D0%BE%D0%B4_%D0%AF%D0%BA%D0%BE%D0%B1%D0%B8_%D0%B2%D1%8B%D1%87%D0%B8%D1%81%D0%BB%D0%B5%D0%BD%D0%B8%D1%8F_%D1%81%D0%B8%D0%BD%D0%B3%D1%83%D0%BB%D1%8F%D1%80%D0%BD%D1%8B%D1%85_%D1%87%D0%B8%D1%81%D0%B5%D0%BB_%D0%B8_%D0%B2%D0%B5%D0%BA%D1%82%D0%BE%D1%80%D0%BE%D0%B2&amp;diff=17908"/>
		<updated>2016-11-17T12:40:38Z</updated>

		<summary type="html">&lt;p&gt;Davletshuna Alexandra: /* Масштабируемость алгоритма и его реализации */&lt;/p&gt;
&lt;hr /&gt;
&lt;div&gt;{{algorithm&lt;br /&gt;
| name              = Метод Якоби вычисления сингулярных чисел и векторов&lt;br /&gt;
| serial_complexity = &amp;lt;math&amp;gt;O(n^3)&amp;lt;/math&amp;gt;&lt;br /&gt;
| pf_height         = &amp;lt;math&amp;gt;O(n^2)&amp;lt;/math&amp;gt;&lt;br /&gt;
| pf_width          = &amp;lt;math&amp;gt;O(n)&amp;lt;/math&amp;gt;&lt;br /&gt;
| input_data        = &amp;lt;math&amp;gt;n^2&amp;lt;/math&amp;gt;&lt;br /&gt;
| output_data       = &amp;lt;math&amp;gt;2n^2 + n&amp;lt;/math&amp;gt;&lt;br /&gt;
}}&lt;br /&gt;
&lt;br /&gt;
Авторы статьи: [[Участница:Davletshuna Alexandra|Давлетшина Александра]] (группа 619) пункты 1.1-1.4, 1.6, 2.7; [[Участница:Alek sandra|Зайцева Александра]] (группа 601) пункты 1.5, 1.7-1.10, 2.7.&lt;br /&gt;
&lt;br /&gt;
== Свойства и структура алгоритма ==&lt;br /&gt;
&lt;br /&gt;
=== Общее описание алгоритма ===&lt;br /&gt;
&#039;&#039;&#039;Сингулярным разложением&#039;&#039;&#039; называется разложение прямоугольной вещественной или комплексной матрицы, имеющее широкое применение, в силу своей наглядной геометрической интерпретации, при решении многих прикладных задач. Сингулярное разложение матрицы А позволяет вычислять сингулярные числа данной матрицы, а также, левые и правые сингулярные векторы матрицы А:&lt;br /&gt;
&lt;br /&gt;
•	левые сингулярные векторы матрицы А — это собственные векторы матрицы &amp;lt;math&amp;gt;AA^*&amp;lt;/math&amp;gt;;&lt;br /&gt;
&lt;br /&gt;
•	правые сингулярные векторы матрицы A — это собственные векторы матрицы &amp;lt;math&amp;gt;A^*A&amp;lt;/math&amp;gt;.&lt;br /&gt;
&lt;br /&gt;
Геометрическая интерпретация сингулярного разложения заключается в следующем факте из геометрии: &#039;&#039;Образом любого линейного преобразования, заданного с помощью матрицы &amp;lt;math&amp;gt;m&amp;lt;/math&amp;gt;x&amp;lt;math&amp;gt;n&amp;lt;/math&amp;gt;, примененного к единичной сфере является гиперэллипсоид&#039;&#039;.&lt;br /&gt;
&lt;br /&gt;
Из многочисленных разложений матриц, наиболее удобным является сингулярное разложение матрицы в виде: &amp;lt;math&amp;gt;A=U\Sigma V^*&amp;lt;/math&amp;gt;, где &amp;lt;math&amp;gt;U, V&amp;lt;/math&amp;gt; – унитарные матрицы, а &amp;lt;math&amp;gt;\Sigma&amp;lt;/math&amp;gt; – диагональная матрица с вещественными положительными числами на диагонали &amp;lt;ref&amp;gt;http://algorithms.parallel.ru/&amp;lt;/ref&amp;gt;.&lt;br /&gt;
&lt;br /&gt;
Диагональные элементы матрицы &amp;lt;math&amp;gt;\Sigma&amp;lt;/math&amp;gt; называются сингулярными числами матрицы &amp;lt;math&amp;gt;A&amp;lt;/math&amp;gt;, а столбцы матриц &amp;lt;math&amp;gt;U,V&amp;lt;/math&amp;gt; левыми и правыми сингулярными векторами соответственно.&lt;br /&gt;
&lt;br /&gt;
Алгоритм Якоби сингулярного разложения матрицы был предложен одним из первых в 1846 году. Он приводит прямоугольную матрицу к диагональной матрице с помощью последовательности элементарных вращений. Метод может найти все сингулярные значения с очень высокой точностью. Однако его производительность является довольно низкой, в сравнении с конкурирующими методами.&lt;br /&gt;
&lt;br /&gt;
&#039;&#039;Неявный&#039;&#039;&amp;lt;ref&amp;gt;Дж. Деммель «Вычислительная линейная алгебра» (стр. 261-264)&amp;lt;/ref&amp;gt; метод Якоби математически эквивалентен применению метода Якоби вычисления собственных значений к матрице &amp;lt;math&amp;gt;A = G^TG&amp;lt;/math&amp;gt;.&lt;br /&gt;
Это значит, что на каждом шаге вычисляется вращение Якоби &amp;lt;math&amp;gt;J&amp;lt;/math&amp;gt;, с помощью которого матрица &amp;lt;math&amp;gt;G^TG&amp;lt;/math&amp;gt; неявно пересчитывется в &amp;lt;math&amp;gt;J^TG^TGJ&amp;lt;/math&amp;gt;; вращение выбрано так, чтобы пара внедиагональных элементов из &amp;lt;math&amp;gt;G^TG&amp;lt;/math&amp;gt; обратилась в нули в матрице &amp;lt;math&amp;gt;J^TG^TGJ&amp;lt;/math&amp;gt;. При этом ни &amp;lt;math&amp;gt;G^TG&amp;lt;/math&amp;gt;, ни &amp;lt;math&amp;gt;J^TG^TGJ&amp;lt;/math&amp;gt; не вычисляются в явном виде; вместо них вычисляется матрица &amp;lt;math&amp;gt;GJ&amp;lt;/math&amp;gt;. Поэтому алгоритм называется &#039;&#039;методом односторонних вращений&#039;&#039;.&lt;br /&gt;
&lt;br /&gt;
=== Математическое описание алгоритма ===&lt;br /&gt;
Исходные данные: матрица &amp;lt;math&amp;gt;G&amp;lt;/math&amp;gt; (элементы &amp;lt;math&amp;gt;g_{ij}, i, j = 1, \ldots, n&amp;lt;/math&amp;gt;).&lt;br /&gt;
&lt;br /&gt;
Вычисляемые данные: матрица &amp;lt;math&amp;gt;\Sigma = diag(\sigma_{i})&amp;lt;/math&amp;gt;, где &amp;lt;math&amp;gt;\sigma_{i}&amp;lt;/math&amp;gt; - сингулярные числа, &amp;lt;math&amp;gt;U&amp;lt;/math&amp;gt; - матрица левых сингулярных векторов, &amp;lt;math&amp;gt;V&amp;lt;/math&amp;gt; - матрица правых сингулярных векторов.&lt;br /&gt;
&lt;br /&gt;
симметричную матрицу &amp;lt;math&amp;gt;A = (G^TG)&amp;lt;/math&amp;gt; можно привести к диагональному виду:&lt;br /&gt;
&amp;lt;math&amp;gt;RG^TGR^T&amp;lt;/math&amp;gt;, где&lt;br /&gt;
&lt;br /&gt;
&amp;lt;math&amp;gt;&lt;br /&gt;
R(j,k,\theta) = &lt;br /&gt;
\begin{matrix}&lt;br /&gt;
  \\&lt;br /&gt;
  \\&lt;br /&gt;
  \\&lt;br /&gt;
j \\&lt;br /&gt;
  \\&lt;br /&gt;
k \\&lt;br /&gt;
  \\&lt;br /&gt;
  \\&lt;br /&gt;
  \\&lt;br /&gt;
\end{matrix}&lt;br /&gt;
&amp;lt;/math&amp;gt;  &lt;br /&gt;
&amp;lt;math&amp;gt;&lt;br /&gt;
\begin{bmatrix}&lt;br /&gt;
  &amp;amp; 1 &amp;amp;   &amp;amp;        &amp;amp;              &amp;amp;        &amp;amp;               &amp;amp;         &amp;amp;    &amp;amp;   \\&lt;br /&gt;
  &amp;amp;   &amp;amp; 1 &amp;amp;        &amp;amp;              &amp;amp;        &amp;amp;               &amp;amp;         &amp;amp;    &amp;amp;   \\&lt;br /&gt;
  &amp;amp;   &amp;amp;   &amp;amp; \ddots &amp;amp;              &amp;amp;        &amp;amp;               &amp;amp;         &amp;amp;    &amp;amp;   \\&lt;br /&gt;
  &amp;amp;   &amp;amp;   &amp;amp;        &amp;amp; \cos(\theta) &amp;amp;        &amp;amp; -\sin(\theta) &amp;amp;         &amp;amp;    &amp;amp;   \\&lt;br /&gt;
  &amp;amp;   &amp;amp;   &amp;amp;        &amp;amp;              &amp;amp; \ddots &amp;amp;               &amp;amp;         &amp;amp;    &amp;amp;   \\&lt;br /&gt;
  &amp;amp;   &amp;amp;   &amp;amp;        &amp;amp; \sin(\theta) &amp;amp;        &amp;amp; \cos(\theta)  &amp;amp;         &amp;amp;    &amp;amp;   \\&lt;br /&gt;
  &amp;amp;   &amp;amp;   &amp;amp;        &amp;amp;              &amp;amp;        &amp;amp;               &amp;amp; \ddots  &amp;amp;    &amp;amp;   \\&lt;br /&gt;
  &amp;amp;   &amp;amp;   &amp;amp;        &amp;amp;              &amp;amp;        &amp;amp;               &amp;amp;         &amp;amp; 1  &amp;amp;   \\&lt;br /&gt;
  &amp;amp;   &amp;amp;   &amp;amp;        &amp;amp;              &amp;amp;        &amp;amp;               &amp;amp;         &amp;amp;    &amp;amp; 1 \\&lt;br /&gt;
\end{bmatrix}&lt;br /&gt;
&amp;lt;/math&amp;gt;&lt;br /&gt;
&lt;br /&gt;
Обозначим &amp;lt;math&amp;gt;s = \sin \theta&amp;lt;/math&amp;gt; и &amp;lt;math&amp;gt;c = \cos \theta&amp;lt;/math&amp;gt;.&lt;br /&gt;
&lt;br /&gt;
Перемножив матрицы &amp;lt;math&amp;gt;RG^TGR^T&amp;lt;/math&amp;gt;, получим следующие выражения&amp;lt;ref&amp;gt;http://www.astro.tsu.ru/OsChMet/5_2.html&amp;lt;/ref&amp;gt;:&lt;br /&gt;
&lt;br /&gt;
&amp;lt;math&amp;gt;\begin{align}&lt;br /&gt;
 a_{jj}^{(i+1)} &amp;amp;= c^2\, a_{jj}^{(i)}  -  2\, s c \,a_{jk}^{(i)}  +  s^2\, a_{kk}^{(i)} \\&lt;br /&gt;
 a_{kk}^{(i+1)} &amp;amp;= s^2 \,a_{jj}^{(i)}  +  2 s c\, a_{jk}^{(i)}  +  c^2 \, a_{kk}^{(i)} \\&lt;br /&gt;
 a_{jk}^{(i+1)} &amp;amp;= a_{kj}^{(i+1)} = (c^2 - s^2 ) \, a_{jk}^{(i)}  +  s c \, (a_{kk}^{(i)} - a_{jj}^{(i)} ) \\&lt;br /&gt;
 a_{jm}^{(i+1)} &amp;amp;= a_{mj}^{(i+1)} = c \, a_{jm}^{(i)}  -  s \, a_{km}^{(i)} &amp;amp; m \ne j,k \\&lt;br /&gt;
 a_{km}^{(i+1)} &amp;amp;= a_{mk}^{(i+1)} = s \, a_{jm}^{(i)}  + c \, a_{km}^{(i)} &amp;amp; m \ne j,k \\&lt;br /&gt;
 a_{ml}^{(i+1)} &amp;amp;= a_{ml}^{(i)} &amp;amp;m,l \ne j,k&lt;br /&gt;
\end{align}&amp;lt;/math&amp;gt;&lt;br /&gt;
&lt;br /&gt;
Т.к внедиагональные элементы должны быть равны 0, то выбираем &amp;lt;math&amp;gt;\theta&amp;lt;/math&amp;gt; так, чтобы &amp;lt;math&amp;gt;a_{jk}^{(i+1)} = 0&amp;lt;/math&amp;gt; и &amp;lt;math&amp;gt;a_{kj}^{(i+1)} = 0&amp;lt;/math&amp;gt;.&lt;br /&gt;
&lt;br /&gt;
Тогда решая уравнение получаем, что&lt;br /&gt;
&lt;br /&gt;
&amp;lt;math&amp;gt;&lt;br /&gt;
         \begin{align}&lt;br /&gt;
         \tau &amp;amp;= ({a_{jj} - a_{kk}})/{2a_{jk}} \\&lt;br /&gt;
         t &amp;amp;= {sign(\tau)}/(|\tau| + \sqrt{1 + \tau^2}) \\&lt;br /&gt;
         c &amp;amp;= 1/(\sqrt{1 + t^2}) \\&lt;br /&gt;
         s &amp;amp;= ct \\&lt;br /&gt;
         \end{align}&amp;lt;/math&amp;gt;&lt;br /&gt;
&lt;br /&gt;
Остановка вычислений алгоритма наступает, когда внедиагональные элементы становятся меньше некоторого наперед заданного числа &amp;lt;math&amp;gt;\varepsilon&amp;lt;/math&amp;gt;.&lt;br /&gt;
&lt;br /&gt;
=== Вычислительное ядро алгоритма ===&lt;br /&gt;
Вычислительное ядро алгоритма составляет непосредственно вычисление одностороннего вращения Якоби, т.е. вычисление элементов матрицы &amp;lt;math&amp;gt;g_{jm}^{(i+1)} = g_{mj}^{(i+1)}&amp;lt;/math&amp;gt; и &amp;lt;math&amp;gt;g_{km}^{(i+1)} = g_{mk}^{(i+1)}&amp;lt;/math&amp;gt;, &amp;lt;math&amp;gt;m \ne j,k&amp;lt;/math&amp;gt;, а также вычисления элементов &amp;lt;math&amp;gt;g_{jj}^{(i+1)} &amp;lt;/math&amp;gt; и &amp;lt;math&amp;gt;g_{kk}^{(i+1)} &amp;lt;/math&amp;gt;, получившихся после умножения промежуточной матрицы на матрицу вращений Якоби:&lt;br /&gt;
&lt;br /&gt;
&amp;lt;math&amp;gt;\begin{align}&lt;br /&gt;
 g_{jj}^{(i+1)} &amp;amp;= c^2\, g_{jj}^{(i)}  -  2\, s c \,g_{jk}^{(i)}  +  s^2\, g_{kk}^{(i)} \\&lt;br /&gt;
 g_{kk}^{(i+1)} &amp;amp;= s^2 \,g_{jj}^{(i)}  +  2 s c\, g_{jk}^{(i)}  +  c^2 \, g_{kk}^{(i)} \\&lt;br /&gt;
 g_{jk}^{(i+1)} &amp;amp;= g_{kj}^{(i+1)} = (c^2 - s^2 ) \, g_{jk}^{(i)}  +  s c \, (g_{kk}^{(i)} - g_{jj}^{(i)} ) \\&lt;br /&gt;
 g_{jm}^{(i+1)} &amp;amp;= g_{mj}^{(i+1)} = c \, g_{jm}^{(i)}  -  s \, g_{km}^{(i)} &amp;amp; m \ne j,k \\&lt;br /&gt;
 g_{km}^{(i+1)} &amp;amp;= g_{mk}^{(i+1)} = s \, g_{jm}^{(i)}  + c \, g_{km}^{(i)} &amp;amp; m \ne j,k \\&lt;br /&gt;
 g_{ml}^{(i+1)} &amp;amp;= g_{ml}^{(i)} &amp;amp;m,l \ne j,k&lt;br /&gt;
\end{align}&amp;lt;/math&amp;gt;&lt;br /&gt;
&lt;br /&gt;
=== Макроструктура алгоритма ===&lt;br /&gt;
Основную часть метода составляет процедура односторонних вращений матрицы, которая в свою очередь состоит из:&lt;br /&gt;
&lt;br /&gt;
#Вычисление &amp;lt;math&amp;gt;\tau, c, s, t&amp;lt;/math&amp;gt;.&lt;br /&gt;
#Одностороннее вращение матрицы. &lt;br /&gt;
&lt;br /&gt;
Что требует &amp;lt;math&amp;gt;O(n)&amp;lt;/math&amp;gt; операций.&lt;br /&gt;
&lt;br /&gt;
После этого необходимо:&lt;br /&gt;
&lt;br /&gt;
#Вычислить сингулярные числа &amp;lt;math&amp;gt;\sigma_i&amp;lt;/math&amp;gt;.  Что требует &amp;lt;math&amp;gt;O(n)&amp;lt;/math&amp;gt; операций.&lt;br /&gt;
#Вычислить &amp;lt;math&amp;gt;U&amp;lt;/math&amp;gt; и &amp;lt;math&amp;gt;V&amp;lt;/math&amp;gt;. Что требует &amp;lt;math&amp;gt;O(n^2)&amp;lt;/math&amp;gt; операций.&lt;br /&gt;
&lt;br /&gt;
=== Схема реализации последовательного алгоритма ===&lt;br /&gt;
Применение метода Якоби к матрице &amp;lt;math&amp;gt;A = (G^TG)&amp;lt;/math&amp;gt; можно описать следующим образом&amp;lt;ref&amp;gt;Дж. Деммель «Вычислительная линейная алгебра» (стр. 261-263)&amp;lt;/ref&amp;gt;:&lt;br /&gt;
&lt;br /&gt;
Если &amp;lt;math&amp;gt;G = U\Sigma V^T&amp;lt;/math&amp;gt; и &amp;lt;math&amp;gt;\Sigma = diag(\sigma_{i})&amp;lt;/math&amp;gt;, то алгоритм вычисляет сингулярные числа &amp;lt;math&amp;gt;\sigma_{i}&amp;lt;/math&amp;gt;, матрицу &amp;lt;math&amp;gt;U&amp;lt;/math&amp;gt; левых сингулярных векторов и матрицу &amp;lt;math&amp;gt;V&amp;lt;/math&amp;gt; правых сингулярных векторов по следующей схеме:&lt;br /&gt;
&lt;br /&gt;
 repeat&lt;br /&gt;
     for &amp;lt;math&amp;gt;j=1&amp;lt;/math&amp;gt; to &amp;lt;math&amp;gt;n-1&amp;lt;/math&amp;gt;&lt;br /&gt;
         for &amp;lt;math&amp;gt;k=j+1&amp;lt;/math&amp;gt; to &amp;lt;math&amp;gt;n&amp;lt;/math&amp;gt;&lt;br /&gt;
             обратиться к процедуре &#039;&#039;&#039;&#039;&#039;One-Sided-Jacobi-Rotation&amp;lt;math&amp;gt;(G,j,k)&amp;lt;/math&amp;gt;&#039;&#039;&#039;&#039;&#039;&lt;br /&gt;
         end for&lt;br /&gt;
     end for&lt;br /&gt;
 пока &amp;lt;math&amp;gt;G^TG&amp;lt;/math&amp;gt; не станет достаточно близка к диагональной матрице&lt;br /&gt;
 Положить &amp;lt;math&amp;gt;\sigma_{i} = ||G(:,i)||_2 &amp;lt;/math&amp;gt; (норма &amp;lt;math&amp;gt;i&amp;lt;/math&amp;gt;-го столбца в &amp;lt;math&amp;gt;G&amp;lt;/math&amp;gt;)&lt;br /&gt;
 Положить &amp;lt;math&amp;gt;U = [u_{1},\dots, u_{n}]&amp;lt;/math&amp;gt;, где &amp;lt;math&amp;gt;u_{i} = G(:,i)/\sigma_{i}&amp;lt;/math&amp;gt;&lt;br /&gt;
 Положить &amp;lt;math&amp;gt;V = J&amp;lt;/math&amp;gt;, где &amp;lt;math&amp;gt;J&amp;lt;/math&amp;gt; - накопленное произведение вращений Якоби.&lt;br /&gt;
&lt;br /&gt;
Где процедура &#039;&#039;&#039;&#039;&#039;One-Sided-Jacobi-Rotation&#039;&#039;&#039;&#039;&#039; является метод односторонних вращений Якоби:&lt;br /&gt;
&lt;br /&gt;
 proc &#039;&#039;&#039;&#039;&#039;One-Sided-Jacobi-Rotation&amp;lt;math&amp;gt;(G,j,k)&amp;lt;/math&amp;gt;&#039;&#039;&#039;&#039;&#039;&lt;br /&gt;
     вычислить &amp;lt;math&amp;gt;a_{jj} = (G^TG)_{jj}, a_{jk} = (G^TG)_{jk}&amp;lt;/math&amp;gt; и &amp;lt;math&amp;gt;a_{kk} = (G^TG)_{kk}&amp;lt;/math&amp;gt;&lt;br /&gt;
     if &amp;lt;math&amp;gt;|a_{jk}|&amp;lt;/math&amp;gt; не слишком мал&lt;br /&gt;
         &amp;lt;math&amp;gt;&lt;br /&gt;
         \begin{align}&lt;br /&gt;
         \tau &amp;amp;= ({a_{jj} - a_{kk}})/{2a_{jk}} \\&lt;br /&gt;
         t &amp;amp;= {sign(\tau)}/(|\tau| + \sqrt{1 + \tau^2}) \\&lt;br /&gt;
         c &amp;amp;= 1/(\sqrt{1 + t^2}) \\&lt;br /&gt;
         s &amp;amp;= ct \\&lt;br /&gt;
         G &amp;amp;= GR(j,k,\theta) \  \dots c=cos\theta, s=sin\theta \end{align}&amp;lt;/math&amp;gt;&lt;br /&gt;
         if нужны правые сингулярные векторы &lt;br /&gt;
             &amp;lt;math&amp;gt;J = JR(j,k,\theta)&amp;lt;/math&amp;gt;&lt;br /&gt;
         end if&lt;br /&gt;
     end if&lt;br /&gt;
&lt;br /&gt;
=== Последовательная сложность алгоритма ===&lt;br /&gt;
Для одного вращения Якоби необходимо выполнить &amp;lt;math&amp;gt;O(n)&amp;lt;/math&amp;gt; операций умножения и сложения. &lt;br /&gt;
&lt;br /&gt;
Всего вариантов выбора &amp;lt;math&amp;gt;j&amp;lt;/math&amp;gt; и &amp;lt;math&amp;gt;k&amp;lt;/math&amp;gt; существует &amp;lt;math&amp;gt;\frac{n(n-1)}{2}&amp;lt;/math&amp;gt;.&lt;br /&gt;
&lt;br /&gt;
Таким образом последовательный алгоритм Якоби вычисления сингулярных чисел и векторов является алгоритмом с кубической сложностью.&lt;br /&gt;
&lt;br /&gt;
=== Информационный граф ===&lt;br /&gt;
Граф алгоритма состоит из четырех групп вершин&lt;br /&gt;
&lt;br /&gt;
(А)Первая группа вершин расположена в двумерной области, соответствующая ей операция - вычисление элементов &amp;lt;math&amp;gt;a_{jj},a_{jk},a_{kk}&amp;lt;/math&amp;gt; матрицы произведения &amp;lt;math&amp;gt;A = (G^TG)&amp;lt;/math&amp;gt;. Где &amp;lt;math&amp;gt;j&amp;lt;/math&amp;gt; изменяется от &amp;lt;math&amp;gt;1&amp;lt;/math&amp;gt; до &amp;lt;math&amp;gt;n-1&amp;lt;/math&amp;gt;, принимая все целочисленные значения, &amp;lt;math&amp;gt;k&amp;lt;/math&amp;gt;  изменяется от &amp;lt;math&amp;gt;j+1&amp;lt;/math&amp;gt; до &amp;lt;math&amp;gt;n&amp;lt;/math&amp;gt;, принимая все целочисленные значения.&lt;br /&gt;
&lt;br /&gt;
Граф вычисления каждого из элементов приведен на рисунке 1, где значениям &amp;lt;math&amp;gt;g_{ij}&amp;lt;/math&amp;gt; соответствуют обозначения &amp;lt;math&amp;gt;x_{ij}&amp;lt;/math&amp;gt;, а элементам &amp;lt;math&amp;gt;g^T_{ij}&amp;lt;/math&amp;gt; обозначения &amp;lt;math&amp;gt;z_{ij}&amp;lt;/math&amp;gt;. Значение &amp;lt;math&amp;gt;s_{ij}&amp;lt;/math&amp;gt; является значением результирующего элемента.&lt;br /&gt;
&lt;br /&gt;
(Б)Вторая группа вершин расположена в двумерной области, соответствующая ей операция – вычисление &amp;lt;math&amp;gt;c&amp;lt;/math&amp;gt; и &amp;lt;math&amp;gt;s&amp;lt;/math&amp;gt;.&lt;br /&gt;
&lt;br /&gt;
Информационный граф с входными и выходными данными вычисления пункта (Б) представлен на рисунке 2.&lt;br /&gt;
&lt;br /&gt;
(В)Третья группа вершин расположена в двумерной области, соответствующая ей операция вычисление значений элементов &amp;lt;math&amp;gt;g_{jm}^{(i+1)} = g_{mj}^{(i+1)}&amp;lt;/math&amp;gt; и &amp;lt;math&amp;gt;g_{km}^{(i+1)} = g_{mk}^{(i+1)}&amp;lt;/math&amp;gt;, &amp;lt;math&amp;gt;m \ne j,k&amp;lt;/math&amp;gt;.&lt;br /&gt;
&lt;br /&gt;
(Г)Четвертая группа вершин расположена в двумерной области, соответствующая ей операция вычисление значений элементов &amp;lt;math&amp;gt;g_{jj}^{(i+1)} &amp;lt;/math&amp;gt; и &amp;lt;math&amp;gt;g_{kk}^{(i+1)} &amp;lt;/math&amp;gt;.&lt;br /&gt;
&lt;br /&gt;
Элементы групп (В) и (Г) вычисляются аналогично вычислению элементов матрицы произведения, т.к. фактически представляют собой перемножение матриц &amp;lt;math&amp;gt;G&amp;lt;/math&amp;gt; и &amp;lt;math&amp;gt;R&amp;lt;/math&amp;gt;&lt;br /&gt;
&lt;br /&gt;
[[File:Jacobi_2.jpg|none|thumb|1000px|Рисунок 1. Информационный граф с входными и выходными параметрами вычисления каждого элемента матрицы произведения.]]&lt;br /&gt;
&lt;br /&gt;
[[File:Jacobi_1.jpg|none|thumb|1000px|Рисунок 2. Информационный граф с входными и выходными параметрами вычисления значений &amp;lt;math&amp;gt;c&amp;lt;/math&amp;gt; и &amp;lt;math&amp;gt;s&amp;lt;/math&amp;gt;.]]&lt;br /&gt;
&lt;br /&gt;
Обобщенный граф метода Якоби представлен на рисунке 3, где буквами А, Б, В и Г обозначено вычисление групп вершин (А), (Б), (В) и (Г).&lt;br /&gt;
&lt;br /&gt;
[[File:Graf21.png|none|thumb|2000px|Рисунок 3. Обобщенный граф алгоритма вычисления сингулярных чисел и векторов методом Якоби.]]&lt;br /&gt;
&lt;br /&gt;
=== Ресурс параллелизма алгоритма ===&lt;br /&gt;
Для выполнения одной итерации метода Якоби требуется последовательно выполнить несколько ярусов:&lt;br /&gt;
# вычислить &amp;lt;math&amp;gt;\tau&amp;lt;/math&amp;gt; &lt;br /&gt;
# вычислить &amp;lt;math&amp;gt;t&amp;lt;/math&amp;gt; &lt;br /&gt;
# вычислить &amp;lt;math&amp;gt;c&amp;lt;/math&amp;gt; &lt;br /&gt;
# вычислить &amp;lt;math&amp;gt;s&amp;lt;/math&amp;gt;&lt;br /&gt;
# выполнить поворот матрицы &amp;lt;math&amp;gt;G&amp;lt;/math&amp;gt; с параллельным выполнением &amp;lt;math&amp;gt;2(n-2)&amp;lt;/math&amp;gt; операций вычисления элементов матрицы &amp;lt;math&amp;gt;g_{jm}^{(i+1)} = g_{mj}^{(i+1)}&amp;lt;/math&amp;gt; и &amp;lt;math&amp;gt;g_{km}^{(i+1)} = g_{mk}^{(i+1)}&amp;lt;/math&amp;gt;, &amp;lt;math&amp;gt;m \ne j,k&amp;lt;/math&amp;gt;, а также вычисления элементов &amp;lt;math&amp;gt;g_{jj}^{(i+1)} &amp;lt;/math&amp;gt; и &amp;lt;math&amp;gt;g_{kk}^{(i+1)} &amp;lt;/math&amp;gt;. &lt;br /&gt;
&lt;br /&gt;
Суммарное количество итераций равно &amp;lt;math&amp;gt;\frac{n(n-1)}{2}&amp;lt;/math&amp;gt; (Различные варианты выбора &amp;lt;math&amp;gt;j&amp;lt;/math&amp;gt; и &amp;lt;math&amp;gt;k&amp;lt;/math&amp;gt;). &lt;br /&gt;
&lt;br /&gt;
Асимптотически метод сходится квадратично. &lt;br /&gt;
&lt;br /&gt;
Таким образом, при классификации по высоте ЯПФ метод Якоби относится к алгоритмам со сложностью &amp;lt;math&amp;gt;O(n^2)&amp;lt;/math&amp;gt;&amp;amp;nbsp;, а при классификации по ширине ЯПФ — к алгоритмам со сложностью &amp;lt;math&amp;gt;O(n)&amp;lt;/math&amp;gt;.&lt;br /&gt;
&lt;br /&gt;
=== Входные и выходные данные алгоритма ===&lt;br /&gt;
&#039;&#039;&#039;Входные данные&#039;&#039;&#039;: плотная матрица &amp;lt;math&amp;gt;G&amp;lt;/math&amp;gt; размера &amp;lt;math&amp;gt;n&amp;lt;/math&amp;gt;х&amp;lt;math&amp;gt;n&amp;lt;/math&amp;gt;, где &amp;lt;math&amp;gt;A= G^TG&amp;lt;/math&amp;gt; – симметрическая матрица.&lt;br /&gt;
&lt;br /&gt;
&#039;&#039;&#039;Объём входных данных&#039;&#039;&#039;: &amp;lt;math&amp;gt;n^2&amp;lt;/math&amp;gt; (т.к. для хранения матрицы &amp;lt;math&amp;gt;G&amp;lt;/math&amp;gt; используем двумерный массив размера &amp;lt;math&amp;gt;n&amp;lt;/math&amp;gt;х&amp;lt;math&amp;gt;n&amp;lt;/math&amp;gt;)&lt;br /&gt;
&lt;br /&gt;
&#039;&#039;&#039;Выходные данные&#039;&#039;&#039;: &amp;lt;math&amp;gt;\sigma_{i}&amp;lt;/math&amp;gt;  - сингулярные числа, матрица &amp;lt;math&amp;gt;U&amp;lt;/math&amp;gt; левых сингулярных векторов и матрица &amp;lt;math&amp;gt;V&amp;lt;/math&amp;gt; правых сингулярных векторов.&lt;br /&gt;
&lt;br /&gt;
&#039;&#039;&#039;Объём выходных данных&#039;&#039;&#039;: &amp;lt;math&amp;gt;2n^2 + n&amp;lt;/math&amp;gt; (т.к. необходимо хранить вектор сингулярных чисел длины &amp;lt;math&amp;gt;n&amp;lt;/math&amp;gt;, а также две матрицы &amp;lt;math&amp;gt;U, V&amp;lt;/math&amp;gt; левых и правых сингулярных векторов размера &amp;lt;math&amp;gt;n&amp;lt;/math&amp;gt;х&amp;lt;math&amp;gt;n&amp;lt;/math&amp;gt;).&lt;br /&gt;
&lt;br /&gt;
=== Свойства алгоритма ===&lt;br /&gt;
Метод Якоби является самым медленным из имеющихся алгоритмов вычисления сингулярных чисел и сингулярных векторов матрицы. Тем не менее, для  матриц &amp;lt;math&amp;gt;G&amp;lt;/math&amp;gt;, которые могут быть представлены в виде &amp;lt;math&amp;gt;G=DX&amp;lt;/math&amp;gt;, где &amp;lt;math&amp;gt;D&amp;lt;/math&amp;gt; - диагональная, а &amp;lt;math&amp;gt;X&amp;lt;/math&amp;gt; - хорошо обусловлена, он способен вычислять сингулярные числа и вектора намного точнее, чем другие методы&amp;lt;ref&amp;gt;Дж. Деммель «Вычислительная линейная алгебра» (стр. 261-264)&amp;lt;/ref&amp;gt;. &lt;br /&gt;
&lt;br /&gt;
Вычислительная мощность алгоритма, как отношение числа операций к суммарному объему входных и выходных данных является линейной.&lt;br /&gt;
&lt;br /&gt;
Метод Якоби не детерминирован, так как является итерационным алгоритмом с выходом по точности (число итераций зависит от входных данных и порогового значения).&lt;br /&gt;
&lt;br /&gt;
== Программная реализация алгоритма ==&lt;br /&gt;
&lt;br /&gt;
=== Особенности реализации последовательного алгоритма ===&lt;br /&gt;
&lt;br /&gt;
=== Локальность данных и вычислений ===&lt;br /&gt;
&lt;br /&gt;
=== Возможные способы и особенности параллельной реализации алгоритма ===&lt;br /&gt;
&lt;br /&gt;
=== Масштабируемость алгоритма и его реализации ===&lt;br /&gt;
Исследование масштабируемости параллельной реализации метода Якоби вычисления сингулярных чисел и векторов проводилось на суперкомпьютере &amp;quot;Ломоносов&amp;quot;. Алгоритм реализован на языке программирования C с использованием механизмов MPI.&lt;br /&gt;
&lt;br /&gt;
Алгоритм работает по следующей схеме:&lt;br /&gt;
#На вход всем процессорам подается матрица &amp;lt;math&amp;gt; G &amp;lt;/math&amp;gt;.&lt;br /&gt;
#Вычисляется элемент &amp;lt;math&amp;gt; a_{jk} &amp;lt;/math&amp;gt; путем перемножения матриц &amp;lt;math&amp;gt; G^TG &amp;lt;/math&amp;gt;, где на каждом процессоре вычисляется своя часть матрицы. После чего результат отправляется на все процессоры.&lt;br /&gt;
##Если полученный элемент оказывается больше некоторого значения, то начинается последовательная часть программы: Вычисление элементов &amp;lt;math&amp;gt; \tau, t, c, s &amp;lt;/math&amp;gt;.&lt;br /&gt;
#Затем, выполняется операция поворота, путем перемножения матриц &amp;lt;math&amp;gt; G &amp;lt;/math&amp;gt; и &amp;lt;math&amp;gt; R &amp;lt;/math&amp;gt;. Данная операция выполняется параллельно на нескольких процессорах, где каждый процессор вычисляет свою часть матрицы. После чего результат пересылается всем процессорам.&lt;br /&gt;
&lt;br /&gt;
Данная схема повторяется до тех пор, пока матрица &amp;lt;math&amp;gt; A = G^TG &amp;lt;/math&amp;gt; не станет достаточно близкой к диагональной.&lt;br /&gt;
&lt;br /&gt;
Для проверки этого факта, в конце каждой итерации цикла вычисляется матрица &amp;lt;math&amp;gt; A &amp;lt;/math&amp;gt;. Данная операция выполняется параллельно на нескольких процессорах, где каждый процессор вычисляет свою часть матрицы, после чего результат пересылается всем процессорам.&lt;br /&gt;
&lt;br /&gt;
&lt;br /&gt;
Набор и границы значений изменяемых параметров запуска реализации алгоритма: &lt;br /&gt;
&lt;br /&gt;
*	число процессоров [1 : 128] с шагом равным степени двойки;&lt;br /&gt;
*	размер матрицы [256 : 1792] с шагом 256.&lt;br /&gt;
&lt;br /&gt;
В результате проведённых экспериментов был получен следующий диапазон эффективности реализации алгоритма:&lt;br /&gt;
&lt;br /&gt;
*	минимальная эффективность реализации ;&lt;br /&gt;
*	максимальная эффективность реализации .&lt;br /&gt;
&lt;br /&gt;
На следующих рисунках приведены графики производительности и эффективности выбранной реализации метода Якоби в зависимости от изменяемых параметров запуска.&lt;br /&gt;
&lt;br /&gt;
[[File:Performance.jpg|none|thumb|1000px|Рисунок 1. Параллельная реализация метода Якоби. Изменение производительности в зависимости от числа процессоров и размера матрицы.]]&lt;br /&gt;
&lt;br /&gt;
=== Динамические характеристики и эффективность реализации алгоритма ===&lt;br /&gt;
&lt;br /&gt;
=== Выводы для классов архитектур ===&lt;br /&gt;
&lt;br /&gt;
=== Существующие реализации алгоритма ===&lt;br /&gt;
Метод Якоби нахождения сингулярных значений и векторов реализован в таких пакетах, как LAPACK &amp;lt;ref&amp;gt;http://www.netlib.org/scalapack/slug/&amp;lt;/ref&amp;gt;, LINPACK/EISPACK &amp;lt;ref&amp;gt; http://www.netlib.org/linpack/ &amp;lt;/ref&amp;gt;, Intel MKL &amp;lt;ref&amp;gt;https://software.intel.com/ru-ru/node/521153#CAF8CA08-1C69-48F8-B0C3-B2B27AFA92FA&amp;lt;/ref&amp;gt;.&lt;br /&gt;
&lt;br /&gt;
Так же функция Якоби реализована в пакете Matlab.&lt;br /&gt;
&lt;br /&gt;
Т. к. алгоритм считается медленным, он не включен во многие известные пакеты.&lt;br /&gt;
&lt;br /&gt;
== Литература ==&lt;br /&gt;
1. Дж. Деммель Вычислительная линейная алгебра. Изд. Мир, 2001.&lt;/div&gt;</summary>
		<author><name>Davletshuna Alexandra</name></author>
	</entry>
	<entry>
		<id>https://xn--80aecvaldz.xn--80ahdrnmvk.xn--p1ai/w/ru/index.php?title=%D0%A3%D1%87%D0%B0%D1%81%D1%82%D0%BD%D0%B8%D0%BA:Davletshuna_Alexandra/%D0%9C%D0%B5%D1%82%D0%BE%D0%B4_%D0%AF%D0%BA%D0%BE%D0%B1%D0%B8_%D0%B2%D1%8B%D1%87%D0%B8%D1%81%D0%BB%D0%B5%D0%BD%D0%B8%D1%8F_%D1%81%D0%B8%D0%BD%D0%B3%D1%83%D0%BB%D1%8F%D1%80%D0%BD%D1%8B%D1%85_%D1%87%D0%B8%D1%81%D0%B5%D0%BB_%D0%B8_%D0%B2%D0%B5%D0%BA%D1%82%D0%BE%D1%80%D0%BE%D0%B2&amp;diff=17902</id>
		<title>Участник:Davletshuna Alexandra/Метод Якоби вычисления сингулярных чисел и векторов</title>
		<link rel="alternate" type="text/html" href="https://xn--80aecvaldz.xn--80ahdrnmvk.xn--p1ai/w/ru/index.php?title=%D0%A3%D1%87%D0%B0%D1%81%D1%82%D0%BD%D0%B8%D0%BA:Davletshuna_Alexandra/%D0%9C%D0%B5%D1%82%D0%BE%D0%B4_%D0%AF%D0%BA%D0%BE%D0%B1%D0%B8_%D0%B2%D1%8B%D1%87%D0%B8%D1%81%D0%BB%D0%B5%D0%BD%D0%B8%D1%8F_%D1%81%D0%B8%D0%BD%D0%B3%D1%83%D0%BB%D1%8F%D1%80%D0%BD%D1%8B%D1%85_%D1%87%D0%B8%D1%81%D0%B5%D0%BB_%D0%B8_%D0%B2%D0%B5%D0%BA%D1%82%D0%BE%D1%80%D0%BE%D0%B2&amp;diff=17902"/>
		<updated>2016-11-17T12:33:27Z</updated>

		<summary type="html">&lt;p&gt;Davletshuna Alexandra: /* Масштабируемость алгоритма и его реализации */&lt;/p&gt;
&lt;hr /&gt;
&lt;div&gt;{{algorithm&lt;br /&gt;
| name              = Метод Якоби вычисления сингулярных чисел и векторов&lt;br /&gt;
| serial_complexity = &amp;lt;math&amp;gt;O(n^3)&amp;lt;/math&amp;gt;&lt;br /&gt;
| pf_height         = &amp;lt;math&amp;gt;O(n^2)&amp;lt;/math&amp;gt;&lt;br /&gt;
| pf_width          = &amp;lt;math&amp;gt;O(n)&amp;lt;/math&amp;gt;&lt;br /&gt;
| input_data        = &amp;lt;math&amp;gt;n^2&amp;lt;/math&amp;gt;&lt;br /&gt;
| output_data       = &amp;lt;math&amp;gt;2n^2 + n&amp;lt;/math&amp;gt;&lt;br /&gt;
}}&lt;br /&gt;
&lt;br /&gt;
Авторы статьи: [[Участница:Davletshuna Alexandra|Давлетшина Александра]] (группа 619) пункты 1.1-1.4, 1.6, 2.7; [[Участница:Alek sandra|Зайцева Александра]] (группа 601) пункты 1.5, 1.7-1.10, 2.7.&lt;br /&gt;
&lt;br /&gt;
== Свойства и структура алгоритма ==&lt;br /&gt;
&lt;br /&gt;
=== Общее описание алгоритма ===&lt;br /&gt;
&#039;&#039;&#039;Сингулярным разложением&#039;&#039;&#039; называется разложение прямоугольной вещественной или комплексной матрицы, имеющее широкое применение, в силу своей наглядной геометрической интерпретации, при решении многих прикладных задач. Сингулярное разложение матрицы А позволяет вычислять сингулярные числа данной матрицы, а также, левые и правые сингулярные векторы матрицы А:&lt;br /&gt;
&lt;br /&gt;
•	левые сингулярные векторы матрицы А — это собственные векторы матрицы &amp;lt;math&amp;gt;AA^*&amp;lt;/math&amp;gt;;&lt;br /&gt;
&lt;br /&gt;
•	правые сингулярные векторы матрицы A — это собственные векторы матрицы &amp;lt;math&amp;gt;A^*A&amp;lt;/math&amp;gt;.&lt;br /&gt;
&lt;br /&gt;
Геометрическая интерпретация сингулярного разложения заключается в следующем факте из геометрии: &#039;&#039;Образом любого линейного преобразования, заданного с помощью матрицы &amp;lt;math&amp;gt;m&amp;lt;/math&amp;gt;x&amp;lt;math&amp;gt;n&amp;lt;/math&amp;gt;, примененного к единичной сфере является гиперэллипсоид&#039;&#039;.&lt;br /&gt;
&lt;br /&gt;
Из многочисленных разложений матриц, наиболее удобным является сингулярное разложение матрицы в виде: &amp;lt;math&amp;gt;A=U\Sigma V^*&amp;lt;/math&amp;gt;, где &amp;lt;math&amp;gt;U, V&amp;lt;/math&amp;gt; – унитарные матрицы, а &amp;lt;math&amp;gt;\Sigma&amp;lt;/math&amp;gt; – диагональная матрица с вещественными положительными числами на диагонали &amp;lt;ref&amp;gt;http://algorithms.parallel.ru/&amp;lt;/ref&amp;gt;.&lt;br /&gt;
&lt;br /&gt;
Диагональные элементы матрицы &amp;lt;math&amp;gt;\Sigma&amp;lt;/math&amp;gt; называются сингулярными числами матрицы &amp;lt;math&amp;gt;A&amp;lt;/math&amp;gt;, а столбцы матриц &amp;lt;math&amp;gt;U,V&amp;lt;/math&amp;gt; левыми и правыми сингулярными векторами соответственно.&lt;br /&gt;
&lt;br /&gt;
Алгоритм Якоби сингулярного разложения матрицы был предложен одним из первых в 1846 году. Он приводит прямоугольную матрицу к диагональной матрице с помощью последовательности элементарных вращений. Метод может найти все сингулярные значения с очень высокой точностью. Однако его производительность является довольно низкой, в сравнении с конкурирующими методами.&lt;br /&gt;
&lt;br /&gt;
&#039;&#039;Неявный&#039;&#039;&amp;lt;ref&amp;gt;Дж. Деммель «Вычислительная линейная алгебра» (стр. 261-264)&amp;lt;/ref&amp;gt; метод Якоби математически эквивалентен применению метода Якоби вычисления собственных значений к матрице &amp;lt;math&amp;gt;A = G^TG&amp;lt;/math&amp;gt;.&lt;br /&gt;
Это значит, что на каждом шаге вычисляется вращение Якоби &amp;lt;math&amp;gt;J&amp;lt;/math&amp;gt;, с помощью которого матрица &amp;lt;math&amp;gt;G^TG&amp;lt;/math&amp;gt; неявно пересчитывется в &amp;lt;math&amp;gt;J^TG^TGJ&amp;lt;/math&amp;gt;; вращение выбрано так, чтобы пара внедиагональных элементов из &amp;lt;math&amp;gt;G^TG&amp;lt;/math&amp;gt; обратилась в нули в матрице &amp;lt;math&amp;gt;J^TG^TGJ&amp;lt;/math&amp;gt;. При этом ни &amp;lt;math&amp;gt;G^TG&amp;lt;/math&amp;gt;, ни &amp;lt;math&amp;gt;J^TG^TGJ&amp;lt;/math&amp;gt; не вычисляются в явном виде; вместо них вычисляется матрица &amp;lt;math&amp;gt;GJ&amp;lt;/math&amp;gt;. Поэтому алгоритм называется &#039;&#039;методом односторонних вращений&#039;&#039;.&lt;br /&gt;
&lt;br /&gt;
=== Математическое описание алгоритма ===&lt;br /&gt;
Исходные данные: матрица &amp;lt;math&amp;gt;G&amp;lt;/math&amp;gt; (элементы &amp;lt;math&amp;gt;g_{ij}, i, j = 1, \ldots, n&amp;lt;/math&amp;gt;).&lt;br /&gt;
&lt;br /&gt;
Вычисляемые данные: матрица &amp;lt;math&amp;gt;\Sigma = diag(\sigma_{i})&amp;lt;/math&amp;gt;, где &amp;lt;math&amp;gt;\sigma_{i}&amp;lt;/math&amp;gt; - сингулярные числа, &amp;lt;math&amp;gt;U&amp;lt;/math&amp;gt; - матрица левых сингулярных векторов, &amp;lt;math&amp;gt;V&amp;lt;/math&amp;gt; - матрица правых сингулярных векторов.&lt;br /&gt;
&lt;br /&gt;
симметричную матрицу &amp;lt;math&amp;gt;A = (G^TG)&amp;lt;/math&amp;gt; можно привести к диагональному виду:&lt;br /&gt;
&amp;lt;math&amp;gt;RG^TGR^T&amp;lt;/math&amp;gt;, где&lt;br /&gt;
&lt;br /&gt;
&amp;lt;math&amp;gt;&lt;br /&gt;
R(j,k,\theta) = &lt;br /&gt;
\begin{matrix}&lt;br /&gt;
  \\&lt;br /&gt;
  \\&lt;br /&gt;
  \\&lt;br /&gt;
j \\&lt;br /&gt;
  \\&lt;br /&gt;
k \\&lt;br /&gt;
  \\&lt;br /&gt;
  \\&lt;br /&gt;
  \\&lt;br /&gt;
\end{matrix}&lt;br /&gt;
&amp;lt;/math&amp;gt;  &lt;br /&gt;
&amp;lt;math&amp;gt;&lt;br /&gt;
\begin{bmatrix}&lt;br /&gt;
  &amp;amp; 1 &amp;amp;   &amp;amp;        &amp;amp;              &amp;amp;        &amp;amp;               &amp;amp;         &amp;amp;    &amp;amp;   \\&lt;br /&gt;
  &amp;amp;   &amp;amp; 1 &amp;amp;        &amp;amp;              &amp;amp;        &amp;amp;               &amp;amp;         &amp;amp;    &amp;amp;   \\&lt;br /&gt;
  &amp;amp;   &amp;amp;   &amp;amp; \ddots &amp;amp;              &amp;amp;        &amp;amp;               &amp;amp;         &amp;amp;    &amp;amp;   \\&lt;br /&gt;
  &amp;amp;   &amp;amp;   &amp;amp;        &amp;amp; \cos(\theta) &amp;amp;        &amp;amp; -\sin(\theta) &amp;amp;         &amp;amp;    &amp;amp;   \\&lt;br /&gt;
  &amp;amp;   &amp;amp;   &amp;amp;        &amp;amp;              &amp;amp; \ddots &amp;amp;               &amp;amp;         &amp;amp;    &amp;amp;   \\&lt;br /&gt;
  &amp;amp;   &amp;amp;   &amp;amp;        &amp;amp; \sin(\theta) &amp;amp;        &amp;amp; \cos(\theta)  &amp;amp;         &amp;amp;    &amp;amp;   \\&lt;br /&gt;
  &amp;amp;   &amp;amp;   &amp;amp;        &amp;amp;              &amp;amp;        &amp;amp;               &amp;amp; \ddots  &amp;amp;    &amp;amp;   \\&lt;br /&gt;
  &amp;amp;   &amp;amp;   &amp;amp;        &amp;amp;              &amp;amp;        &amp;amp;               &amp;amp;         &amp;amp; 1  &amp;amp;   \\&lt;br /&gt;
  &amp;amp;   &amp;amp;   &amp;amp;        &amp;amp;              &amp;amp;        &amp;amp;               &amp;amp;         &amp;amp;    &amp;amp; 1 \\&lt;br /&gt;
\end{bmatrix}&lt;br /&gt;
&amp;lt;/math&amp;gt;&lt;br /&gt;
&lt;br /&gt;
Обозначим &amp;lt;math&amp;gt;s = \sin \theta&amp;lt;/math&amp;gt; и &amp;lt;math&amp;gt;c = \cos \theta&amp;lt;/math&amp;gt;.&lt;br /&gt;
&lt;br /&gt;
Перемножив матрицы &amp;lt;math&amp;gt;RG^TGR^T&amp;lt;/math&amp;gt;, получим следующие выражения&amp;lt;ref&amp;gt;http://www.astro.tsu.ru/OsChMet/5_2.html&amp;lt;/ref&amp;gt;:&lt;br /&gt;
&lt;br /&gt;
&amp;lt;math&amp;gt;\begin{align}&lt;br /&gt;
 a_{jj}^{(i+1)} &amp;amp;= c^2\, a_{jj}^{(i)}  -  2\, s c \,a_{jk}^{(i)}  +  s^2\, a_{kk}^{(i)} \\&lt;br /&gt;
 a_{kk}^{(i+1)} &amp;amp;= s^2 \,a_{jj}^{(i)}  +  2 s c\, a_{jk}^{(i)}  +  c^2 \, a_{kk}^{(i)} \\&lt;br /&gt;
 a_{jk}^{(i+1)} &amp;amp;= a_{kj}^{(i+1)} = (c^2 - s^2 ) \, a_{jk}^{(i)}  +  s c \, (a_{kk}^{(i)} - a_{jj}^{(i)} ) \\&lt;br /&gt;
 a_{jm}^{(i+1)} &amp;amp;= a_{mj}^{(i+1)} = c \, a_{jm}^{(i)}  -  s \, a_{km}^{(i)} &amp;amp; m \ne j,k \\&lt;br /&gt;
 a_{km}^{(i+1)} &amp;amp;= a_{mk}^{(i+1)} = s \, a_{jm}^{(i)}  + c \, a_{km}^{(i)} &amp;amp; m \ne j,k \\&lt;br /&gt;
 a_{ml}^{(i+1)} &amp;amp;= a_{ml}^{(i)} &amp;amp;m,l \ne j,k&lt;br /&gt;
\end{align}&amp;lt;/math&amp;gt;&lt;br /&gt;
&lt;br /&gt;
Т.к внедиагональные элементы должны быть равны 0, то выбираем &amp;lt;math&amp;gt;\theta&amp;lt;/math&amp;gt; так, чтобы &amp;lt;math&amp;gt;a_{jk}^{(i+1)} = 0&amp;lt;/math&amp;gt; и &amp;lt;math&amp;gt;a_{kj}^{(i+1)} = 0&amp;lt;/math&amp;gt;.&lt;br /&gt;
&lt;br /&gt;
Тогда решая уравнение получаем, что&lt;br /&gt;
&lt;br /&gt;
&amp;lt;math&amp;gt;&lt;br /&gt;
         \begin{align}&lt;br /&gt;
         \tau &amp;amp;= ({a_{jj} - a_{kk}})/{2a_{jk}} \\&lt;br /&gt;
         t &amp;amp;= {sign(\tau)}/(|\tau| + \sqrt{1 + \tau^2}) \\&lt;br /&gt;
         c &amp;amp;= 1/(\sqrt{1 + t^2}) \\&lt;br /&gt;
         s &amp;amp;= ct \\&lt;br /&gt;
         \end{align}&amp;lt;/math&amp;gt;&lt;br /&gt;
&lt;br /&gt;
Остановка вычислений алгоритма наступает, когда внедиагональные элементы становятся меньше некоторого наперед заданного числа &amp;lt;math&amp;gt;\varepsilon&amp;lt;/math&amp;gt;.&lt;br /&gt;
&lt;br /&gt;
=== Вычислительное ядро алгоритма ===&lt;br /&gt;
Вычислительное ядро алгоритма составляет непосредственно вычисление одностороннего вращения Якоби, т.е. вычисление элементов матрицы &amp;lt;math&amp;gt;g_{jm}^{(i+1)} = g_{mj}^{(i+1)}&amp;lt;/math&amp;gt; и &amp;lt;math&amp;gt;g_{km}^{(i+1)} = g_{mk}^{(i+1)}&amp;lt;/math&amp;gt;, &amp;lt;math&amp;gt;m \ne j,k&amp;lt;/math&amp;gt;, а также вычисления элементов &amp;lt;math&amp;gt;g_{jj}^{(i+1)} &amp;lt;/math&amp;gt; и &amp;lt;math&amp;gt;g_{kk}^{(i+1)} &amp;lt;/math&amp;gt;, получившихся после умножения промежуточной матрицы на матрицу вращений Якоби:&lt;br /&gt;
&lt;br /&gt;
&amp;lt;math&amp;gt;\begin{align}&lt;br /&gt;
 g_{jj}^{(i+1)} &amp;amp;= c^2\, g_{jj}^{(i)}  -  2\, s c \,g_{jk}^{(i)}  +  s^2\, g_{kk}^{(i)} \\&lt;br /&gt;
 g_{kk}^{(i+1)} &amp;amp;= s^2 \,g_{jj}^{(i)}  +  2 s c\, g_{jk}^{(i)}  +  c^2 \, g_{kk}^{(i)} \\&lt;br /&gt;
 g_{jk}^{(i+1)} &amp;amp;= g_{kj}^{(i+1)} = (c^2 - s^2 ) \, g_{jk}^{(i)}  +  s c \, (g_{kk}^{(i)} - g_{jj}^{(i)} ) \\&lt;br /&gt;
 g_{jm}^{(i+1)} &amp;amp;= g_{mj}^{(i+1)} = c \, g_{jm}^{(i)}  -  s \, g_{km}^{(i)} &amp;amp; m \ne j,k \\&lt;br /&gt;
 g_{km}^{(i+1)} &amp;amp;= g_{mk}^{(i+1)} = s \, g_{jm}^{(i)}  + c \, g_{km}^{(i)} &amp;amp; m \ne j,k \\&lt;br /&gt;
 g_{ml}^{(i+1)} &amp;amp;= g_{ml}^{(i)} &amp;amp;m,l \ne j,k&lt;br /&gt;
\end{align}&amp;lt;/math&amp;gt;&lt;br /&gt;
&lt;br /&gt;
=== Макроструктура алгоритма ===&lt;br /&gt;
Основную часть метода составляет процедура односторонних вращений матрицы, которая в свою очередь состоит из:&lt;br /&gt;
&lt;br /&gt;
#Вычисление &amp;lt;math&amp;gt;\tau, c, s, t&amp;lt;/math&amp;gt;.&lt;br /&gt;
#Одностороннее вращение матрицы. &lt;br /&gt;
&lt;br /&gt;
Что требует &amp;lt;math&amp;gt;O(n)&amp;lt;/math&amp;gt; операций.&lt;br /&gt;
&lt;br /&gt;
После этого необходимо:&lt;br /&gt;
&lt;br /&gt;
#Вычислить сингулярные числа &amp;lt;math&amp;gt;\sigma_i&amp;lt;/math&amp;gt;.  Что требует &amp;lt;math&amp;gt;O(n)&amp;lt;/math&amp;gt; операций.&lt;br /&gt;
#Вычислить &amp;lt;math&amp;gt;U&amp;lt;/math&amp;gt; и &amp;lt;math&amp;gt;V&amp;lt;/math&amp;gt;. Что требует &amp;lt;math&amp;gt;O(n^2)&amp;lt;/math&amp;gt; операций.&lt;br /&gt;
&lt;br /&gt;
=== Схема реализации последовательного алгоритма ===&lt;br /&gt;
Применение метода Якоби к матрице &amp;lt;math&amp;gt;A = (G^TG)&amp;lt;/math&amp;gt; можно описать следующим образом&amp;lt;ref&amp;gt;Дж. Деммель «Вычислительная линейная алгебра» (стр. 261-263)&amp;lt;/ref&amp;gt;:&lt;br /&gt;
&lt;br /&gt;
Если &amp;lt;math&amp;gt;G = U\Sigma V^T&amp;lt;/math&amp;gt; и &amp;lt;math&amp;gt;\Sigma = diag(\sigma_{i})&amp;lt;/math&amp;gt;, то алгоритм вычисляет сингулярные числа &amp;lt;math&amp;gt;\sigma_{i}&amp;lt;/math&amp;gt;, матрицу &amp;lt;math&amp;gt;U&amp;lt;/math&amp;gt; левых сингулярных векторов и матрицу &amp;lt;math&amp;gt;V&amp;lt;/math&amp;gt; правых сингулярных векторов по следующей схеме:&lt;br /&gt;
&lt;br /&gt;
 repeat&lt;br /&gt;
     for &amp;lt;math&amp;gt;j=1&amp;lt;/math&amp;gt; to &amp;lt;math&amp;gt;n-1&amp;lt;/math&amp;gt;&lt;br /&gt;
         for &amp;lt;math&amp;gt;k=j+1&amp;lt;/math&amp;gt; to &amp;lt;math&amp;gt;n&amp;lt;/math&amp;gt;&lt;br /&gt;
             обратиться к процедуре &#039;&#039;&#039;&#039;&#039;One-Sided-Jacobi-Rotation&amp;lt;math&amp;gt;(G,j,k)&amp;lt;/math&amp;gt;&#039;&#039;&#039;&#039;&#039;&lt;br /&gt;
         end for&lt;br /&gt;
     end for&lt;br /&gt;
 пока &amp;lt;math&amp;gt;G^TG&amp;lt;/math&amp;gt; не станет достаточно близка к диагональной матрице&lt;br /&gt;
 Положить &amp;lt;math&amp;gt;\sigma_{i} = ||G(:,i)||_2 &amp;lt;/math&amp;gt; (норма &amp;lt;math&amp;gt;i&amp;lt;/math&amp;gt;-го столбца в &amp;lt;math&amp;gt;G&amp;lt;/math&amp;gt;)&lt;br /&gt;
 Положить &amp;lt;math&amp;gt;U = [u_{1},\dots, u_{n}]&amp;lt;/math&amp;gt;, где &amp;lt;math&amp;gt;u_{i} = G(:,i)/\sigma_{i}&amp;lt;/math&amp;gt;&lt;br /&gt;
 Положить &amp;lt;math&amp;gt;V = J&amp;lt;/math&amp;gt;, где &amp;lt;math&amp;gt;J&amp;lt;/math&amp;gt; - накопленное произведение вращений Якоби.&lt;br /&gt;
&lt;br /&gt;
Где процедура &#039;&#039;&#039;&#039;&#039;One-Sided-Jacobi-Rotation&#039;&#039;&#039;&#039;&#039; является метод односторонних вращений Якоби:&lt;br /&gt;
&lt;br /&gt;
 proc &#039;&#039;&#039;&#039;&#039;One-Sided-Jacobi-Rotation&amp;lt;math&amp;gt;(G,j,k)&amp;lt;/math&amp;gt;&#039;&#039;&#039;&#039;&#039;&lt;br /&gt;
     вычислить &amp;lt;math&amp;gt;a_{jj} = (G^TG)_{jj}, a_{jk} = (G^TG)_{jk}&amp;lt;/math&amp;gt; и &amp;lt;math&amp;gt;a_{kk} = (G^TG)_{kk}&amp;lt;/math&amp;gt;&lt;br /&gt;
     if &amp;lt;math&amp;gt;|a_{jk}|&amp;lt;/math&amp;gt; не слишком мал&lt;br /&gt;
         &amp;lt;math&amp;gt;&lt;br /&gt;
         \begin{align}&lt;br /&gt;
         \tau &amp;amp;= ({a_{jj} - a_{kk}})/{2a_{jk}} \\&lt;br /&gt;
         t &amp;amp;= {sign(\tau)}/(|\tau| + \sqrt{1 + \tau^2}) \\&lt;br /&gt;
         c &amp;amp;= 1/(\sqrt{1 + t^2}) \\&lt;br /&gt;
         s &amp;amp;= ct \\&lt;br /&gt;
         G &amp;amp;= GR(j,k,\theta) \  \dots c=cos\theta, s=sin\theta \end{align}&amp;lt;/math&amp;gt;&lt;br /&gt;
         if нужны правые сингулярные векторы &lt;br /&gt;
             &amp;lt;math&amp;gt;J = JR(j,k,\theta)&amp;lt;/math&amp;gt;&lt;br /&gt;
         end if&lt;br /&gt;
     end if&lt;br /&gt;
&lt;br /&gt;
=== Последовательная сложность алгоритма ===&lt;br /&gt;
Для одного вращения Якоби необходимо выполнить &amp;lt;math&amp;gt;O(n)&amp;lt;/math&amp;gt; операций умножения и сложения. &lt;br /&gt;
&lt;br /&gt;
Всего вариантов выбора &amp;lt;math&amp;gt;j&amp;lt;/math&amp;gt; и &amp;lt;math&amp;gt;k&amp;lt;/math&amp;gt; существует &amp;lt;math&amp;gt;\frac{n(n-1)}{2}&amp;lt;/math&amp;gt;.&lt;br /&gt;
&lt;br /&gt;
Таким образом последовательный алгоритм Якоби вычисления сингулярных чисел и векторов является алгоритмом с кубической сложностью.&lt;br /&gt;
&lt;br /&gt;
=== Информационный граф ===&lt;br /&gt;
Граф алгоритма состоит из четырех групп вершин&lt;br /&gt;
&lt;br /&gt;
(А)Первая группа вершин расположена в двумерной области, соответствующая ей операция - вычисление элементов &amp;lt;math&amp;gt;a_{jj},a_{jk},a_{kk}&amp;lt;/math&amp;gt; матрицы произведения &amp;lt;math&amp;gt;A = (G^TG)&amp;lt;/math&amp;gt;. Где &amp;lt;math&amp;gt;j&amp;lt;/math&amp;gt; изменяется от &amp;lt;math&amp;gt;1&amp;lt;/math&amp;gt; до &amp;lt;math&amp;gt;n-1&amp;lt;/math&amp;gt;, принимая все целочисленные значения, &amp;lt;math&amp;gt;k&amp;lt;/math&amp;gt;  изменяется от &amp;lt;math&amp;gt;j+1&amp;lt;/math&amp;gt; до &amp;lt;math&amp;gt;n&amp;lt;/math&amp;gt;, принимая все целочисленные значения.&lt;br /&gt;
&lt;br /&gt;
Граф вычисления каждого из элементов приведен на рисунке 1, где значениям &amp;lt;math&amp;gt;g_{ij}&amp;lt;/math&amp;gt; соответствуют обозначения &amp;lt;math&amp;gt;x_{ij}&amp;lt;/math&amp;gt;, а элементам &amp;lt;math&amp;gt;g^T_{ij}&amp;lt;/math&amp;gt; обозначения &amp;lt;math&amp;gt;z_{ij}&amp;lt;/math&amp;gt;. Значение &amp;lt;math&amp;gt;s_{ij}&amp;lt;/math&amp;gt; является значением результирующего элемента.&lt;br /&gt;
&lt;br /&gt;
(Б)Вторая группа вершин расположена в двумерной области, соответствующая ей операция – вычисление &amp;lt;math&amp;gt;c&amp;lt;/math&amp;gt; и &amp;lt;math&amp;gt;s&amp;lt;/math&amp;gt;.&lt;br /&gt;
&lt;br /&gt;
Информационный граф с входными и выходными данными вычисления пункта (Б) представлен на рисунке 2.&lt;br /&gt;
&lt;br /&gt;
(В)Третья группа вершин расположена в двумерной области, соответствующая ей операция вычисление значений элементов &amp;lt;math&amp;gt;g_{jm}^{(i+1)} = g_{mj}^{(i+1)}&amp;lt;/math&amp;gt; и &amp;lt;math&amp;gt;g_{km}^{(i+1)} = g_{mk}^{(i+1)}&amp;lt;/math&amp;gt;, &amp;lt;math&amp;gt;m \ne j,k&amp;lt;/math&amp;gt;.&lt;br /&gt;
&lt;br /&gt;
(Г)Четвертая группа вершин расположена в двумерной области, соответствующая ей операция вычисление значений элементов &amp;lt;math&amp;gt;g_{jj}^{(i+1)} &amp;lt;/math&amp;gt; и &amp;lt;math&amp;gt;g_{kk}^{(i+1)} &amp;lt;/math&amp;gt;.&lt;br /&gt;
&lt;br /&gt;
Элементы групп (В) и (Г) вычисляются аналогично вычислению элементов матрицы произведения, т.к. фактически представляют собой перемножение матриц &amp;lt;math&amp;gt;G&amp;lt;/math&amp;gt; и &amp;lt;math&amp;gt;R&amp;lt;/math&amp;gt;&lt;br /&gt;
&lt;br /&gt;
[[File:Jacobi_2.jpg|none|thumb|1000px|Рисунок 1. Информационный граф с входными и выходными параметрами вычисления каждого элемента матрицы произведения.]]&lt;br /&gt;
&lt;br /&gt;
[[File:Jacobi_1.jpg|none|thumb|1000px|Рисунок 2. Информационный граф с входными и выходными параметрами вычисления значений &amp;lt;math&amp;gt;c&amp;lt;/math&amp;gt; и &amp;lt;math&amp;gt;s&amp;lt;/math&amp;gt;.]]&lt;br /&gt;
&lt;br /&gt;
Обобщенный граф метода Якоби представлен на рисунке 3, где буквами А, Б, В и Г обозначено вычисление групп вершин (А), (Б), (В) и (Г).&lt;br /&gt;
&lt;br /&gt;
[[File:Graf21.png|none|thumb|2000px|Рисунок 3. Обобщенный граф алгоритма вычисления сингулярных чисел и векторов методом Якоби.]]&lt;br /&gt;
&lt;br /&gt;
=== Ресурс параллелизма алгоритма ===&lt;br /&gt;
Для выполнения одной итерации метода Якоби требуется последовательно выполнить несколько ярусов:&lt;br /&gt;
# вычислить &amp;lt;math&amp;gt;\tau&amp;lt;/math&amp;gt; &lt;br /&gt;
# вычислить &amp;lt;math&amp;gt;t&amp;lt;/math&amp;gt; &lt;br /&gt;
# вычислить &amp;lt;math&amp;gt;c&amp;lt;/math&amp;gt; &lt;br /&gt;
# вычислить &amp;lt;math&amp;gt;s&amp;lt;/math&amp;gt;&lt;br /&gt;
# выполнить поворот матрицы &amp;lt;math&amp;gt;G&amp;lt;/math&amp;gt; с параллельным выполнением &amp;lt;math&amp;gt;2(n-2)&amp;lt;/math&amp;gt; операций вычисления элементов матрицы &amp;lt;math&amp;gt;g_{jm}^{(i+1)} = g_{mj}^{(i+1)}&amp;lt;/math&amp;gt; и &amp;lt;math&amp;gt;g_{km}^{(i+1)} = g_{mk}^{(i+1)}&amp;lt;/math&amp;gt;, &amp;lt;math&amp;gt;m \ne j,k&amp;lt;/math&amp;gt;, а также вычисления элементов &amp;lt;math&amp;gt;g_{jj}^{(i+1)} &amp;lt;/math&amp;gt; и &amp;lt;math&amp;gt;g_{kk}^{(i+1)} &amp;lt;/math&amp;gt;. &lt;br /&gt;
&lt;br /&gt;
Суммарное количество итераций равно &amp;lt;math&amp;gt;\frac{n(n-1)}{2}&amp;lt;/math&amp;gt; (Различные варианты выбора &amp;lt;math&amp;gt;j&amp;lt;/math&amp;gt; и &amp;lt;math&amp;gt;k&amp;lt;/math&amp;gt;). &lt;br /&gt;
&lt;br /&gt;
Асимптотически метод сходится квадратично. &lt;br /&gt;
&lt;br /&gt;
Таким образом, при классификации по высоте ЯПФ метод Якоби относится к алгоритмам со сложностью &amp;lt;math&amp;gt;O(n^2)&amp;lt;/math&amp;gt;&amp;amp;nbsp;, а при классификации по ширине ЯПФ — к алгоритмам со сложностью &amp;lt;math&amp;gt;O(n)&amp;lt;/math&amp;gt;.&lt;br /&gt;
&lt;br /&gt;
=== Входные и выходные данные алгоритма ===&lt;br /&gt;
&#039;&#039;&#039;Входные данные&#039;&#039;&#039;: плотная матрица &amp;lt;math&amp;gt;G&amp;lt;/math&amp;gt; размера &amp;lt;math&amp;gt;n&amp;lt;/math&amp;gt;х&amp;lt;math&amp;gt;n&amp;lt;/math&amp;gt;, где &amp;lt;math&amp;gt;A= G^TG&amp;lt;/math&amp;gt; – симметрическая матрица.&lt;br /&gt;
&lt;br /&gt;
&#039;&#039;&#039;Объём входных данных&#039;&#039;&#039;: &amp;lt;math&amp;gt;n^2&amp;lt;/math&amp;gt; (т.к. для хранения матрицы &amp;lt;math&amp;gt;G&amp;lt;/math&amp;gt; используем двумерный массив размера &amp;lt;math&amp;gt;n&amp;lt;/math&amp;gt;х&amp;lt;math&amp;gt;n&amp;lt;/math&amp;gt;)&lt;br /&gt;
&lt;br /&gt;
&#039;&#039;&#039;Выходные данные&#039;&#039;&#039;: &amp;lt;math&amp;gt;\sigma_{i}&amp;lt;/math&amp;gt;  - сингулярные числа, матрица &amp;lt;math&amp;gt;U&amp;lt;/math&amp;gt; левых сингулярных векторов и матрица &amp;lt;math&amp;gt;V&amp;lt;/math&amp;gt; правых сингулярных векторов.&lt;br /&gt;
&lt;br /&gt;
&#039;&#039;&#039;Объём выходных данных&#039;&#039;&#039;: &amp;lt;math&amp;gt;2n^2 + n&amp;lt;/math&amp;gt; (т.к. необходимо хранить вектор сингулярных чисел длины &amp;lt;math&amp;gt;n&amp;lt;/math&amp;gt;, а также две матрицы &amp;lt;math&amp;gt;U, V&amp;lt;/math&amp;gt; левых и правых сингулярных векторов размера &amp;lt;math&amp;gt;n&amp;lt;/math&amp;gt;х&amp;lt;math&amp;gt;n&amp;lt;/math&amp;gt;).&lt;br /&gt;
&lt;br /&gt;
=== Свойства алгоритма ===&lt;br /&gt;
Метод Якоби является самым медленным из имеющихся алгоритмов вычисления сингулярных чисел и сингулярных векторов матрицы. Тем не менее, для  матриц &amp;lt;math&amp;gt;G&amp;lt;/math&amp;gt;, которые могут быть представлены в виде &amp;lt;math&amp;gt;G=DX&amp;lt;/math&amp;gt;, где &amp;lt;math&amp;gt;D&amp;lt;/math&amp;gt; - диагональная, а &amp;lt;math&amp;gt;X&amp;lt;/math&amp;gt; - хорошо обусловлена, он способен вычислять сингулярные числа и вектора намного точнее, чем другие методы&amp;lt;ref&amp;gt;Дж. Деммель «Вычислительная линейная алгебра» (стр. 261-264)&amp;lt;/ref&amp;gt;. &lt;br /&gt;
&lt;br /&gt;
Вычислительная мощность алгоритма, как отношение числа операций к суммарному объему входных и выходных данных является линейной.&lt;br /&gt;
&lt;br /&gt;
Метод Якоби не детерминирован, так как является итерационным алгоритмом с выходом по точности (число итераций зависит от входных данных и порогового значения).&lt;br /&gt;
&lt;br /&gt;
== Программная реализация алгоритма ==&lt;br /&gt;
&lt;br /&gt;
=== Особенности реализации последовательного алгоритма ===&lt;br /&gt;
&lt;br /&gt;
=== Локальность данных и вычислений ===&lt;br /&gt;
&lt;br /&gt;
=== Возможные способы и особенности параллельной реализации алгоритма ===&lt;br /&gt;
&lt;br /&gt;
=== Масштабируемость алгоритма и его реализации ===&lt;br /&gt;
Исследование масштабируемости параллельной реализации метода Якоби вычисления сингулярных чисел и векторов проводилось на суперкомпьютере &amp;quot;Ломоносов&amp;quot;. Алгоритм реализован на языке программирования C с использованием механизмов MPI.&lt;br /&gt;
&lt;br /&gt;
Алгоритм работает по следующей схеме:&lt;br /&gt;
#На вход всем процессорам подается матрица &amp;lt;math&amp;gt; G &amp;lt;/math&amp;gt;.&lt;br /&gt;
#Вычисляется элемент &amp;lt;math&amp;gt; a_{jk} &amp;lt;/math&amp;gt; путем перемножения матриц &amp;lt;math&amp;gt; G^TG &amp;lt;/math&amp;gt;, где на каждом процессоре вычисляется своя часть матрицы. После чего результат отправляется на все процессоры.&lt;br /&gt;
#Если полученный элемент оказывается больше некоторого значения, то начинается последовательная часть программы: Вычисление элементов &amp;lt;math&amp;gt; \tau, t, c, s &amp;lt;/math&amp;gt;.&lt;br /&gt;
#Затем, выполняется операция поворота, путем перемножения матриц &amp;lt;math&amp;gt; G &amp;lt;/math&amp;gt; и &amp;lt;math&amp;gt; R &amp;lt;/math&amp;gt;. Данная операция выполняется параллельно на нескольких процессорах, где каждый процессор вычисляет свою часть матрицы. После чего результат пересылается всем процессорам.&lt;br /&gt;
&lt;br /&gt;
Данная схема повторяется до тех пор, пока матрица &amp;lt;math&amp;gt; A = G^TG &amp;lt;/math&amp;gt; не станет достаточно близкой к диагональной.&lt;br /&gt;
&lt;br /&gt;
Для проверки этого факта, в конце каждой итерации цикла вычисляется матрица &amp;lt;math&amp;gt; A &amp;lt;/math&amp;gt;. Данная операция выполняется параллельно на нескольких процессорах, где каждый процессор вычисляет свою часть матрицы, после чего результат пересылается всем процессорам.&lt;br /&gt;
&lt;br /&gt;
&lt;br /&gt;
Набор и границы значений изменяемых параметров запуска реализации алгоритма: &lt;br /&gt;
&lt;br /&gt;
*	число процессоров [1 : 128] с шагом равным степени двойки;&lt;br /&gt;
*	размер матрицы [256 : 1792] с шагом 256.&lt;br /&gt;
&lt;br /&gt;
В результате проведённых экспериментов был получен следующий диапазон эффективности реализации алгоритма:&lt;br /&gt;
&lt;br /&gt;
*	минимальная эффективность реализации ;&lt;br /&gt;
*	максимальная эффективность реализации .&lt;br /&gt;
&lt;br /&gt;
На следующих рисунках приведены графики производительности и эффективности выбранной реализации метода Якоби в зависимости от изменяемых параметров запуска.&lt;br /&gt;
&lt;br /&gt;
[[File:Performance.jpg|none|thumb|1000px|Рисунок 1. Параллельная реализация метода Якоби. Изменение производительности в зависимости от числа процессоров и размера матрицы.]]&lt;br /&gt;
&lt;br /&gt;
=== Динамические характеристики и эффективность реализации алгоритма ===&lt;br /&gt;
&lt;br /&gt;
=== Выводы для классов архитектур ===&lt;br /&gt;
&lt;br /&gt;
=== Существующие реализации алгоритма ===&lt;br /&gt;
Метод Якоби нахождения сингулярных значений и векторов реализован в таких пакетах, как LAPACK &amp;lt;ref&amp;gt;http://www.netlib.org/scalapack/slug/&amp;lt;/ref&amp;gt;, LINPACK/EISPACK &amp;lt;ref&amp;gt; http://www.netlib.org/linpack/ &amp;lt;/ref&amp;gt;, Intel MKL &amp;lt;ref&amp;gt;https://software.intel.com/ru-ru/node/521153#CAF8CA08-1C69-48F8-B0C3-B2B27AFA92FA&amp;lt;/ref&amp;gt;.&lt;br /&gt;
&lt;br /&gt;
Так же функция Якоби реализована в пакете Matlab.&lt;br /&gt;
&lt;br /&gt;
Т. к. алгоритм считается медленным, он не включен во многие известные пакеты.&lt;br /&gt;
&lt;br /&gt;
== Литература ==&lt;br /&gt;
1. Дж. Деммель Вычислительная линейная алгебра. Изд. Мир, 2001.&lt;/div&gt;</summary>
		<author><name>Davletshuna Alexandra</name></author>
	</entry>
	<entry>
		<id>https://xn--80aecvaldz.xn--80ahdrnmvk.xn--p1ai/w/ru/index.php?title=%D0%A3%D1%87%D0%B0%D1%81%D1%82%D0%BD%D0%B8%D0%BA:Davletshuna_Alexandra/%D0%9C%D0%B5%D1%82%D0%BE%D0%B4_%D0%AF%D0%BA%D0%BE%D0%B1%D0%B8_%D0%B2%D1%8B%D1%87%D0%B8%D1%81%D0%BB%D0%B5%D0%BD%D0%B8%D1%8F_%D1%81%D0%B8%D0%BD%D0%B3%D1%83%D0%BB%D1%8F%D1%80%D0%BD%D1%8B%D1%85_%D1%87%D0%B8%D1%81%D0%B5%D0%BB_%D0%B8_%D0%B2%D0%B5%D0%BA%D1%82%D0%BE%D1%80%D0%BE%D0%B2&amp;diff=17900</id>
		<title>Участник:Davletshuna Alexandra/Метод Якоби вычисления сингулярных чисел и векторов</title>
		<link rel="alternate" type="text/html" href="https://xn--80aecvaldz.xn--80ahdrnmvk.xn--p1ai/w/ru/index.php?title=%D0%A3%D1%87%D0%B0%D1%81%D1%82%D0%BD%D0%B8%D0%BA:Davletshuna_Alexandra/%D0%9C%D0%B5%D1%82%D0%BE%D0%B4_%D0%AF%D0%BA%D0%BE%D0%B1%D0%B8_%D0%B2%D1%8B%D1%87%D0%B8%D1%81%D0%BB%D0%B5%D0%BD%D0%B8%D1%8F_%D1%81%D0%B8%D0%BD%D0%B3%D1%83%D0%BB%D1%8F%D1%80%D0%BD%D1%8B%D1%85_%D1%87%D0%B8%D1%81%D0%B5%D0%BB_%D0%B8_%D0%B2%D0%B5%D0%BA%D1%82%D0%BE%D1%80%D0%BE%D0%B2&amp;diff=17900"/>
		<updated>2016-11-17T12:32:13Z</updated>

		<summary type="html">&lt;p&gt;Davletshuna Alexandra: /* Масштабируемость алгоритма и его реализации */&lt;/p&gt;
&lt;hr /&gt;
&lt;div&gt;{{algorithm&lt;br /&gt;
| name              = Метод Якоби вычисления сингулярных чисел и векторов&lt;br /&gt;
| serial_complexity = &amp;lt;math&amp;gt;O(n^3)&amp;lt;/math&amp;gt;&lt;br /&gt;
| pf_height         = &amp;lt;math&amp;gt;O(n^2)&amp;lt;/math&amp;gt;&lt;br /&gt;
| pf_width          = &amp;lt;math&amp;gt;O(n)&amp;lt;/math&amp;gt;&lt;br /&gt;
| input_data        = &amp;lt;math&amp;gt;n^2&amp;lt;/math&amp;gt;&lt;br /&gt;
| output_data       = &amp;lt;math&amp;gt;2n^2 + n&amp;lt;/math&amp;gt;&lt;br /&gt;
}}&lt;br /&gt;
&lt;br /&gt;
Авторы статьи: [[Участница:Davletshuna Alexandra|Давлетшина Александра]] (группа 619) пункты 1.1-1.4, 1.6, 2.7; [[Участница:Alek sandra|Зайцева Александра]] (группа 601) пункты 1.5, 1.7-1.10, 2.7.&lt;br /&gt;
&lt;br /&gt;
== Свойства и структура алгоритма ==&lt;br /&gt;
&lt;br /&gt;
=== Общее описание алгоритма ===&lt;br /&gt;
&#039;&#039;&#039;Сингулярным разложением&#039;&#039;&#039; называется разложение прямоугольной вещественной или комплексной матрицы, имеющее широкое применение, в силу своей наглядной геометрической интерпретации, при решении многих прикладных задач. Сингулярное разложение матрицы А позволяет вычислять сингулярные числа данной матрицы, а также, левые и правые сингулярные векторы матрицы А:&lt;br /&gt;
&lt;br /&gt;
•	левые сингулярные векторы матрицы А — это собственные векторы матрицы &amp;lt;math&amp;gt;AA^*&amp;lt;/math&amp;gt;;&lt;br /&gt;
&lt;br /&gt;
•	правые сингулярные векторы матрицы A — это собственные векторы матрицы &amp;lt;math&amp;gt;A^*A&amp;lt;/math&amp;gt;.&lt;br /&gt;
&lt;br /&gt;
Геометрическая интерпретация сингулярного разложения заключается в следующем факте из геометрии: &#039;&#039;Образом любого линейного преобразования, заданного с помощью матрицы &amp;lt;math&amp;gt;m&amp;lt;/math&amp;gt;x&amp;lt;math&amp;gt;n&amp;lt;/math&amp;gt;, примененного к единичной сфере является гиперэллипсоид&#039;&#039;.&lt;br /&gt;
&lt;br /&gt;
Из многочисленных разложений матриц, наиболее удобным является сингулярное разложение матрицы в виде: &amp;lt;math&amp;gt;A=U\Sigma V^*&amp;lt;/math&amp;gt;, где &amp;lt;math&amp;gt;U, V&amp;lt;/math&amp;gt; – унитарные матрицы, а &amp;lt;math&amp;gt;\Sigma&amp;lt;/math&amp;gt; – диагональная матрица с вещественными положительными числами на диагонали &amp;lt;ref&amp;gt;http://algorithms.parallel.ru/&amp;lt;/ref&amp;gt;.&lt;br /&gt;
&lt;br /&gt;
Диагональные элементы матрицы &amp;lt;math&amp;gt;\Sigma&amp;lt;/math&amp;gt; называются сингулярными числами матрицы &amp;lt;math&amp;gt;A&amp;lt;/math&amp;gt;, а столбцы матриц &amp;lt;math&amp;gt;U,V&amp;lt;/math&amp;gt; левыми и правыми сингулярными векторами соответственно.&lt;br /&gt;
&lt;br /&gt;
Алгоритм Якоби сингулярного разложения матрицы был предложен одним из первых в 1846 году. Он приводит прямоугольную матрицу к диагональной матрице с помощью последовательности элементарных вращений. Метод может найти все сингулярные значения с очень высокой точностью. Однако его производительность является довольно низкой, в сравнении с конкурирующими методами.&lt;br /&gt;
&lt;br /&gt;
&#039;&#039;Неявный&#039;&#039;&amp;lt;ref&amp;gt;Дж. Деммель «Вычислительная линейная алгебра» (стр. 261-264)&amp;lt;/ref&amp;gt; метод Якоби математически эквивалентен применению метода Якоби вычисления собственных значений к матрице &amp;lt;math&amp;gt;A = G^TG&amp;lt;/math&amp;gt;.&lt;br /&gt;
Это значит, что на каждом шаге вычисляется вращение Якоби &amp;lt;math&amp;gt;J&amp;lt;/math&amp;gt;, с помощью которого матрица &amp;lt;math&amp;gt;G^TG&amp;lt;/math&amp;gt; неявно пересчитывется в &amp;lt;math&amp;gt;J^TG^TGJ&amp;lt;/math&amp;gt;; вращение выбрано так, чтобы пара внедиагональных элементов из &amp;lt;math&amp;gt;G^TG&amp;lt;/math&amp;gt; обратилась в нули в матрице &amp;lt;math&amp;gt;J^TG^TGJ&amp;lt;/math&amp;gt;. При этом ни &amp;lt;math&amp;gt;G^TG&amp;lt;/math&amp;gt;, ни &amp;lt;math&amp;gt;J^TG^TGJ&amp;lt;/math&amp;gt; не вычисляются в явном виде; вместо них вычисляется матрица &amp;lt;math&amp;gt;GJ&amp;lt;/math&amp;gt;. Поэтому алгоритм называется &#039;&#039;методом односторонних вращений&#039;&#039;.&lt;br /&gt;
&lt;br /&gt;
=== Математическое описание алгоритма ===&lt;br /&gt;
Исходные данные: матрица &amp;lt;math&amp;gt;G&amp;lt;/math&amp;gt; (элементы &amp;lt;math&amp;gt;g_{ij}, i, j = 1, \ldots, n&amp;lt;/math&amp;gt;).&lt;br /&gt;
&lt;br /&gt;
Вычисляемые данные: матрица &amp;lt;math&amp;gt;\Sigma = diag(\sigma_{i})&amp;lt;/math&amp;gt;, где &amp;lt;math&amp;gt;\sigma_{i}&amp;lt;/math&amp;gt; - сингулярные числа, &amp;lt;math&amp;gt;U&amp;lt;/math&amp;gt; - матрица левых сингулярных векторов, &amp;lt;math&amp;gt;V&amp;lt;/math&amp;gt; - матрица правых сингулярных векторов.&lt;br /&gt;
&lt;br /&gt;
симметричную матрицу &amp;lt;math&amp;gt;A = (G^TG)&amp;lt;/math&amp;gt; можно привести к диагональному виду:&lt;br /&gt;
&amp;lt;math&amp;gt;RG^TGR^T&amp;lt;/math&amp;gt;, где&lt;br /&gt;
&lt;br /&gt;
&amp;lt;math&amp;gt;&lt;br /&gt;
R(j,k,\theta) = &lt;br /&gt;
\begin{matrix}&lt;br /&gt;
  \\&lt;br /&gt;
  \\&lt;br /&gt;
  \\&lt;br /&gt;
j \\&lt;br /&gt;
  \\&lt;br /&gt;
k \\&lt;br /&gt;
  \\&lt;br /&gt;
  \\&lt;br /&gt;
  \\&lt;br /&gt;
\end{matrix}&lt;br /&gt;
&amp;lt;/math&amp;gt;  &lt;br /&gt;
&amp;lt;math&amp;gt;&lt;br /&gt;
\begin{bmatrix}&lt;br /&gt;
  &amp;amp; 1 &amp;amp;   &amp;amp;        &amp;amp;              &amp;amp;        &amp;amp;               &amp;amp;         &amp;amp;    &amp;amp;   \\&lt;br /&gt;
  &amp;amp;   &amp;amp; 1 &amp;amp;        &amp;amp;              &amp;amp;        &amp;amp;               &amp;amp;         &amp;amp;    &amp;amp;   \\&lt;br /&gt;
  &amp;amp;   &amp;amp;   &amp;amp; \ddots &amp;amp;              &amp;amp;        &amp;amp;               &amp;amp;         &amp;amp;    &amp;amp;   \\&lt;br /&gt;
  &amp;amp;   &amp;amp;   &amp;amp;        &amp;amp; \cos(\theta) &amp;amp;        &amp;amp; -\sin(\theta) &amp;amp;         &amp;amp;    &amp;amp;   \\&lt;br /&gt;
  &amp;amp;   &amp;amp;   &amp;amp;        &amp;amp;              &amp;amp; \ddots &amp;amp;               &amp;amp;         &amp;amp;    &amp;amp;   \\&lt;br /&gt;
  &amp;amp;   &amp;amp;   &amp;amp;        &amp;amp; \sin(\theta) &amp;amp;        &amp;amp; \cos(\theta)  &amp;amp;         &amp;amp;    &amp;amp;   \\&lt;br /&gt;
  &amp;amp;   &amp;amp;   &amp;amp;        &amp;amp;              &amp;amp;        &amp;amp;               &amp;amp; \ddots  &amp;amp;    &amp;amp;   \\&lt;br /&gt;
  &amp;amp;   &amp;amp;   &amp;amp;        &amp;amp;              &amp;amp;        &amp;amp;               &amp;amp;         &amp;amp; 1  &amp;amp;   \\&lt;br /&gt;
  &amp;amp;   &amp;amp;   &amp;amp;        &amp;amp;              &amp;amp;        &amp;amp;               &amp;amp;         &amp;amp;    &amp;amp; 1 \\&lt;br /&gt;
\end{bmatrix}&lt;br /&gt;
&amp;lt;/math&amp;gt;&lt;br /&gt;
&lt;br /&gt;
Обозначим &amp;lt;math&amp;gt;s = \sin \theta&amp;lt;/math&amp;gt; и &amp;lt;math&amp;gt;c = \cos \theta&amp;lt;/math&amp;gt;.&lt;br /&gt;
&lt;br /&gt;
Перемножив матрицы &amp;lt;math&amp;gt;RG^TGR^T&amp;lt;/math&amp;gt;, получим следующие выражения&amp;lt;ref&amp;gt;http://www.astro.tsu.ru/OsChMet/5_2.html&amp;lt;/ref&amp;gt;:&lt;br /&gt;
&lt;br /&gt;
&amp;lt;math&amp;gt;\begin{align}&lt;br /&gt;
 a_{jj}^{(i+1)} &amp;amp;= c^2\, a_{jj}^{(i)}  -  2\, s c \,a_{jk}^{(i)}  +  s^2\, a_{kk}^{(i)} \\&lt;br /&gt;
 a_{kk}^{(i+1)} &amp;amp;= s^2 \,a_{jj}^{(i)}  +  2 s c\, a_{jk}^{(i)}  +  c^2 \, a_{kk}^{(i)} \\&lt;br /&gt;
 a_{jk}^{(i+1)} &amp;amp;= a_{kj}^{(i+1)} = (c^2 - s^2 ) \, a_{jk}^{(i)}  +  s c \, (a_{kk}^{(i)} - a_{jj}^{(i)} ) \\&lt;br /&gt;
 a_{jm}^{(i+1)} &amp;amp;= a_{mj}^{(i+1)} = c \, a_{jm}^{(i)}  -  s \, a_{km}^{(i)} &amp;amp; m \ne j,k \\&lt;br /&gt;
 a_{km}^{(i+1)} &amp;amp;= a_{mk}^{(i+1)} = s \, a_{jm}^{(i)}  + c \, a_{km}^{(i)} &amp;amp; m \ne j,k \\&lt;br /&gt;
 a_{ml}^{(i+1)} &amp;amp;= a_{ml}^{(i)} &amp;amp;m,l \ne j,k&lt;br /&gt;
\end{align}&amp;lt;/math&amp;gt;&lt;br /&gt;
&lt;br /&gt;
Т.к внедиагональные элементы должны быть равны 0, то выбираем &amp;lt;math&amp;gt;\theta&amp;lt;/math&amp;gt; так, чтобы &amp;lt;math&amp;gt;a_{jk}^{(i+1)} = 0&amp;lt;/math&amp;gt; и &amp;lt;math&amp;gt;a_{kj}^{(i+1)} = 0&amp;lt;/math&amp;gt;.&lt;br /&gt;
&lt;br /&gt;
Тогда решая уравнение получаем, что&lt;br /&gt;
&lt;br /&gt;
&amp;lt;math&amp;gt;&lt;br /&gt;
         \begin{align}&lt;br /&gt;
         \tau &amp;amp;= ({a_{jj} - a_{kk}})/{2a_{jk}} \\&lt;br /&gt;
         t &amp;amp;= {sign(\tau)}/(|\tau| + \sqrt{1 + \tau^2}) \\&lt;br /&gt;
         c &amp;amp;= 1/(\sqrt{1 + t^2}) \\&lt;br /&gt;
         s &amp;amp;= ct \\&lt;br /&gt;
         \end{align}&amp;lt;/math&amp;gt;&lt;br /&gt;
&lt;br /&gt;
Остановка вычислений алгоритма наступает, когда внедиагональные элементы становятся меньше некоторого наперед заданного числа &amp;lt;math&amp;gt;\varepsilon&amp;lt;/math&amp;gt;.&lt;br /&gt;
&lt;br /&gt;
=== Вычислительное ядро алгоритма ===&lt;br /&gt;
Вычислительное ядро алгоритма составляет непосредственно вычисление одностороннего вращения Якоби, т.е. вычисление элементов матрицы &amp;lt;math&amp;gt;g_{jm}^{(i+1)} = g_{mj}^{(i+1)}&amp;lt;/math&amp;gt; и &amp;lt;math&amp;gt;g_{km}^{(i+1)} = g_{mk}^{(i+1)}&amp;lt;/math&amp;gt;, &amp;lt;math&amp;gt;m \ne j,k&amp;lt;/math&amp;gt;, а также вычисления элементов &amp;lt;math&amp;gt;g_{jj}^{(i+1)} &amp;lt;/math&amp;gt; и &amp;lt;math&amp;gt;g_{kk}^{(i+1)} &amp;lt;/math&amp;gt;, получившихся после умножения промежуточной матрицы на матрицу вращений Якоби:&lt;br /&gt;
&lt;br /&gt;
&amp;lt;math&amp;gt;\begin{align}&lt;br /&gt;
 g_{jj}^{(i+1)} &amp;amp;= c^2\, g_{jj}^{(i)}  -  2\, s c \,g_{jk}^{(i)}  +  s^2\, g_{kk}^{(i)} \\&lt;br /&gt;
 g_{kk}^{(i+1)} &amp;amp;= s^2 \,g_{jj}^{(i)}  +  2 s c\, g_{jk}^{(i)}  +  c^2 \, g_{kk}^{(i)} \\&lt;br /&gt;
 g_{jk}^{(i+1)} &amp;amp;= g_{kj}^{(i+1)} = (c^2 - s^2 ) \, g_{jk}^{(i)}  +  s c \, (g_{kk}^{(i)} - g_{jj}^{(i)} ) \\&lt;br /&gt;
 g_{jm}^{(i+1)} &amp;amp;= g_{mj}^{(i+1)} = c \, g_{jm}^{(i)}  -  s \, g_{km}^{(i)} &amp;amp; m \ne j,k \\&lt;br /&gt;
 g_{km}^{(i+1)} &amp;amp;= g_{mk}^{(i+1)} = s \, g_{jm}^{(i)}  + c \, g_{km}^{(i)} &amp;amp; m \ne j,k \\&lt;br /&gt;
 g_{ml}^{(i+1)} &amp;amp;= g_{ml}^{(i)} &amp;amp;m,l \ne j,k&lt;br /&gt;
\end{align}&amp;lt;/math&amp;gt;&lt;br /&gt;
&lt;br /&gt;
=== Макроструктура алгоритма ===&lt;br /&gt;
Основную часть метода составляет процедура односторонних вращений матрицы, которая в свою очередь состоит из:&lt;br /&gt;
&lt;br /&gt;
#Вычисление &amp;lt;math&amp;gt;\tau, c, s, t&amp;lt;/math&amp;gt;.&lt;br /&gt;
#Одностороннее вращение матрицы. &lt;br /&gt;
&lt;br /&gt;
Что требует &amp;lt;math&amp;gt;O(n)&amp;lt;/math&amp;gt; операций.&lt;br /&gt;
&lt;br /&gt;
После этого необходимо:&lt;br /&gt;
&lt;br /&gt;
#Вычислить сингулярные числа &amp;lt;math&amp;gt;\sigma_i&amp;lt;/math&amp;gt;.  Что требует &amp;lt;math&amp;gt;O(n)&amp;lt;/math&amp;gt; операций.&lt;br /&gt;
#Вычислить &amp;lt;math&amp;gt;U&amp;lt;/math&amp;gt; и &amp;lt;math&amp;gt;V&amp;lt;/math&amp;gt;. Что требует &amp;lt;math&amp;gt;O(n^2)&amp;lt;/math&amp;gt; операций.&lt;br /&gt;
&lt;br /&gt;
=== Схема реализации последовательного алгоритма ===&lt;br /&gt;
Применение метода Якоби к матрице &amp;lt;math&amp;gt;A = (G^TG)&amp;lt;/math&amp;gt; можно описать следующим образом&amp;lt;ref&amp;gt;Дж. Деммель «Вычислительная линейная алгебра» (стр. 261-263)&amp;lt;/ref&amp;gt;:&lt;br /&gt;
&lt;br /&gt;
Если &amp;lt;math&amp;gt;G = U\Sigma V^T&amp;lt;/math&amp;gt; и &amp;lt;math&amp;gt;\Sigma = diag(\sigma_{i})&amp;lt;/math&amp;gt;, то алгоритм вычисляет сингулярные числа &amp;lt;math&amp;gt;\sigma_{i}&amp;lt;/math&amp;gt;, матрицу &amp;lt;math&amp;gt;U&amp;lt;/math&amp;gt; левых сингулярных векторов и матрицу &amp;lt;math&amp;gt;V&amp;lt;/math&amp;gt; правых сингулярных векторов по следующей схеме:&lt;br /&gt;
&lt;br /&gt;
 repeat&lt;br /&gt;
     for &amp;lt;math&amp;gt;j=1&amp;lt;/math&amp;gt; to &amp;lt;math&amp;gt;n-1&amp;lt;/math&amp;gt;&lt;br /&gt;
         for &amp;lt;math&amp;gt;k=j+1&amp;lt;/math&amp;gt; to &amp;lt;math&amp;gt;n&amp;lt;/math&amp;gt;&lt;br /&gt;
             обратиться к процедуре &#039;&#039;&#039;&#039;&#039;One-Sided-Jacobi-Rotation&amp;lt;math&amp;gt;(G,j,k)&amp;lt;/math&amp;gt;&#039;&#039;&#039;&#039;&#039;&lt;br /&gt;
         end for&lt;br /&gt;
     end for&lt;br /&gt;
 пока &amp;lt;math&amp;gt;G^TG&amp;lt;/math&amp;gt; не станет достаточно близка к диагональной матрице&lt;br /&gt;
 Положить &amp;lt;math&amp;gt;\sigma_{i} = ||G(:,i)||_2 &amp;lt;/math&amp;gt; (норма &amp;lt;math&amp;gt;i&amp;lt;/math&amp;gt;-го столбца в &amp;lt;math&amp;gt;G&amp;lt;/math&amp;gt;)&lt;br /&gt;
 Положить &amp;lt;math&amp;gt;U = [u_{1},\dots, u_{n}]&amp;lt;/math&amp;gt;, где &amp;lt;math&amp;gt;u_{i} = G(:,i)/\sigma_{i}&amp;lt;/math&amp;gt;&lt;br /&gt;
 Положить &amp;lt;math&amp;gt;V = J&amp;lt;/math&amp;gt;, где &amp;lt;math&amp;gt;J&amp;lt;/math&amp;gt; - накопленное произведение вращений Якоби.&lt;br /&gt;
&lt;br /&gt;
Где процедура &#039;&#039;&#039;&#039;&#039;One-Sided-Jacobi-Rotation&#039;&#039;&#039;&#039;&#039; является метод односторонних вращений Якоби:&lt;br /&gt;
&lt;br /&gt;
 proc &#039;&#039;&#039;&#039;&#039;One-Sided-Jacobi-Rotation&amp;lt;math&amp;gt;(G,j,k)&amp;lt;/math&amp;gt;&#039;&#039;&#039;&#039;&#039;&lt;br /&gt;
     вычислить &amp;lt;math&amp;gt;a_{jj} = (G^TG)_{jj}, a_{jk} = (G^TG)_{jk}&amp;lt;/math&amp;gt; и &amp;lt;math&amp;gt;a_{kk} = (G^TG)_{kk}&amp;lt;/math&amp;gt;&lt;br /&gt;
     if &amp;lt;math&amp;gt;|a_{jk}|&amp;lt;/math&amp;gt; не слишком мал&lt;br /&gt;
         &amp;lt;math&amp;gt;&lt;br /&gt;
         \begin{align}&lt;br /&gt;
         \tau &amp;amp;= ({a_{jj} - a_{kk}})/{2a_{jk}} \\&lt;br /&gt;
         t &amp;amp;= {sign(\tau)}/(|\tau| + \sqrt{1 + \tau^2}) \\&lt;br /&gt;
         c &amp;amp;= 1/(\sqrt{1 + t^2}) \\&lt;br /&gt;
         s &amp;amp;= ct \\&lt;br /&gt;
         G &amp;amp;= GR(j,k,\theta) \  \dots c=cos\theta, s=sin\theta \end{align}&amp;lt;/math&amp;gt;&lt;br /&gt;
         if нужны правые сингулярные векторы &lt;br /&gt;
             &amp;lt;math&amp;gt;J = JR(j,k,\theta)&amp;lt;/math&amp;gt;&lt;br /&gt;
         end if&lt;br /&gt;
     end if&lt;br /&gt;
&lt;br /&gt;
=== Последовательная сложность алгоритма ===&lt;br /&gt;
Для одного вращения Якоби необходимо выполнить &amp;lt;math&amp;gt;O(n)&amp;lt;/math&amp;gt; операций умножения и сложения. &lt;br /&gt;
&lt;br /&gt;
Всего вариантов выбора &amp;lt;math&amp;gt;j&amp;lt;/math&amp;gt; и &amp;lt;math&amp;gt;k&amp;lt;/math&amp;gt; существует &amp;lt;math&amp;gt;\frac{n(n-1)}{2}&amp;lt;/math&amp;gt;.&lt;br /&gt;
&lt;br /&gt;
Таким образом последовательный алгоритм Якоби вычисления сингулярных чисел и векторов является алгоритмом с кубической сложностью.&lt;br /&gt;
&lt;br /&gt;
=== Информационный граф ===&lt;br /&gt;
Граф алгоритма состоит из четырех групп вершин&lt;br /&gt;
&lt;br /&gt;
(А)Первая группа вершин расположена в двумерной области, соответствующая ей операция - вычисление элементов &amp;lt;math&amp;gt;a_{jj},a_{jk},a_{kk}&amp;lt;/math&amp;gt; матрицы произведения &amp;lt;math&amp;gt;A = (G^TG)&amp;lt;/math&amp;gt;. Где &amp;lt;math&amp;gt;j&amp;lt;/math&amp;gt; изменяется от &amp;lt;math&amp;gt;1&amp;lt;/math&amp;gt; до &amp;lt;math&amp;gt;n-1&amp;lt;/math&amp;gt;, принимая все целочисленные значения, &amp;lt;math&amp;gt;k&amp;lt;/math&amp;gt;  изменяется от &amp;lt;math&amp;gt;j+1&amp;lt;/math&amp;gt; до &amp;lt;math&amp;gt;n&amp;lt;/math&amp;gt;, принимая все целочисленные значения.&lt;br /&gt;
&lt;br /&gt;
Граф вычисления каждого из элементов приведен на рисунке 1, где значениям &amp;lt;math&amp;gt;g_{ij}&amp;lt;/math&amp;gt; соответствуют обозначения &amp;lt;math&amp;gt;x_{ij}&amp;lt;/math&amp;gt;, а элементам &amp;lt;math&amp;gt;g^T_{ij}&amp;lt;/math&amp;gt; обозначения &amp;lt;math&amp;gt;z_{ij}&amp;lt;/math&amp;gt;. Значение &amp;lt;math&amp;gt;s_{ij}&amp;lt;/math&amp;gt; является значением результирующего элемента.&lt;br /&gt;
&lt;br /&gt;
(Б)Вторая группа вершин расположена в двумерной области, соответствующая ей операция – вычисление &amp;lt;math&amp;gt;c&amp;lt;/math&amp;gt; и &amp;lt;math&amp;gt;s&amp;lt;/math&amp;gt;.&lt;br /&gt;
&lt;br /&gt;
Информационный граф с входными и выходными данными вычисления пункта (Б) представлен на рисунке 2.&lt;br /&gt;
&lt;br /&gt;
(В)Третья группа вершин расположена в двумерной области, соответствующая ей операция вычисление значений элементов &amp;lt;math&amp;gt;g_{jm}^{(i+1)} = g_{mj}^{(i+1)}&amp;lt;/math&amp;gt; и &amp;lt;math&amp;gt;g_{km}^{(i+1)} = g_{mk}^{(i+1)}&amp;lt;/math&amp;gt;, &amp;lt;math&amp;gt;m \ne j,k&amp;lt;/math&amp;gt;.&lt;br /&gt;
&lt;br /&gt;
(Г)Четвертая группа вершин расположена в двумерной области, соответствующая ей операция вычисление значений элементов &amp;lt;math&amp;gt;g_{jj}^{(i+1)} &amp;lt;/math&amp;gt; и &amp;lt;math&amp;gt;g_{kk}^{(i+1)} &amp;lt;/math&amp;gt;.&lt;br /&gt;
&lt;br /&gt;
Элементы групп (В) и (Г) вычисляются аналогично вычислению элементов матрицы произведения, т.к. фактически представляют собой перемножение матриц &amp;lt;math&amp;gt;G&amp;lt;/math&amp;gt; и &amp;lt;math&amp;gt;R&amp;lt;/math&amp;gt;&lt;br /&gt;
&lt;br /&gt;
[[File:Jacobi_2.jpg|none|thumb|1000px|Рисунок 1. Информационный граф с входными и выходными параметрами вычисления каждого элемента матрицы произведения.]]&lt;br /&gt;
&lt;br /&gt;
[[File:Jacobi_1.jpg|none|thumb|1000px|Рисунок 2. Информационный граф с входными и выходными параметрами вычисления значений &amp;lt;math&amp;gt;c&amp;lt;/math&amp;gt; и &amp;lt;math&amp;gt;s&amp;lt;/math&amp;gt;.]]&lt;br /&gt;
&lt;br /&gt;
Обобщенный граф метода Якоби представлен на рисунке 3, где буквами А, Б, В и Г обозначено вычисление групп вершин (А), (Б), (В) и (Г).&lt;br /&gt;
&lt;br /&gt;
[[File:Graf21.png|none|thumb|2000px|Рисунок 3. Обобщенный граф алгоритма вычисления сингулярных чисел и векторов методом Якоби.]]&lt;br /&gt;
&lt;br /&gt;
=== Ресурс параллелизма алгоритма ===&lt;br /&gt;
Для выполнения одной итерации метода Якоби требуется последовательно выполнить несколько ярусов:&lt;br /&gt;
# вычислить &amp;lt;math&amp;gt;\tau&amp;lt;/math&amp;gt; &lt;br /&gt;
# вычислить &amp;lt;math&amp;gt;t&amp;lt;/math&amp;gt; &lt;br /&gt;
# вычислить &amp;lt;math&amp;gt;c&amp;lt;/math&amp;gt; &lt;br /&gt;
# вычислить &amp;lt;math&amp;gt;s&amp;lt;/math&amp;gt;&lt;br /&gt;
# выполнить поворот матрицы &amp;lt;math&amp;gt;G&amp;lt;/math&amp;gt; с параллельным выполнением &amp;lt;math&amp;gt;2(n-2)&amp;lt;/math&amp;gt; операций вычисления элементов матрицы &amp;lt;math&amp;gt;g_{jm}^{(i+1)} = g_{mj}^{(i+1)}&amp;lt;/math&amp;gt; и &amp;lt;math&amp;gt;g_{km}^{(i+1)} = g_{mk}^{(i+1)}&amp;lt;/math&amp;gt;, &amp;lt;math&amp;gt;m \ne j,k&amp;lt;/math&amp;gt;, а также вычисления элементов &amp;lt;math&amp;gt;g_{jj}^{(i+1)} &amp;lt;/math&amp;gt; и &amp;lt;math&amp;gt;g_{kk}^{(i+1)} &amp;lt;/math&amp;gt;. &lt;br /&gt;
&lt;br /&gt;
Суммарное количество итераций равно &amp;lt;math&amp;gt;\frac{n(n-1)}{2}&amp;lt;/math&amp;gt; (Различные варианты выбора &amp;lt;math&amp;gt;j&amp;lt;/math&amp;gt; и &amp;lt;math&amp;gt;k&amp;lt;/math&amp;gt;). &lt;br /&gt;
&lt;br /&gt;
Асимптотически метод сходится квадратично. &lt;br /&gt;
&lt;br /&gt;
Таким образом, при классификации по высоте ЯПФ метод Якоби относится к алгоритмам со сложностью &amp;lt;math&amp;gt;O(n^2)&amp;lt;/math&amp;gt;&amp;amp;nbsp;, а при классификации по ширине ЯПФ — к алгоритмам со сложностью &amp;lt;math&amp;gt;O(n)&amp;lt;/math&amp;gt;.&lt;br /&gt;
&lt;br /&gt;
=== Входные и выходные данные алгоритма ===&lt;br /&gt;
&#039;&#039;&#039;Входные данные&#039;&#039;&#039;: плотная матрица &amp;lt;math&amp;gt;G&amp;lt;/math&amp;gt; размера &amp;lt;math&amp;gt;n&amp;lt;/math&amp;gt;х&amp;lt;math&amp;gt;n&amp;lt;/math&amp;gt;, где &amp;lt;math&amp;gt;A= G^TG&amp;lt;/math&amp;gt; – симметрическая матрица.&lt;br /&gt;
&lt;br /&gt;
&#039;&#039;&#039;Объём входных данных&#039;&#039;&#039;: &amp;lt;math&amp;gt;n^2&amp;lt;/math&amp;gt; (т.к. для хранения матрицы &amp;lt;math&amp;gt;G&amp;lt;/math&amp;gt; используем двумерный массив размера &amp;lt;math&amp;gt;n&amp;lt;/math&amp;gt;х&amp;lt;math&amp;gt;n&amp;lt;/math&amp;gt;)&lt;br /&gt;
&lt;br /&gt;
&#039;&#039;&#039;Выходные данные&#039;&#039;&#039;: &amp;lt;math&amp;gt;\sigma_{i}&amp;lt;/math&amp;gt;  - сингулярные числа, матрица &amp;lt;math&amp;gt;U&amp;lt;/math&amp;gt; левых сингулярных векторов и матрица &amp;lt;math&amp;gt;V&amp;lt;/math&amp;gt; правых сингулярных векторов.&lt;br /&gt;
&lt;br /&gt;
&#039;&#039;&#039;Объём выходных данных&#039;&#039;&#039;: &amp;lt;math&amp;gt;2n^2 + n&amp;lt;/math&amp;gt; (т.к. необходимо хранить вектор сингулярных чисел длины &amp;lt;math&amp;gt;n&amp;lt;/math&amp;gt;, а также две матрицы &amp;lt;math&amp;gt;U, V&amp;lt;/math&amp;gt; левых и правых сингулярных векторов размера &amp;lt;math&amp;gt;n&amp;lt;/math&amp;gt;х&amp;lt;math&amp;gt;n&amp;lt;/math&amp;gt;).&lt;br /&gt;
&lt;br /&gt;
=== Свойства алгоритма ===&lt;br /&gt;
Метод Якоби является самым медленным из имеющихся алгоритмов вычисления сингулярных чисел и сингулярных векторов матрицы. Тем не менее, для  матриц &amp;lt;math&amp;gt;G&amp;lt;/math&amp;gt;, которые могут быть представлены в виде &amp;lt;math&amp;gt;G=DX&amp;lt;/math&amp;gt;, где &amp;lt;math&amp;gt;D&amp;lt;/math&amp;gt; - диагональная, а &amp;lt;math&amp;gt;X&amp;lt;/math&amp;gt; - хорошо обусловлена, он способен вычислять сингулярные числа и вектора намного точнее, чем другие методы&amp;lt;ref&amp;gt;Дж. Деммель «Вычислительная линейная алгебра» (стр. 261-264)&amp;lt;/ref&amp;gt;. &lt;br /&gt;
&lt;br /&gt;
Вычислительная мощность алгоритма, как отношение числа операций к суммарному объему входных и выходных данных является линейной.&lt;br /&gt;
&lt;br /&gt;
Метод Якоби не детерминирован, так как является итерационным алгоритмом с выходом по точности (число итераций зависит от входных данных и порогового значения).&lt;br /&gt;
&lt;br /&gt;
== Программная реализация алгоритма ==&lt;br /&gt;
&lt;br /&gt;
=== Особенности реализации последовательного алгоритма ===&lt;br /&gt;
&lt;br /&gt;
=== Локальность данных и вычислений ===&lt;br /&gt;
&lt;br /&gt;
=== Возможные способы и особенности параллельной реализации алгоритма ===&lt;br /&gt;
&lt;br /&gt;
=== Масштабируемость алгоритма и его реализации ===&lt;br /&gt;
Исследование масштабируемости параллельной реализации метода Якоби вычисления сингулярных чисел и векторов проводилось на суперкомпьютере &amp;quot;Ломоносов&amp;quot;. Алгоритм реализован на языке программирования C с использованием механизмов MPI.&lt;br /&gt;
&lt;br /&gt;
Алгоритм работает по следующей схеме:&lt;br /&gt;
#На вход всем процессорам подается матрица &amp;lt;math&amp;gt; G &amp;lt;/math&amp;gt;.&lt;br /&gt;
#Вычисляется элемент &amp;lt;math&amp;gt; a_{jk} &amp;lt;/math&amp;gt; путем перемножения матриц &amp;lt;math&amp;gt; G^TG &amp;lt;/math&amp;gt;, где на каждом процессоре вычисляется своя часть матрицы. После чего результат отправляется на все процессоры.&lt;br /&gt;
#Если полученный элемент оказывается больше некоторого значения, то начинается последовательная часть программы:Вычисление элементов &amp;lt;math&amp;gt; \tau, t, c, s &amp;lt;/math&amp;gt;.&lt;br /&gt;
#Затем, выполняется операция поворота, путем перемножения матриц &amp;lt;math&amp;gt; G*R &amp;lt;/math&amp;gt;. Данная операция выполняется параллельно на нескольких процессорах, где каждый процессор вычисляет свою часть матрицы. После чего результат пересылается всем процессорам.&lt;br /&gt;
&lt;br /&gt;
Данная схема повторяется до тех пор, пока матрица &amp;lt;math&amp;gt; A = G^T*G &amp;lt;/math&amp;gt; не станет достаточно близкой к диагональной.&lt;br /&gt;
&lt;br /&gt;
Для проверки этого факта, в конце каждой итерации цикла вычисляется матрица &amp;lt;math&amp;gt; A = G^T*G &amp;lt;/math&amp;gt;. Данная операция выполняется параллельно на нескольких процессорах, где каждый процессор вычисляет свою часть матрицы, после чего результат пересылается всем процессорам.&lt;br /&gt;
&lt;br /&gt;
&lt;br /&gt;
Набор и границы значений изменяемых параметров запуска реализации алгоритма: &lt;br /&gt;
&lt;br /&gt;
*	число процессоров [1 : 128] с шагом равным степени двойки;&lt;br /&gt;
*	размер матрицы [256 : 1792] с шагом 256.&lt;br /&gt;
&lt;br /&gt;
В результате проведённых экспериментов был получен следующий диапазон эффективности реализации алгоритма:&lt;br /&gt;
&lt;br /&gt;
*	минимальная эффективность реализации ;&lt;br /&gt;
*	максимальная эффективность реализации .&lt;br /&gt;
&lt;br /&gt;
На следующих рисунках приведены графики производительности и эффективности выбранной реализации метода Якоби в зависимости от изменяемых параметров запуска.&lt;br /&gt;
&lt;br /&gt;
[[File:Performance.jpg|none|thumb|1000px|Рисунок 1. Параллельная реализация метода Якоби. Изменение производительности в зависимости от числа процессоров и размера матрицы.]]&lt;br /&gt;
&lt;br /&gt;
=== Динамические характеристики и эффективность реализации алгоритма ===&lt;br /&gt;
&lt;br /&gt;
=== Выводы для классов архитектур ===&lt;br /&gt;
&lt;br /&gt;
=== Существующие реализации алгоритма ===&lt;br /&gt;
Метод Якоби нахождения сингулярных значений и векторов реализован в таких пакетах, как LAPACK &amp;lt;ref&amp;gt;http://www.netlib.org/scalapack/slug/&amp;lt;/ref&amp;gt;, LINPACK/EISPACK &amp;lt;ref&amp;gt; http://www.netlib.org/linpack/ &amp;lt;/ref&amp;gt;, Intel MKL &amp;lt;ref&amp;gt;https://software.intel.com/ru-ru/node/521153#CAF8CA08-1C69-48F8-B0C3-B2B27AFA92FA&amp;lt;/ref&amp;gt;.&lt;br /&gt;
&lt;br /&gt;
Так же функция Якоби реализована в пакете Matlab.&lt;br /&gt;
&lt;br /&gt;
Т. к. алгоритм считается медленным, он не включен во многие известные пакеты.&lt;br /&gt;
&lt;br /&gt;
== Литература ==&lt;br /&gt;
1. Дж. Деммель Вычислительная линейная алгебра. Изд. Мир, 2001.&lt;/div&gt;</summary>
		<author><name>Davletshuna Alexandra</name></author>
	</entry>
	<entry>
		<id>https://xn--80aecvaldz.xn--80ahdrnmvk.xn--p1ai/w/ru/index.php?title=%D0%A3%D1%87%D0%B0%D1%81%D1%82%D0%BD%D0%B8%D0%BA:Davletshuna_Alexandra/%D0%9C%D0%B5%D1%82%D0%BE%D0%B4_%D0%AF%D0%BA%D0%BE%D0%B1%D0%B8_%D0%B2%D1%8B%D1%87%D0%B8%D1%81%D0%BB%D0%B5%D0%BD%D0%B8%D1%8F_%D1%81%D0%B8%D0%BD%D0%B3%D1%83%D0%BB%D1%8F%D1%80%D0%BD%D1%8B%D1%85_%D1%87%D0%B8%D1%81%D0%B5%D0%BB_%D0%B8_%D0%B2%D0%B5%D0%BA%D1%82%D0%BE%D1%80%D0%BE%D0%B2&amp;diff=17898</id>
		<title>Участник:Davletshuna Alexandra/Метод Якоби вычисления сингулярных чисел и векторов</title>
		<link rel="alternate" type="text/html" href="https://xn--80aecvaldz.xn--80ahdrnmvk.xn--p1ai/w/ru/index.php?title=%D0%A3%D1%87%D0%B0%D1%81%D1%82%D0%BD%D0%B8%D0%BA:Davletshuna_Alexandra/%D0%9C%D0%B5%D1%82%D0%BE%D0%B4_%D0%AF%D0%BA%D0%BE%D0%B1%D0%B8_%D0%B2%D1%8B%D1%87%D0%B8%D1%81%D0%BB%D0%B5%D0%BD%D0%B8%D1%8F_%D1%81%D0%B8%D0%BD%D0%B3%D1%83%D0%BB%D1%8F%D1%80%D0%BD%D1%8B%D1%85_%D1%87%D0%B8%D1%81%D0%B5%D0%BB_%D0%B8_%D0%B2%D0%B5%D0%BA%D1%82%D0%BE%D1%80%D0%BE%D0%B2&amp;diff=17898"/>
		<updated>2016-11-17T12:31:40Z</updated>

		<summary type="html">&lt;p&gt;Davletshuna Alexandra: /* Масштабируемость алгоритма и его реализации */&lt;/p&gt;
&lt;hr /&gt;
&lt;div&gt;{{algorithm&lt;br /&gt;
| name              = Метод Якоби вычисления сингулярных чисел и векторов&lt;br /&gt;
| serial_complexity = &amp;lt;math&amp;gt;O(n^3)&amp;lt;/math&amp;gt;&lt;br /&gt;
| pf_height         = &amp;lt;math&amp;gt;O(n^2)&amp;lt;/math&amp;gt;&lt;br /&gt;
| pf_width          = &amp;lt;math&amp;gt;O(n)&amp;lt;/math&amp;gt;&lt;br /&gt;
| input_data        = &amp;lt;math&amp;gt;n^2&amp;lt;/math&amp;gt;&lt;br /&gt;
| output_data       = &amp;lt;math&amp;gt;2n^2 + n&amp;lt;/math&amp;gt;&lt;br /&gt;
}}&lt;br /&gt;
&lt;br /&gt;
Авторы статьи: [[Участница:Davletshuna Alexandra|Давлетшина Александра]] (группа 619) пункты 1.1-1.4, 1.6, 2.7; [[Участница:Alek sandra|Зайцева Александра]] (группа 601) пункты 1.5, 1.7-1.10, 2.7.&lt;br /&gt;
&lt;br /&gt;
== Свойства и структура алгоритма ==&lt;br /&gt;
&lt;br /&gt;
=== Общее описание алгоритма ===&lt;br /&gt;
&#039;&#039;&#039;Сингулярным разложением&#039;&#039;&#039; называется разложение прямоугольной вещественной или комплексной матрицы, имеющее широкое применение, в силу своей наглядной геометрической интерпретации, при решении многих прикладных задач. Сингулярное разложение матрицы А позволяет вычислять сингулярные числа данной матрицы, а также, левые и правые сингулярные векторы матрицы А:&lt;br /&gt;
&lt;br /&gt;
•	левые сингулярные векторы матрицы А — это собственные векторы матрицы &amp;lt;math&amp;gt;AA^*&amp;lt;/math&amp;gt;;&lt;br /&gt;
&lt;br /&gt;
•	правые сингулярные векторы матрицы A — это собственные векторы матрицы &amp;lt;math&amp;gt;A^*A&amp;lt;/math&amp;gt;.&lt;br /&gt;
&lt;br /&gt;
Геометрическая интерпретация сингулярного разложения заключается в следующем факте из геометрии: &#039;&#039;Образом любого линейного преобразования, заданного с помощью матрицы &amp;lt;math&amp;gt;m&amp;lt;/math&amp;gt;x&amp;lt;math&amp;gt;n&amp;lt;/math&amp;gt;, примененного к единичной сфере является гиперэллипсоид&#039;&#039;.&lt;br /&gt;
&lt;br /&gt;
Из многочисленных разложений матриц, наиболее удобным является сингулярное разложение матрицы в виде: &amp;lt;math&amp;gt;A=U\Sigma V^*&amp;lt;/math&amp;gt;, где &amp;lt;math&amp;gt;U, V&amp;lt;/math&amp;gt; – унитарные матрицы, а &amp;lt;math&amp;gt;\Sigma&amp;lt;/math&amp;gt; – диагональная матрица с вещественными положительными числами на диагонали &amp;lt;ref&amp;gt;http://algorithms.parallel.ru/&amp;lt;/ref&amp;gt;.&lt;br /&gt;
&lt;br /&gt;
Диагональные элементы матрицы &amp;lt;math&amp;gt;\Sigma&amp;lt;/math&amp;gt; называются сингулярными числами матрицы &amp;lt;math&amp;gt;A&amp;lt;/math&amp;gt;, а столбцы матриц &amp;lt;math&amp;gt;U,V&amp;lt;/math&amp;gt; левыми и правыми сингулярными векторами соответственно.&lt;br /&gt;
&lt;br /&gt;
Алгоритм Якоби сингулярного разложения матрицы был предложен одним из первых в 1846 году. Он приводит прямоугольную матрицу к диагональной матрице с помощью последовательности элементарных вращений. Метод может найти все сингулярные значения с очень высокой точностью. Однако его производительность является довольно низкой, в сравнении с конкурирующими методами.&lt;br /&gt;
&lt;br /&gt;
&#039;&#039;Неявный&#039;&#039;&amp;lt;ref&amp;gt;Дж. Деммель «Вычислительная линейная алгебра» (стр. 261-264)&amp;lt;/ref&amp;gt; метод Якоби математически эквивалентен применению метода Якоби вычисления собственных значений к матрице &amp;lt;math&amp;gt;A = G^TG&amp;lt;/math&amp;gt;.&lt;br /&gt;
Это значит, что на каждом шаге вычисляется вращение Якоби &amp;lt;math&amp;gt;J&amp;lt;/math&amp;gt;, с помощью которого матрица &amp;lt;math&amp;gt;G^TG&amp;lt;/math&amp;gt; неявно пересчитывется в &amp;lt;math&amp;gt;J^TG^TGJ&amp;lt;/math&amp;gt;; вращение выбрано так, чтобы пара внедиагональных элементов из &amp;lt;math&amp;gt;G^TG&amp;lt;/math&amp;gt; обратилась в нули в матрице &amp;lt;math&amp;gt;J^TG^TGJ&amp;lt;/math&amp;gt;. При этом ни &amp;lt;math&amp;gt;G^TG&amp;lt;/math&amp;gt;, ни &amp;lt;math&amp;gt;J^TG^TGJ&amp;lt;/math&amp;gt; не вычисляются в явном виде; вместо них вычисляется матрица &amp;lt;math&amp;gt;GJ&amp;lt;/math&amp;gt;. Поэтому алгоритм называется &#039;&#039;методом односторонних вращений&#039;&#039;.&lt;br /&gt;
&lt;br /&gt;
=== Математическое описание алгоритма ===&lt;br /&gt;
Исходные данные: матрица &amp;lt;math&amp;gt;G&amp;lt;/math&amp;gt; (элементы &amp;lt;math&amp;gt;g_{ij}, i, j = 1, \ldots, n&amp;lt;/math&amp;gt;).&lt;br /&gt;
&lt;br /&gt;
Вычисляемые данные: матрица &amp;lt;math&amp;gt;\Sigma = diag(\sigma_{i})&amp;lt;/math&amp;gt;, где &amp;lt;math&amp;gt;\sigma_{i}&amp;lt;/math&amp;gt; - сингулярные числа, &amp;lt;math&amp;gt;U&amp;lt;/math&amp;gt; - матрица левых сингулярных векторов, &amp;lt;math&amp;gt;V&amp;lt;/math&amp;gt; - матрица правых сингулярных векторов.&lt;br /&gt;
&lt;br /&gt;
симметричную матрицу &amp;lt;math&amp;gt;A = (G^TG)&amp;lt;/math&amp;gt; можно привести к диагональному виду:&lt;br /&gt;
&amp;lt;math&amp;gt;RG^TGR^T&amp;lt;/math&amp;gt;, где&lt;br /&gt;
&lt;br /&gt;
&amp;lt;math&amp;gt;&lt;br /&gt;
R(j,k,\theta) = &lt;br /&gt;
\begin{matrix}&lt;br /&gt;
  \\&lt;br /&gt;
  \\&lt;br /&gt;
  \\&lt;br /&gt;
j \\&lt;br /&gt;
  \\&lt;br /&gt;
k \\&lt;br /&gt;
  \\&lt;br /&gt;
  \\&lt;br /&gt;
  \\&lt;br /&gt;
\end{matrix}&lt;br /&gt;
&amp;lt;/math&amp;gt;  &lt;br /&gt;
&amp;lt;math&amp;gt;&lt;br /&gt;
\begin{bmatrix}&lt;br /&gt;
  &amp;amp; 1 &amp;amp;   &amp;amp;        &amp;amp;              &amp;amp;        &amp;amp;               &amp;amp;         &amp;amp;    &amp;amp;   \\&lt;br /&gt;
  &amp;amp;   &amp;amp; 1 &amp;amp;        &amp;amp;              &amp;amp;        &amp;amp;               &amp;amp;         &amp;amp;    &amp;amp;   \\&lt;br /&gt;
  &amp;amp;   &amp;amp;   &amp;amp; \ddots &amp;amp;              &amp;amp;        &amp;amp;               &amp;amp;         &amp;amp;    &amp;amp;   \\&lt;br /&gt;
  &amp;amp;   &amp;amp;   &amp;amp;        &amp;amp; \cos(\theta) &amp;amp;        &amp;amp; -\sin(\theta) &amp;amp;         &amp;amp;    &amp;amp;   \\&lt;br /&gt;
  &amp;amp;   &amp;amp;   &amp;amp;        &amp;amp;              &amp;amp; \ddots &amp;amp;               &amp;amp;         &amp;amp;    &amp;amp;   \\&lt;br /&gt;
  &amp;amp;   &amp;amp;   &amp;amp;        &amp;amp; \sin(\theta) &amp;amp;        &amp;amp; \cos(\theta)  &amp;amp;         &amp;amp;    &amp;amp;   \\&lt;br /&gt;
  &amp;amp;   &amp;amp;   &amp;amp;        &amp;amp;              &amp;amp;        &amp;amp;               &amp;amp; \ddots  &amp;amp;    &amp;amp;   \\&lt;br /&gt;
  &amp;amp;   &amp;amp;   &amp;amp;        &amp;amp;              &amp;amp;        &amp;amp;               &amp;amp;         &amp;amp; 1  &amp;amp;   \\&lt;br /&gt;
  &amp;amp;   &amp;amp;   &amp;amp;        &amp;amp;              &amp;amp;        &amp;amp;               &amp;amp;         &amp;amp;    &amp;amp; 1 \\&lt;br /&gt;
\end{bmatrix}&lt;br /&gt;
&amp;lt;/math&amp;gt;&lt;br /&gt;
&lt;br /&gt;
Обозначим &amp;lt;math&amp;gt;s = \sin \theta&amp;lt;/math&amp;gt; и &amp;lt;math&amp;gt;c = \cos \theta&amp;lt;/math&amp;gt;.&lt;br /&gt;
&lt;br /&gt;
Перемножив матрицы &amp;lt;math&amp;gt;RG^TGR^T&amp;lt;/math&amp;gt;, получим следующие выражения&amp;lt;ref&amp;gt;http://www.astro.tsu.ru/OsChMet/5_2.html&amp;lt;/ref&amp;gt;:&lt;br /&gt;
&lt;br /&gt;
&amp;lt;math&amp;gt;\begin{align}&lt;br /&gt;
 a_{jj}^{(i+1)} &amp;amp;= c^2\, a_{jj}^{(i)}  -  2\, s c \,a_{jk}^{(i)}  +  s^2\, a_{kk}^{(i)} \\&lt;br /&gt;
 a_{kk}^{(i+1)} &amp;amp;= s^2 \,a_{jj}^{(i)}  +  2 s c\, a_{jk}^{(i)}  +  c^2 \, a_{kk}^{(i)} \\&lt;br /&gt;
 a_{jk}^{(i+1)} &amp;amp;= a_{kj}^{(i+1)} = (c^2 - s^2 ) \, a_{jk}^{(i)}  +  s c \, (a_{kk}^{(i)} - a_{jj}^{(i)} ) \\&lt;br /&gt;
 a_{jm}^{(i+1)} &amp;amp;= a_{mj}^{(i+1)} = c \, a_{jm}^{(i)}  -  s \, a_{km}^{(i)} &amp;amp; m \ne j,k \\&lt;br /&gt;
 a_{km}^{(i+1)} &amp;amp;= a_{mk}^{(i+1)} = s \, a_{jm}^{(i)}  + c \, a_{km}^{(i)} &amp;amp; m \ne j,k \\&lt;br /&gt;
 a_{ml}^{(i+1)} &amp;amp;= a_{ml}^{(i)} &amp;amp;m,l \ne j,k&lt;br /&gt;
\end{align}&amp;lt;/math&amp;gt;&lt;br /&gt;
&lt;br /&gt;
Т.к внедиагональные элементы должны быть равны 0, то выбираем &amp;lt;math&amp;gt;\theta&amp;lt;/math&amp;gt; так, чтобы &amp;lt;math&amp;gt;a_{jk}^{(i+1)} = 0&amp;lt;/math&amp;gt; и &amp;lt;math&amp;gt;a_{kj}^{(i+1)} = 0&amp;lt;/math&amp;gt;.&lt;br /&gt;
&lt;br /&gt;
Тогда решая уравнение получаем, что&lt;br /&gt;
&lt;br /&gt;
&amp;lt;math&amp;gt;&lt;br /&gt;
         \begin{align}&lt;br /&gt;
         \tau &amp;amp;= ({a_{jj} - a_{kk}})/{2a_{jk}} \\&lt;br /&gt;
         t &amp;amp;= {sign(\tau)}/(|\tau| + \sqrt{1 + \tau^2}) \\&lt;br /&gt;
         c &amp;amp;= 1/(\sqrt{1 + t^2}) \\&lt;br /&gt;
         s &amp;amp;= ct \\&lt;br /&gt;
         \end{align}&amp;lt;/math&amp;gt;&lt;br /&gt;
&lt;br /&gt;
Остановка вычислений алгоритма наступает, когда внедиагональные элементы становятся меньше некоторого наперед заданного числа &amp;lt;math&amp;gt;\varepsilon&amp;lt;/math&amp;gt;.&lt;br /&gt;
&lt;br /&gt;
=== Вычислительное ядро алгоритма ===&lt;br /&gt;
Вычислительное ядро алгоритма составляет непосредственно вычисление одностороннего вращения Якоби, т.е. вычисление элементов матрицы &amp;lt;math&amp;gt;g_{jm}^{(i+1)} = g_{mj}^{(i+1)}&amp;lt;/math&amp;gt; и &amp;lt;math&amp;gt;g_{km}^{(i+1)} = g_{mk}^{(i+1)}&amp;lt;/math&amp;gt;, &amp;lt;math&amp;gt;m \ne j,k&amp;lt;/math&amp;gt;, а также вычисления элементов &amp;lt;math&amp;gt;g_{jj}^{(i+1)} &amp;lt;/math&amp;gt; и &amp;lt;math&amp;gt;g_{kk}^{(i+1)} &amp;lt;/math&amp;gt;, получившихся после умножения промежуточной матрицы на матрицу вращений Якоби:&lt;br /&gt;
&lt;br /&gt;
&amp;lt;math&amp;gt;\begin{align}&lt;br /&gt;
 g_{jj}^{(i+1)} &amp;amp;= c^2\, g_{jj}^{(i)}  -  2\, s c \,g_{jk}^{(i)}  +  s^2\, g_{kk}^{(i)} \\&lt;br /&gt;
 g_{kk}^{(i+1)} &amp;amp;= s^2 \,g_{jj}^{(i)}  +  2 s c\, g_{jk}^{(i)}  +  c^2 \, g_{kk}^{(i)} \\&lt;br /&gt;
 g_{jk}^{(i+1)} &amp;amp;= g_{kj}^{(i+1)} = (c^2 - s^2 ) \, g_{jk}^{(i)}  +  s c \, (g_{kk}^{(i)} - g_{jj}^{(i)} ) \\&lt;br /&gt;
 g_{jm}^{(i+1)} &amp;amp;= g_{mj}^{(i+1)} = c \, g_{jm}^{(i)}  -  s \, g_{km}^{(i)} &amp;amp; m \ne j,k \\&lt;br /&gt;
 g_{km}^{(i+1)} &amp;amp;= g_{mk}^{(i+1)} = s \, g_{jm}^{(i)}  + c \, g_{km}^{(i)} &amp;amp; m \ne j,k \\&lt;br /&gt;
 g_{ml}^{(i+1)} &amp;amp;= g_{ml}^{(i)} &amp;amp;m,l \ne j,k&lt;br /&gt;
\end{align}&amp;lt;/math&amp;gt;&lt;br /&gt;
&lt;br /&gt;
=== Макроструктура алгоритма ===&lt;br /&gt;
Основную часть метода составляет процедура односторонних вращений матрицы, которая в свою очередь состоит из:&lt;br /&gt;
&lt;br /&gt;
#Вычисление &amp;lt;math&amp;gt;\tau, c, s, t&amp;lt;/math&amp;gt;.&lt;br /&gt;
#Одностороннее вращение матрицы. &lt;br /&gt;
&lt;br /&gt;
Что требует &amp;lt;math&amp;gt;O(n)&amp;lt;/math&amp;gt; операций.&lt;br /&gt;
&lt;br /&gt;
После этого необходимо:&lt;br /&gt;
&lt;br /&gt;
#Вычислить сингулярные числа &amp;lt;math&amp;gt;\sigma_i&amp;lt;/math&amp;gt;.  Что требует &amp;lt;math&amp;gt;O(n)&amp;lt;/math&amp;gt; операций.&lt;br /&gt;
#Вычислить &amp;lt;math&amp;gt;U&amp;lt;/math&amp;gt; и &amp;lt;math&amp;gt;V&amp;lt;/math&amp;gt;. Что требует &amp;lt;math&amp;gt;O(n^2)&amp;lt;/math&amp;gt; операций.&lt;br /&gt;
&lt;br /&gt;
=== Схема реализации последовательного алгоритма ===&lt;br /&gt;
Применение метода Якоби к матрице &amp;lt;math&amp;gt;A = (G^TG)&amp;lt;/math&amp;gt; можно описать следующим образом&amp;lt;ref&amp;gt;Дж. Деммель «Вычислительная линейная алгебра» (стр. 261-263)&amp;lt;/ref&amp;gt;:&lt;br /&gt;
&lt;br /&gt;
Если &amp;lt;math&amp;gt;G = U\Sigma V^T&amp;lt;/math&amp;gt; и &amp;lt;math&amp;gt;\Sigma = diag(\sigma_{i})&amp;lt;/math&amp;gt;, то алгоритм вычисляет сингулярные числа &amp;lt;math&amp;gt;\sigma_{i}&amp;lt;/math&amp;gt;, матрицу &amp;lt;math&amp;gt;U&amp;lt;/math&amp;gt; левых сингулярных векторов и матрицу &amp;lt;math&amp;gt;V&amp;lt;/math&amp;gt; правых сингулярных векторов по следующей схеме:&lt;br /&gt;
&lt;br /&gt;
 repeat&lt;br /&gt;
     for &amp;lt;math&amp;gt;j=1&amp;lt;/math&amp;gt; to &amp;lt;math&amp;gt;n-1&amp;lt;/math&amp;gt;&lt;br /&gt;
         for &amp;lt;math&amp;gt;k=j+1&amp;lt;/math&amp;gt; to &amp;lt;math&amp;gt;n&amp;lt;/math&amp;gt;&lt;br /&gt;
             обратиться к процедуре &#039;&#039;&#039;&#039;&#039;One-Sided-Jacobi-Rotation&amp;lt;math&amp;gt;(G,j,k)&amp;lt;/math&amp;gt;&#039;&#039;&#039;&#039;&#039;&lt;br /&gt;
         end for&lt;br /&gt;
     end for&lt;br /&gt;
 пока &amp;lt;math&amp;gt;G^TG&amp;lt;/math&amp;gt; не станет достаточно близка к диагональной матрице&lt;br /&gt;
 Положить &amp;lt;math&amp;gt;\sigma_{i} = ||G(:,i)||_2 &amp;lt;/math&amp;gt; (норма &amp;lt;math&amp;gt;i&amp;lt;/math&amp;gt;-го столбца в &amp;lt;math&amp;gt;G&amp;lt;/math&amp;gt;)&lt;br /&gt;
 Положить &amp;lt;math&amp;gt;U = [u_{1},\dots, u_{n}]&amp;lt;/math&amp;gt;, где &amp;lt;math&amp;gt;u_{i} = G(:,i)/\sigma_{i}&amp;lt;/math&amp;gt;&lt;br /&gt;
 Положить &amp;lt;math&amp;gt;V = J&amp;lt;/math&amp;gt;, где &amp;lt;math&amp;gt;J&amp;lt;/math&amp;gt; - накопленное произведение вращений Якоби.&lt;br /&gt;
&lt;br /&gt;
Где процедура &#039;&#039;&#039;&#039;&#039;One-Sided-Jacobi-Rotation&#039;&#039;&#039;&#039;&#039; является метод односторонних вращений Якоби:&lt;br /&gt;
&lt;br /&gt;
 proc &#039;&#039;&#039;&#039;&#039;One-Sided-Jacobi-Rotation&amp;lt;math&amp;gt;(G,j,k)&amp;lt;/math&amp;gt;&#039;&#039;&#039;&#039;&#039;&lt;br /&gt;
     вычислить &amp;lt;math&amp;gt;a_{jj} = (G^TG)_{jj}, a_{jk} = (G^TG)_{jk}&amp;lt;/math&amp;gt; и &amp;lt;math&amp;gt;a_{kk} = (G^TG)_{kk}&amp;lt;/math&amp;gt;&lt;br /&gt;
     if &amp;lt;math&amp;gt;|a_{jk}|&amp;lt;/math&amp;gt; не слишком мал&lt;br /&gt;
         &amp;lt;math&amp;gt;&lt;br /&gt;
         \begin{align}&lt;br /&gt;
         \tau &amp;amp;= ({a_{jj} - a_{kk}})/{2a_{jk}} \\&lt;br /&gt;
         t &amp;amp;= {sign(\tau)}/(|\tau| + \sqrt{1 + \tau^2}) \\&lt;br /&gt;
         c &amp;amp;= 1/(\sqrt{1 + t^2}) \\&lt;br /&gt;
         s &amp;amp;= ct \\&lt;br /&gt;
         G &amp;amp;= GR(j,k,\theta) \  \dots c=cos\theta, s=sin\theta \end{align}&amp;lt;/math&amp;gt;&lt;br /&gt;
         if нужны правые сингулярные векторы &lt;br /&gt;
             &amp;lt;math&amp;gt;J = JR(j,k,\theta)&amp;lt;/math&amp;gt;&lt;br /&gt;
         end if&lt;br /&gt;
     end if&lt;br /&gt;
&lt;br /&gt;
=== Последовательная сложность алгоритма ===&lt;br /&gt;
Для одного вращения Якоби необходимо выполнить &amp;lt;math&amp;gt;O(n)&amp;lt;/math&amp;gt; операций умножения и сложения. &lt;br /&gt;
&lt;br /&gt;
Всего вариантов выбора &amp;lt;math&amp;gt;j&amp;lt;/math&amp;gt; и &amp;lt;math&amp;gt;k&amp;lt;/math&amp;gt; существует &amp;lt;math&amp;gt;\frac{n(n-1)}{2}&amp;lt;/math&amp;gt;.&lt;br /&gt;
&lt;br /&gt;
Таким образом последовательный алгоритм Якоби вычисления сингулярных чисел и векторов является алгоритмом с кубической сложностью.&lt;br /&gt;
&lt;br /&gt;
=== Информационный граф ===&lt;br /&gt;
Граф алгоритма состоит из четырех групп вершин&lt;br /&gt;
&lt;br /&gt;
(А)Первая группа вершин расположена в двумерной области, соответствующая ей операция - вычисление элементов &amp;lt;math&amp;gt;a_{jj},a_{jk},a_{kk}&amp;lt;/math&amp;gt; матрицы произведения &amp;lt;math&amp;gt;A = (G^TG)&amp;lt;/math&amp;gt;. Где &amp;lt;math&amp;gt;j&amp;lt;/math&amp;gt; изменяется от &amp;lt;math&amp;gt;1&amp;lt;/math&amp;gt; до &amp;lt;math&amp;gt;n-1&amp;lt;/math&amp;gt;, принимая все целочисленные значения, &amp;lt;math&amp;gt;k&amp;lt;/math&amp;gt;  изменяется от &amp;lt;math&amp;gt;j+1&amp;lt;/math&amp;gt; до &amp;lt;math&amp;gt;n&amp;lt;/math&amp;gt;, принимая все целочисленные значения.&lt;br /&gt;
&lt;br /&gt;
Граф вычисления каждого из элементов приведен на рисунке 1, где значениям &amp;lt;math&amp;gt;g_{ij}&amp;lt;/math&amp;gt; соответствуют обозначения &amp;lt;math&amp;gt;x_{ij}&amp;lt;/math&amp;gt;, а элементам &amp;lt;math&amp;gt;g^T_{ij}&amp;lt;/math&amp;gt; обозначения &amp;lt;math&amp;gt;z_{ij}&amp;lt;/math&amp;gt;. Значение &amp;lt;math&amp;gt;s_{ij}&amp;lt;/math&amp;gt; является значением результирующего элемента.&lt;br /&gt;
&lt;br /&gt;
(Б)Вторая группа вершин расположена в двумерной области, соответствующая ей операция – вычисление &amp;lt;math&amp;gt;c&amp;lt;/math&amp;gt; и &amp;lt;math&amp;gt;s&amp;lt;/math&amp;gt;.&lt;br /&gt;
&lt;br /&gt;
Информационный граф с входными и выходными данными вычисления пункта (Б) представлен на рисунке 2.&lt;br /&gt;
&lt;br /&gt;
(В)Третья группа вершин расположена в двумерной области, соответствующая ей операция вычисление значений элементов &amp;lt;math&amp;gt;g_{jm}^{(i+1)} = g_{mj}^{(i+1)}&amp;lt;/math&amp;gt; и &amp;lt;math&amp;gt;g_{km}^{(i+1)} = g_{mk}^{(i+1)}&amp;lt;/math&amp;gt;, &amp;lt;math&amp;gt;m \ne j,k&amp;lt;/math&amp;gt;.&lt;br /&gt;
&lt;br /&gt;
(Г)Четвертая группа вершин расположена в двумерной области, соответствующая ей операция вычисление значений элементов &amp;lt;math&amp;gt;g_{jj}^{(i+1)} &amp;lt;/math&amp;gt; и &amp;lt;math&amp;gt;g_{kk}^{(i+1)} &amp;lt;/math&amp;gt;.&lt;br /&gt;
&lt;br /&gt;
Элементы групп (В) и (Г) вычисляются аналогично вычислению элементов матрицы произведения, т.к. фактически представляют собой перемножение матриц &amp;lt;math&amp;gt;G&amp;lt;/math&amp;gt; и &amp;lt;math&amp;gt;R&amp;lt;/math&amp;gt;&lt;br /&gt;
&lt;br /&gt;
[[File:Jacobi_2.jpg|none|thumb|1000px|Рисунок 1. Информационный граф с входными и выходными параметрами вычисления каждого элемента матрицы произведения.]]&lt;br /&gt;
&lt;br /&gt;
[[File:Jacobi_1.jpg|none|thumb|1000px|Рисунок 2. Информационный граф с входными и выходными параметрами вычисления значений &amp;lt;math&amp;gt;c&amp;lt;/math&amp;gt; и &amp;lt;math&amp;gt;s&amp;lt;/math&amp;gt;.]]&lt;br /&gt;
&lt;br /&gt;
Обобщенный граф метода Якоби представлен на рисунке 3, где буквами А, Б, В и Г обозначено вычисление групп вершин (А), (Б), (В) и (Г).&lt;br /&gt;
&lt;br /&gt;
[[File:Graf21.png|none|thumb|2000px|Рисунок 3. Обобщенный граф алгоритма вычисления сингулярных чисел и векторов методом Якоби.]]&lt;br /&gt;
&lt;br /&gt;
=== Ресурс параллелизма алгоритма ===&lt;br /&gt;
Для выполнения одной итерации метода Якоби требуется последовательно выполнить несколько ярусов:&lt;br /&gt;
# вычислить &amp;lt;math&amp;gt;\tau&amp;lt;/math&amp;gt; &lt;br /&gt;
# вычислить &amp;lt;math&amp;gt;t&amp;lt;/math&amp;gt; &lt;br /&gt;
# вычислить &amp;lt;math&amp;gt;c&amp;lt;/math&amp;gt; &lt;br /&gt;
# вычислить &amp;lt;math&amp;gt;s&amp;lt;/math&amp;gt;&lt;br /&gt;
# выполнить поворот матрицы &amp;lt;math&amp;gt;G&amp;lt;/math&amp;gt; с параллельным выполнением &amp;lt;math&amp;gt;2(n-2)&amp;lt;/math&amp;gt; операций вычисления элементов матрицы &amp;lt;math&amp;gt;g_{jm}^{(i+1)} = g_{mj}^{(i+1)}&amp;lt;/math&amp;gt; и &amp;lt;math&amp;gt;g_{km}^{(i+1)} = g_{mk}^{(i+1)}&amp;lt;/math&amp;gt;, &amp;lt;math&amp;gt;m \ne j,k&amp;lt;/math&amp;gt;, а также вычисления элементов &amp;lt;math&amp;gt;g_{jj}^{(i+1)} &amp;lt;/math&amp;gt; и &amp;lt;math&amp;gt;g_{kk}^{(i+1)} &amp;lt;/math&amp;gt;. &lt;br /&gt;
&lt;br /&gt;
Суммарное количество итераций равно &amp;lt;math&amp;gt;\frac{n(n-1)}{2}&amp;lt;/math&amp;gt; (Различные варианты выбора &amp;lt;math&amp;gt;j&amp;lt;/math&amp;gt; и &amp;lt;math&amp;gt;k&amp;lt;/math&amp;gt;). &lt;br /&gt;
&lt;br /&gt;
Асимптотически метод сходится квадратично. &lt;br /&gt;
&lt;br /&gt;
Таким образом, при классификации по высоте ЯПФ метод Якоби относится к алгоритмам со сложностью &amp;lt;math&amp;gt;O(n^2)&amp;lt;/math&amp;gt;&amp;amp;nbsp;, а при классификации по ширине ЯПФ — к алгоритмам со сложностью &amp;lt;math&amp;gt;O(n)&amp;lt;/math&amp;gt;.&lt;br /&gt;
&lt;br /&gt;
=== Входные и выходные данные алгоритма ===&lt;br /&gt;
&#039;&#039;&#039;Входные данные&#039;&#039;&#039;: плотная матрица &amp;lt;math&amp;gt;G&amp;lt;/math&amp;gt; размера &amp;lt;math&amp;gt;n&amp;lt;/math&amp;gt;х&amp;lt;math&amp;gt;n&amp;lt;/math&amp;gt;, где &amp;lt;math&amp;gt;A= G^TG&amp;lt;/math&amp;gt; – симметрическая матрица.&lt;br /&gt;
&lt;br /&gt;
&#039;&#039;&#039;Объём входных данных&#039;&#039;&#039;: &amp;lt;math&amp;gt;n^2&amp;lt;/math&amp;gt; (т.к. для хранения матрицы &amp;lt;math&amp;gt;G&amp;lt;/math&amp;gt; используем двумерный массив размера &amp;lt;math&amp;gt;n&amp;lt;/math&amp;gt;х&amp;lt;math&amp;gt;n&amp;lt;/math&amp;gt;)&lt;br /&gt;
&lt;br /&gt;
&#039;&#039;&#039;Выходные данные&#039;&#039;&#039;: &amp;lt;math&amp;gt;\sigma_{i}&amp;lt;/math&amp;gt;  - сингулярные числа, матрица &amp;lt;math&amp;gt;U&amp;lt;/math&amp;gt; левых сингулярных векторов и матрица &amp;lt;math&amp;gt;V&amp;lt;/math&amp;gt; правых сингулярных векторов.&lt;br /&gt;
&lt;br /&gt;
&#039;&#039;&#039;Объём выходных данных&#039;&#039;&#039;: &amp;lt;math&amp;gt;2n^2 + n&amp;lt;/math&amp;gt; (т.к. необходимо хранить вектор сингулярных чисел длины &amp;lt;math&amp;gt;n&amp;lt;/math&amp;gt;, а также две матрицы &amp;lt;math&amp;gt;U, V&amp;lt;/math&amp;gt; левых и правых сингулярных векторов размера &amp;lt;math&amp;gt;n&amp;lt;/math&amp;gt;х&amp;lt;math&amp;gt;n&amp;lt;/math&amp;gt;).&lt;br /&gt;
&lt;br /&gt;
=== Свойства алгоритма ===&lt;br /&gt;
Метод Якоби является самым медленным из имеющихся алгоритмов вычисления сингулярных чисел и сингулярных векторов матрицы. Тем не менее, для  матриц &amp;lt;math&amp;gt;G&amp;lt;/math&amp;gt;, которые могут быть представлены в виде &amp;lt;math&amp;gt;G=DX&amp;lt;/math&amp;gt;, где &amp;lt;math&amp;gt;D&amp;lt;/math&amp;gt; - диагональная, а &amp;lt;math&amp;gt;X&amp;lt;/math&amp;gt; - хорошо обусловлена, он способен вычислять сингулярные числа и вектора намного точнее, чем другие методы&amp;lt;ref&amp;gt;Дж. Деммель «Вычислительная линейная алгебра» (стр. 261-264)&amp;lt;/ref&amp;gt;. &lt;br /&gt;
&lt;br /&gt;
Вычислительная мощность алгоритма, как отношение числа операций к суммарному объему входных и выходных данных является линейной.&lt;br /&gt;
&lt;br /&gt;
Метод Якоби не детерминирован, так как является итерационным алгоритмом с выходом по точности (число итераций зависит от входных данных и порогового значения).&lt;br /&gt;
&lt;br /&gt;
== Программная реализация алгоритма ==&lt;br /&gt;
&lt;br /&gt;
=== Особенности реализации последовательного алгоритма ===&lt;br /&gt;
&lt;br /&gt;
=== Локальность данных и вычислений ===&lt;br /&gt;
&lt;br /&gt;
=== Возможные способы и особенности параллельной реализации алгоритма ===&lt;br /&gt;
&lt;br /&gt;
=== Масштабируемость алгоритма и его реализации ===&lt;br /&gt;
Исследование масштабируемости параллельной реализации метода Якоби вычисления сингулярных чисел и векторов проводилось на суперкомпьютере &amp;quot;Ломоносов&amp;quot;. Алгоритм реализован на языке программирования C с использованием механизмов MPI.&lt;br /&gt;
&lt;br /&gt;
Алгоритм работает по следующей схеме:&lt;br /&gt;
#На вход всем процессорам подается матрица &amp;lt;math&amp;gt; G &amp;lt;/math&amp;gt;.&lt;br /&gt;
#Вычисляется элемент &amp;lt;math&amp;gt; a_{jk} &amp;lt;/math&amp;gt; путем перемножения матриц &amp;lt;math&amp;gt; G^TG &amp;lt;/math&amp;gt;, где на каждом процессоре вычисляется своя часть матрицы. После чего результат отправляется на все процессоры.&lt;br /&gt;
#Если полученный элемент оказывается больше некоторого значения, то начинается последовательная часть программы:Вычисление элементов &amp;lt;math&amp;gt; tau, t, c, s &amp;lt;/math&amp;gt;.&lt;br /&gt;
#Затем, выполняется операция поворота, путем перемножения матриц &amp;lt;math&amp;gt; G*R &amp;lt;/math&amp;gt;. Данная операция выполняется параллельно на нескольких процессорах, где каждый процессор вычисляет свою часть матрицы. После чего результат пересылается всем процессорам.&lt;br /&gt;
&lt;br /&gt;
Данная схема повторяется до тех пор, пока матрица &amp;lt;math&amp;gt; A = G^T*G &amp;lt;/math&amp;gt; не станет достаточно близкой к диагональной.&lt;br /&gt;
&lt;br /&gt;
Для проверки этого факта, в конце каждой итерации цикла вычисляется матрица &amp;lt;math&amp;gt; A = G^T*G &amp;lt;/math&amp;gt;. Данная операция выполняется параллельно на нескольких процессорах, где каждый процессор вычисляет свою часть матрицы, после чего результат пересылается всем процессорам.&lt;br /&gt;
&lt;br /&gt;
&lt;br /&gt;
Набор и границы значений изменяемых параметров запуска реализации алгоритма: &lt;br /&gt;
&lt;br /&gt;
*	число процессоров [1 : 128] с шагом равным степени двойки;&lt;br /&gt;
*	размер матрицы [256 : 1792] с шагом 256.&lt;br /&gt;
&lt;br /&gt;
В результате проведённых экспериментов был получен следующий диапазон эффективности реализации алгоритма:&lt;br /&gt;
&lt;br /&gt;
*	минимальная эффективность реализации ;&lt;br /&gt;
*	максимальная эффективность реализации .&lt;br /&gt;
&lt;br /&gt;
На следующих рисунках приведены графики производительности и эффективности выбранной реализации метода Якоби в зависимости от изменяемых параметров запуска.&lt;br /&gt;
&lt;br /&gt;
[[File:Performance.jpg|none|thumb|1000px|Рисунок 1. Параллельная реализация метода Якоби. Изменение производительности в зависимости от числа процессоров и размера матрицы.]]&lt;br /&gt;
&lt;br /&gt;
=== Динамические характеристики и эффективность реализации алгоритма ===&lt;br /&gt;
&lt;br /&gt;
=== Выводы для классов архитектур ===&lt;br /&gt;
&lt;br /&gt;
=== Существующие реализации алгоритма ===&lt;br /&gt;
Метод Якоби нахождения сингулярных значений и векторов реализован в таких пакетах, как LAPACK &amp;lt;ref&amp;gt;http://www.netlib.org/scalapack/slug/&amp;lt;/ref&amp;gt;, LINPACK/EISPACK &amp;lt;ref&amp;gt; http://www.netlib.org/linpack/ &amp;lt;/ref&amp;gt;, Intel MKL &amp;lt;ref&amp;gt;https://software.intel.com/ru-ru/node/521153#CAF8CA08-1C69-48F8-B0C3-B2B27AFA92FA&amp;lt;/ref&amp;gt;.&lt;br /&gt;
&lt;br /&gt;
Так же функция Якоби реализована в пакете Matlab.&lt;br /&gt;
&lt;br /&gt;
Т. к. алгоритм считается медленным, он не включен во многие известные пакеты.&lt;br /&gt;
&lt;br /&gt;
== Литература ==&lt;br /&gt;
1. Дж. Деммель Вычислительная линейная алгебра. Изд. Мир, 2001.&lt;/div&gt;</summary>
		<author><name>Davletshuna Alexandra</name></author>
	</entry>
	<entry>
		<id>https://xn--80aecvaldz.xn--80ahdrnmvk.xn--p1ai/w/ru/index.php?title=%D0%A3%D1%87%D0%B0%D1%81%D1%82%D0%BD%D0%B8%D0%BA:Davletshuna_Alexandra/%D0%9C%D0%B5%D1%82%D0%BE%D0%B4_%D0%AF%D0%BA%D0%BE%D0%B1%D0%B8_%D0%B2%D1%8B%D1%87%D0%B8%D1%81%D0%BB%D0%B5%D0%BD%D0%B8%D1%8F_%D1%81%D0%B8%D0%BD%D0%B3%D1%83%D0%BB%D1%8F%D1%80%D0%BD%D1%8B%D1%85_%D1%87%D0%B8%D1%81%D0%B5%D0%BB_%D0%B8_%D0%B2%D0%B5%D0%BA%D1%82%D0%BE%D1%80%D0%BE%D0%B2&amp;diff=17897</id>
		<title>Участник:Davletshuna Alexandra/Метод Якоби вычисления сингулярных чисел и векторов</title>
		<link rel="alternate" type="text/html" href="https://xn--80aecvaldz.xn--80ahdrnmvk.xn--p1ai/w/ru/index.php?title=%D0%A3%D1%87%D0%B0%D1%81%D1%82%D0%BD%D0%B8%D0%BA:Davletshuna_Alexandra/%D0%9C%D0%B5%D1%82%D0%BE%D0%B4_%D0%AF%D0%BA%D0%BE%D0%B1%D0%B8_%D0%B2%D1%8B%D1%87%D0%B8%D1%81%D0%BB%D0%B5%D0%BD%D0%B8%D1%8F_%D1%81%D0%B8%D0%BD%D0%B3%D1%83%D0%BB%D1%8F%D1%80%D0%BD%D1%8B%D1%85_%D1%87%D0%B8%D1%81%D0%B5%D0%BB_%D0%B8_%D0%B2%D0%B5%D0%BA%D1%82%D0%BE%D1%80%D0%BE%D0%B2&amp;diff=17897"/>
		<updated>2016-11-17T12:30:37Z</updated>

		<summary type="html">&lt;p&gt;Davletshuna Alexandra: /* Масштабируемость алгоритма и его реализации */&lt;/p&gt;
&lt;hr /&gt;
&lt;div&gt;{{algorithm&lt;br /&gt;
| name              = Метод Якоби вычисления сингулярных чисел и векторов&lt;br /&gt;
| serial_complexity = &amp;lt;math&amp;gt;O(n^3)&amp;lt;/math&amp;gt;&lt;br /&gt;
| pf_height         = &amp;lt;math&amp;gt;O(n^2)&amp;lt;/math&amp;gt;&lt;br /&gt;
| pf_width          = &amp;lt;math&amp;gt;O(n)&amp;lt;/math&amp;gt;&lt;br /&gt;
| input_data        = &amp;lt;math&amp;gt;n^2&amp;lt;/math&amp;gt;&lt;br /&gt;
| output_data       = &amp;lt;math&amp;gt;2n^2 + n&amp;lt;/math&amp;gt;&lt;br /&gt;
}}&lt;br /&gt;
&lt;br /&gt;
Авторы статьи: [[Участница:Davletshuna Alexandra|Давлетшина Александра]] (группа 619) пункты 1.1-1.4, 1.6, 2.7; [[Участница:Alek sandra|Зайцева Александра]] (группа 601) пункты 1.5, 1.7-1.10, 2.7.&lt;br /&gt;
&lt;br /&gt;
== Свойства и структура алгоритма ==&lt;br /&gt;
&lt;br /&gt;
=== Общее описание алгоритма ===&lt;br /&gt;
&#039;&#039;&#039;Сингулярным разложением&#039;&#039;&#039; называется разложение прямоугольной вещественной или комплексной матрицы, имеющее широкое применение, в силу своей наглядной геометрической интерпретации, при решении многих прикладных задач. Сингулярное разложение матрицы А позволяет вычислять сингулярные числа данной матрицы, а также, левые и правые сингулярные векторы матрицы А:&lt;br /&gt;
&lt;br /&gt;
•	левые сингулярные векторы матрицы А — это собственные векторы матрицы &amp;lt;math&amp;gt;AA^*&amp;lt;/math&amp;gt;;&lt;br /&gt;
&lt;br /&gt;
•	правые сингулярные векторы матрицы A — это собственные векторы матрицы &amp;lt;math&amp;gt;A^*A&amp;lt;/math&amp;gt;.&lt;br /&gt;
&lt;br /&gt;
Геометрическая интерпретация сингулярного разложения заключается в следующем факте из геометрии: &#039;&#039;Образом любого линейного преобразования, заданного с помощью матрицы &amp;lt;math&amp;gt;m&amp;lt;/math&amp;gt;x&amp;lt;math&amp;gt;n&amp;lt;/math&amp;gt;, примененного к единичной сфере является гиперэллипсоид&#039;&#039;.&lt;br /&gt;
&lt;br /&gt;
Из многочисленных разложений матриц, наиболее удобным является сингулярное разложение матрицы в виде: &amp;lt;math&amp;gt;A=U\Sigma V^*&amp;lt;/math&amp;gt;, где &amp;lt;math&amp;gt;U, V&amp;lt;/math&amp;gt; – унитарные матрицы, а &amp;lt;math&amp;gt;\Sigma&amp;lt;/math&amp;gt; – диагональная матрица с вещественными положительными числами на диагонали &amp;lt;ref&amp;gt;http://algorithms.parallel.ru/&amp;lt;/ref&amp;gt;.&lt;br /&gt;
&lt;br /&gt;
Диагональные элементы матрицы &amp;lt;math&amp;gt;\Sigma&amp;lt;/math&amp;gt; называются сингулярными числами матрицы &amp;lt;math&amp;gt;A&amp;lt;/math&amp;gt;, а столбцы матриц &amp;lt;math&amp;gt;U,V&amp;lt;/math&amp;gt; левыми и правыми сингулярными векторами соответственно.&lt;br /&gt;
&lt;br /&gt;
Алгоритм Якоби сингулярного разложения матрицы был предложен одним из первых в 1846 году. Он приводит прямоугольную матрицу к диагональной матрице с помощью последовательности элементарных вращений. Метод может найти все сингулярные значения с очень высокой точностью. Однако его производительность является довольно низкой, в сравнении с конкурирующими методами.&lt;br /&gt;
&lt;br /&gt;
&#039;&#039;Неявный&#039;&#039;&amp;lt;ref&amp;gt;Дж. Деммель «Вычислительная линейная алгебра» (стр. 261-264)&amp;lt;/ref&amp;gt; метод Якоби математически эквивалентен применению метода Якоби вычисления собственных значений к матрице &amp;lt;math&amp;gt;A = G^TG&amp;lt;/math&amp;gt;.&lt;br /&gt;
Это значит, что на каждом шаге вычисляется вращение Якоби &amp;lt;math&amp;gt;J&amp;lt;/math&amp;gt;, с помощью которого матрица &amp;lt;math&amp;gt;G^TG&amp;lt;/math&amp;gt; неявно пересчитывется в &amp;lt;math&amp;gt;J^TG^TGJ&amp;lt;/math&amp;gt;; вращение выбрано так, чтобы пара внедиагональных элементов из &amp;lt;math&amp;gt;G^TG&amp;lt;/math&amp;gt; обратилась в нули в матрице &amp;lt;math&amp;gt;J^TG^TGJ&amp;lt;/math&amp;gt;. При этом ни &amp;lt;math&amp;gt;G^TG&amp;lt;/math&amp;gt;, ни &amp;lt;math&amp;gt;J^TG^TGJ&amp;lt;/math&amp;gt; не вычисляются в явном виде; вместо них вычисляется матрица &amp;lt;math&amp;gt;GJ&amp;lt;/math&amp;gt;. Поэтому алгоритм называется &#039;&#039;методом односторонних вращений&#039;&#039;.&lt;br /&gt;
&lt;br /&gt;
=== Математическое описание алгоритма ===&lt;br /&gt;
Исходные данные: матрица &amp;lt;math&amp;gt;G&amp;lt;/math&amp;gt; (элементы &amp;lt;math&amp;gt;g_{ij}, i, j = 1, \ldots, n&amp;lt;/math&amp;gt;).&lt;br /&gt;
&lt;br /&gt;
Вычисляемые данные: матрица &amp;lt;math&amp;gt;\Sigma = diag(\sigma_{i})&amp;lt;/math&amp;gt;, где &amp;lt;math&amp;gt;\sigma_{i}&amp;lt;/math&amp;gt; - сингулярные числа, &amp;lt;math&amp;gt;U&amp;lt;/math&amp;gt; - матрица левых сингулярных векторов, &amp;lt;math&amp;gt;V&amp;lt;/math&amp;gt; - матрица правых сингулярных векторов.&lt;br /&gt;
&lt;br /&gt;
симметричную матрицу &amp;lt;math&amp;gt;A = (G^TG)&amp;lt;/math&amp;gt; можно привести к диагональному виду:&lt;br /&gt;
&amp;lt;math&amp;gt;RG^TGR^T&amp;lt;/math&amp;gt;, где&lt;br /&gt;
&lt;br /&gt;
&amp;lt;math&amp;gt;&lt;br /&gt;
R(j,k,\theta) = &lt;br /&gt;
\begin{matrix}&lt;br /&gt;
  \\&lt;br /&gt;
  \\&lt;br /&gt;
  \\&lt;br /&gt;
j \\&lt;br /&gt;
  \\&lt;br /&gt;
k \\&lt;br /&gt;
  \\&lt;br /&gt;
  \\&lt;br /&gt;
  \\&lt;br /&gt;
\end{matrix}&lt;br /&gt;
&amp;lt;/math&amp;gt;  &lt;br /&gt;
&amp;lt;math&amp;gt;&lt;br /&gt;
\begin{bmatrix}&lt;br /&gt;
  &amp;amp; 1 &amp;amp;   &amp;amp;        &amp;amp;              &amp;amp;        &amp;amp;               &amp;amp;         &amp;amp;    &amp;amp;   \\&lt;br /&gt;
  &amp;amp;   &amp;amp; 1 &amp;amp;        &amp;amp;              &amp;amp;        &amp;amp;               &amp;amp;         &amp;amp;    &amp;amp;   \\&lt;br /&gt;
  &amp;amp;   &amp;amp;   &amp;amp; \ddots &amp;amp;              &amp;amp;        &amp;amp;               &amp;amp;         &amp;amp;    &amp;amp;   \\&lt;br /&gt;
  &amp;amp;   &amp;amp;   &amp;amp;        &amp;amp; \cos(\theta) &amp;amp;        &amp;amp; -\sin(\theta) &amp;amp;         &amp;amp;    &amp;amp;   \\&lt;br /&gt;
  &amp;amp;   &amp;amp;   &amp;amp;        &amp;amp;              &amp;amp; \ddots &amp;amp;               &amp;amp;         &amp;amp;    &amp;amp;   \\&lt;br /&gt;
  &amp;amp;   &amp;amp;   &amp;amp;        &amp;amp; \sin(\theta) &amp;amp;        &amp;amp; \cos(\theta)  &amp;amp;         &amp;amp;    &amp;amp;   \\&lt;br /&gt;
  &amp;amp;   &amp;amp;   &amp;amp;        &amp;amp;              &amp;amp;        &amp;amp;               &amp;amp; \ddots  &amp;amp;    &amp;amp;   \\&lt;br /&gt;
  &amp;amp;   &amp;amp;   &amp;amp;        &amp;amp;              &amp;amp;        &amp;amp;               &amp;amp;         &amp;amp; 1  &amp;amp;   \\&lt;br /&gt;
  &amp;amp;   &amp;amp;   &amp;amp;        &amp;amp;              &amp;amp;        &amp;amp;               &amp;amp;         &amp;amp;    &amp;amp; 1 \\&lt;br /&gt;
\end{bmatrix}&lt;br /&gt;
&amp;lt;/math&amp;gt;&lt;br /&gt;
&lt;br /&gt;
Обозначим &amp;lt;math&amp;gt;s = \sin \theta&amp;lt;/math&amp;gt; и &amp;lt;math&amp;gt;c = \cos \theta&amp;lt;/math&amp;gt;.&lt;br /&gt;
&lt;br /&gt;
Перемножив матрицы &amp;lt;math&amp;gt;RG^TGR^T&amp;lt;/math&amp;gt;, получим следующие выражения&amp;lt;ref&amp;gt;http://www.astro.tsu.ru/OsChMet/5_2.html&amp;lt;/ref&amp;gt;:&lt;br /&gt;
&lt;br /&gt;
&amp;lt;math&amp;gt;\begin{align}&lt;br /&gt;
 a_{jj}^{(i+1)} &amp;amp;= c^2\, a_{jj}^{(i)}  -  2\, s c \,a_{jk}^{(i)}  +  s^2\, a_{kk}^{(i)} \\&lt;br /&gt;
 a_{kk}^{(i+1)} &amp;amp;= s^2 \,a_{jj}^{(i)}  +  2 s c\, a_{jk}^{(i)}  +  c^2 \, a_{kk}^{(i)} \\&lt;br /&gt;
 a_{jk}^{(i+1)} &amp;amp;= a_{kj}^{(i+1)} = (c^2 - s^2 ) \, a_{jk}^{(i)}  +  s c \, (a_{kk}^{(i)} - a_{jj}^{(i)} ) \\&lt;br /&gt;
 a_{jm}^{(i+1)} &amp;amp;= a_{mj}^{(i+1)} = c \, a_{jm}^{(i)}  -  s \, a_{km}^{(i)} &amp;amp; m \ne j,k \\&lt;br /&gt;
 a_{km}^{(i+1)} &amp;amp;= a_{mk}^{(i+1)} = s \, a_{jm}^{(i)}  + c \, a_{km}^{(i)} &amp;amp; m \ne j,k \\&lt;br /&gt;
 a_{ml}^{(i+1)} &amp;amp;= a_{ml}^{(i)} &amp;amp;m,l \ne j,k&lt;br /&gt;
\end{align}&amp;lt;/math&amp;gt;&lt;br /&gt;
&lt;br /&gt;
Т.к внедиагональные элементы должны быть равны 0, то выбираем &amp;lt;math&amp;gt;\theta&amp;lt;/math&amp;gt; так, чтобы &amp;lt;math&amp;gt;a_{jk}^{(i+1)} = 0&amp;lt;/math&amp;gt; и &amp;lt;math&amp;gt;a_{kj}^{(i+1)} = 0&amp;lt;/math&amp;gt;.&lt;br /&gt;
&lt;br /&gt;
Тогда решая уравнение получаем, что&lt;br /&gt;
&lt;br /&gt;
&amp;lt;math&amp;gt;&lt;br /&gt;
         \begin{align}&lt;br /&gt;
         \tau &amp;amp;= ({a_{jj} - a_{kk}})/{2a_{jk}} \\&lt;br /&gt;
         t &amp;amp;= {sign(\tau)}/(|\tau| + \sqrt{1 + \tau^2}) \\&lt;br /&gt;
         c &amp;amp;= 1/(\sqrt{1 + t^2}) \\&lt;br /&gt;
         s &amp;amp;= ct \\&lt;br /&gt;
         \end{align}&amp;lt;/math&amp;gt;&lt;br /&gt;
&lt;br /&gt;
Остановка вычислений алгоритма наступает, когда внедиагональные элементы становятся меньше некоторого наперед заданного числа &amp;lt;math&amp;gt;\varepsilon&amp;lt;/math&amp;gt;.&lt;br /&gt;
&lt;br /&gt;
=== Вычислительное ядро алгоритма ===&lt;br /&gt;
Вычислительное ядро алгоритма составляет непосредственно вычисление одностороннего вращения Якоби, т.е. вычисление элементов матрицы &amp;lt;math&amp;gt;g_{jm}^{(i+1)} = g_{mj}^{(i+1)}&amp;lt;/math&amp;gt; и &amp;lt;math&amp;gt;g_{km}^{(i+1)} = g_{mk}^{(i+1)}&amp;lt;/math&amp;gt;, &amp;lt;math&amp;gt;m \ne j,k&amp;lt;/math&amp;gt;, а также вычисления элементов &amp;lt;math&amp;gt;g_{jj}^{(i+1)} &amp;lt;/math&amp;gt; и &amp;lt;math&amp;gt;g_{kk}^{(i+1)} &amp;lt;/math&amp;gt;, получившихся после умножения промежуточной матрицы на матрицу вращений Якоби:&lt;br /&gt;
&lt;br /&gt;
&amp;lt;math&amp;gt;\begin{align}&lt;br /&gt;
 g_{jj}^{(i+1)} &amp;amp;= c^2\, g_{jj}^{(i)}  -  2\, s c \,g_{jk}^{(i)}  +  s^2\, g_{kk}^{(i)} \\&lt;br /&gt;
 g_{kk}^{(i+1)} &amp;amp;= s^2 \,g_{jj}^{(i)}  +  2 s c\, g_{jk}^{(i)}  +  c^2 \, g_{kk}^{(i)} \\&lt;br /&gt;
 g_{jk}^{(i+1)} &amp;amp;= g_{kj}^{(i+1)} = (c^2 - s^2 ) \, g_{jk}^{(i)}  +  s c \, (g_{kk}^{(i)} - g_{jj}^{(i)} ) \\&lt;br /&gt;
 g_{jm}^{(i+1)} &amp;amp;= g_{mj}^{(i+1)} = c \, g_{jm}^{(i)}  -  s \, g_{km}^{(i)} &amp;amp; m \ne j,k \\&lt;br /&gt;
 g_{km}^{(i+1)} &amp;amp;= g_{mk}^{(i+1)} = s \, g_{jm}^{(i)}  + c \, g_{km}^{(i)} &amp;amp; m \ne j,k \\&lt;br /&gt;
 g_{ml}^{(i+1)} &amp;amp;= g_{ml}^{(i)} &amp;amp;m,l \ne j,k&lt;br /&gt;
\end{align}&amp;lt;/math&amp;gt;&lt;br /&gt;
&lt;br /&gt;
=== Макроструктура алгоритма ===&lt;br /&gt;
Основную часть метода составляет процедура односторонних вращений матрицы, которая в свою очередь состоит из:&lt;br /&gt;
&lt;br /&gt;
#Вычисление &amp;lt;math&amp;gt;\tau, c, s, t&amp;lt;/math&amp;gt;.&lt;br /&gt;
#Одностороннее вращение матрицы. &lt;br /&gt;
&lt;br /&gt;
Что требует &amp;lt;math&amp;gt;O(n)&amp;lt;/math&amp;gt; операций.&lt;br /&gt;
&lt;br /&gt;
После этого необходимо:&lt;br /&gt;
&lt;br /&gt;
#Вычислить сингулярные числа &amp;lt;math&amp;gt;\sigma_i&amp;lt;/math&amp;gt;.  Что требует &amp;lt;math&amp;gt;O(n)&amp;lt;/math&amp;gt; операций.&lt;br /&gt;
#Вычислить &amp;lt;math&amp;gt;U&amp;lt;/math&amp;gt; и &amp;lt;math&amp;gt;V&amp;lt;/math&amp;gt;. Что требует &amp;lt;math&amp;gt;O(n^2)&amp;lt;/math&amp;gt; операций.&lt;br /&gt;
&lt;br /&gt;
=== Схема реализации последовательного алгоритма ===&lt;br /&gt;
Применение метода Якоби к матрице &amp;lt;math&amp;gt;A = (G^TG)&amp;lt;/math&amp;gt; можно описать следующим образом&amp;lt;ref&amp;gt;Дж. Деммель «Вычислительная линейная алгебра» (стр. 261-263)&amp;lt;/ref&amp;gt;:&lt;br /&gt;
&lt;br /&gt;
Если &amp;lt;math&amp;gt;G = U\Sigma V^T&amp;lt;/math&amp;gt; и &amp;lt;math&amp;gt;\Sigma = diag(\sigma_{i})&amp;lt;/math&amp;gt;, то алгоритм вычисляет сингулярные числа &amp;lt;math&amp;gt;\sigma_{i}&amp;lt;/math&amp;gt;, матрицу &amp;lt;math&amp;gt;U&amp;lt;/math&amp;gt; левых сингулярных векторов и матрицу &amp;lt;math&amp;gt;V&amp;lt;/math&amp;gt; правых сингулярных векторов по следующей схеме:&lt;br /&gt;
&lt;br /&gt;
 repeat&lt;br /&gt;
     for &amp;lt;math&amp;gt;j=1&amp;lt;/math&amp;gt; to &amp;lt;math&amp;gt;n-1&amp;lt;/math&amp;gt;&lt;br /&gt;
         for &amp;lt;math&amp;gt;k=j+1&amp;lt;/math&amp;gt; to &amp;lt;math&amp;gt;n&amp;lt;/math&amp;gt;&lt;br /&gt;
             обратиться к процедуре &#039;&#039;&#039;&#039;&#039;One-Sided-Jacobi-Rotation&amp;lt;math&amp;gt;(G,j,k)&amp;lt;/math&amp;gt;&#039;&#039;&#039;&#039;&#039;&lt;br /&gt;
         end for&lt;br /&gt;
     end for&lt;br /&gt;
 пока &amp;lt;math&amp;gt;G^TG&amp;lt;/math&amp;gt; не станет достаточно близка к диагональной матрице&lt;br /&gt;
 Положить &amp;lt;math&amp;gt;\sigma_{i} = ||G(:,i)||_2 &amp;lt;/math&amp;gt; (норма &amp;lt;math&amp;gt;i&amp;lt;/math&amp;gt;-го столбца в &amp;lt;math&amp;gt;G&amp;lt;/math&amp;gt;)&lt;br /&gt;
 Положить &amp;lt;math&amp;gt;U = [u_{1},\dots, u_{n}]&amp;lt;/math&amp;gt;, где &amp;lt;math&amp;gt;u_{i} = G(:,i)/\sigma_{i}&amp;lt;/math&amp;gt;&lt;br /&gt;
 Положить &amp;lt;math&amp;gt;V = J&amp;lt;/math&amp;gt;, где &amp;lt;math&amp;gt;J&amp;lt;/math&amp;gt; - накопленное произведение вращений Якоби.&lt;br /&gt;
&lt;br /&gt;
Где процедура &#039;&#039;&#039;&#039;&#039;One-Sided-Jacobi-Rotation&#039;&#039;&#039;&#039;&#039; является метод односторонних вращений Якоби:&lt;br /&gt;
&lt;br /&gt;
 proc &#039;&#039;&#039;&#039;&#039;One-Sided-Jacobi-Rotation&amp;lt;math&amp;gt;(G,j,k)&amp;lt;/math&amp;gt;&#039;&#039;&#039;&#039;&#039;&lt;br /&gt;
     вычислить &amp;lt;math&amp;gt;a_{jj} = (G^TG)_{jj}, a_{jk} = (G^TG)_{jk}&amp;lt;/math&amp;gt; и &amp;lt;math&amp;gt;a_{kk} = (G^TG)_{kk}&amp;lt;/math&amp;gt;&lt;br /&gt;
     if &amp;lt;math&amp;gt;|a_{jk}|&amp;lt;/math&amp;gt; не слишком мал&lt;br /&gt;
         &amp;lt;math&amp;gt;&lt;br /&gt;
         \begin{align}&lt;br /&gt;
         \tau &amp;amp;= ({a_{jj} - a_{kk}})/{2a_{jk}} \\&lt;br /&gt;
         t &amp;amp;= {sign(\tau)}/(|\tau| + \sqrt{1 + \tau^2}) \\&lt;br /&gt;
         c &amp;amp;= 1/(\sqrt{1 + t^2}) \\&lt;br /&gt;
         s &amp;amp;= ct \\&lt;br /&gt;
         G &amp;amp;= GR(j,k,\theta) \  \dots c=cos\theta, s=sin\theta \end{align}&amp;lt;/math&amp;gt;&lt;br /&gt;
         if нужны правые сингулярные векторы &lt;br /&gt;
             &amp;lt;math&amp;gt;J = JR(j,k,\theta)&amp;lt;/math&amp;gt;&lt;br /&gt;
         end if&lt;br /&gt;
     end if&lt;br /&gt;
&lt;br /&gt;
=== Последовательная сложность алгоритма ===&lt;br /&gt;
Для одного вращения Якоби необходимо выполнить &amp;lt;math&amp;gt;O(n)&amp;lt;/math&amp;gt; операций умножения и сложения. &lt;br /&gt;
&lt;br /&gt;
Всего вариантов выбора &amp;lt;math&amp;gt;j&amp;lt;/math&amp;gt; и &amp;lt;math&amp;gt;k&amp;lt;/math&amp;gt; существует &amp;lt;math&amp;gt;\frac{n(n-1)}{2}&amp;lt;/math&amp;gt;.&lt;br /&gt;
&lt;br /&gt;
Таким образом последовательный алгоритм Якоби вычисления сингулярных чисел и векторов является алгоритмом с кубической сложностью.&lt;br /&gt;
&lt;br /&gt;
=== Информационный граф ===&lt;br /&gt;
Граф алгоритма состоит из четырех групп вершин&lt;br /&gt;
&lt;br /&gt;
(А)Первая группа вершин расположена в двумерной области, соответствующая ей операция - вычисление элементов &amp;lt;math&amp;gt;a_{jj},a_{jk},a_{kk}&amp;lt;/math&amp;gt; матрицы произведения &amp;lt;math&amp;gt;A = (G^TG)&amp;lt;/math&amp;gt;. Где &amp;lt;math&amp;gt;j&amp;lt;/math&amp;gt; изменяется от &amp;lt;math&amp;gt;1&amp;lt;/math&amp;gt; до &amp;lt;math&amp;gt;n-1&amp;lt;/math&amp;gt;, принимая все целочисленные значения, &amp;lt;math&amp;gt;k&amp;lt;/math&amp;gt;  изменяется от &amp;lt;math&amp;gt;j+1&amp;lt;/math&amp;gt; до &amp;lt;math&amp;gt;n&amp;lt;/math&amp;gt;, принимая все целочисленные значения.&lt;br /&gt;
&lt;br /&gt;
Граф вычисления каждого из элементов приведен на рисунке 1, где значениям &amp;lt;math&amp;gt;g_{ij}&amp;lt;/math&amp;gt; соответствуют обозначения &amp;lt;math&amp;gt;x_{ij}&amp;lt;/math&amp;gt;, а элементам &amp;lt;math&amp;gt;g^T_{ij}&amp;lt;/math&amp;gt; обозначения &amp;lt;math&amp;gt;z_{ij}&amp;lt;/math&amp;gt;. Значение &amp;lt;math&amp;gt;s_{ij}&amp;lt;/math&amp;gt; является значением результирующего элемента.&lt;br /&gt;
&lt;br /&gt;
(Б)Вторая группа вершин расположена в двумерной области, соответствующая ей операция – вычисление &amp;lt;math&amp;gt;c&amp;lt;/math&amp;gt; и &amp;lt;math&amp;gt;s&amp;lt;/math&amp;gt;.&lt;br /&gt;
&lt;br /&gt;
Информационный граф с входными и выходными данными вычисления пункта (Б) представлен на рисунке 2.&lt;br /&gt;
&lt;br /&gt;
(В)Третья группа вершин расположена в двумерной области, соответствующая ей операция вычисление значений элементов &amp;lt;math&amp;gt;g_{jm}^{(i+1)} = g_{mj}^{(i+1)}&amp;lt;/math&amp;gt; и &amp;lt;math&amp;gt;g_{km}^{(i+1)} = g_{mk}^{(i+1)}&amp;lt;/math&amp;gt;, &amp;lt;math&amp;gt;m \ne j,k&amp;lt;/math&amp;gt;.&lt;br /&gt;
&lt;br /&gt;
(Г)Четвертая группа вершин расположена в двумерной области, соответствующая ей операция вычисление значений элементов &amp;lt;math&amp;gt;g_{jj}^{(i+1)} &amp;lt;/math&amp;gt; и &amp;lt;math&amp;gt;g_{kk}^{(i+1)} &amp;lt;/math&amp;gt;.&lt;br /&gt;
&lt;br /&gt;
Элементы групп (В) и (Г) вычисляются аналогично вычислению элементов матрицы произведения, т.к. фактически представляют собой перемножение матриц &amp;lt;math&amp;gt;G&amp;lt;/math&amp;gt; и &amp;lt;math&amp;gt;R&amp;lt;/math&amp;gt;&lt;br /&gt;
&lt;br /&gt;
[[File:Jacobi_2.jpg|none|thumb|1000px|Рисунок 1. Информационный граф с входными и выходными параметрами вычисления каждого элемента матрицы произведения.]]&lt;br /&gt;
&lt;br /&gt;
[[File:Jacobi_1.jpg|none|thumb|1000px|Рисунок 2. Информационный граф с входными и выходными параметрами вычисления значений &amp;lt;math&amp;gt;c&amp;lt;/math&amp;gt; и &amp;lt;math&amp;gt;s&amp;lt;/math&amp;gt;.]]&lt;br /&gt;
&lt;br /&gt;
Обобщенный граф метода Якоби представлен на рисунке 3, где буквами А, Б, В и Г обозначено вычисление групп вершин (А), (Б), (В) и (Г).&lt;br /&gt;
&lt;br /&gt;
[[File:Graf21.png|none|thumb|2000px|Рисунок 3. Обобщенный граф алгоритма вычисления сингулярных чисел и векторов методом Якоби.]]&lt;br /&gt;
&lt;br /&gt;
=== Ресурс параллелизма алгоритма ===&lt;br /&gt;
Для выполнения одной итерации метода Якоби требуется последовательно выполнить несколько ярусов:&lt;br /&gt;
# вычислить &amp;lt;math&amp;gt;\tau&amp;lt;/math&amp;gt; &lt;br /&gt;
# вычислить &amp;lt;math&amp;gt;t&amp;lt;/math&amp;gt; &lt;br /&gt;
# вычислить &amp;lt;math&amp;gt;c&amp;lt;/math&amp;gt; &lt;br /&gt;
# вычислить &amp;lt;math&amp;gt;s&amp;lt;/math&amp;gt;&lt;br /&gt;
# выполнить поворот матрицы &amp;lt;math&amp;gt;G&amp;lt;/math&amp;gt; с параллельным выполнением &amp;lt;math&amp;gt;2(n-2)&amp;lt;/math&amp;gt; операций вычисления элементов матрицы &amp;lt;math&amp;gt;g_{jm}^{(i+1)} = g_{mj}^{(i+1)}&amp;lt;/math&amp;gt; и &amp;lt;math&amp;gt;g_{km}^{(i+1)} = g_{mk}^{(i+1)}&amp;lt;/math&amp;gt;, &amp;lt;math&amp;gt;m \ne j,k&amp;lt;/math&amp;gt;, а также вычисления элементов &amp;lt;math&amp;gt;g_{jj}^{(i+1)} &amp;lt;/math&amp;gt; и &amp;lt;math&amp;gt;g_{kk}^{(i+1)} &amp;lt;/math&amp;gt;. &lt;br /&gt;
&lt;br /&gt;
Суммарное количество итераций равно &amp;lt;math&amp;gt;\frac{n(n-1)}{2}&amp;lt;/math&amp;gt; (Различные варианты выбора &amp;lt;math&amp;gt;j&amp;lt;/math&amp;gt; и &amp;lt;math&amp;gt;k&amp;lt;/math&amp;gt;). &lt;br /&gt;
&lt;br /&gt;
Асимптотически метод сходится квадратично. &lt;br /&gt;
&lt;br /&gt;
Таким образом, при классификации по высоте ЯПФ метод Якоби относится к алгоритмам со сложностью &amp;lt;math&amp;gt;O(n^2)&amp;lt;/math&amp;gt;&amp;amp;nbsp;, а при классификации по ширине ЯПФ — к алгоритмам со сложностью &amp;lt;math&amp;gt;O(n)&amp;lt;/math&amp;gt;.&lt;br /&gt;
&lt;br /&gt;
=== Входные и выходные данные алгоритма ===&lt;br /&gt;
&#039;&#039;&#039;Входные данные&#039;&#039;&#039;: плотная матрица &amp;lt;math&amp;gt;G&amp;lt;/math&amp;gt; размера &amp;lt;math&amp;gt;n&amp;lt;/math&amp;gt;х&amp;lt;math&amp;gt;n&amp;lt;/math&amp;gt;, где &amp;lt;math&amp;gt;A= G^TG&amp;lt;/math&amp;gt; – симметрическая матрица.&lt;br /&gt;
&lt;br /&gt;
&#039;&#039;&#039;Объём входных данных&#039;&#039;&#039;: &amp;lt;math&amp;gt;n^2&amp;lt;/math&amp;gt; (т.к. для хранения матрицы &amp;lt;math&amp;gt;G&amp;lt;/math&amp;gt; используем двумерный массив размера &amp;lt;math&amp;gt;n&amp;lt;/math&amp;gt;х&amp;lt;math&amp;gt;n&amp;lt;/math&amp;gt;)&lt;br /&gt;
&lt;br /&gt;
&#039;&#039;&#039;Выходные данные&#039;&#039;&#039;: &amp;lt;math&amp;gt;\sigma_{i}&amp;lt;/math&amp;gt;  - сингулярные числа, матрица &amp;lt;math&amp;gt;U&amp;lt;/math&amp;gt; левых сингулярных векторов и матрица &amp;lt;math&amp;gt;V&amp;lt;/math&amp;gt; правых сингулярных векторов.&lt;br /&gt;
&lt;br /&gt;
&#039;&#039;&#039;Объём выходных данных&#039;&#039;&#039;: &amp;lt;math&amp;gt;2n^2 + n&amp;lt;/math&amp;gt; (т.к. необходимо хранить вектор сингулярных чисел длины &amp;lt;math&amp;gt;n&amp;lt;/math&amp;gt;, а также две матрицы &amp;lt;math&amp;gt;U, V&amp;lt;/math&amp;gt; левых и правых сингулярных векторов размера &amp;lt;math&amp;gt;n&amp;lt;/math&amp;gt;х&amp;lt;math&amp;gt;n&amp;lt;/math&amp;gt;).&lt;br /&gt;
&lt;br /&gt;
=== Свойства алгоритма ===&lt;br /&gt;
Метод Якоби является самым медленным из имеющихся алгоритмов вычисления сингулярных чисел и сингулярных векторов матрицы. Тем не менее, для  матриц &amp;lt;math&amp;gt;G&amp;lt;/math&amp;gt;, которые могут быть представлены в виде &amp;lt;math&amp;gt;G=DX&amp;lt;/math&amp;gt;, где &amp;lt;math&amp;gt;D&amp;lt;/math&amp;gt; - диагональная, а &amp;lt;math&amp;gt;X&amp;lt;/math&amp;gt; - хорошо обусловлена, он способен вычислять сингулярные числа и вектора намного точнее, чем другие методы&amp;lt;ref&amp;gt;Дж. Деммель «Вычислительная линейная алгебра» (стр. 261-264)&amp;lt;/ref&amp;gt;. &lt;br /&gt;
&lt;br /&gt;
Вычислительная мощность алгоритма, как отношение числа операций к суммарному объему входных и выходных данных является линейной.&lt;br /&gt;
&lt;br /&gt;
Метод Якоби не детерминирован, так как является итерационным алгоритмом с выходом по точности (число итераций зависит от входных данных и порогового значения).&lt;br /&gt;
&lt;br /&gt;
== Программная реализация алгоритма ==&lt;br /&gt;
&lt;br /&gt;
=== Особенности реализации последовательного алгоритма ===&lt;br /&gt;
&lt;br /&gt;
=== Локальность данных и вычислений ===&lt;br /&gt;
&lt;br /&gt;
=== Возможные способы и особенности параллельной реализации алгоритма ===&lt;br /&gt;
&lt;br /&gt;
=== Масштабируемость алгоритма и его реализации ===&lt;br /&gt;
Исследование масштабируемости параллельной реализации метода Якоби вычисления сингулярных чисел и векторов проводилось на суперкомпьютере &amp;quot;Ломоносов&amp;quot;. Алгоритм реализован на языке программирования C с использованием механизмов MPI.&lt;br /&gt;
&lt;br /&gt;
Алгоритм работает по следующей схеме:&lt;br /&gt;
#На вход всем процессорам подается матрица &amp;lt;math&amp;gt; G &amp;lt;/math&amp;gt;.&lt;br /&gt;
#Вычисляется элемент &amp;lt;math&amp;gt; a_{jk} &amp;lt;/math&amp;gt; путем перемножения матриц &amp;lt;math&amp;gt; G^TG &amp;lt;/math&amp;gt;, где на каждом процессоре вычисляется своя часть матрицы. После чего результат отправляется на все процессоры.&lt;br /&gt;
#Если полученный элемент оказывается больше некоторого значения, то начинается последовательная часть программы:&lt;br /&gt;
#Вычисление элементов &amp;lt;math&amp;gt; tau, t, c, s &amp;lt;/math&amp;gt;.&lt;br /&gt;
#Затем, выполняется операция поворота, путем перемножения матриц &amp;lt;math&amp;gt; G*R &amp;lt;/math&amp;gt;. Данная операция выполняется параллельно на нескольких процессорах, где каждый процессор вычисляет свою часть матрицы. После чего результат пересылается всем процессорам.&lt;br /&gt;
&lt;br /&gt;
Данная схема повторяется до тех пор, пока матрица &amp;lt;math&amp;gt; A = G^T*G &amp;lt;/math&amp;gt; не станет достаточно близкой к диагональной.&lt;br /&gt;
&lt;br /&gt;
Для проверки этого факта, в конце каждой итерации цикла вычисляется матрица &amp;lt;math&amp;gt; A = G^T*G &amp;lt;/math&amp;gt;. Данная операция выполняется параллельно на нескольких процессорах, где каждый процессор вычисляет свою часть матрицы, после чего результат пересылается всем процессорам.&lt;br /&gt;
&lt;br /&gt;
&lt;br /&gt;
Набор и границы значений изменяемых параметров запуска реализации алгоритма: &lt;br /&gt;
&lt;br /&gt;
*	число процессоров [1 : 128] с шагом равным степени двойки;&lt;br /&gt;
*	размер матрицы [256 : 1792] с шагом 256.&lt;br /&gt;
&lt;br /&gt;
В результате проведённых экспериментов был получен следующий диапазон эффективности реализации алгоритма:&lt;br /&gt;
&lt;br /&gt;
*	минимальная эффективность реализации ;&lt;br /&gt;
*	максимальная эффективность реализации .&lt;br /&gt;
&lt;br /&gt;
На следующих рисунках приведены графики производительности и эффективности выбранной реализации метода Якоби в зависимости от изменяемых параметров запуска.&lt;br /&gt;
&lt;br /&gt;
[[File:Performance.jpg|none|thumb|1000px|Рисунок 1. Параллельная реализация метода Якоби. Изменение производительности в зависимости от числа процессоров и размера матрицы.]]&lt;br /&gt;
&lt;br /&gt;
=== Динамические характеристики и эффективность реализации алгоритма ===&lt;br /&gt;
&lt;br /&gt;
=== Выводы для классов архитектур ===&lt;br /&gt;
&lt;br /&gt;
=== Существующие реализации алгоритма ===&lt;br /&gt;
Метод Якоби нахождения сингулярных значений и векторов реализован в таких пакетах, как LAPACK &amp;lt;ref&amp;gt;http://www.netlib.org/scalapack/slug/&amp;lt;/ref&amp;gt;, LINPACK/EISPACK &amp;lt;ref&amp;gt; http://www.netlib.org/linpack/ &amp;lt;/ref&amp;gt;, Intel MKL &amp;lt;ref&amp;gt;https://software.intel.com/ru-ru/node/521153#CAF8CA08-1C69-48F8-B0C3-B2B27AFA92FA&amp;lt;/ref&amp;gt;.&lt;br /&gt;
&lt;br /&gt;
Так же функция Якоби реализована в пакете Matlab.&lt;br /&gt;
&lt;br /&gt;
Т. к. алгоритм считается медленным, он не включен во многие известные пакеты.&lt;br /&gt;
&lt;br /&gt;
== Литература ==&lt;br /&gt;
1. Дж. Деммель Вычислительная линейная алгебра. Изд. Мир, 2001.&lt;/div&gt;</summary>
		<author><name>Davletshuna Alexandra</name></author>
	</entry>
	<entry>
		<id>https://xn--80aecvaldz.xn--80ahdrnmvk.xn--p1ai/w/ru/index.php?title=%D0%A3%D1%87%D0%B0%D1%81%D1%82%D0%BD%D0%B8%D0%BA:Davletshuna_Alexandra/%D0%9C%D0%B5%D1%82%D0%BE%D0%B4_%D0%AF%D0%BA%D0%BE%D0%B1%D0%B8_%D0%B2%D1%8B%D1%87%D0%B8%D1%81%D0%BB%D0%B5%D0%BD%D0%B8%D1%8F_%D1%81%D0%B8%D0%BD%D0%B3%D1%83%D0%BB%D1%8F%D1%80%D0%BD%D1%8B%D1%85_%D1%87%D0%B8%D1%81%D0%B5%D0%BB_%D0%B8_%D0%B2%D0%B5%D0%BA%D1%82%D0%BE%D1%80%D0%BE%D0%B2&amp;diff=17896</id>
		<title>Участник:Davletshuna Alexandra/Метод Якоби вычисления сингулярных чисел и векторов</title>
		<link rel="alternate" type="text/html" href="https://xn--80aecvaldz.xn--80ahdrnmvk.xn--p1ai/w/ru/index.php?title=%D0%A3%D1%87%D0%B0%D1%81%D1%82%D0%BD%D0%B8%D0%BA:Davletshuna_Alexandra/%D0%9C%D0%B5%D1%82%D0%BE%D0%B4_%D0%AF%D0%BA%D0%BE%D0%B1%D0%B8_%D0%B2%D1%8B%D1%87%D0%B8%D1%81%D0%BB%D0%B5%D0%BD%D0%B8%D1%8F_%D1%81%D0%B8%D0%BD%D0%B3%D1%83%D0%BB%D1%8F%D1%80%D0%BD%D1%8B%D1%85_%D1%87%D0%B8%D1%81%D0%B5%D0%BB_%D0%B8_%D0%B2%D0%B5%D0%BA%D1%82%D0%BE%D1%80%D0%BE%D0%B2&amp;diff=17896"/>
		<updated>2016-11-17T12:06:15Z</updated>

		<summary type="html">&lt;p&gt;Davletshuna Alexandra: /* Масштабируемость алгоритма и его реализации */&lt;/p&gt;
&lt;hr /&gt;
&lt;div&gt;{{algorithm&lt;br /&gt;
| name              = Метод Якоби вычисления сингулярных чисел и векторов&lt;br /&gt;
| serial_complexity = &amp;lt;math&amp;gt;O(n^3)&amp;lt;/math&amp;gt;&lt;br /&gt;
| pf_height         = &amp;lt;math&amp;gt;O(n^2)&amp;lt;/math&amp;gt;&lt;br /&gt;
| pf_width          = &amp;lt;math&amp;gt;O(n)&amp;lt;/math&amp;gt;&lt;br /&gt;
| input_data        = &amp;lt;math&amp;gt;n^2&amp;lt;/math&amp;gt;&lt;br /&gt;
| output_data       = &amp;lt;math&amp;gt;2n^2 + n&amp;lt;/math&amp;gt;&lt;br /&gt;
}}&lt;br /&gt;
&lt;br /&gt;
Авторы статьи: [[Участница:Davletshuna Alexandra|Давлетшина Александра]] (группа 619) пункты 1.1-1.4, 1.6, 2.7; [[Участница:Alek sandra|Зайцева Александра]] (группа 601) пункты 1.5, 1.7-1.10, 2.7.&lt;br /&gt;
&lt;br /&gt;
== Свойства и структура алгоритма ==&lt;br /&gt;
&lt;br /&gt;
=== Общее описание алгоритма ===&lt;br /&gt;
&#039;&#039;&#039;Сингулярным разложением&#039;&#039;&#039; называется разложение прямоугольной вещественной или комплексной матрицы, имеющее широкое применение, в силу своей наглядной геометрической интерпретации, при решении многих прикладных задач. Сингулярное разложение матрицы А позволяет вычислять сингулярные числа данной матрицы, а также, левые и правые сингулярные векторы матрицы А:&lt;br /&gt;
&lt;br /&gt;
•	левые сингулярные векторы матрицы А — это собственные векторы матрицы &amp;lt;math&amp;gt;AA^*&amp;lt;/math&amp;gt;;&lt;br /&gt;
&lt;br /&gt;
•	правые сингулярные векторы матрицы A — это собственные векторы матрицы &amp;lt;math&amp;gt;A^*A&amp;lt;/math&amp;gt;.&lt;br /&gt;
&lt;br /&gt;
Геометрическая интерпретация сингулярного разложения заключается в следующем факте из геометрии: &#039;&#039;Образом любого линейного преобразования, заданного с помощью матрицы &amp;lt;math&amp;gt;m&amp;lt;/math&amp;gt;x&amp;lt;math&amp;gt;n&amp;lt;/math&amp;gt;, примененного к единичной сфере является гиперэллипсоид&#039;&#039;.&lt;br /&gt;
&lt;br /&gt;
Из многочисленных разложений матриц, наиболее удобным является сингулярное разложение матрицы в виде: &amp;lt;math&amp;gt;A=U\Sigma V^*&amp;lt;/math&amp;gt;, где &amp;lt;math&amp;gt;U, V&amp;lt;/math&amp;gt; – унитарные матрицы, а &amp;lt;math&amp;gt;\Sigma&amp;lt;/math&amp;gt; – диагональная матрица с вещественными положительными числами на диагонали &amp;lt;ref&amp;gt;http://algorithms.parallel.ru/&amp;lt;/ref&amp;gt;.&lt;br /&gt;
&lt;br /&gt;
Диагональные элементы матрицы &amp;lt;math&amp;gt;\Sigma&amp;lt;/math&amp;gt; называются сингулярными числами матрицы &amp;lt;math&amp;gt;A&amp;lt;/math&amp;gt;, а столбцы матриц &amp;lt;math&amp;gt;U,V&amp;lt;/math&amp;gt; левыми и правыми сингулярными векторами соответственно.&lt;br /&gt;
&lt;br /&gt;
Алгоритм Якоби сингулярного разложения матрицы был предложен одним из первых в 1846 году. Он приводит прямоугольную матрицу к диагональной матрице с помощью последовательности элементарных вращений. Метод может найти все сингулярные значения с очень высокой точностью. Однако его производительность является довольно низкой, в сравнении с конкурирующими методами.&lt;br /&gt;
&lt;br /&gt;
&#039;&#039;Неявный&#039;&#039;&amp;lt;ref&amp;gt;Дж. Деммель «Вычислительная линейная алгебра» (стр. 261-264)&amp;lt;/ref&amp;gt; метод Якоби математически эквивалентен применению метода Якоби вычисления собственных значений к матрице &amp;lt;math&amp;gt;A = G^TG&amp;lt;/math&amp;gt;.&lt;br /&gt;
Это значит, что на каждом шаге вычисляется вращение Якоби &amp;lt;math&amp;gt;J&amp;lt;/math&amp;gt;, с помощью которого матрица &amp;lt;math&amp;gt;G^TG&amp;lt;/math&amp;gt; неявно пересчитывется в &amp;lt;math&amp;gt;J^TG^TGJ&amp;lt;/math&amp;gt;; вращение выбрано так, чтобы пара внедиагональных элементов из &amp;lt;math&amp;gt;G^TG&amp;lt;/math&amp;gt; обратилась в нули в матрице &amp;lt;math&amp;gt;J^TG^TGJ&amp;lt;/math&amp;gt;. При этом ни &amp;lt;math&amp;gt;G^TG&amp;lt;/math&amp;gt;, ни &amp;lt;math&amp;gt;J^TG^TGJ&amp;lt;/math&amp;gt; не вычисляются в явном виде; вместо них вычисляется матрица &amp;lt;math&amp;gt;GJ&amp;lt;/math&amp;gt;. Поэтому алгоритм называется &#039;&#039;методом односторонних вращений&#039;&#039;.&lt;br /&gt;
&lt;br /&gt;
=== Математическое описание алгоритма ===&lt;br /&gt;
Исходные данные: матрица &amp;lt;math&amp;gt;G&amp;lt;/math&amp;gt; (элементы &amp;lt;math&amp;gt;g_{ij}, i, j = 1, \ldots, n&amp;lt;/math&amp;gt;).&lt;br /&gt;
&lt;br /&gt;
Вычисляемые данные: матрица &amp;lt;math&amp;gt;\Sigma = diag(\sigma_{i})&amp;lt;/math&amp;gt;, где &amp;lt;math&amp;gt;\sigma_{i}&amp;lt;/math&amp;gt; - сингулярные числа, &amp;lt;math&amp;gt;U&amp;lt;/math&amp;gt; - матрица левых сингулярных векторов, &amp;lt;math&amp;gt;V&amp;lt;/math&amp;gt; - матрица правых сингулярных векторов.&lt;br /&gt;
&lt;br /&gt;
симметричную матрицу &amp;lt;math&amp;gt;A = (G^TG)&amp;lt;/math&amp;gt; можно привести к диагональному виду:&lt;br /&gt;
&amp;lt;math&amp;gt;RG^TGR^T&amp;lt;/math&amp;gt;, где&lt;br /&gt;
&lt;br /&gt;
&amp;lt;math&amp;gt;&lt;br /&gt;
R(j,k,\theta) = &lt;br /&gt;
\begin{matrix}&lt;br /&gt;
  \\&lt;br /&gt;
  \\&lt;br /&gt;
  \\&lt;br /&gt;
j \\&lt;br /&gt;
  \\&lt;br /&gt;
k \\&lt;br /&gt;
  \\&lt;br /&gt;
  \\&lt;br /&gt;
  \\&lt;br /&gt;
\end{matrix}&lt;br /&gt;
&amp;lt;/math&amp;gt;  &lt;br /&gt;
&amp;lt;math&amp;gt;&lt;br /&gt;
\begin{bmatrix}&lt;br /&gt;
  &amp;amp; 1 &amp;amp;   &amp;amp;        &amp;amp;              &amp;amp;        &amp;amp;               &amp;amp;         &amp;amp;    &amp;amp;   \\&lt;br /&gt;
  &amp;amp;   &amp;amp; 1 &amp;amp;        &amp;amp;              &amp;amp;        &amp;amp;               &amp;amp;         &amp;amp;    &amp;amp;   \\&lt;br /&gt;
  &amp;amp;   &amp;amp;   &amp;amp; \ddots &amp;amp;              &amp;amp;        &amp;amp;               &amp;amp;         &amp;amp;    &amp;amp;   \\&lt;br /&gt;
  &amp;amp;   &amp;amp;   &amp;amp;        &amp;amp; \cos(\theta) &amp;amp;        &amp;amp; -\sin(\theta) &amp;amp;         &amp;amp;    &amp;amp;   \\&lt;br /&gt;
  &amp;amp;   &amp;amp;   &amp;amp;        &amp;amp;              &amp;amp; \ddots &amp;amp;               &amp;amp;         &amp;amp;    &amp;amp;   \\&lt;br /&gt;
  &amp;amp;   &amp;amp;   &amp;amp;        &amp;amp; \sin(\theta) &amp;amp;        &amp;amp; \cos(\theta)  &amp;amp;         &amp;amp;    &amp;amp;   \\&lt;br /&gt;
  &amp;amp;   &amp;amp;   &amp;amp;        &amp;amp;              &amp;amp;        &amp;amp;               &amp;amp; \ddots  &amp;amp;    &amp;amp;   \\&lt;br /&gt;
  &amp;amp;   &amp;amp;   &amp;amp;        &amp;amp;              &amp;amp;        &amp;amp;               &amp;amp;         &amp;amp; 1  &amp;amp;   \\&lt;br /&gt;
  &amp;amp;   &amp;amp;   &amp;amp;        &amp;amp;              &amp;amp;        &amp;amp;               &amp;amp;         &amp;amp;    &amp;amp; 1 \\&lt;br /&gt;
\end{bmatrix}&lt;br /&gt;
&amp;lt;/math&amp;gt;&lt;br /&gt;
&lt;br /&gt;
Обозначим &amp;lt;math&amp;gt;s = \sin \theta&amp;lt;/math&amp;gt; и &amp;lt;math&amp;gt;c = \cos \theta&amp;lt;/math&amp;gt;.&lt;br /&gt;
&lt;br /&gt;
Перемножив матрицы &amp;lt;math&amp;gt;RG^TGR^T&amp;lt;/math&amp;gt;, получим следующие выражения&amp;lt;ref&amp;gt;http://www.astro.tsu.ru/OsChMet/5_2.html&amp;lt;/ref&amp;gt;:&lt;br /&gt;
&lt;br /&gt;
&amp;lt;math&amp;gt;\begin{align}&lt;br /&gt;
 a_{jj}^{(i+1)} &amp;amp;= c^2\, a_{jj}^{(i)}  -  2\, s c \,a_{jk}^{(i)}  +  s^2\, a_{kk}^{(i)} \\&lt;br /&gt;
 a_{kk}^{(i+1)} &amp;amp;= s^2 \,a_{jj}^{(i)}  +  2 s c\, a_{jk}^{(i)}  +  c^2 \, a_{kk}^{(i)} \\&lt;br /&gt;
 a_{jk}^{(i+1)} &amp;amp;= a_{kj}^{(i+1)} = (c^2 - s^2 ) \, a_{jk}^{(i)}  +  s c \, (a_{kk}^{(i)} - a_{jj}^{(i)} ) \\&lt;br /&gt;
 a_{jm}^{(i+1)} &amp;amp;= a_{mj}^{(i+1)} = c \, a_{jm}^{(i)}  -  s \, a_{km}^{(i)} &amp;amp; m \ne j,k \\&lt;br /&gt;
 a_{km}^{(i+1)} &amp;amp;= a_{mk}^{(i+1)} = s \, a_{jm}^{(i)}  + c \, a_{km}^{(i)} &amp;amp; m \ne j,k \\&lt;br /&gt;
 a_{ml}^{(i+1)} &amp;amp;= a_{ml}^{(i)} &amp;amp;m,l \ne j,k&lt;br /&gt;
\end{align}&amp;lt;/math&amp;gt;&lt;br /&gt;
&lt;br /&gt;
Т.к внедиагональные элементы должны быть равны 0, то выбираем &amp;lt;math&amp;gt;\theta&amp;lt;/math&amp;gt; так, чтобы &amp;lt;math&amp;gt;a_{jk}^{(i+1)} = 0&amp;lt;/math&amp;gt; и &amp;lt;math&amp;gt;a_{kj}^{(i+1)} = 0&amp;lt;/math&amp;gt;.&lt;br /&gt;
&lt;br /&gt;
Тогда решая уравнение получаем, что&lt;br /&gt;
&lt;br /&gt;
&amp;lt;math&amp;gt;&lt;br /&gt;
         \begin{align}&lt;br /&gt;
         \tau &amp;amp;= ({a_{jj} - a_{kk}})/{2a_{jk}} \\&lt;br /&gt;
         t &amp;amp;= {sign(\tau)}/(|\tau| + \sqrt{1 + \tau^2}) \\&lt;br /&gt;
         c &amp;amp;= 1/(\sqrt{1 + t^2}) \\&lt;br /&gt;
         s &amp;amp;= ct \\&lt;br /&gt;
         \end{align}&amp;lt;/math&amp;gt;&lt;br /&gt;
&lt;br /&gt;
Остановка вычислений алгоритма наступает, когда внедиагональные элементы становятся меньше некоторого наперед заданного числа &amp;lt;math&amp;gt;\varepsilon&amp;lt;/math&amp;gt;.&lt;br /&gt;
&lt;br /&gt;
=== Вычислительное ядро алгоритма ===&lt;br /&gt;
Вычислительное ядро алгоритма составляет непосредственно вычисление одностороннего вращения Якоби, т.е. вычисление элементов матрицы &amp;lt;math&amp;gt;g_{jm}^{(i+1)} = g_{mj}^{(i+1)}&amp;lt;/math&amp;gt; и &amp;lt;math&amp;gt;g_{km}^{(i+1)} = g_{mk}^{(i+1)}&amp;lt;/math&amp;gt;, &amp;lt;math&amp;gt;m \ne j,k&amp;lt;/math&amp;gt;, а также вычисления элементов &amp;lt;math&amp;gt;g_{jj}^{(i+1)} &amp;lt;/math&amp;gt; и &amp;lt;math&amp;gt;g_{kk}^{(i+1)} &amp;lt;/math&amp;gt;, получившихся после умножения промежуточной матрицы на матрицу вращений Якоби:&lt;br /&gt;
&lt;br /&gt;
&amp;lt;math&amp;gt;\begin{align}&lt;br /&gt;
 g_{jj}^{(i+1)} &amp;amp;= c^2\, g_{jj}^{(i)}  -  2\, s c \,g_{jk}^{(i)}  +  s^2\, g_{kk}^{(i)} \\&lt;br /&gt;
 g_{kk}^{(i+1)} &amp;amp;= s^2 \,g_{jj}^{(i)}  +  2 s c\, g_{jk}^{(i)}  +  c^2 \, g_{kk}^{(i)} \\&lt;br /&gt;
 g_{jk}^{(i+1)} &amp;amp;= g_{kj}^{(i+1)} = (c^2 - s^2 ) \, g_{jk}^{(i)}  +  s c \, (g_{kk}^{(i)} - g_{jj}^{(i)} ) \\&lt;br /&gt;
 g_{jm}^{(i+1)} &amp;amp;= g_{mj}^{(i+1)} = c \, g_{jm}^{(i)}  -  s \, g_{km}^{(i)} &amp;amp; m \ne j,k \\&lt;br /&gt;
 g_{km}^{(i+1)} &amp;amp;= g_{mk}^{(i+1)} = s \, g_{jm}^{(i)}  + c \, g_{km}^{(i)} &amp;amp; m \ne j,k \\&lt;br /&gt;
 g_{ml}^{(i+1)} &amp;amp;= g_{ml}^{(i)} &amp;amp;m,l \ne j,k&lt;br /&gt;
\end{align}&amp;lt;/math&amp;gt;&lt;br /&gt;
&lt;br /&gt;
=== Макроструктура алгоритма ===&lt;br /&gt;
Основную часть метода составляет процедура односторонних вращений матрицы, которая в свою очередь состоит из:&lt;br /&gt;
&lt;br /&gt;
#Вычисление &amp;lt;math&amp;gt;\tau, c, s, t&amp;lt;/math&amp;gt;.&lt;br /&gt;
#Одностороннее вращение матрицы. &lt;br /&gt;
&lt;br /&gt;
Что требует &amp;lt;math&amp;gt;O(n)&amp;lt;/math&amp;gt; операций.&lt;br /&gt;
&lt;br /&gt;
После этого необходимо:&lt;br /&gt;
&lt;br /&gt;
#Вычислить сингулярные числа &amp;lt;math&amp;gt;\sigma_i&amp;lt;/math&amp;gt;.  Что требует &amp;lt;math&amp;gt;O(n)&amp;lt;/math&amp;gt; операций.&lt;br /&gt;
#Вычислить &amp;lt;math&amp;gt;U&amp;lt;/math&amp;gt; и &amp;lt;math&amp;gt;V&amp;lt;/math&amp;gt;. Что требует &amp;lt;math&amp;gt;O(n^2)&amp;lt;/math&amp;gt; операций.&lt;br /&gt;
&lt;br /&gt;
=== Схема реализации последовательного алгоритма ===&lt;br /&gt;
Применение метода Якоби к матрице &amp;lt;math&amp;gt;A = (G^TG)&amp;lt;/math&amp;gt; можно описать следующим образом&amp;lt;ref&amp;gt;Дж. Деммель «Вычислительная линейная алгебра» (стр. 261-263)&amp;lt;/ref&amp;gt;:&lt;br /&gt;
&lt;br /&gt;
Если &amp;lt;math&amp;gt;G = U\Sigma V^T&amp;lt;/math&amp;gt; и &amp;lt;math&amp;gt;\Sigma = diag(\sigma_{i})&amp;lt;/math&amp;gt;, то алгоритм вычисляет сингулярные числа &amp;lt;math&amp;gt;\sigma_{i}&amp;lt;/math&amp;gt;, матрицу &amp;lt;math&amp;gt;U&amp;lt;/math&amp;gt; левых сингулярных векторов и матрицу &amp;lt;math&amp;gt;V&amp;lt;/math&amp;gt; правых сингулярных векторов по следующей схеме:&lt;br /&gt;
&lt;br /&gt;
 repeat&lt;br /&gt;
     for &amp;lt;math&amp;gt;j=1&amp;lt;/math&amp;gt; to &amp;lt;math&amp;gt;n-1&amp;lt;/math&amp;gt;&lt;br /&gt;
         for &amp;lt;math&amp;gt;k=j+1&amp;lt;/math&amp;gt; to &amp;lt;math&amp;gt;n&amp;lt;/math&amp;gt;&lt;br /&gt;
             обратиться к процедуре &#039;&#039;&#039;&#039;&#039;One-Sided-Jacobi-Rotation&amp;lt;math&amp;gt;(G,j,k)&amp;lt;/math&amp;gt;&#039;&#039;&#039;&#039;&#039;&lt;br /&gt;
         end for&lt;br /&gt;
     end for&lt;br /&gt;
 пока &amp;lt;math&amp;gt;G^TG&amp;lt;/math&amp;gt; не станет достаточно близка к диагональной матрице&lt;br /&gt;
 Положить &amp;lt;math&amp;gt;\sigma_{i} = ||G(:,i)||_2 &amp;lt;/math&amp;gt; (норма &amp;lt;math&amp;gt;i&amp;lt;/math&amp;gt;-го столбца в &amp;lt;math&amp;gt;G&amp;lt;/math&amp;gt;)&lt;br /&gt;
 Положить &amp;lt;math&amp;gt;U = [u_{1},\dots, u_{n}]&amp;lt;/math&amp;gt;, где &amp;lt;math&amp;gt;u_{i} = G(:,i)/\sigma_{i}&amp;lt;/math&amp;gt;&lt;br /&gt;
 Положить &amp;lt;math&amp;gt;V = J&amp;lt;/math&amp;gt;, где &amp;lt;math&amp;gt;J&amp;lt;/math&amp;gt; - накопленное произведение вращений Якоби.&lt;br /&gt;
&lt;br /&gt;
Где процедура &#039;&#039;&#039;&#039;&#039;One-Sided-Jacobi-Rotation&#039;&#039;&#039;&#039;&#039; является метод односторонних вращений Якоби:&lt;br /&gt;
&lt;br /&gt;
 proc &#039;&#039;&#039;&#039;&#039;One-Sided-Jacobi-Rotation&amp;lt;math&amp;gt;(G,j,k)&amp;lt;/math&amp;gt;&#039;&#039;&#039;&#039;&#039;&lt;br /&gt;
     вычислить &amp;lt;math&amp;gt;a_{jj} = (G^TG)_{jj}, a_{jk} = (G^TG)_{jk}&amp;lt;/math&amp;gt; и &amp;lt;math&amp;gt;a_{kk} = (G^TG)_{kk}&amp;lt;/math&amp;gt;&lt;br /&gt;
     if &amp;lt;math&amp;gt;|a_{jk}|&amp;lt;/math&amp;gt; не слишком мал&lt;br /&gt;
         &amp;lt;math&amp;gt;&lt;br /&gt;
         \begin{align}&lt;br /&gt;
         \tau &amp;amp;= ({a_{jj} - a_{kk}})/{2a_{jk}} \\&lt;br /&gt;
         t &amp;amp;= {sign(\tau)}/(|\tau| + \sqrt{1 + \tau^2}) \\&lt;br /&gt;
         c &amp;amp;= 1/(\sqrt{1 + t^2}) \\&lt;br /&gt;
         s &amp;amp;= ct \\&lt;br /&gt;
         G &amp;amp;= GR(j,k,\theta) \  \dots c=cos\theta, s=sin\theta \end{align}&amp;lt;/math&amp;gt;&lt;br /&gt;
         if нужны правые сингулярные векторы &lt;br /&gt;
             &amp;lt;math&amp;gt;J = JR(j,k,\theta)&amp;lt;/math&amp;gt;&lt;br /&gt;
         end if&lt;br /&gt;
     end if&lt;br /&gt;
&lt;br /&gt;
=== Последовательная сложность алгоритма ===&lt;br /&gt;
Для одного вращения Якоби необходимо выполнить &amp;lt;math&amp;gt;O(n)&amp;lt;/math&amp;gt; операций умножения и сложения. &lt;br /&gt;
&lt;br /&gt;
Всего вариантов выбора &amp;lt;math&amp;gt;j&amp;lt;/math&amp;gt; и &amp;lt;math&amp;gt;k&amp;lt;/math&amp;gt; существует &amp;lt;math&amp;gt;\frac{n(n-1)}{2}&amp;lt;/math&amp;gt;.&lt;br /&gt;
&lt;br /&gt;
Таким образом последовательный алгоритм Якоби вычисления сингулярных чисел и векторов является алгоритмом с кубической сложностью.&lt;br /&gt;
&lt;br /&gt;
=== Информационный граф ===&lt;br /&gt;
Граф алгоритма состоит из четырех групп вершин&lt;br /&gt;
&lt;br /&gt;
(А)Первая группа вершин расположена в двумерной области, соответствующая ей операция - вычисление элементов &amp;lt;math&amp;gt;a_{jj},a_{jk},a_{kk}&amp;lt;/math&amp;gt; матрицы произведения &amp;lt;math&amp;gt;A = (G^TG)&amp;lt;/math&amp;gt;. Где &amp;lt;math&amp;gt;j&amp;lt;/math&amp;gt; изменяется от &amp;lt;math&amp;gt;1&amp;lt;/math&amp;gt; до &amp;lt;math&amp;gt;n-1&amp;lt;/math&amp;gt;, принимая все целочисленные значения, &amp;lt;math&amp;gt;k&amp;lt;/math&amp;gt;  изменяется от &amp;lt;math&amp;gt;j+1&amp;lt;/math&amp;gt; до &amp;lt;math&amp;gt;n&amp;lt;/math&amp;gt;, принимая все целочисленные значения.&lt;br /&gt;
&lt;br /&gt;
Граф вычисления каждого из элементов приведен на рисунке 1, где значениям &amp;lt;math&amp;gt;g_{ij}&amp;lt;/math&amp;gt; соответствуют обозначения &amp;lt;math&amp;gt;x_{ij}&amp;lt;/math&amp;gt;, а элементам &amp;lt;math&amp;gt;g^T_{ij}&amp;lt;/math&amp;gt; обозначения &amp;lt;math&amp;gt;z_{ij}&amp;lt;/math&amp;gt;. Значение &amp;lt;math&amp;gt;s_{ij}&amp;lt;/math&amp;gt; является значением результирующего элемента.&lt;br /&gt;
&lt;br /&gt;
(Б)Вторая группа вершин расположена в двумерной области, соответствующая ей операция – вычисление &amp;lt;math&amp;gt;c&amp;lt;/math&amp;gt; и &amp;lt;math&amp;gt;s&amp;lt;/math&amp;gt;.&lt;br /&gt;
&lt;br /&gt;
Информационный граф с входными и выходными данными вычисления пункта (Б) представлен на рисунке 2.&lt;br /&gt;
&lt;br /&gt;
(В)Третья группа вершин расположена в двумерной области, соответствующая ей операция вычисление значений элементов &amp;lt;math&amp;gt;g_{jm}^{(i+1)} = g_{mj}^{(i+1)}&amp;lt;/math&amp;gt; и &amp;lt;math&amp;gt;g_{km}^{(i+1)} = g_{mk}^{(i+1)}&amp;lt;/math&amp;gt;, &amp;lt;math&amp;gt;m \ne j,k&amp;lt;/math&amp;gt;.&lt;br /&gt;
&lt;br /&gt;
(Г)Четвертая группа вершин расположена в двумерной области, соответствующая ей операция вычисление значений элементов &amp;lt;math&amp;gt;g_{jj}^{(i+1)} &amp;lt;/math&amp;gt; и &amp;lt;math&amp;gt;g_{kk}^{(i+1)} &amp;lt;/math&amp;gt;.&lt;br /&gt;
&lt;br /&gt;
Элементы групп (В) и (Г) вычисляются аналогично вычислению элементов матрицы произведения, т.к. фактически представляют собой перемножение матриц &amp;lt;math&amp;gt;G&amp;lt;/math&amp;gt; и &amp;lt;math&amp;gt;R&amp;lt;/math&amp;gt;&lt;br /&gt;
&lt;br /&gt;
[[File:Jacobi_2.jpg|none|thumb|1000px|Рисунок 1. Информационный граф с входными и выходными параметрами вычисления каждого элемента матрицы произведения.]]&lt;br /&gt;
&lt;br /&gt;
[[File:Jacobi_1.jpg|none|thumb|1000px|Рисунок 2. Информационный граф с входными и выходными параметрами вычисления значений &amp;lt;math&amp;gt;c&amp;lt;/math&amp;gt; и &amp;lt;math&amp;gt;s&amp;lt;/math&amp;gt;.]]&lt;br /&gt;
&lt;br /&gt;
Обобщенный граф метода Якоби представлен на рисунке 3, где буквами А, Б, В и Г обозначено вычисление групп вершин (А), (Б), (В) и (Г).&lt;br /&gt;
&lt;br /&gt;
[[File:Graf21.png|none|thumb|2000px|Рисунок 3. Обобщенный граф алгоритма вычисления сингулярных чисел и векторов методом Якоби.]]&lt;br /&gt;
&lt;br /&gt;
=== Ресурс параллелизма алгоритма ===&lt;br /&gt;
Для выполнения одной итерации метода Якоби требуется последовательно выполнить несколько ярусов:&lt;br /&gt;
# вычислить &amp;lt;math&amp;gt;\tau&amp;lt;/math&amp;gt; &lt;br /&gt;
# вычислить &amp;lt;math&amp;gt;t&amp;lt;/math&amp;gt; &lt;br /&gt;
# вычислить &amp;lt;math&amp;gt;c&amp;lt;/math&amp;gt; &lt;br /&gt;
# вычислить &amp;lt;math&amp;gt;s&amp;lt;/math&amp;gt;&lt;br /&gt;
# выполнить поворот матрицы &amp;lt;math&amp;gt;G&amp;lt;/math&amp;gt; с параллельным выполнением &amp;lt;math&amp;gt;2(n-2)&amp;lt;/math&amp;gt; операций вычисления элементов матрицы &amp;lt;math&amp;gt;g_{jm}^{(i+1)} = g_{mj}^{(i+1)}&amp;lt;/math&amp;gt; и &amp;lt;math&amp;gt;g_{km}^{(i+1)} = g_{mk}^{(i+1)}&amp;lt;/math&amp;gt;, &amp;lt;math&amp;gt;m \ne j,k&amp;lt;/math&amp;gt;, а также вычисления элементов &amp;lt;math&amp;gt;g_{jj}^{(i+1)} &amp;lt;/math&amp;gt; и &amp;lt;math&amp;gt;g_{kk}^{(i+1)} &amp;lt;/math&amp;gt;. &lt;br /&gt;
&lt;br /&gt;
Суммарное количество итераций равно &amp;lt;math&amp;gt;\frac{n(n-1)}{2}&amp;lt;/math&amp;gt; (Различные варианты выбора &amp;lt;math&amp;gt;j&amp;lt;/math&amp;gt; и &amp;lt;math&amp;gt;k&amp;lt;/math&amp;gt;). &lt;br /&gt;
&lt;br /&gt;
Асимптотически метод сходится квадратично. &lt;br /&gt;
&lt;br /&gt;
Таким образом, при классификации по высоте ЯПФ метод Якоби относится к алгоритмам со сложностью &amp;lt;math&amp;gt;O(n^2)&amp;lt;/math&amp;gt;&amp;amp;nbsp;, а при классификации по ширине ЯПФ — к алгоритмам со сложностью &amp;lt;math&amp;gt;O(n)&amp;lt;/math&amp;gt;.&lt;br /&gt;
&lt;br /&gt;
=== Входные и выходные данные алгоритма ===&lt;br /&gt;
&#039;&#039;&#039;Входные данные&#039;&#039;&#039;: плотная матрица &amp;lt;math&amp;gt;G&amp;lt;/math&amp;gt; размера &amp;lt;math&amp;gt;n&amp;lt;/math&amp;gt;х&amp;lt;math&amp;gt;n&amp;lt;/math&amp;gt;, где &amp;lt;math&amp;gt;A= G^TG&amp;lt;/math&amp;gt; – симметрическая матрица.&lt;br /&gt;
&lt;br /&gt;
&#039;&#039;&#039;Объём входных данных&#039;&#039;&#039;: &amp;lt;math&amp;gt;n^2&amp;lt;/math&amp;gt; (т.к. для хранения матрицы &amp;lt;math&amp;gt;G&amp;lt;/math&amp;gt; используем двумерный массив размера &amp;lt;math&amp;gt;n&amp;lt;/math&amp;gt;х&amp;lt;math&amp;gt;n&amp;lt;/math&amp;gt;)&lt;br /&gt;
&lt;br /&gt;
&#039;&#039;&#039;Выходные данные&#039;&#039;&#039;: &amp;lt;math&amp;gt;\sigma_{i}&amp;lt;/math&amp;gt;  - сингулярные числа, матрица &amp;lt;math&amp;gt;U&amp;lt;/math&amp;gt; левых сингулярных векторов и матрица &amp;lt;math&amp;gt;V&amp;lt;/math&amp;gt; правых сингулярных векторов.&lt;br /&gt;
&lt;br /&gt;
&#039;&#039;&#039;Объём выходных данных&#039;&#039;&#039;: &amp;lt;math&amp;gt;2n^2 + n&amp;lt;/math&amp;gt; (т.к. необходимо хранить вектор сингулярных чисел длины &amp;lt;math&amp;gt;n&amp;lt;/math&amp;gt;, а также две матрицы &amp;lt;math&amp;gt;U, V&amp;lt;/math&amp;gt; левых и правых сингулярных векторов размера &amp;lt;math&amp;gt;n&amp;lt;/math&amp;gt;х&amp;lt;math&amp;gt;n&amp;lt;/math&amp;gt;).&lt;br /&gt;
&lt;br /&gt;
=== Свойства алгоритма ===&lt;br /&gt;
Метод Якоби является самым медленным из имеющихся алгоритмов вычисления сингулярных чисел и сингулярных векторов матрицы. Тем не менее, для  матриц &amp;lt;math&amp;gt;G&amp;lt;/math&amp;gt;, которые могут быть представлены в виде &amp;lt;math&amp;gt;G=DX&amp;lt;/math&amp;gt;, где &amp;lt;math&amp;gt;D&amp;lt;/math&amp;gt; - диагональная, а &amp;lt;math&amp;gt;X&amp;lt;/math&amp;gt; - хорошо обусловлена, он способен вычислять сингулярные числа и вектора намного точнее, чем другие методы&amp;lt;ref&amp;gt;Дж. Деммель «Вычислительная линейная алгебра» (стр. 261-264)&amp;lt;/ref&amp;gt;. &lt;br /&gt;
&lt;br /&gt;
Вычислительная мощность алгоритма, как отношение числа операций к суммарному объему входных и выходных данных является линейной.&lt;br /&gt;
&lt;br /&gt;
Метод Якоби не детерминирован, так как является итерационным алгоритмом с выходом по точности (число итераций зависит от входных данных и порогового значения).&lt;br /&gt;
&lt;br /&gt;
== Программная реализация алгоритма ==&lt;br /&gt;
&lt;br /&gt;
=== Особенности реализации последовательного алгоритма ===&lt;br /&gt;
&lt;br /&gt;
=== Локальность данных и вычислений ===&lt;br /&gt;
&lt;br /&gt;
=== Возможные способы и особенности параллельной реализации алгоритма ===&lt;br /&gt;
&lt;br /&gt;
=== Масштабируемость алгоритма и его реализации ===&lt;br /&gt;
Исследование масштабируемости параллельной реализации метода Якоби вычисления сингулярных чисел и векторов проводилось на суперкомпьютере &amp;quot;Ломоносов&amp;quot;. Алгоритм реализован на языке программирования C с использованием механизмов MPI.&lt;br /&gt;
&lt;br /&gt;
Набор и границы значений изменяемых параметров запуска реализации алгоритма: &lt;br /&gt;
&lt;br /&gt;
*	число процессоров [1 : 128] с шагом равным степени двойки;&lt;br /&gt;
*	размер матрицы [256 : 1792] с шагом 256.&lt;br /&gt;
&lt;br /&gt;
В результате проведённых экспериментов был получен следующий диапазон эффективности реализации алгоритма:&lt;br /&gt;
&lt;br /&gt;
*	минимальная эффективность реализации ;&lt;br /&gt;
*	максимальная эффективность реализации .&lt;br /&gt;
&lt;br /&gt;
На следующих рисунках приведены графики производительности и эффективности выбранной реализации метода Якоби в зависимости от изменяемых параметров запуска.&lt;br /&gt;
&lt;br /&gt;
[[File:Performance.jpg|none|thumb|1000px|Рисунок 1. Параллельная реализация метода Якоби. Изменение производительности в зависимости от числа процессоров и размера матрицы.]]&lt;br /&gt;
&lt;br /&gt;
=== Динамические характеристики и эффективность реализации алгоритма ===&lt;br /&gt;
&lt;br /&gt;
=== Выводы для классов архитектур ===&lt;br /&gt;
&lt;br /&gt;
=== Существующие реализации алгоритма ===&lt;br /&gt;
Метод Якоби нахождения сингулярных значений и векторов реализован в таких пакетах, как LAPACK &amp;lt;ref&amp;gt;http://www.netlib.org/scalapack/slug/&amp;lt;/ref&amp;gt;, LINPACK/EISPACK &amp;lt;ref&amp;gt; http://www.netlib.org/linpack/ &amp;lt;/ref&amp;gt;, Intel MKL &amp;lt;ref&amp;gt;https://software.intel.com/ru-ru/node/521153#CAF8CA08-1C69-48F8-B0C3-B2B27AFA92FA&amp;lt;/ref&amp;gt;.&lt;br /&gt;
&lt;br /&gt;
Так же функция Якоби реализована в пакете Matlab.&lt;br /&gt;
&lt;br /&gt;
Т. к. алгоритм считается медленным, он не включен во многие известные пакеты.&lt;br /&gt;
&lt;br /&gt;
== Литература ==&lt;br /&gt;
1. Дж. Деммель Вычислительная линейная алгебра. Изд. Мир, 2001.&lt;/div&gt;</summary>
		<author><name>Davletshuna Alexandra</name></author>
	</entry>
	<entry>
		<id>https://xn--80aecvaldz.xn--80ahdrnmvk.xn--p1ai/w/ru/index.php?title=%D0%A3%D1%87%D0%B0%D1%81%D1%82%D0%BD%D0%B8%D0%BA:Davletshuna_Alexandra/%D0%9C%D0%B5%D1%82%D0%BE%D0%B4_%D0%AF%D0%BA%D0%BE%D0%B1%D0%B8_%D0%B2%D1%8B%D1%87%D0%B8%D1%81%D0%BB%D0%B5%D0%BD%D0%B8%D1%8F_%D1%81%D0%B8%D0%BD%D0%B3%D1%83%D0%BB%D1%8F%D1%80%D0%BD%D1%8B%D1%85_%D1%87%D0%B8%D1%81%D0%B5%D0%BB_%D0%B8_%D0%B2%D0%B5%D0%BA%D1%82%D0%BE%D1%80%D0%BE%D0%B2&amp;diff=17895</id>
		<title>Участник:Davletshuna Alexandra/Метод Якоби вычисления сингулярных чисел и векторов</title>
		<link rel="alternate" type="text/html" href="https://xn--80aecvaldz.xn--80ahdrnmvk.xn--p1ai/w/ru/index.php?title=%D0%A3%D1%87%D0%B0%D1%81%D1%82%D0%BD%D0%B8%D0%BA:Davletshuna_Alexandra/%D0%9C%D0%B5%D1%82%D0%BE%D0%B4_%D0%AF%D0%BA%D0%BE%D0%B1%D0%B8_%D0%B2%D1%8B%D1%87%D0%B8%D1%81%D0%BB%D0%B5%D0%BD%D0%B8%D1%8F_%D1%81%D0%B8%D0%BD%D0%B3%D1%83%D0%BB%D1%8F%D1%80%D0%BD%D1%8B%D1%85_%D1%87%D0%B8%D1%81%D0%B5%D0%BB_%D0%B8_%D0%B2%D0%B5%D0%BA%D1%82%D0%BE%D1%80%D0%BE%D0%B2&amp;diff=17895"/>
		<updated>2016-11-17T12:03:22Z</updated>

		<summary type="html">&lt;p&gt;Davletshuna Alexandra: /* Масштабируемость алгоритма и его реализации */&lt;/p&gt;
&lt;hr /&gt;
&lt;div&gt;{{algorithm&lt;br /&gt;
| name              = Метод Якоби вычисления сингулярных чисел и векторов&lt;br /&gt;
| serial_complexity = &amp;lt;math&amp;gt;O(n^3)&amp;lt;/math&amp;gt;&lt;br /&gt;
| pf_height         = &amp;lt;math&amp;gt;O(n^2)&amp;lt;/math&amp;gt;&lt;br /&gt;
| pf_width          = &amp;lt;math&amp;gt;O(n)&amp;lt;/math&amp;gt;&lt;br /&gt;
| input_data        = &amp;lt;math&amp;gt;n^2&amp;lt;/math&amp;gt;&lt;br /&gt;
| output_data       = &amp;lt;math&amp;gt;2n^2 + n&amp;lt;/math&amp;gt;&lt;br /&gt;
}}&lt;br /&gt;
&lt;br /&gt;
Авторы статьи: [[Участница:Davletshuna Alexandra|Давлетшина Александра]] (группа 619) пункты 1.1-1.4, 1.6, 2.7; [[Участница:Alek sandra|Зайцева Александра]] (группа 601) пункты 1.5, 1.7-1.10, 2.7.&lt;br /&gt;
&lt;br /&gt;
== Свойства и структура алгоритма ==&lt;br /&gt;
&lt;br /&gt;
=== Общее описание алгоритма ===&lt;br /&gt;
&#039;&#039;&#039;Сингулярным разложением&#039;&#039;&#039; называется разложение прямоугольной вещественной или комплексной матрицы, имеющее широкое применение, в силу своей наглядной геометрической интерпретации, при решении многих прикладных задач. Сингулярное разложение матрицы А позволяет вычислять сингулярные числа данной матрицы, а также, левые и правые сингулярные векторы матрицы А:&lt;br /&gt;
&lt;br /&gt;
•	левые сингулярные векторы матрицы А — это собственные векторы матрицы &amp;lt;math&amp;gt;AA^*&amp;lt;/math&amp;gt;;&lt;br /&gt;
&lt;br /&gt;
•	правые сингулярные векторы матрицы A — это собственные векторы матрицы &amp;lt;math&amp;gt;A^*A&amp;lt;/math&amp;gt;.&lt;br /&gt;
&lt;br /&gt;
Геометрическая интерпретация сингулярного разложения заключается в следующем факте из геометрии: &#039;&#039;Образом любого линейного преобразования, заданного с помощью матрицы &amp;lt;math&amp;gt;m&amp;lt;/math&amp;gt;x&amp;lt;math&amp;gt;n&amp;lt;/math&amp;gt;, примененного к единичной сфере является гиперэллипсоид&#039;&#039;.&lt;br /&gt;
&lt;br /&gt;
Из многочисленных разложений матриц, наиболее удобным является сингулярное разложение матрицы в виде: &amp;lt;math&amp;gt;A=U\Sigma V^*&amp;lt;/math&amp;gt;, где &amp;lt;math&amp;gt;U, V&amp;lt;/math&amp;gt; – унитарные матрицы, а &amp;lt;math&amp;gt;\Sigma&amp;lt;/math&amp;gt; – диагональная матрица с вещественными положительными числами на диагонали &amp;lt;ref&amp;gt;http://algorithms.parallel.ru/&amp;lt;/ref&amp;gt;.&lt;br /&gt;
&lt;br /&gt;
Диагональные элементы матрицы &amp;lt;math&amp;gt;\Sigma&amp;lt;/math&amp;gt; называются сингулярными числами матрицы &amp;lt;math&amp;gt;A&amp;lt;/math&amp;gt;, а столбцы матриц &amp;lt;math&amp;gt;U,V&amp;lt;/math&amp;gt; левыми и правыми сингулярными векторами соответственно.&lt;br /&gt;
&lt;br /&gt;
Алгоритм Якоби сингулярного разложения матрицы был предложен одним из первых в 1846 году. Он приводит прямоугольную матрицу к диагональной матрице с помощью последовательности элементарных вращений. Метод может найти все сингулярные значения с очень высокой точностью. Однако его производительность является довольно низкой, в сравнении с конкурирующими методами.&lt;br /&gt;
&lt;br /&gt;
&#039;&#039;Неявный&#039;&#039;&amp;lt;ref&amp;gt;Дж. Деммель «Вычислительная линейная алгебра» (стр. 261-264)&amp;lt;/ref&amp;gt; метод Якоби математически эквивалентен применению метода Якоби вычисления собственных значений к матрице &amp;lt;math&amp;gt;A = G^TG&amp;lt;/math&amp;gt;.&lt;br /&gt;
Это значит, что на каждом шаге вычисляется вращение Якоби &amp;lt;math&amp;gt;J&amp;lt;/math&amp;gt;, с помощью которого матрица &amp;lt;math&amp;gt;G^TG&amp;lt;/math&amp;gt; неявно пересчитывется в &amp;lt;math&amp;gt;J^TG^TGJ&amp;lt;/math&amp;gt;; вращение выбрано так, чтобы пара внедиагональных элементов из &amp;lt;math&amp;gt;G^TG&amp;lt;/math&amp;gt; обратилась в нули в матрице &amp;lt;math&amp;gt;J^TG^TGJ&amp;lt;/math&amp;gt;. При этом ни &amp;lt;math&amp;gt;G^TG&amp;lt;/math&amp;gt;, ни &amp;lt;math&amp;gt;J^TG^TGJ&amp;lt;/math&amp;gt; не вычисляются в явном виде; вместо них вычисляется матрица &amp;lt;math&amp;gt;GJ&amp;lt;/math&amp;gt;. Поэтому алгоритм называется &#039;&#039;методом односторонних вращений&#039;&#039;.&lt;br /&gt;
&lt;br /&gt;
=== Математическое описание алгоритма ===&lt;br /&gt;
Исходные данные: матрица &amp;lt;math&amp;gt;G&amp;lt;/math&amp;gt; (элементы &amp;lt;math&amp;gt;g_{ij}, i, j = 1, \ldots, n&amp;lt;/math&amp;gt;).&lt;br /&gt;
&lt;br /&gt;
Вычисляемые данные: матрица &amp;lt;math&amp;gt;\Sigma = diag(\sigma_{i})&amp;lt;/math&amp;gt;, где &amp;lt;math&amp;gt;\sigma_{i}&amp;lt;/math&amp;gt; - сингулярные числа, &amp;lt;math&amp;gt;U&amp;lt;/math&amp;gt; - матрица левых сингулярных векторов, &amp;lt;math&amp;gt;V&amp;lt;/math&amp;gt; - матрица правых сингулярных векторов.&lt;br /&gt;
&lt;br /&gt;
симметричную матрицу &amp;lt;math&amp;gt;A = (G^TG)&amp;lt;/math&amp;gt; можно привести к диагональному виду:&lt;br /&gt;
&amp;lt;math&amp;gt;RG^TGR^T&amp;lt;/math&amp;gt;, где&lt;br /&gt;
&lt;br /&gt;
&amp;lt;math&amp;gt;&lt;br /&gt;
R(j,k,\theta) = &lt;br /&gt;
\begin{matrix}&lt;br /&gt;
  \\&lt;br /&gt;
  \\&lt;br /&gt;
  \\&lt;br /&gt;
j \\&lt;br /&gt;
  \\&lt;br /&gt;
k \\&lt;br /&gt;
  \\&lt;br /&gt;
  \\&lt;br /&gt;
  \\&lt;br /&gt;
\end{matrix}&lt;br /&gt;
&amp;lt;/math&amp;gt;  &lt;br /&gt;
&amp;lt;math&amp;gt;&lt;br /&gt;
\begin{bmatrix}&lt;br /&gt;
  &amp;amp; 1 &amp;amp;   &amp;amp;        &amp;amp;              &amp;amp;        &amp;amp;               &amp;amp;         &amp;amp;    &amp;amp;   \\&lt;br /&gt;
  &amp;amp;   &amp;amp; 1 &amp;amp;        &amp;amp;              &amp;amp;        &amp;amp;               &amp;amp;         &amp;amp;    &amp;amp;   \\&lt;br /&gt;
  &amp;amp;   &amp;amp;   &amp;amp; \ddots &amp;amp;              &amp;amp;        &amp;amp;               &amp;amp;         &amp;amp;    &amp;amp;   \\&lt;br /&gt;
  &amp;amp;   &amp;amp;   &amp;amp;        &amp;amp; \cos(\theta) &amp;amp;        &amp;amp; -\sin(\theta) &amp;amp;         &amp;amp;    &amp;amp;   \\&lt;br /&gt;
  &amp;amp;   &amp;amp;   &amp;amp;        &amp;amp;              &amp;amp; \ddots &amp;amp;               &amp;amp;         &amp;amp;    &amp;amp;   \\&lt;br /&gt;
  &amp;amp;   &amp;amp;   &amp;amp;        &amp;amp; \sin(\theta) &amp;amp;        &amp;amp; \cos(\theta)  &amp;amp;         &amp;amp;    &amp;amp;   \\&lt;br /&gt;
  &amp;amp;   &amp;amp;   &amp;amp;        &amp;amp;              &amp;amp;        &amp;amp;               &amp;amp; \ddots  &amp;amp;    &amp;amp;   \\&lt;br /&gt;
  &amp;amp;   &amp;amp;   &amp;amp;        &amp;amp;              &amp;amp;        &amp;amp;               &amp;amp;         &amp;amp; 1  &amp;amp;   \\&lt;br /&gt;
  &amp;amp;   &amp;amp;   &amp;amp;        &amp;amp;              &amp;amp;        &amp;amp;               &amp;amp;         &amp;amp;    &amp;amp; 1 \\&lt;br /&gt;
\end{bmatrix}&lt;br /&gt;
&amp;lt;/math&amp;gt;&lt;br /&gt;
&lt;br /&gt;
Обозначим &amp;lt;math&amp;gt;s = \sin \theta&amp;lt;/math&amp;gt; и &amp;lt;math&amp;gt;c = \cos \theta&amp;lt;/math&amp;gt;.&lt;br /&gt;
&lt;br /&gt;
Перемножив матрицы &amp;lt;math&amp;gt;RG^TGR^T&amp;lt;/math&amp;gt;, получим следующие выражения&amp;lt;ref&amp;gt;http://www.astro.tsu.ru/OsChMet/5_2.html&amp;lt;/ref&amp;gt;:&lt;br /&gt;
&lt;br /&gt;
&amp;lt;math&amp;gt;\begin{align}&lt;br /&gt;
 a_{jj}^{(i+1)} &amp;amp;= c^2\, a_{jj}^{(i)}  -  2\, s c \,a_{jk}^{(i)}  +  s^2\, a_{kk}^{(i)} \\&lt;br /&gt;
 a_{kk}^{(i+1)} &amp;amp;= s^2 \,a_{jj}^{(i)}  +  2 s c\, a_{jk}^{(i)}  +  c^2 \, a_{kk}^{(i)} \\&lt;br /&gt;
 a_{jk}^{(i+1)} &amp;amp;= a_{kj}^{(i+1)} = (c^2 - s^2 ) \, a_{jk}^{(i)}  +  s c \, (a_{kk}^{(i)} - a_{jj}^{(i)} ) \\&lt;br /&gt;
 a_{jm}^{(i+1)} &amp;amp;= a_{mj}^{(i+1)} = c \, a_{jm}^{(i)}  -  s \, a_{km}^{(i)} &amp;amp; m \ne j,k \\&lt;br /&gt;
 a_{km}^{(i+1)} &amp;amp;= a_{mk}^{(i+1)} = s \, a_{jm}^{(i)}  + c \, a_{km}^{(i)} &amp;amp; m \ne j,k \\&lt;br /&gt;
 a_{ml}^{(i+1)} &amp;amp;= a_{ml}^{(i)} &amp;amp;m,l \ne j,k&lt;br /&gt;
\end{align}&amp;lt;/math&amp;gt;&lt;br /&gt;
&lt;br /&gt;
Т.к внедиагональные элементы должны быть равны 0, то выбираем &amp;lt;math&amp;gt;\theta&amp;lt;/math&amp;gt; так, чтобы &amp;lt;math&amp;gt;a_{jk}^{(i+1)} = 0&amp;lt;/math&amp;gt; и &amp;lt;math&amp;gt;a_{kj}^{(i+1)} = 0&amp;lt;/math&amp;gt;.&lt;br /&gt;
&lt;br /&gt;
Тогда решая уравнение получаем, что&lt;br /&gt;
&lt;br /&gt;
&amp;lt;math&amp;gt;&lt;br /&gt;
         \begin{align}&lt;br /&gt;
         \tau &amp;amp;= ({a_{jj} - a_{kk}})/{2a_{jk}} \\&lt;br /&gt;
         t &amp;amp;= {sign(\tau)}/(|\tau| + \sqrt{1 + \tau^2}) \\&lt;br /&gt;
         c &amp;amp;= 1/(\sqrt{1 + t^2}) \\&lt;br /&gt;
         s &amp;amp;= ct \\&lt;br /&gt;
         \end{align}&amp;lt;/math&amp;gt;&lt;br /&gt;
&lt;br /&gt;
Остановка вычислений алгоритма наступает, когда внедиагональные элементы становятся меньше некоторого наперед заданного числа &amp;lt;math&amp;gt;\varepsilon&amp;lt;/math&amp;gt;.&lt;br /&gt;
&lt;br /&gt;
=== Вычислительное ядро алгоритма ===&lt;br /&gt;
Вычислительное ядро алгоритма составляет непосредственно вычисление одностороннего вращения Якоби, т.е. вычисление элементов матрицы &amp;lt;math&amp;gt;g_{jm}^{(i+1)} = g_{mj}^{(i+1)}&amp;lt;/math&amp;gt; и &amp;lt;math&amp;gt;g_{km}^{(i+1)} = g_{mk}^{(i+1)}&amp;lt;/math&amp;gt;, &amp;lt;math&amp;gt;m \ne j,k&amp;lt;/math&amp;gt;, а также вычисления элементов &amp;lt;math&amp;gt;g_{jj}^{(i+1)} &amp;lt;/math&amp;gt; и &amp;lt;math&amp;gt;g_{kk}^{(i+1)} &amp;lt;/math&amp;gt;, получившихся после умножения промежуточной матрицы на матрицу вращений Якоби:&lt;br /&gt;
&lt;br /&gt;
&amp;lt;math&amp;gt;\begin{align}&lt;br /&gt;
 g_{jj}^{(i+1)} &amp;amp;= c^2\, g_{jj}^{(i)}  -  2\, s c \,g_{jk}^{(i)}  +  s^2\, g_{kk}^{(i)} \\&lt;br /&gt;
 g_{kk}^{(i+1)} &amp;amp;= s^2 \,g_{jj}^{(i)}  +  2 s c\, g_{jk}^{(i)}  +  c^2 \, g_{kk}^{(i)} \\&lt;br /&gt;
 g_{jk}^{(i+1)} &amp;amp;= g_{kj}^{(i+1)} = (c^2 - s^2 ) \, g_{jk}^{(i)}  +  s c \, (g_{kk}^{(i)} - g_{jj}^{(i)} ) \\&lt;br /&gt;
 g_{jm}^{(i+1)} &amp;amp;= g_{mj}^{(i+1)} = c \, g_{jm}^{(i)}  -  s \, g_{km}^{(i)} &amp;amp; m \ne j,k \\&lt;br /&gt;
 g_{km}^{(i+1)} &amp;amp;= g_{mk}^{(i+1)} = s \, g_{jm}^{(i)}  + c \, g_{km}^{(i)} &amp;amp; m \ne j,k \\&lt;br /&gt;
 g_{ml}^{(i+1)} &amp;amp;= g_{ml}^{(i)} &amp;amp;m,l \ne j,k&lt;br /&gt;
\end{align}&amp;lt;/math&amp;gt;&lt;br /&gt;
&lt;br /&gt;
=== Макроструктура алгоритма ===&lt;br /&gt;
Основную часть метода составляет процедура односторонних вращений матрицы, которая в свою очередь состоит из:&lt;br /&gt;
&lt;br /&gt;
#Вычисление &amp;lt;math&amp;gt;\tau, c, s, t&amp;lt;/math&amp;gt;.&lt;br /&gt;
#Одностороннее вращение матрицы. &lt;br /&gt;
&lt;br /&gt;
Что требует &amp;lt;math&amp;gt;O(n)&amp;lt;/math&amp;gt; операций.&lt;br /&gt;
&lt;br /&gt;
После этого необходимо:&lt;br /&gt;
&lt;br /&gt;
#Вычислить сингулярные числа &amp;lt;math&amp;gt;\sigma_i&amp;lt;/math&amp;gt;.  Что требует &amp;lt;math&amp;gt;O(n)&amp;lt;/math&amp;gt; операций.&lt;br /&gt;
#Вычислить &amp;lt;math&amp;gt;U&amp;lt;/math&amp;gt; и &amp;lt;math&amp;gt;V&amp;lt;/math&amp;gt;. Что требует &amp;lt;math&amp;gt;O(n^2)&amp;lt;/math&amp;gt; операций.&lt;br /&gt;
&lt;br /&gt;
=== Схема реализации последовательного алгоритма ===&lt;br /&gt;
Применение метода Якоби к матрице &amp;lt;math&amp;gt;A = (G^TG)&amp;lt;/math&amp;gt; можно описать следующим образом&amp;lt;ref&amp;gt;Дж. Деммель «Вычислительная линейная алгебра» (стр. 261-263)&amp;lt;/ref&amp;gt;:&lt;br /&gt;
&lt;br /&gt;
Если &amp;lt;math&amp;gt;G = U\Sigma V^T&amp;lt;/math&amp;gt; и &amp;lt;math&amp;gt;\Sigma = diag(\sigma_{i})&amp;lt;/math&amp;gt;, то алгоритм вычисляет сингулярные числа &amp;lt;math&amp;gt;\sigma_{i}&amp;lt;/math&amp;gt;, матрицу &amp;lt;math&amp;gt;U&amp;lt;/math&amp;gt; левых сингулярных векторов и матрицу &amp;lt;math&amp;gt;V&amp;lt;/math&amp;gt; правых сингулярных векторов по следующей схеме:&lt;br /&gt;
&lt;br /&gt;
 repeat&lt;br /&gt;
     for &amp;lt;math&amp;gt;j=1&amp;lt;/math&amp;gt; to &amp;lt;math&amp;gt;n-1&amp;lt;/math&amp;gt;&lt;br /&gt;
         for &amp;lt;math&amp;gt;k=j+1&amp;lt;/math&amp;gt; to &amp;lt;math&amp;gt;n&amp;lt;/math&amp;gt;&lt;br /&gt;
             обратиться к процедуре &#039;&#039;&#039;&#039;&#039;One-Sided-Jacobi-Rotation&amp;lt;math&amp;gt;(G,j,k)&amp;lt;/math&amp;gt;&#039;&#039;&#039;&#039;&#039;&lt;br /&gt;
         end for&lt;br /&gt;
     end for&lt;br /&gt;
 пока &amp;lt;math&amp;gt;G^TG&amp;lt;/math&amp;gt; не станет достаточно близка к диагональной матрице&lt;br /&gt;
 Положить &amp;lt;math&amp;gt;\sigma_{i} = ||G(:,i)||_2 &amp;lt;/math&amp;gt; (норма &amp;lt;math&amp;gt;i&amp;lt;/math&amp;gt;-го столбца в &amp;lt;math&amp;gt;G&amp;lt;/math&amp;gt;)&lt;br /&gt;
 Положить &amp;lt;math&amp;gt;U = [u_{1},\dots, u_{n}]&amp;lt;/math&amp;gt;, где &amp;lt;math&amp;gt;u_{i} = G(:,i)/\sigma_{i}&amp;lt;/math&amp;gt;&lt;br /&gt;
 Положить &amp;lt;math&amp;gt;V = J&amp;lt;/math&amp;gt;, где &amp;lt;math&amp;gt;J&amp;lt;/math&amp;gt; - накопленное произведение вращений Якоби.&lt;br /&gt;
&lt;br /&gt;
Где процедура &#039;&#039;&#039;&#039;&#039;One-Sided-Jacobi-Rotation&#039;&#039;&#039;&#039;&#039; является метод односторонних вращений Якоби:&lt;br /&gt;
&lt;br /&gt;
 proc &#039;&#039;&#039;&#039;&#039;One-Sided-Jacobi-Rotation&amp;lt;math&amp;gt;(G,j,k)&amp;lt;/math&amp;gt;&#039;&#039;&#039;&#039;&#039;&lt;br /&gt;
     вычислить &amp;lt;math&amp;gt;a_{jj} = (G^TG)_{jj}, a_{jk} = (G^TG)_{jk}&amp;lt;/math&amp;gt; и &amp;lt;math&amp;gt;a_{kk} = (G^TG)_{kk}&amp;lt;/math&amp;gt;&lt;br /&gt;
     if &amp;lt;math&amp;gt;|a_{jk}|&amp;lt;/math&amp;gt; не слишком мал&lt;br /&gt;
         &amp;lt;math&amp;gt;&lt;br /&gt;
         \begin{align}&lt;br /&gt;
         \tau &amp;amp;= ({a_{jj} - a_{kk}})/{2a_{jk}} \\&lt;br /&gt;
         t &amp;amp;= {sign(\tau)}/(|\tau| + \sqrt{1 + \tau^2}) \\&lt;br /&gt;
         c &amp;amp;= 1/(\sqrt{1 + t^2}) \\&lt;br /&gt;
         s &amp;amp;= ct \\&lt;br /&gt;
         G &amp;amp;= GR(j,k,\theta) \  \dots c=cos\theta, s=sin\theta \end{align}&amp;lt;/math&amp;gt;&lt;br /&gt;
         if нужны правые сингулярные векторы &lt;br /&gt;
             &amp;lt;math&amp;gt;J = JR(j,k,\theta)&amp;lt;/math&amp;gt;&lt;br /&gt;
         end if&lt;br /&gt;
     end if&lt;br /&gt;
&lt;br /&gt;
=== Последовательная сложность алгоритма ===&lt;br /&gt;
Для одного вращения Якоби необходимо выполнить &amp;lt;math&amp;gt;O(n)&amp;lt;/math&amp;gt; операций умножения и сложения. &lt;br /&gt;
&lt;br /&gt;
Всего вариантов выбора &amp;lt;math&amp;gt;j&amp;lt;/math&amp;gt; и &amp;lt;math&amp;gt;k&amp;lt;/math&amp;gt; существует &amp;lt;math&amp;gt;\frac{n(n-1)}{2}&amp;lt;/math&amp;gt;.&lt;br /&gt;
&lt;br /&gt;
Таким образом последовательный алгоритм Якоби вычисления сингулярных чисел и векторов является алгоритмом с кубической сложностью.&lt;br /&gt;
&lt;br /&gt;
=== Информационный граф ===&lt;br /&gt;
Граф алгоритма состоит из четырех групп вершин&lt;br /&gt;
&lt;br /&gt;
(А)Первая группа вершин расположена в двумерной области, соответствующая ей операция - вычисление элементов &amp;lt;math&amp;gt;a_{jj},a_{jk},a_{kk}&amp;lt;/math&amp;gt; матрицы произведения &amp;lt;math&amp;gt;A = (G^TG)&amp;lt;/math&amp;gt;. Где &amp;lt;math&amp;gt;j&amp;lt;/math&amp;gt; изменяется от &amp;lt;math&amp;gt;1&amp;lt;/math&amp;gt; до &amp;lt;math&amp;gt;n-1&amp;lt;/math&amp;gt;, принимая все целочисленные значения, &amp;lt;math&amp;gt;k&amp;lt;/math&amp;gt;  изменяется от &amp;lt;math&amp;gt;j+1&amp;lt;/math&amp;gt; до &amp;lt;math&amp;gt;n&amp;lt;/math&amp;gt;, принимая все целочисленные значения.&lt;br /&gt;
&lt;br /&gt;
Граф вычисления каждого из элементов приведен на рисунке 1, где значениям &amp;lt;math&amp;gt;g_{ij}&amp;lt;/math&amp;gt; соответствуют обозначения &amp;lt;math&amp;gt;x_{ij}&amp;lt;/math&amp;gt;, а элементам &amp;lt;math&amp;gt;g^T_{ij}&amp;lt;/math&amp;gt; обозначения &amp;lt;math&amp;gt;z_{ij}&amp;lt;/math&amp;gt;. Значение &amp;lt;math&amp;gt;s_{ij}&amp;lt;/math&amp;gt; является значением результирующего элемента.&lt;br /&gt;
&lt;br /&gt;
(Б)Вторая группа вершин расположена в двумерной области, соответствующая ей операция – вычисление &amp;lt;math&amp;gt;c&amp;lt;/math&amp;gt; и &amp;lt;math&amp;gt;s&amp;lt;/math&amp;gt;.&lt;br /&gt;
&lt;br /&gt;
Информационный граф с входными и выходными данными вычисления пункта (Б) представлен на рисунке 2.&lt;br /&gt;
&lt;br /&gt;
(В)Третья группа вершин расположена в двумерной области, соответствующая ей операция вычисление значений элементов &amp;lt;math&amp;gt;g_{jm}^{(i+1)} = g_{mj}^{(i+1)}&amp;lt;/math&amp;gt; и &amp;lt;math&amp;gt;g_{km}^{(i+1)} = g_{mk}^{(i+1)}&amp;lt;/math&amp;gt;, &amp;lt;math&amp;gt;m \ne j,k&amp;lt;/math&amp;gt;.&lt;br /&gt;
&lt;br /&gt;
(Г)Четвертая группа вершин расположена в двумерной области, соответствующая ей операция вычисление значений элементов &amp;lt;math&amp;gt;g_{jj}^{(i+1)} &amp;lt;/math&amp;gt; и &amp;lt;math&amp;gt;g_{kk}^{(i+1)} &amp;lt;/math&amp;gt;.&lt;br /&gt;
&lt;br /&gt;
Элементы групп (В) и (Г) вычисляются аналогично вычислению элементов матрицы произведения, т.к. фактически представляют собой перемножение матриц &amp;lt;math&amp;gt;G&amp;lt;/math&amp;gt; и &amp;lt;math&amp;gt;R&amp;lt;/math&amp;gt;&lt;br /&gt;
&lt;br /&gt;
[[File:Jacobi_2.jpg|none|thumb|1000px|Рисунок 1. Информационный граф с входными и выходными параметрами вычисления каждого элемента матрицы произведения.]]&lt;br /&gt;
&lt;br /&gt;
[[File:Jacobi_1.jpg|none|thumb|1000px|Рисунок 2. Информационный граф с входными и выходными параметрами вычисления значений &amp;lt;math&amp;gt;c&amp;lt;/math&amp;gt; и &amp;lt;math&amp;gt;s&amp;lt;/math&amp;gt;.]]&lt;br /&gt;
&lt;br /&gt;
Обобщенный граф метода Якоби представлен на рисунке 3, где буквами А, Б, В и Г обозначено вычисление групп вершин (А), (Б), (В) и (Г).&lt;br /&gt;
&lt;br /&gt;
[[File:Graf21.png|none|thumb|2000px|Рисунок 3. Обобщенный граф алгоритма вычисления сингулярных чисел и векторов методом Якоби.]]&lt;br /&gt;
&lt;br /&gt;
=== Ресурс параллелизма алгоритма ===&lt;br /&gt;
Для выполнения одной итерации метода Якоби требуется последовательно выполнить несколько ярусов:&lt;br /&gt;
# вычислить &amp;lt;math&amp;gt;\tau&amp;lt;/math&amp;gt; &lt;br /&gt;
# вычислить &amp;lt;math&amp;gt;t&amp;lt;/math&amp;gt; &lt;br /&gt;
# вычислить &amp;lt;math&amp;gt;c&amp;lt;/math&amp;gt; &lt;br /&gt;
# вычислить &amp;lt;math&amp;gt;s&amp;lt;/math&amp;gt;&lt;br /&gt;
# выполнить поворот матрицы &amp;lt;math&amp;gt;G&amp;lt;/math&amp;gt; с параллельным выполнением &amp;lt;math&amp;gt;2(n-2)&amp;lt;/math&amp;gt; операций вычисления элементов матрицы &amp;lt;math&amp;gt;g_{jm}^{(i+1)} = g_{mj}^{(i+1)}&amp;lt;/math&amp;gt; и &amp;lt;math&amp;gt;g_{km}^{(i+1)} = g_{mk}^{(i+1)}&amp;lt;/math&amp;gt;, &amp;lt;math&amp;gt;m \ne j,k&amp;lt;/math&amp;gt;, а также вычисления элементов &amp;lt;math&amp;gt;g_{jj}^{(i+1)} &amp;lt;/math&amp;gt; и &amp;lt;math&amp;gt;g_{kk}^{(i+1)} &amp;lt;/math&amp;gt;. &lt;br /&gt;
&lt;br /&gt;
Суммарное количество итераций равно &amp;lt;math&amp;gt;\frac{n(n-1)}{2}&amp;lt;/math&amp;gt; (Различные варианты выбора &amp;lt;math&amp;gt;j&amp;lt;/math&amp;gt; и &amp;lt;math&amp;gt;k&amp;lt;/math&amp;gt;). &lt;br /&gt;
&lt;br /&gt;
Асимптотически метод сходится квадратично. &lt;br /&gt;
&lt;br /&gt;
Таким образом, при классификации по высоте ЯПФ метод Якоби относится к алгоритмам со сложностью &amp;lt;math&amp;gt;O(n^2)&amp;lt;/math&amp;gt;&amp;amp;nbsp;, а при классификации по ширине ЯПФ — к алгоритмам со сложностью &amp;lt;math&amp;gt;O(n)&amp;lt;/math&amp;gt;.&lt;br /&gt;
&lt;br /&gt;
=== Входные и выходные данные алгоритма ===&lt;br /&gt;
&#039;&#039;&#039;Входные данные&#039;&#039;&#039;: плотная матрица &amp;lt;math&amp;gt;G&amp;lt;/math&amp;gt; размера &amp;lt;math&amp;gt;n&amp;lt;/math&amp;gt;х&amp;lt;math&amp;gt;n&amp;lt;/math&amp;gt;, где &amp;lt;math&amp;gt;A= G^TG&amp;lt;/math&amp;gt; – симметрическая матрица.&lt;br /&gt;
&lt;br /&gt;
&#039;&#039;&#039;Объём входных данных&#039;&#039;&#039;: &amp;lt;math&amp;gt;n^2&amp;lt;/math&amp;gt; (т.к. для хранения матрицы &amp;lt;math&amp;gt;G&amp;lt;/math&amp;gt; используем двумерный массив размера &amp;lt;math&amp;gt;n&amp;lt;/math&amp;gt;х&amp;lt;math&amp;gt;n&amp;lt;/math&amp;gt;)&lt;br /&gt;
&lt;br /&gt;
&#039;&#039;&#039;Выходные данные&#039;&#039;&#039;: &amp;lt;math&amp;gt;\sigma_{i}&amp;lt;/math&amp;gt;  - сингулярные числа, матрица &amp;lt;math&amp;gt;U&amp;lt;/math&amp;gt; левых сингулярных векторов и матрица &amp;lt;math&amp;gt;V&amp;lt;/math&amp;gt; правых сингулярных векторов.&lt;br /&gt;
&lt;br /&gt;
&#039;&#039;&#039;Объём выходных данных&#039;&#039;&#039;: &amp;lt;math&amp;gt;2n^2 + n&amp;lt;/math&amp;gt; (т.к. необходимо хранить вектор сингулярных чисел длины &amp;lt;math&amp;gt;n&amp;lt;/math&amp;gt;, а также две матрицы &amp;lt;math&amp;gt;U, V&amp;lt;/math&amp;gt; левых и правых сингулярных векторов размера &amp;lt;math&amp;gt;n&amp;lt;/math&amp;gt;х&amp;lt;math&amp;gt;n&amp;lt;/math&amp;gt;).&lt;br /&gt;
&lt;br /&gt;
=== Свойства алгоритма ===&lt;br /&gt;
Метод Якоби является самым медленным из имеющихся алгоритмов вычисления сингулярных чисел и сингулярных векторов матрицы. Тем не менее, для  матриц &amp;lt;math&amp;gt;G&amp;lt;/math&amp;gt;, которые могут быть представлены в виде &amp;lt;math&amp;gt;G=DX&amp;lt;/math&amp;gt;, где &amp;lt;math&amp;gt;D&amp;lt;/math&amp;gt; - диагональная, а &amp;lt;math&amp;gt;X&amp;lt;/math&amp;gt; - хорошо обусловлена, он способен вычислять сингулярные числа и вектора намного точнее, чем другие методы&amp;lt;ref&amp;gt;Дж. Деммель «Вычислительная линейная алгебра» (стр. 261-264)&amp;lt;/ref&amp;gt;. &lt;br /&gt;
&lt;br /&gt;
Вычислительная мощность алгоритма, как отношение числа операций к суммарному объему входных и выходных данных является линейной.&lt;br /&gt;
&lt;br /&gt;
Метод Якоби не детерминирован, так как является итерационным алгоритмом с выходом по точности (число итераций зависит от входных данных и порогового значения).&lt;br /&gt;
&lt;br /&gt;
== Программная реализация алгоритма ==&lt;br /&gt;
&lt;br /&gt;
=== Особенности реализации последовательного алгоритма ===&lt;br /&gt;
&lt;br /&gt;
=== Локальность данных и вычислений ===&lt;br /&gt;
&lt;br /&gt;
=== Возможные способы и особенности параллельной реализации алгоритма ===&lt;br /&gt;
&lt;br /&gt;
=== Масштабируемость алгоритма и его реализации ===&lt;br /&gt;
Исследование масштабируемости параллельной реализации метода Якоби вычисления сингулярных чисел и векторов проводилось на суперкомпьютере &amp;quot;Ломоносов&amp;quot;. Алгоритм реализован на языке программирования C с использованием механизмов MPI.&lt;br /&gt;
&lt;br /&gt;
Набор и границы значений изменяемых параметров запуска реализации алгоритма: &lt;br /&gt;
&lt;br /&gt;
*	число процессоров [1 : 128] с шагом равным степени двойки;&lt;br /&gt;
*	размер матрицы [256 : 1792] с шагом 256.&lt;br /&gt;
&lt;br /&gt;
В результате проведённых экспериментов был получен следующий диапазон эффективности реализации алгоритма:&lt;br /&gt;
&lt;br /&gt;
*	минимальная эффективность реализации 0,023%;&lt;br /&gt;
*	максимальная эффективность реализации 8,84%.&lt;br /&gt;
&lt;br /&gt;
На следующих рисунках приведены графики производительности и эффективности выбранной реализации метода Якоби в зависимости от изменяемых параметров запуска.&lt;br /&gt;
&lt;br /&gt;
[[File:Performance.jpg|none|thumb|1000px|Рисунок 1. Параллельная реализация метода Якоби. Изменение производительности в зависимости от числа процессоров и размера матрицы.]]&lt;br /&gt;
&lt;br /&gt;
=== Динамические характеристики и эффективность реализации алгоритма ===&lt;br /&gt;
&lt;br /&gt;
=== Выводы для классов архитектур ===&lt;br /&gt;
&lt;br /&gt;
=== Существующие реализации алгоритма ===&lt;br /&gt;
Метод Якоби нахождения сингулярных значений и векторов реализован в таких пакетах, как LAPACK &amp;lt;ref&amp;gt;http://www.netlib.org/scalapack/slug/&amp;lt;/ref&amp;gt;, LINPACK/EISPACK &amp;lt;ref&amp;gt; http://www.netlib.org/linpack/ &amp;lt;/ref&amp;gt;, Intel MKL &amp;lt;ref&amp;gt;https://software.intel.com/ru-ru/node/521153#CAF8CA08-1C69-48F8-B0C3-B2B27AFA92FA&amp;lt;/ref&amp;gt;.&lt;br /&gt;
&lt;br /&gt;
Так же функция Якоби реализована в пакете Matlab.&lt;br /&gt;
&lt;br /&gt;
Т. к. алгоритм считается медленным, он не включен во многие известные пакеты.&lt;br /&gt;
&lt;br /&gt;
== Литература ==&lt;br /&gt;
1. Дж. Деммель Вычислительная линейная алгебра. Изд. Мир, 2001.&lt;/div&gt;</summary>
		<author><name>Davletshuna Alexandra</name></author>
	</entry>
	<entry>
		<id>https://xn--80aecvaldz.xn--80ahdrnmvk.xn--p1ai/w/ru/index.php?title=%D0%A3%D1%87%D0%B0%D1%81%D1%82%D0%BD%D0%B8%D0%BA:Davletshuna_Alexandra/%D0%9C%D0%B5%D1%82%D0%BE%D0%B4_%D0%AF%D0%BA%D0%BE%D0%B1%D0%B8_%D0%B2%D1%8B%D1%87%D0%B8%D1%81%D0%BB%D0%B5%D0%BD%D0%B8%D1%8F_%D1%81%D0%B8%D0%BD%D0%B3%D1%83%D0%BB%D1%8F%D1%80%D0%BD%D1%8B%D1%85_%D1%87%D0%B8%D1%81%D0%B5%D0%BB_%D0%B8_%D0%B2%D0%B5%D0%BA%D1%82%D0%BE%D1%80%D0%BE%D0%B2&amp;diff=17849</id>
		<title>Участник:Davletshuna Alexandra/Метод Якоби вычисления сингулярных чисел и векторов</title>
		<link rel="alternate" type="text/html" href="https://xn--80aecvaldz.xn--80ahdrnmvk.xn--p1ai/w/ru/index.php?title=%D0%A3%D1%87%D0%B0%D1%81%D1%82%D0%BD%D0%B8%D0%BA:Davletshuna_Alexandra/%D0%9C%D0%B5%D1%82%D0%BE%D0%B4_%D0%AF%D0%BA%D0%BE%D0%B1%D0%B8_%D0%B2%D1%8B%D1%87%D0%B8%D1%81%D0%BB%D0%B5%D0%BD%D0%B8%D1%8F_%D1%81%D0%B8%D0%BD%D0%B3%D1%83%D0%BB%D1%8F%D1%80%D0%BD%D1%8B%D1%85_%D1%87%D0%B8%D1%81%D0%B5%D0%BB_%D0%B8_%D0%B2%D0%B5%D0%BA%D1%82%D0%BE%D1%80%D0%BE%D0%B2&amp;diff=17849"/>
		<updated>2016-11-17T06:30:42Z</updated>

		<summary type="html">&lt;p&gt;Davletshuna Alexandra: /* Масштабируемость алгоритма и его реализации */&lt;/p&gt;
&lt;hr /&gt;
&lt;div&gt;{{algorithm&lt;br /&gt;
| name              = Метод Якоби вычисления сингулярных чисел и векторов&lt;br /&gt;
| serial_complexity = &amp;lt;math&amp;gt;O(n^3)&amp;lt;/math&amp;gt;&lt;br /&gt;
| pf_height         = &amp;lt;math&amp;gt;O(n^2)&amp;lt;/math&amp;gt;&lt;br /&gt;
| pf_width          = &amp;lt;math&amp;gt;O(n)&amp;lt;/math&amp;gt;&lt;br /&gt;
| input_data        = &amp;lt;math&amp;gt;n^2&amp;lt;/math&amp;gt;&lt;br /&gt;
| output_data       = &amp;lt;math&amp;gt;2n^2 + n&amp;lt;/math&amp;gt;&lt;br /&gt;
}}&lt;br /&gt;
&lt;br /&gt;
Авторы статьи: [[Участница:Davletshuna Alexandra|Давлетшина Александра]] (группа 619) пункты 1.1-1.4, 1.6, 2.7; [[Участница:Alek sandra|Зайцева Александра]] (группа 601) пункты 1.5, 1.7-1.10, 2.7.&lt;br /&gt;
&lt;br /&gt;
== Свойства и структура алгоритма ==&lt;br /&gt;
&lt;br /&gt;
=== Общее описание алгоритма ===&lt;br /&gt;
&#039;&#039;&#039;Сингулярным разложением&#039;&#039;&#039; называется разложение прямоугольной вещественной или комплексной матрицы, имеющее широкое применение, в силу своей наглядной геометрической интерпретации, при решении многих прикладных задач. Сингулярное разложение матрицы А позволяет вычислять сингулярные числа данной матрицы, а также, левые и правые сингулярные векторы матрицы А:&lt;br /&gt;
&lt;br /&gt;
•	левые сингулярные векторы матрицы А — это собственные векторы матрицы &amp;lt;math&amp;gt;AA^*&amp;lt;/math&amp;gt;;&lt;br /&gt;
&lt;br /&gt;
•	правые сингулярные векторы матрицы A — это собственные векторы матрицы &amp;lt;math&amp;gt;A^*A&amp;lt;/math&amp;gt;.&lt;br /&gt;
&lt;br /&gt;
Геометрическая интерпретация сингулярного разложения заключается в следующем факте из геометрии: &#039;&#039;Образом любого линейного преобразования, заданного с помощью матрицы &amp;lt;math&amp;gt;m&amp;lt;/math&amp;gt;x&amp;lt;math&amp;gt;n&amp;lt;/math&amp;gt;, примененного к единичной сфере является гиперэллипсоид&#039;&#039;.&lt;br /&gt;
&lt;br /&gt;
Из многочисленных разложений матриц, наиболее удобным является сингулярное разложение матрицы в виде: &amp;lt;math&amp;gt;A=U\Sigma V^*&amp;lt;/math&amp;gt;, где &amp;lt;math&amp;gt;U, V&amp;lt;/math&amp;gt; – унитарные матрицы, а &amp;lt;math&amp;gt;\Sigma&amp;lt;/math&amp;gt; – диагональная матрица с вещественными положительными числами на диагонали &amp;lt;ref&amp;gt;http://algorithms.parallel.ru/&amp;lt;/ref&amp;gt;.&lt;br /&gt;
&lt;br /&gt;
Диагональные элементы матрицы &amp;lt;math&amp;gt;\Sigma&amp;lt;/math&amp;gt; называются сингулярными числами матрицы &amp;lt;math&amp;gt;A&amp;lt;/math&amp;gt;, а столбцы матриц &amp;lt;math&amp;gt;U,V&amp;lt;/math&amp;gt; левыми и правыми сингулярными векторами соответственно.&lt;br /&gt;
&lt;br /&gt;
Алгоритм Якоби сингулярного разложения матрицы был предложен одним из первых в 1846 году. Он приводит прямоугольную матрицу к диагональной матрице с помощью последовательности элементарных вращений. Метод может найти все сингулярные значения с очень высокой точностью. Однако его производительность является довольно низкой, в сравнении с конкурирующими методами.&lt;br /&gt;
&lt;br /&gt;
&#039;&#039;Неявный&#039;&#039;&amp;lt;ref&amp;gt;Дж. Деммель «Вычислительная линейная алгебра» (стр. 261-264)&amp;lt;/ref&amp;gt; метод Якоби математически эквивалентен применению метода Якоби вычисления собственных значений к матрице &amp;lt;math&amp;gt;A = G^TG&amp;lt;/math&amp;gt;.&lt;br /&gt;
Это значит, что на каждом шаге вычисляется вращение Якоби &amp;lt;math&amp;gt;J&amp;lt;/math&amp;gt;, с помощью которого матрица &amp;lt;math&amp;gt;G^TG&amp;lt;/math&amp;gt; неявно пересчитывется в &amp;lt;math&amp;gt;J^TG^TGJ&amp;lt;/math&amp;gt;; вращение выбрано так, чтобы пара внедиагональных элементов из &amp;lt;math&amp;gt;G^TG&amp;lt;/math&amp;gt; обратилась в нули в матрице &amp;lt;math&amp;gt;J^TG^TGJ&amp;lt;/math&amp;gt;. При этом ни &amp;lt;math&amp;gt;G^TG&amp;lt;/math&amp;gt;, ни &amp;lt;math&amp;gt;J^TG^TGJ&amp;lt;/math&amp;gt; не вычисляются в явном виде; вместо них вычисляется матрица &amp;lt;math&amp;gt;GJ&amp;lt;/math&amp;gt;. Поэтому алгоритм называется &#039;&#039;методом односторонних вращений&#039;&#039;.&lt;br /&gt;
&lt;br /&gt;
=== Математическое описание алгоритма ===&lt;br /&gt;
Исходные данные: матрица &amp;lt;math&amp;gt;G&amp;lt;/math&amp;gt; (элементы &amp;lt;math&amp;gt;g_{ij}, i, j = 1, \ldots, n&amp;lt;/math&amp;gt;).&lt;br /&gt;
&lt;br /&gt;
Вычисляемые данные: матрица &amp;lt;math&amp;gt;\Sigma = diag(\sigma_{i})&amp;lt;/math&amp;gt;, где &amp;lt;math&amp;gt;\sigma_{i}&amp;lt;/math&amp;gt; - сингулярные числа, &amp;lt;math&amp;gt;U&amp;lt;/math&amp;gt; - матрица левых сингулярных векторов, &amp;lt;math&amp;gt;V&amp;lt;/math&amp;gt; - матрица правых сингулярных векторов.&lt;br /&gt;
&lt;br /&gt;
симметричную матрицу &amp;lt;math&amp;gt;A = (G^TG)&amp;lt;/math&amp;gt; можно привести к диагональному виду:&lt;br /&gt;
&amp;lt;math&amp;gt;RG^TGR^T&amp;lt;/math&amp;gt;, где&lt;br /&gt;
&lt;br /&gt;
&amp;lt;math&amp;gt;&lt;br /&gt;
R(j,k,\theta) = &lt;br /&gt;
\begin{matrix}&lt;br /&gt;
  \\&lt;br /&gt;
  \\&lt;br /&gt;
  \\&lt;br /&gt;
j \\&lt;br /&gt;
  \\&lt;br /&gt;
k \\&lt;br /&gt;
  \\&lt;br /&gt;
  \\&lt;br /&gt;
  \\&lt;br /&gt;
\end{matrix}&lt;br /&gt;
&amp;lt;/math&amp;gt;  &lt;br /&gt;
&amp;lt;math&amp;gt;&lt;br /&gt;
\begin{bmatrix}&lt;br /&gt;
  &amp;amp; 1 &amp;amp;   &amp;amp;        &amp;amp;              &amp;amp;        &amp;amp;               &amp;amp;         &amp;amp;    &amp;amp;   \\&lt;br /&gt;
  &amp;amp;   &amp;amp; 1 &amp;amp;        &amp;amp;              &amp;amp;        &amp;amp;               &amp;amp;         &amp;amp;    &amp;amp;   \\&lt;br /&gt;
  &amp;amp;   &amp;amp;   &amp;amp; \ddots &amp;amp;              &amp;amp;        &amp;amp;               &amp;amp;         &amp;amp;    &amp;amp;   \\&lt;br /&gt;
  &amp;amp;   &amp;amp;   &amp;amp;        &amp;amp; \cos(\theta) &amp;amp;        &amp;amp; -\sin(\theta) &amp;amp;         &amp;amp;    &amp;amp;   \\&lt;br /&gt;
  &amp;amp;   &amp;amp;   &amp;amp;        &amp;amp;              &amp;amp; \ddots &amp;amp;               &amp;amp;         &amp;amp;    &amp;amp;   \\&lt;br /&gt;
  &amp;amp;   &amp;amp;   &amp;amp;        &amp;amp; \sin(\theta) &amp;amp;        &amp;amp; \cos(\theta)  &amp;amp;         &amp;amp;    &amp;amp;   \\&lt;br /&gt;
  &amp;amp;   &amp;amp;   &amp;amp;        &amp;amp;              &amp;amp;        &amp;amp;               &amp;amp; \ddots  &amp;amp;    &amp;amp;   \\&lt;br /&gt;
  &amp;amp;   &amp;amp;   &amp;amp;        &amp;amp;              &amp;amp;        &amp;amp;               &amp;amp;         &amp;amp; 1  &amp;amp;   \\&lt;br /&gt;
  &amp;amp;   &amp;amp;   &amp;amp;        &amp;amp;              &amp;amp;        &amp;amp;               &amp;amp;         &amp;amp;    &amp;amp; 1 \\&lt;br /&gt;
\end{bmatrix}&lt;br /&gt;
&amp;lt;/math&amp;gt;&lt;br /&gt;
&lt;br /&gt;
Обозначим &amp;lt;math&amp;gt;s = \sin \theta&amp;lt;/math&amp;gt; и &amp;lt;math&amp;gt;c = \cos \theta&amp;lt;/math&amp;gt;.&lt;br /&gt;
&lt;br /&gt;
Перемножив матрицы &amp;lt;math&amp;gt;RG^TGR^T&amp;lt;/math&amp;gt;, получим следующие выражения&amp;lt;ref&amp;gt;http://www.astro.tsu.ru/OsChMet/5_2.html&amp;lt;/ref&amp;gt;:&lt;br /&gt;
&lt;br /&gt;
&amp;lt;math&amp;gt;\begin{align}&lt;br /&gt;
 a_{jj}^{(i+1)} &amp;amp;= c^2\, a_{jj}^{(i)}  -  2\, s c \,a_{jk}^{(i)}  +  s^2\, a_{kk}^{(i)} \\&lt;br /&gt;
 a_{kk}^{(i+1)} &amp;amp;= s^2 \,a_{jj}^{(i)}  +  2 s c\, a_{jk}^{(i)}  +  c^2 \, a_{kk}^{(i)} \\&lt;br /&gt;
 a_{jk}^{(i+1)} &amp;amp;= a_{kj}^{(i+1)} = (c^2 - s^2 ) \, a_{jk}^{(i)}  +  s c \, (a_{kk}^{(i)} - a_{jj}^{(i)} ) \\&lt;br /&gt;
 a_{jm}^{(i+1)} &amp;amp;= a_{mj}^{(i+1)} = c \, a_{jm}^{(i)}  -  s \, a_{km}^{(i)} &amp;amp; m \ne j,k \\&lt;br /&gt;
 a_{km}^{(i+1)} &amp;amp;= a_{mk}^{(i+1)} = s \, a_{jm}^{(i)}  + c \, a_{km}^{(i)} &amp;amp; m \ne j,k \\&lt;br /&gt;
 a_{ml}^{(i+1)} &amp;amp;= a_{ml}^{(i)} &amp;amp;m,l \ne j,k&lt;br /&gt;
\end{align}&amp;lt;/math&amp;gt;&lt;br /&gt;
&lt;br /&gt;
Т.к внедиагональные элементы должны быть равны 0, то выбираем &amp;lt;math&amp;gt;\theta&amp;lt;/math&amp;gt; так, чтобы &amp;lt;math&amp;gt;a_{jk}^{(i+1)} = 0&amp;lt;/math&amp;gt; и &amp;lt;math&amp;gt;a_{kj}^{(i+1)} = 0&amp;lt;/math&amp;gt;.&lt;br /&gt;
&lt;br /&gt;
Тогда решая уравнение получаем, что&lt;br /&gt;
&lt;br /&gt;
&amp;lt;math&amp;gt;&lt;br /&gt;
         \begin{align}&lt;br /&gt;
         \tau &amp;amp;= ({a_{jj} - a_{kk}})/{2a_{jk}} \\&lt;br /&gt;
         t &amp;amp;= {sign(\tau)}/(|\tau| + \sqrt{1 + \tau^2}) \\&lt;br /&gt;
         c &amp;amp;= 1/(\sqrt{1 + t^2}) \\&lt;br /&gt;
         s &amp;amp;= ct \\&lt;br /&gt;
         \end{align}&amp;lt;/math&amp;gt;&lt;br /&gt;
&lt;br /&gt;
Остановка вычислений алгоритма наступает, когда внедиагональные элементы становятся меньше некоторого наперед заданного числа &amp;lt;math&amp;gt;\varepsilon&amp;lt;/math&amp;gt;.&lt;br /&gt;
&lt;br /&gt;
=== Вычислительное ядро алгоритма ===&lt;br /&gt;
Вычислительное ядро алгоритма составляет непосредственно вычисление одностороннего вращения Якоби, т.е. вычисление элементов матрицы &amp;lt;math&amp;gt;g_{jm}^{(i+1)} = g_{mj}^{(i+1)}&amp;lt;/math&amp;gt; и &amp;lt;math&amp;gt;g_{km}^{(i+1)} = g_{mk}^{(i+1)}&amp;lt;/math&amp;gt;, &amp;lt;math&amp;gt;m \ne j,k&amp;lt;/math&amp;gt;, а также вычисления элементов &amp;lt;math&amp;gt;g_{jj}^{(i+1)} &amp;lt;/math&amp;gt; и &amp;lt;math&amp;gt;g_{kk}^{(i+1)} &amp;lt;/math&amp;gt;, получившихся после умножения промежуточной матрицы на матрицу вращений Якоби:&lt;br /&gt;
&lt;br /&gt;
&amp;lt;math&amp;gt;\begin{align}&lt;br /&gt;
 g_{jj}^{(i+1)} &amp;amp;= c^2\, g_{jj}^{(i)}  -  2\, s c \,g_{jk}^{(i)}  +  s^2\, g_{kk}^{(i)} \\&lt;br /&gt;
 g_{kk}^{(i+1)} &amp;amp;= s^2 \,g_{jj}^{(i)}  +  2 s c\, g_{jk}^{(i)}  +  c^2 \, g_{kk}^{(i)} \\&lt;br /&gt;
 g_{jk}^{(i+1)} &amp;amp;= g_{kj}^{(i+1)} = (c^2 - s^2 ) \, g_{jk}^{(i)}  +  s c \, (g_{kk}^{(i)} - g_{jj}^{(i)} ) \\&lt;br /&gt;
 g_{jm}^{(i+1)} &amp;amp;= g_{mj}^{(i+1)} = c \, g_{jm}^{(i)}  -  s \, g_{km}^{(i)} &amp;amp; m \ne j,k \\&lt;br /&gt;
 g_{km}^{(i+1)} &amp;amp;= g_{mk}^{(i+1)} = s \, g_{jm}^{(i)}  + c \, g_{km}^{(i)} &amp;amp; m \ne j,k \\&lt;br /&gt;
 g_{ml}^{(i+1)} &amp;amp;= g_{ml}^{(i)} &amp;amp;m,l \ne j,k&lt;br /&gt;
\end{align}&amp;lt;/math&amp;gt;&lt;br /&gt;
&lt;br /&gt;
=== Макроструктура алгоритма ===&lt;br /&gt;
Основную часть метода составляет процедура односторонних вращений матрицы, которая в свою очередь состоит из:&lt;br /&gt;
&lt;br /&gt;
#Вычисление &amp;lt;math&amp;gt;\tau, c, s, t&amp;lt;/math&amp;gt;.&lt;br /&gt;
#Одностороннее вращение матрицы. &lt;br /&gt;
&lt;br /&gt;
Что требует &amp;lt;math&amp;gt;O(n)&amp;lt;/math&amp;gt; операций.&lt;br /&gt;
&lt;br /&gt;
После этого необходимо:&lt;br /&gt;
&lt;br /&gt;
#Вычислить сингулярные числа &amp;lt;math&amp;gt;\sigma_i&amp;lt;/math&amp;gt;.  Что требует &amp;lt;math&amp;gt;O(n)&amp;lt;/math&amp;gt; операций.&lt;br /&gt;
#Вычислить &amp;lt;math&amp;gt;U&amp;lt;/math&amp;gt; и &amp;lt;math&amp;gt;V&amp;lt;/math&amp;gt;. Что требует &amp;lt;math&amp;gt;O(n^2)&amp;lt;/math&amp;gt; операций.&lt;br /&gt;
&lt;br /&gt;
=== Схема реализации последовательного алгоритма ===&lt;br /&gt;
Применение метода Якоби к матрице &amp;lt;math&amp;gt;A = (G^TG)&amp;lt;/math&amp;gt; можно описать следующим образом&amp;lt;ref&amp;gt;Дж. Деммель «Вычислительная линейная алгебра» (стр. 261-263)&amp;lt;/ref&amp;gt;:&lt;br /&gt;
&lt;br /&gt;
Если &amp;lt;math&amp;gt;G = U\Sigma V^T&amp;lt;/math&amp;gt; и &amp;lt;math&amp;gt;\Sigma = diag(\sigma_{i})&amp;lt;/math&amp;gt;, то алгоритм вычисляет сингулярные числа &amp;lt;math&amp;gt;\sigma_{i}&amp;lt;/math&amp;gt;, матрицу &amp;lt;math&amp;gt;U&amp;lt;/math&amp;gt; левых сингулярных векторов и матрицу &amp;lt;math&amp;gt;V&amp;lt;/math&amp;gt; правых сингулярных векторов по следующей схеме:&lt;br /&gt;
&lt;br /&gt;
 repeat&lt;br /&gt;
     for &amp;lt;math&amp;gt;j=1&amp;lt;/math&amp;gt; to &amp;lt;math&amp;gt;n-1&amp;lt;/math&amp;gt;&lt;br /&gt;
         for &amp;lt;math&amp;gt;k=j+1&amp;lt;/math&amp;gt; to &amp;lt;math&amp;gt;n&amp;lt;/math&amp;gt;&lt;br /&gt;
             обратиться к процедуре &#039;&#039;&#039;&#039;&#039;One-Sided-Jacobi-Rotation&amp;lt;math&amp;gt;(G,j,k)&amp;lt;/math&amp;gt;&#039;&#039;&#039;&#039;&#039;&lt;br /&gt;
         end for&lt;br /&gt;
     end for&lt;br /&gt;
 пока &amp;lt;math&amp;gt;G^TG&amp;lt;/math&amp;gt; не станет достаточно близка к диагональной матрице&lt;br /&gt;
 Положить &amp;lt;math&amp;gt;\sigma_{i} = ||G(:,i)||_2 &amp;lt;/math&amp;gt; (норма &amp;lt;math&amp;gt;i&amp;lt;/math&amp;gt;-го столбца в &amp;lt;math&amp;gt;G&amp;lt;/math&amp;gt;)&lt;br /&gt;
 Положить &amp;lt;math&amp;gt;U = [u_{1},\dots, u_{n}]&amp;lt;/math&amp;gt;, где &amp;lt;math&amp;gt;u_{i} = G(:,i)/\sigma_{i}&amp;lt;/math&amp;gt;&lt;br /&gt;
 Положить &amp;lt;math&amp;gt;V = J&amp;lt;/math&amp;gt;, где &amp;lt;math&amp;gt;J&amp;lt;/math&amp;gt; - накопленное произведение вращений Якоби.&lt;br /&gt;
&lt;br /&gt;
Где процедура &#039;&#039;&#039;&#039;&#039;One-Sided-Jacobi-Rotation&#039;&#039;&#039;&#039;&#039; является метод односторонних вращений Якоби:&lt;br /&gt;
&lt;br /&gt;
 proc &#039;&#039;&#039;&#039;&#039;One-Sided-Jacobi-Rotation&amp;lt;math&amp;gt;(G,j,k)&amp;lt;/math&amp;gt;&#039;&#039;&#039;&#039;&#039;&lt;br /&gt;
     вычислить &amp;lt;math&amp;gt;a_{jj} = (G^TG)_{jj}, a_{jk} = (G^TG)_{jk}&amp;lt;/math&amp;gt; и &amp;lt;math&amp;gt;a_{kk} = (G^TG)_{kk}&amp;lt;/math&amp;gt;&lt;br /&gt;
     if &amp;lt;math&amp;gt;|a_{jk}|&amp;lt;/math&amp;gt; не слишком мал&lt;br /&gt;
         &amp;lt;math&amp;gt;&lt;br /&gt;
         \begin{align}&lt;br /&gt;
         \tau &amp;amp;= ({a_{jj} - a_{kk}})/{2a_{jk}} \\&lt;br /&gt;
         t &amp;amp;= {sign(\tau)}/(|\tau| + \sqrt{1 + \tau^2}) \\&lt;br /&gt;
         c &amp;amp;= 1/(\sqrt{1 + t^2}) \\&lt;br /&gt;
         s &amp;amp;= ct \\&lt;br /&gt;
         G &amp;amp;= GR(j,k,\theta) \  \dots c=cos\theta, s=sin\theta \end{align}&amp;lt;/math&amp;gt;&lt;br /&gt;
         if нужны правые сингулярные векторы &lt;br /&gt;
             &amp;lt;math&amp;gt;J = JR(j,k,\theta)&amp;lt;/math&amp;gt;&lt;br /&gt;
         end if&lt;br /&gt;
     end if&lt;br /&gt;
&lt;br /&gt;
=== Последовательная сложность алгоритма ===&lt;br /&gt;
Для одного вращения Якоби необходимо выполнить &amp;lt;math&amp;gt;O(n)&amp;lt;/math&amp;gt; операций умножения и сложения. &lt;br /&gt;
&lt;br /&gt;
Всего вариантов выбора &amp;lt;math&amp;gt;j&amp;lt;/math&amp;gt; и &amp;lt;math&amp;gt;k&amp;lt;/math&amp;gt; существует &amp;lt;math&amp;gt;\frac{n(n-1)}{2}&amp;lt;/math&amp;gt;.&lt;br /&gt;
&lt;br /&gt;
Таким образом последовательный алгоритм Якоби вычисления сингулярных чисел и векторов является алгоритмом с кубической сложностью.&lt;br /&gt;
&lt;br /&gt;
=== Информационный граф ===&lt;br /&gt;
Граф алгоритма состоит из четырех групп вершин&lt;br /&gt;
&lt;br /&gt;
(А)Первая группа вершин расположена в двумерной области, соответствующая ей операция - вычисление элементов &amp;lt;math&amp;gt;a_{jj},a_{jk},a_{kk}&amp;lt;/math&amp;gt; матрицы произведения &amp;lt;math&amp;gt;A = (G^TG)&amp;lt;/math&amp;gt;. Где &amp;lt;math&amp;gt;j&amp;lt;/math&amp;gt; изменяется от &amp;lt;math&amp;gt;1&amp;lt;/math&amp;gt; до &amp;lt;math&amp;gt;n-1&amp;lt;/math&amp;gt;, принимая все целочисленные значения, &amp;lt;math&amp;gt;k&amp;lt;/math&amp;gt;  изменяется от &amp;lt;math&amp;gt;j+1&amp;lt;/math&amp;gt; до &amp;lt;math&amp;gt;n&amp;lt;/math&amp;gt;, принимая все целочисленные значения.&lt;br /&gt;
&lt;br /&gt;
Граф вычисления каждого из элементов приведен на рисунке 1, где значениям &amp;lt;math&amp;gt;g_{ij}&amp;lt;/math&amp;gt; соответствуют обозначения &amp;lt;math&amp;gt;x_{ij}&amp;lt;/math&amp;gt;, а элементам &amp;lt;math&amp;gt;g^T_{ij}&amp;lt;/math&amp;gt; обозначения &amp;lt;math&amp;gt;z_{ij}&amp;lt;/math&amp;gt;. Значение &amp;lt;math&amp;gt;s_{ij}&amp;lt;/math&amp;gt; является значением результирующего элемента.&lt;br /&gt;
&lt;br /&gt;
(Б)Вторая группа вершин расположена в двумерной области, соответствующая ей операция – вычисление &amp;lt;math&amp;gt;c&amp;lt;/math&amp;gt; и &amp;lt;math&amp;gt;s&amp;lt;/math&amp;gt;.&lt;br /&gt;
&lt;br /&gt;
Информационный граф с входными и выходными данными вычисления пункта (Б) представлен на рисунке 2.&lt;br /&gt;
&lt;br /&gt;
(В)Третья группа вершин расположена в двумерной области, соответствующая ей операция вычисление значений элементов &amp;lt;math&amp;gt;g_{jm}^{(i+1)} = g_{mj}^{(i+1)}&amp;lt;/math&amp;gt; и &amp;lt;math&amp;gt;g_{km}^{(i+1)} = g_{mk}^{(i+1)}&amp;lt;/math&amp;gt;, &amp;lt;math&amp;gt;m \ne j,k&amp;lt;/math&amp;gt;.&lt;br /&gt;
&lt;br /&gt;
(Г)Четвертая группа вершин расположена в двумерной области, соответствующая ей операция вычисление значений элементов &amp;lt;math&amp;gt;g_{jj}^{(i+1)} &amp;lt;/math&amp;gt; и &amp;lt;math&amp;gt;g_{kk}^{(i+1)} &amp;lt;/math&amp;gt;.&lt;br /&gt;
&lt;br /&gt;
Элементы групп (В) и (Г) вычисляются аналогично вычислению элементов матрицы произведения, т.к. фактически представляют собой перемножение матриц &amp;lt;math&amp;gt;G&amp;lt;/math&amp;gt; и &amp;lt;math&amp;gt;R&amp;lt;/math&amp;gt;&lt;br /&gt;
&lt;br /&gt;
[[File:Jacobi_2.jpg|none|thumb|1000px|Рисунок 1. Информационный граф с входными и выходными параметрами вычисления каждого элемента матрицы произведения.]]&lt;br /&gt;
&lt;br /&gt;
[[File:Jacobi_1.jpg|none|thumb|1000px|Рисунок 2. Информационный граф с входными и выходными параметрами вычисления значений &amp;lt;math&amp;gt;c&amp;lt;/math&amp;gt; и &amp;lt;math&amp;gt;s&amp;lt;/math&amp;gt;.]]&lt;br /&gt;
&lt;br /&gt;
Обобщенный граф метода Якоби представлен на рисунке 3, где буквами А, Б, В и Г обозначено вычисление групп вершин (А), (Б), (В) и (Г).&lt;br /&gt;
&lt;br /&gt;
[[File:Graf21.png|none|thumb|2000px|Рисунок 3. Обобщенный граф алгоритма вычисления сингулярных чисел и векторов методом Якоби.]]&lt;br /&gt;
&lt;br /&gt;
=== Ресурс параллелизма алгоритма ===&lt;br /&gt;
Для выполнения одной итерации метода Якоби требуется последовательно выполнить несколько ярусов:&lt;br /&gt;
# вычислить &amp;lt;math&amp;gt;\tau&amp;lt;/math&amp;gt; &lt;br /&gt;
# вычислить &amp;lt;math&amp;gt;t&amp;lt;/math&amp;gt; &lt;br /&gt;
# вычислить &amp;lt;math&amp;gt;c&amp;lt;/math&amp;gt; &lt;br /&gt;
# вычислить &amp;lt;math&amp;gt;s&amp;lt;/math&amp;gt;&lt;br /&gt;
# выполнить поворот матрицы &amp;lt;math&amp;gt;G&amp;lt;/math&amp;gt; с параллельным выполнением &amp;lt;math&amp;gt;2(n-2)&amp;lt;/math&amp;gt; операций вычисления элементов матрицы &amp;lt;math&amp;gt;g_{jm}^{(i+1)} = g_{mj}^{(i+1)}&amp;lt;/math&amp;gt; и &amp;lt;math&amp;gt;g_{km}^{(i+1)} = g_{mk}^{(i+1)}&amp;lt;/math&amp;gt;, &amp;lt;math&amp;gt;m \ne j,k&amp;lt;/math&amp;gt;, а также вычисления элементов &amp;lt;math&amp;gt;g_{jj}^{(i+1)} &amp;lt;/math&amp;gt; и &amp;lt;math&amp;gt;g_{kk}^{(i+1)} &amp;lt;/math&amp;gt;. &lt;br /&gt;
&lt;br /&gt;
Суммарное количество итераций равно &amp;lt;math&amp;gt;\frac{n(n-1)}{2}&amp;lt;/math&amp;gt; (Различные варианты выбора &amp;lt;math&amp;gt;j&amp;lt;/math&amp;gt; и &amp;lt;math&amp;gt;k&amp;lt;/math&amp;gt;). &lt;br /&gt;
&lt;br /&gt;
Асимптотически метод сходится квадратично. &lt;br /&gt;
&lt;br /&gt;
Таким образом, при классификации по высоте ЯПФ метод Якоби относится к алгоритмам со сложностью &amp;lt;math&amp;gt;O(n^2)&amp;lt;/math&amp;gt;&amp;amp;nbsp;, а при классификации по ширине ЯПФ — к алгоритмам со сложностью &amp;lt;math&amp;gt;O(n)&amp;lt;/math&amp;gt;.&lt;br /&gt;
&lt;br /&gt;
=== Входные и выходные данные алгоритма ===&lt;br /&gt;
&#039;&#039;&#039;Входные данные&#039;&#039;&#039;: плотная матрица &amp;lt;math&amp;gt;G&amp;lt;/math&amp;gt; размера &amp;lt;math&amp;gt;n&amp;lt;/math&amp;gt;х&amp;lt;math&amp;gt;n&amp;lt;/math&amp;gt;, где &amp;lt;math&amp;gt;A= G^TG&amp;lt;/math&amp;gt; – симметрическая матрица.&lt;br /&gt;
&lt;br /&gt;
&#039;&#039;&#039;Объём входных данных&#039;&#039;&#039;: &amp;lt;math&amp;gt;n^2&amp;lt;/math&amp;gt; (т.к. для хранения матрицы &amp;lt;math&amp;gt;G&amp;lt;/math&amp;gt; используем двумерный массив размера &amp;lt;math&amp;gt;n&amp;lt;/math&amp;gt;х&amp;lt;math&amp;gt;n&amp;lt;/math&amp;gt;)&lt;br /&gt;
&lt;br /&gt;
&#039;&#039;&#039;Выходные данные&#039;&#039;&#039;: &amp;lt;math&amp;gt;\sigma_{i}&amp;lt;/math&amp;gt;  - сингулярные числа, матрица &amp;lt;math&amp;gt;U&amp;lt;/math&amp;gt; левых сингулярных векторов и матрица &amp;lt;math&amp;gt;V&amp;lt;/math&amp;gt; правых сингулярных векторов.&lt;br /&gt;
&lt;br /&gt;
&#039;&#039;&#039;Объём выходных данных&#039;&#039;&#039;: &amp;lt;math&amp;gt;2n^2 + n&amp;lt;/math&amp;gt; (т.к. необходимо хранить вектор сингулярных чисел длины &amp;lt;math&amp;gt;n&amp;lt;/math&amp;gt;, а также две матрицы &amp;lt;math&amp;gt;U, V&amp;lt;/math&amp;gt; левых и правых сингулярных векторов размера &amp;lt;math&amp;gt;n&amp;lt;/math&amp;gt;х&amp;lt;math&amp;gt;n&amp;lt;/math&amp;gt;).&lt;br /&gt;
&lt;br /&gt;
=== Свойства алгоритма ===&lt;br /&gt;
Метод Якоби является самым медленным из имеющихся алгоритмов вычисления сингулярных чисел и сингулярных векторов матрицы. Тем не менее, для  матриц &amp;lt;math&amp;gt;G&amp;lt;/math&amp;gt;, которые могут быть представлены в виде &amp;lt;math&amp;gt;G=DX&amp;lt;/math&amp;gt;, где &amp;lt;math&amp;gt;D&amp;lt;/math&amp;gt; - диагональная, а &amp;lt;math&amp;gt;X&amp;lt;/math&amp;gt; - хорошо обусловлена, он способен вычислять сингулярные числа и вектора намного точнее, чем другие методы&amp;lt;ref&amp;gt;Дж. Деммель «Вычислительная линейная алгебра» (стр. 261-264)&amp;lt;/ref&amp;gt;. &lt;br /&gt;
&lt;br /&gt;
Вычислительная мощность алгоритма, как отношение числа операций к суммарному объему входных и выходных данных является линейной.&lt;br /&gt;
&lt;br /&gt;
Метод Якоби не детерминирован, так как является итерационным алгоритмом с выходом по точности (число итераций зависит от входных данных и порогового значения).&lt;br /&gt;
&lt;br /&gt;
== Программная реализация алгоритма ==&lt;br /&gt;
&lt;br /&gt;
=== Особенности реализации последовательного алгоритма ===&lt;br /&gt;
&lt;br /&gt;
=== Локальность данных и вычислений ===&lt;br /&gt;
&lt;br /&gt;
=== Возможные способы и особенности параллельной реализации алгоритма ===&lt;br /&gt;
&lt;br /&gt;
=== Масштабируемость алгоритма и его реализации ===&lt;br /&gt;
Исследование масштабируемости параллельной реализации метода Якоби вычисления сингулярных чисел и векторов проводилось на суперкомпьютере &amp;quot;Ломоносов&amp;quot;.&lt;br /&gt;
&lt;br /&gt;
Набор и границы значений изменяемых параметров запуска реализации алгоритма: &lt;br /&gt;
&lt;br /&gt;
*	число процессоров [1 : 128] с шагом равным степени двойки;&lt;br /&gt;
*	размер матрицы [256 : 1792] с шагом 256.&lt;br /&gt;
&lt;br /&gt;
В результате проведённых экспериментов был получен следующий диапазон эффективности реализации алгоритма:&lt;br /&gt;
&lt;br /&gt;
*	минимальная эффективность реализации 0,023%;&lt;br /&gt;
*	максимальная эффективность реализации 8,84%.&lt;br /&gt;
&lt;br /&gt;
На следующих рисунках приведены графики производительности и эффективности выбранной реализации метода Якоби в зависимости от изменяемых параметров запуска.&lt;br /&gt;
&lt;br /&gt;
[[File:Performance.jpg|none|thumb|1000px|Рисунок 1. Параллельная реализация метода Якоби. Изменение производительности в зависимости от числа процессоров и размера матрицы.]]&lt;br /&gt;
&lt;br /&gt;
[[File:EfficiencyJackobi.jpg|none|thumb|1000px|Рисунок 2. Параллельная реализация метода Якоби. Изменение эффективности в зависимости от числа процессоров и размера матрицы.]]&lt;br /&gt;
&lt;br /&gt;
=== Динамические характеристики и эффективность реализации алгоритма ===&lt;br /&gt;
&lt;br /&gt;
=== Выводы для классов архитектур ===&lt;br /&gt;
&lt;br /&gt;
=== Существующие реализации алгоритма ===&lt;br /&gt;
Метод Якоби нахождения сингулярных значений и векторов реализован в таких пакетах, как LAPACK &amp;lt;ref&amp;gt;http://www.netlib.org/scalapack/slug/&amp;lt;/ref&amp;gt;, LINPACK/EISPACK &amp;lt;ref&amp;gt; http://www.netlib.org/linpack/ &amp;lt;/ref&amp;gt;, Intel MKL &amp;lt;ref&amp;gt;https://software.intel.com/ru-ru/node/521153#CAF8CA08-1C69-48F8-B0C3-B2B27AFA92FA&amp;lt;/ref&amp;gt;.&lt;br /&gt;
&lt;br /&gt;
Так же функция Якоби реализована в пакете Matlab.&lt;br /&gt;
&lt;br /&gt;
Т. к. алгоритм считается медленным, он не включен во многие известные пакеты.&lt;br /&gt;
&lt;br /&gt;
== Литература ==&lt;br /&gt;
1. Дж. Деммель Вычислительная линейная алгебра. Изд. Мир, 2001.&lt;/div&gt;</summary>
		<author><name>Davletshuna Alexandra</name></author>
	</entry>
	<entry>
		<id>https://xn--80aecvaldz.xn--80ahdrnmvk.xn--p1ai/w/ru/index.php?title=%D0%A3%D1%87%D0%B0%D1%81%D1%82%D0%BD%D0%B8%D0%BA:Davletshuna_Alexandra/%D0%9C%D0%B5%D1%82%D0%BE%D0%B4_%D0%AF%D0%BA%D0%BE%D0%B1%D0%B8_%D0%B2%D1%8B%D1%87%D0%B8%D1%81%D0%BB%D0%B5%D0%BD%D0%B8%D1%8F_%D1%81%D0%B8%D0%BD%D0%B3%D1%83%D0%BB%D1%8F%D1%80%D0%BD%D1%8B%D1%85_%D1%87%D0%B8%D1%81%D0%B5%D0%BB_%D0%B8_%D0%B2%D0%B5%D0%BA%D1%82%D0%BE%D1%80%D0%BE%D0%B2&amp;diff=17848</id>
		<title>Участник:Davletshuna Alexandra/Метод Якоби вычисления сингулярных чисел и векторов</title>
		<link rel="alternate" type="text/html" href="https://xn--80aecvaldz.xn--80ahdrnmvk.xn--p1ai/w/ru/index.php?title=%D0%A3%D1%87%D0%B0%D1%81%D1%82%D0%BD%D0%B8%D0%BA:Davletshuna_Alexandra/%D0%9C%D0%B5%D1%82%D0%BE%D0%B4_%D0%AF%D0%BA%D0%BE%D0%B1%D0%B8_%D0%B2%D1%8B%D1%87%D0%B8%D1%81%D0%BB%D0%B5%D0%BD%D0%B8%D1%8F_%D1%81%D0%B8%D0%BD%D0%B3%D1%83%D0%BB%D1%8F%D1%80%D0%BD%D1%8B%D1%85_%D1%87%D0%B8%D1%81%D0%B5%D0%BB_%D0%B8_%D0%B2%D0%B5%D0%BA%D1%82%D0%BE%D1%80%D0%BE%D0%B2&amp;diff=17848"/>
		<updated>2016-11-17T06:30:09Z</updated>

		<summary type="html">&lt;p&gt;Davletshuna Alexandra: /* Масштабируемость алгоритма и его реализации */&lt;/p&gt;
&lt;hr /&gt;
&lt;div&gt;{{algorithm&lt;br /&gt;
| name              = Метод Якоби вычисления сингулярных чисел и векторов&lt;br /&gt;
| serial_complexity = &amp;lt;math&amp;gt;O(n^3)&amp;lt;/math&amp;gt;&lt;br /&gt;
| pf_height         = &amp;lt;math&amp;gt;O(n^2)&amp;lt;/math&amp;gt;&lt;br /&gt;
| pf_width          = &amp;lt;math&amp;gt;O(n)&amp;lt;/math&amp;gt;&lt;br /&gt;
| input_data        = &amp;lt;math&amp;gt;n^2&amp;lt;/math&amp;gt;&lt;br /&gt;
| output_data       = &amp;lt;math&amp;gt;2n^2 + n&amp;lt;/math&amp;gt;&lt;br /&gt;
}}&lt;br /&gt;
&lt;br /&gt;
Авторы статьи: [[Участница:Davletshuna Alexandra|Давлетшина Александра]] (группа 619) пункты 1.1-1.4, 1.6, 2.7; [[Участница:Alek sandra|Зайцева Александра]] (группа 601) пункты 1.5, 1.7-1.10, 2.7.&lt;br /&gt;
&lt;br /&gt;
== Свойства и структура алгоритма ==&lt;br /&gt;
&lt;br /&gt;
=== Общее описание алгоритма ===&lt;br /&gt;
&#039;&#039;&#039;Сингулярным разложением&#039;&#039;&#039; называется разложение прямоугольной вещественной или комплексной матрицы, имеющее широкое применение, в силу своей наглядной геометрической интерпретации, при решении многих прикладных задач. Сингулярное разложение матрицы А позволяет вычислять сингулярные числа данной матрицы, а также, левые и правые сингулярные векторы матрицы А:&lt;br /&gt;
&lt;br /&gt;
•	левые сингулярные векторы матрицы А — это собственные векторы матрицы &amp;lt;math&amp;gt;AA^*&amp;lt;/math&amp;gt;;&lt;br /&gt;
&lt;br /&gt;
•	правые сингулярные векторы матрицы A — это собственные векторы матрицы &amp;lt;math&amp;gt;A^*A&amp;lt;/math&amp;gt;.&lt;br /&gt;
&lt;br /&gt;
Геометрическая интерпретация сингулярного разложения заключается в следующем факте из геометрии: &#039;&#039;Образом любого линейного преобразования, заданного с помощью матрицы &amp;lt;math&amp;gt;m&amp;lt;/math&amp;gt;x&amp;lt;math&amp;gt;n&amp;lt;/math&amp;gt;, примененного к единичной сфере является гиперэллипсоид&#039;&#039;.&lt;br /&gt;
&lt;br /&gt;
Из многочисленных разложений матриц, наиболее удобным является сингулярное разложение матрицы в виде: &amp;lt;math&amp;gt;A=U\Sigma V^*&amp;lt;/math&amp;gt;, где &amp;lt;math&amp;gt;U, V&amp;lt;/math&amp;gt; – унитарные матрицы, а &amp;lt;math&amp;gt;\Sigma&amp;lt;/math&amp;gt; – диагональная матрица с вещественными положительными числами на диагонали &amp;lt;ref&amp;gt;http://algorithms.parallel.ru/&amp;lt;/ref&amp;gt;.&lt;br /&gt;
&lt;br /&gt;
Диагональные элементы матрицы &amp;lt;math&amp;gt;\Sigma&amp;lt;/math&amp;gt; называются сингулярными числами матрицы &amp;lt;math&amp;gt;A&amp;lt;/math&amp;gt;, а столбцы матриц &amp;lt;math&amp;gt;U,V&amp;lt;/math&amp;gt; левыми и правыми сингулярными векторами соответственно.&lt;br /&gt;
&lt;br /&gt;
Алгоритм Якоби сингулярного разложения матрицы был предложен одним из первых в 1846 году. Он приводит прямоугольную матрицу к диагональной матрице с помощью последовательности элементарных вращений. Метод может найти все сингулярные значения с очень высокой точностью. Однако его производительность является довольно низкой, в сравнении с конкурирующими методами.&lt;br /&gt;
&lt;br /&gt;
&#039;&#039;Неявный&#039;&#039;&amp;lt;ref&amp;gt;Дж. Деммель «Вычислительная линейная алгебра» (стр. 261-264)&amp;lt;/ref&amp;gt; метод Якоби математически эквивалентен применению метода Якоби вычисления собственных значений к матрице &amp;lt;math&amp;gt;A = G^TG&amp;lt;/math&amp;gt;.&lt;br /&gt;
Это значит, что на каждом шаге вычисляется вращение Якоби &amp;lt;math&amp;gt;J&amp;lt;/math&amp;gt;, с помощью которого матрица &amp;lt;math&amp;gt;G^TG&amp;lt;/math&amp;gt; неявно пересчитывется в &amp;lt;math&amp;gt;J^TG^TGJ&amp;lt;/math&amp;gt;; вращение выбрано так, чтобы пара внедиагональных элементов из &amp;lt;math&amp;gt;G^TG&amp;lt;/math&amp;gt; обратилась в нули в матрице &amp;lt;math&amp;gt;J^TG^TGJ&amp;lt;/math&amp;gt;. При этом ни &amp;lt;math&amp;gt;G^TG&amp;lt;/math&amp;gt;, ни &amp;lt;math&amp;gt;J^TG^TGJ&amp;lt;/math&amp;gt; не вычисляются в явном виде; вместо них вычисляется матрица &amp;lt;math&amp;gt;GJ&amp;lt;/math&amp;gt;. Поэтому алгоритм называется &#039;&#039;методом односторонних вращений&#039;&#039;.&lt;br /&gt;
&lt;br /&gt;
=== Математическое описание алгоритма ===&lt;br /&gt;
Исходные данные: матрица &amp;lt;math&amp;gt;G&amp;lt;/math&amp;gt; (элементы &amp;lt;math&amp;gt;g_{ij}, i, j = 1, \ldots, n&amp;lt;/math&amp;gt;).&lt;br /&gt;
&lt;br /&gt;
Вычисляемые данные: матрица &amp;lt;math&amp;gt;\Sigma = diag(\sigma_{i})&amp;lt;/math&amp;gt;, где &amp;lt;math&amp;gt;\sigma_{i}&amp;lt;/math&amp;gt; - сингулярные числа, &amp;lt;math&amp;gt;U&amp;lt;/math&amp;gt; - матрица левых сингулярных векторов, &amp;lt;math&amp;gt;V&amp;lt;/math&amp;gt; - матрица правых сингулярных векторов.&lt;br /&gt;
&lt;br /&gt;
симметричную матрицу &amp;lt;math&amp;gt;A = (G^TG)&amp;lt;/math&amp;gt; можно привести к диагональному виду:&lt;br /&gt;
&amp;lt;math&amp;gt;RG^TGR^T&amp;lt;/math&amp;gt;, где&lt;br /&gt;
&lt;br /&gt;
&amp;lt;math&amp;gt;&lt;br /&gt;
R(j,k,\theta) = &lt;br /&gt;
\begin{matrix}&lt;br /&gt;
  \\&lt;br /&gt;
  \\&lt;br /&gt;
  \\&lt;br /&gt;
j \\&lt;br /&gt;
  \\&lt;br /&gt;
k \\&lt;br /&gt;
  \\&lt;br /&gt;
  \\&lt;br /&gt;
  \\&lt;br /&gt;
\end{matrix}&lt;br /&gt;
&amp;lt;/math&amp;gt;  &lt;br /&gt;
&amp;lt;math&amp;gt;&lt;br /&gt;
\begin{bmatrix}&lt;br /&gt;
  &amp;amp; 1 &amp;amp;   &amp;amp;        &amp;amp;              &amp;amp;        &amp;amp;               &amp;amp;         &amp;amp;    &amp;amp;   \\&lt;br /&gt;
  &amp;amp;   &amp;amp; 1 &amp;amp;        &amp;amp;              &amp;amp;        &amp;amp;               &amp;amp;         &amp;amp;    &amp;amp;   \\&lt;br /&gt;
  &amp;amp;   &amp;amp;   &amp;amp; \ddots &amp;amp;              &amp;amp;        &amp;amp;               &amp;amp;         &amp;amp;    &amp;amp;   \\&lt;br /&gt;
  &amp;amp;   &amp;amp;   &amp;amp;        &amp;amp; \cos(\theta) &amp;amp;        &amp;amp; -\sin(\theta) &amp;amp;         &amp;amp;    &amp;amp;   \\&lt;br /&gt;
  &amp;amp;   &amp;amp;   &amp;amp;        &amp;amp;              &amp;amp; \ddots &amp;amp;               &amp;amp;         &amp;amp;    &amp;amp;   \\&lt;br /&gt;
  &amp;amp;   &amp;amp;   &amp;amp;        &amp;amp; \sin(\theta) &amp;amp;        &amp;amp; \cos(\theta)  &amp;amp;         &amp;amp;    &amp;amp;   \\&lt;br /&gt;
  &amp;amp;   &amp;amp;   &amp;amp;        &amp;amp;              &amp;amp;        &amp;amp;               &amp;amp; \ddots  &amp;amp;    &amp;amp;   \\&lt;br /&gt;
  &amp;amp;   &amp;amp;   &amp;amp;        &amp;amp;              &amp;amp;        &amp;amp;               &amp;amp;         &amp;amp; 1  &amp;amp;   \\&lt;br /&gt;
  &amp;amp;   &amp;amp;   &amp;amp;        &amp;amp;              &amp;amp;        &amp;amp;               &amp;amp;         &amp;amp;    &amp;amp; 1 \\&lt;br /&gt;
\end{bmatrix}&lt;br /&gt;
&amp;lt;/math&amp;gt;&lt;br /&gt;
&lt;br /&gt;
Обозначим &amp;lt;math&amp;gt;s = \sin \theta&amp;lt;/math&amp;gt; и &amp;lt;math&amp;gt;c = \cos \theta&amp;lt;/math&amp;gt;.&lt;br /&gt;
&lt;br /&gt;
Перемножив матрицы &amp;lt;math&amp;gt;RG^TGR^T&amp;lt;/math&amp;gt;, получим следующие выражения&amp;lt;ref&amp;gt;http://www.astro.tsu.ru/OsChMet/5_2.html&amp;lt;/ref&amp;gt;:&lt;br /&gt;
&lt;br /&gt;
&amp;lt;math&amp;gt;\begin{align}&lt;br /&gt;
 a_{jj}^{(i+1)} &amp;amp;= c^2\, a_{jj}^{(i)}  -  2\, s c \,a_{jk}^{(i)}  +  s^2\, a_{kk}^{(i)} \\&lt;br /&gt;
 a_{kk}^{(i+1)} &amp;amp;= s^2 \,a_{jj}^{(i)}  +  2 s c\, a_{jk}^{(i)}  +  c^2 \, a_{kk}^{(i)} \\&lt;br /&gt;
 a_{jk}^{(i+1)} &amp;amp;= a_{kj}^{(i+1)} = (c^2 - s^2 ) \, a_{jk}^{(i)}  +  s c \, (a_{kk}^{(i)} - a_{jj}^{(i)} ) \\&lt;br /&gt;
 a_{jm}^{(i+1)} &amp;amp;= a_{mj}^{(i+1)} = c \, a_{jm}^{(i)}  -  s \, a_{km}^{(i)} &amp;amp; m \ne j,k \\&lt;br /&gt;
 a_{km}^{(i+1)} &amp;amp;= a_{mk}^{(i+1)} = s \, a_{jm}^{(i)}  + c \, a_{km}^{(i)} &amp;amp; m \ne j,k \\&lt;br /&gt;
 a_{ml}^{(i+1)} &amp;amp;= a_{ml}^{(i)} &amp;amp;m,l \ne j,k&lt;br /&gt;
\end{align}&amp;lt;/math&amp;gt;&lt;br /&gt;
&lt;br /&gt;
Т.к внедиагональные элементы должны быть равны 0, то выбираем &amp;lt;math&amp;gt;\theta&amp;lt;/math&amp;gt; так, чтобы &amp;lt;math&amp;gt;a_{jk}^{(i+1)} = 0&amp;lt;/math&amp;gt; и &amp;lt;math&amp;gt;a_{kj}^{(i+1)} = 0&amp;lt;/math&amp;gt;.&lt;br /&gt;
&lt;br /&gt;
Тогда решая уравнение получаем, что&lt;br /&gt;
&lt;br /&gt;
&amp;lt;math&amp;gt;&lt;br /&gt;
         \begin{align}&lt;br /&gt;
         \tau &amp;amp;= ({a_{jj} - a_{kk}})/{2a_{jk}} \\&lt;br /&gt;
         t &amp;amp;= {sign(\tau)}/(|\tau| + \sqrt{1 + \tau^2}) \\&lt;br /&gt;
         c &amp;amp;= 1/(\sqrt{1 + t^2}) \\&lt;br /&gt;
         s &amp;amp;= ct \\&lt;br /&gt;
         \end{align}&amp;lt;/math&amp;gt;&lt;br /&gt;
&lt;br /&gt;
Остановка вычислений алгоритма наступает, когда внедиагональные элементы становятся меньше некоторого наперед заданного числа &amp;lt;math&amp;gt;\varepsilon&amp;lt;/math&amp;gt;.&lt;br /&gt;
&lt;br /&gt;
=== Вычислительное ядро алгоритма ===&lt;br /&gt;
Вычислительное ядро алгоритма составляет непосредственно вычисление одностороннего вращения Якоби, т.е. вычисление элементов матрицы &amp;lt;math&amp;gt;g_{jm}^{(i+1)} = g_{mj}^{(i+1)}&amp;lt;/math&amp;gt; и &amp;lt;math&amp;gt;g_{km}^{(i+1)} = g_{mk}^{(i+1)}&amp;lt;/math&amp;gt;, &amp;lt;math&amp;gt;m \ne j,k&amp;lt;/math&amp;gt;, а также вычисления элементов &amp;lt;math&amp;gt;g_{jj}^{(i+1)} &amp;lt;/math&amp;gt; и &amp;lt;math&amp;gt;g_{kk}^{(i+1)} &amp;lt;/math&amp;gt;, получившихся после умножения промежуточной матрицы на матрицу вращений Якоби:&lt;br /&gt;
&lt;br /&gt;
&amp;lt;math&amp;gt;\begin{align}&lt;br /&gt;
 g_{jj}^{(i+1)} &amp;amp;= c^2\, g_{jj}^{(i)}  -  2\, s c \,g_{jk}^{(i)}  +  s^2\, g_{kk}^{(i)} \\&lt;br /&gt;
 g_{kk}^{(i+1)} &amp;amp;= s^2 \,g_{jj}^{(i)}  +  2 s c\, g_{jk}^{(i)}  +  c^2 \, g_{kk}^{(i)} \\&lt;br /&gt;
 g_{jk}^{(i+1)} &amp;amp;= g_{kj}^{(i+1)} = (c^2 - s^2 ) \, g_{jk}^{(i)}  +  s c \, (g_{kk}^{(i)} - g_{jj}^{(i)} ) \\&lt;br /&gt;
 g_{jm}^{(i+1)} &amp;amp;= g_{mj}^{(i+1)} = c \, g_{jm}^{(i)}  -  s \, g_{km}^{(i)} &amp;amp; m \ne j,k \\&lt;br /&gt;
 g_{km}^{(i+1)} &amp;amp;= g_{mk}^{(i+1)} = s \, g_{jm}^{(i)}  + c \, g_{km}^{(i)} &amp;amp; m \ne j,k \\&lt;br /&gt;
 g_{ml}^{(i+1)} &amp;amp;= g_{ml}^{(i)} &amp;amp;m,l \ne j,k&lt;br /&gt;
\end{align}&amp;lt;/math&amp;gt;&lt;br /&gt;
&lt;br /&gt;
=== Макроструктура алгоритма ===&lt;br /&gt;
Основную часть метода составляет процедура односторонних вращений матрицы, которая в свою очередь состоит из:&lt;br /&gt;
&lt;br /&gt;
#Вычисление &amp;lt;math&amp;gt;\tau, c, s, t&amp;lt;/math&amp;gt;.&lt;br /&gt;
#Одностороннее вращение матрицы. &lt;br /&gt;
&lt;br /&gt;
Что требует &amp;lt;math&amp;gt;O(n)&amp;lt;/math&amp;gt; операций.&lt;br /&gt;
&lt;br /&gt;
После этого необходимо:&lt;br /&gt;
&lt;br /&gt;
#Вычислить сингулярные числа &amp;lt;math&amp;gt;\sigma_i&amp;lt;/math&amp;gt;.  Что требует &amp;lt;math&amp;gt;O(n)&amp;lt;/math&amp;gt; операций.&lt;br /&gt;
#Вычислить &amp;lt;math&amp;gt;U&amp;lt;/math&amp;gt; и &amp;lt;math&amp;gt;V&amp;lt;/math&amp;gt;. Что требует &amp;lt;math&amp;gt;O(n^2)&amp;lt;/math&amp;gt; операций.&lt;br /&gt;
&lt;br /&gt;
=== Схема реализации последовательного алгоритма ===&lt;br /&gt;
Применение метода Якоби к матрице &amp;lt;math&amp;gt;A = (G^TG)&amp;lt;/math&amp;gt; можно описать следующим образом&amp;lt;ref&amp;gt;Дж. Деммель «Вычислительная линейная алгебра» (стр. 261-263)&amp;lt;/ref&amp;gt;:&lt;br /&gt;
&lt;br /&gt;
Если &amp;lt;math&amp;gt;G = U\Sigma V^T&amp;lt;/math&amp;gt; и &amp;lt;math&amp;gt;\Sigma = diag(\sigma_{i})&amp;lt;/math&amp;gt;, то алгоритм вычисляет сингулярные числа &amp;lt;math&amp;gt;\sigma_{i}&amp;lt;/math&amp;gt;, матрицу &amp;lt;math&amp;gt;U&amp;lt;/math&amp;gt; левых сингулярных векторов и матрицу &amp;lt;math&amp;gt;V&amp;lt;/math&amp;gt; правых сингулярных векторов по следующей схеме:&lt;br /&gt;
&lt;br /&gt;
 repeat&lt;br /&gt;
     for &amp;lt;math&amp;gt;j=1&amp;lt;/math&amp;gt; to &amp;lt;math&amp;gt;n-1&amp;lt;/math&amp;gt;&lt;br /&gt;
         for &amp;lt;math&amp;gt;k=j+1&amp;lt;/math&amp;gt; to &amp;lt;math&amp;gt;n&amp;lt;/math&amp;gt;&lt;br /&gt;
             обратиться к процедуре &#039;&#039;&#039;&#039;&#039;One-Sided-Jacobi-Rotation&amp;lt;math&amp;gt;(G,j,k)&amp;lt;/math&amp;gt;&#039;&#039;&#039;&#039;&#039;&lt;br /&gt;
         end for&lt;br /&gt;
     end for&lt;br /&gt;
 пока &amp;lt;math&amp;gt;G^TG&amp;lt;/math&amp;gt; не станет достаточно близка к диагональной матрице&lt;br /&gt;
 Положить &amp;lt;math&amp;gt;\sigma_{i} = ||G(:,i)||_2 &amp;lt;/math&amp;gt; (норма &amp;lt;math&amp;gt;i&amp;lt;/math&amp;gt;-го столбца в &amp;lt;math&amp;gt;G&amp;lt;/math&amp;gt;)&lt;br /&gt;
 Положить &amp;lt;math&amp;gt;U = [u_{1},\dots, u_{n}]&amp;lt;/math&amp;gt;, где &amp;lt;math&amp;gt;u_{i} = G(:,i)/\sigma_{i}&amp;lt;/math&amp;gt;&lt;br /&gt;
 Положить &amp;lt;math&amp;gt;V = J&amp;lt;/math&amp;gt;, где &amp;lt;math&amp;gt;J&amp;lt;/math&amp;gt; - накопленное произведение вращений Якоби.&lt;br /&gt;
&lt;br /&gt;
Где процедура &#039;&#039;&#039;&#039;&#039;One-Sided-Jacobi-Rotation&#039;&#039;&#039;&#039;&#039; является метод односторонних вращений Якоби:&lt;br /&gt;
&lt;br /&gt;
 proc &#039;&#039;&#039;&#039;&#039;One-Sided-Jacobi-Rotation&amp;lt;math&amp;gt;(G,j,k)&amp;lt;/math&amp;gt;&#039;&#039;&#039;&#039;&#039;&lt;br /&gt;
     вычислить &amp;lt;math&amp;gt;a_{jj} = (G^TG)_{jj}, a_{jk} = (G^TG)_{jk}&amp;lt;/math&amp;gt; и &amp;lt;math&amp;gt;a_{kk} = (G^TG)_{kk}&amp;lt;/math&amp;gt;&lt;br /&gt;
     if &amp;lt;math&amp;gt;|a_{jk}|&amp;lt;/math&amp;gt; не слишком мал&lt;br /&gt;
         &amp;lt;math&amp;gt;&lt;br /&gt;
         \begin{align}&lt;br /&gt;
         \tau &amp;amp;= ({a_{jj} - a_{kk}})/{2a_{jk}} \\&lt;br /&gt;
         t &amp;amp;= {sign(\tau)}/(|\tau| + \sqrt{1 + \tau^2}) \\&lt;br /&gt;
         c &amp;amp;= 1/(\sqrt{1 + t^2}) \\&lt;br /&gt;
         s &amp;amp;= ct \\&lt;br /&gt;
         G &amp;amp;= GR(j,k,\theta) \  \dots c=cos\theta, s=sin\theta \end{align}&amp;lt;/math&amp;gt;&lt;br /&gt;
         if нужны правые сингулярные векторы &lt;br /&gt;
             &amp;lt;math&amp;gt;J = JR(j,k,\theta)&amp;lt;/math&amp;gt;&lt;br /&gt;
         end if&lt;br /&gt;
     end if&lt;br /&gt;
&lt;br /&gt;
=== Последовательная сложность алгоритма ===&lt;br /&gt;
Для одного вращения Якоби необходимо выполнить &amp;lt;math&amp;gt;O(n)&amp;lt;/math&amp;gt; операций умножения и сложения. &lt;br /&gt;
&lt;br /&gt;
Всего вариантов выбора &amp;lt;math&amp;gt;j&amp;lt;/math&amp;gt; и &amp;lt;math&amp;gt;k&amp;lt;/math&amp;gt; существует &amp;lt;math&amp;gt;\frac{n(n-1)}{2}&amp;lt;/math&amp;gt;.&lt;br /&gt;
&lt;br /&gt;
Таким образом последовательный алгоритм Якоби вычисления сингулярных чисел и векторов является алгоритмом с кубической сложностью.&lt;br /&gt;
&lt;br /&gt;
=== Информационный граф ===&lt;br /&gt;
Граф алгоритма состоит из четырех групп вершин&lt;br /&gt;
&lt;br /&gt;
(А)Первая группа вершин расположена в двумерной области, соответствующая ей операция - вычисление элементов &amp;lt;math&amp;gt;a_{jj},a_{jk},a_{kk}&amp;lt;/math&amp;gt; матрицы произведения &amp;lt;math&amp;gt;A = (G^TG)&amp;lt;/math&amp;gt;. Где &amp;lt;math&amp;gt;j&amp;lt;/math&amp;gt; изменяется от &amp;lt;math&amp;gt;1&amp;lt;/math&amp;gt; до &amp;lt;math&amp;gt;n-1&amp;lt;/math&amp;gt;, принимая все целочисленные значения, &amp;lt;math&amp;gt;k&amp;lt;/math&amp;gt;  изменяется от &amp;lt;math&amp;gt;j+1&amp;lt;/math&amp;gt; до &amp;lt;math&amp;gt;n&amp;lt;/math&amp;gt;, принимая все целочисленные значения.&lt;br /&gt;
&lt;br /&gt;
Граф вычисления каждого из элементов приведен на рисунке 1, где значениям &amp;lt;math&amp;gt;g_{ij}&amp;lt;/math&amp;gt; соответствуют обозначения &amp;lt;math&amp;gt;x_{ij}&amp;lt;/math&amp;gt;, а элементам &amp;lt;math&amp;gt;g^T_{ij}&amp;lt;/math&amp;gt; обозначения &amp;lt;math&amp;gt;z_{ij}&amp;lt;/math&amp;gt;. Значение &amp;lt;math&amp;gt;s_{ij}&amp;lt;/math&amp;gt; является значением результирующего элемента.&lt;br /&gt;
&lt;br /&gt;
(Б)Вторая группа вершин расположена в двумерной области, соответствующая ей операция – вычисление &amp;lt;math&amp;gt;c&amp;lt;/math&amp;gt; и &amp;lt;math&amp;gt;s&amp;lt;/math&amp;gt;.&lt;br /&gt;
&lt;br /&gt;
Информационный граф с входными и выходными данными вычисления пункта (Б) представлен на рисунке 2.&lt;br /&gt;
&lt;br /&gt;
(В)Третья группа вершин расположена в двумерной области, соответствующая ей операция вычисление значений элементов &amp;lt;math&amp;gt;g_{jm}^{(i+1)} = g_{mj}^{(i+1)}&amp;lt;/math&amp;gt; и &amp;lt;math&amp;gt;g_{km}^{(i+1)} = g_{mk}^{(i+1)}&amp;lt;/math&amp;gt;, &amp;lt;math&amp;gt;m \ne j,k&amp;lt;/math&amp;gt;.&lt;br /&gt;
&lt;br /&gt;
(Г)Четвертая группа вершин расположена в двумерной области, соответствующая ей операция вычисление значений элементов &amp;lt;math&amp;gt;g_{jj}^{(i+1)} &amp;lt;/math&amp;gt; и &amp;lt;math&amp;gt;g_{kk}^{(i+1)} &amp;lt;/math&amp;gt;.&lt;br /&gt;
&lt;br /&gt;
Элементы групп (В) и (Г) вычисляются аналогично вычислению элементов матрицы произведения, т.к. фактически представляют собой перемножение матриц &amp;lt;math&amp;gt;G&amp;lt;/math&amp;gt; и &amp;lt;math&amp;gt;R&amp;lt;/math&amp;gt;&lt;br /&gt;
&lt;br /&gt;
[[File:Jacobi_2.jpg|none|thumb|1000px|Рисунок 1. Информационный граф с входными и выходными параметрами вычисления каждого элемента матрицы произведения.]]&lt;br /&gt;
&lt;br /&gt;
[[File:Jacobi_1.jpg|none|thumb|1000px|Рисунок 2. Информационный граф с входными и выходными параметрами вычисления значений &amp;lt;math&amp;gt;c&amp;lt;/math&amp;gt; и &amp;lt;math&amp;gt;s&amp;lt;/math&amp;gt;.]]&lt;br /&gt;
&lt;br /&gt;
Обобщенный граф метода Якоби представлен на рисунке 3, где буквами А, Б, В и Г обозначено вычисление групп вершин (А), (Б), (В) и (Г).&lt;br /&gt;
&lt;br /&gt;
[[File:Graf21.png|none|thumb|2000px|Рисунок 3. Обобщенный граф алгоритма вычисления сингулярных чисел и векторов методом Якоби.]]&lt;br /&gt;
&lt;br /&gt;
=== Ресурс параллелизма алгоритма ===&lt;br /&gt;
Для выполнения одной итерации метода Якоби требуется последовательно выполнить несколько ярусов:&lt;br /&gt;
# вычислить &amp;lt;math&amp;gt;\tau&amp;lt;/math&amp;gt; &lt;br /&gt;
# вычислить &amp;lt;math&amp;gt;t&amp;lt;/math&amp;gt; &lt;br /&gt;
# вычислить &amp;lt;math&amp;gt;c&amp;lt;/math&amp;gt; &lt;br /&gt;
# вычислить &amp;lt;math&amp;gt;s&amp;lt;/math&amp;gt;&lt;br /&gt;
# выполнить поворот матрицы &amp;lt;math&amp;gt;G&amp;lt;/math&amp;gt; с параллельным выполнением &amp;lt;math&amp;gt;2(n-2)&amp;lt;/math&amp;gt; операций вычисления элементов матрицы &amp;lt;math&amp;gt;g_{jm}^{(i+1)} = g_{mj}^{(i+1)}&amp;lt;/math&amp;gt; и &amp;lt;math&amp;gt;g_{km}^{(i+1)} = g_{mk}^{(i+1)}&amp;lt;/math&amp;gt;, &amp;lt;math&amp;gt;m \ne j,k&amp;lt;/math&amp;gt;, а также вычисления элементов &amp;lt;math&amp;gt;g_{jj}^{(i+1)} &amp;lt;/math&amp;gt; и &amp;lt;math&amp;gt;g_{kk}^{(i+1)} &amp;lt;/math&amp;gt;. &lt;br /&gt;
&lt;br /&gt;
Суммарное количество итераций равно &amp;lt;math&amp;gt;\frac{n(n-1)}{2}&amp;lt;/math&amp;gt; (Различные варианты выбора &amp;lt;math&amp;gt;j&amp;lt;/math&amp;gt; и &amp;lt;math&amp;gt;k&amp;lt;/math&amp;gt;). &lt;br /&gt;
&lt;br /&gt;
Асимптотически метод сходится квадратично. &lt;br /&gt;
&lt;br /&gt;
Таким образом, при классификации по высоте ЯПФ метод Якоби относится к алгоритмам со сложностью &amp;lt;math&amp;gt;O(n^2)&amp;lt;/math&amp;gt;&amp;amp;nbsp;, а при классификации по ширине ЯПФ — к алгоритмам со сложностью &amp;lt;math&amp;gt;O(n)&amp;lt;/math&amp;gt;.&lt;br /&gt;
&lt;br /&gt;
=== Входные и выходные данные алгоритма ===&lt;br /&gt;
&#039;&#039;&#039;Входные данные&#039;&#039;&#039;: плотная матрица &amp;lt;math&amp;gt;G&amp;lt;/math&amp;gt; размера &amp;lt;math&amp;gt;n&amp;lt;/math&amp;gt;х&amp;lt;math&amp;gt;n&amp;lt;/math&amp;gt;, где &amp;lt;math&amp;gt;A= G^TG&amp;lt;/math&amp;gt; – симметрическая матрица.&lt;br /&gt;
&lt;br /&gt;
&#039;&#039;&#039;Объём входных данных&#039;&#039;&#039;: &amp;lt;math&amp;gt;n^2&amp;lt;/math&amp;gt; (т.к. для хранения матрицы &amp;lt;math&amp;gt;G&amp;lt;/math&amp;gt; используем двумерный массив размера &amp;lt;math&amp;gt;n&amp;lt;/math&amp;gt;х&amp;lt;math&amp;gt;n&amp;lt;/math&amp;gt;)&lt;br /&gt;
&lt;br /&gt;
&#039;&#039;&#039;Выходные данные&#039;&#039;&#039;: &amp;lt;math&amp;gt;\sigma_{i}&amp;lt;/math&amp;gt;  - сингулярные числа, матрица &amp;lt;math&amp;gt;U&amp;lt;/math&amp;gt; левых сингулярных векторов и матрица &amp;lt;math&amp;gt;V&amp;lt;/math&amp;gt; правых сингулярных векторов.&lt;br /&gt;
&lt;br /&gt;
&#039;&#039;&#039;Объём выходных данных&#039;&#039;&#039;: &amp;lt;math&amp;gt;2n^2 + n&amp;lt;/math&amp;gt; (т.к. необходимо хранить вектор сингулярных чисел длины &amp;lt;math&amp;gt;n&amp;lt;/math&amp;gt;, а также две матрицы &amp;lt;math&amp;gt;U, V&amp;lt;/math&amp;gt; левых и правых сингулярных векторов размера &amp;lt;math&amp;gt;n&amp;lt;/math&amp;gt;х&amp;lt;math&amp;gt;n&amp;lt;/math&amp;gt;).&lt;br /&gt;
&lt;br /&gt;
=== Свойства алгоритма ===&lt;br /&gt;
Метод Якоби является самым медленным из имеющихся алгоритмов вычисления сингулярных чисел и сингулярных векторов матрицы. Тем не менее, для  матриц &amp;lt;math&amp;gt;G&amp;lt;/math&amp;gt;, которые могут быть представлены в виде &amp;lt;math&amp;gt;G=DX&amp;lt;/math&amp;gt;, где &amp;lt;math&amp;gt;D&amp;lt;/math&amp;gt; - диагональная, а &amp;lt;math&amp;gt;X&amp;lt;/math&amp;gt; - хорошо обусловлена, он способен вычислять сингулярные числа и вектора намного точнее, чем другие методы&amp;lt;ref&amp;gt;Дж. Деммель «Вычислительная линейная алгебра» (стр. 261-264)&amp;lt;/ref&amp;gt;. &lt;br /&gt;
&lt;br /&gt;
Вычислительная мощность алгоритма, как отношение числа операций к суммарному объему входных и выходных данных является линейной.&lt;br /&gt;
&lt;br /&gt;
Метод Якоби не детерминирован, так как является итерационным алгоритмом с выходом по точности (число итераций зависит от входных данных и порогового значения).&lt;br /&gt;
&lt;br /&gt;
== Программная реализация алгоритма ==&lt;br /&gt;
&lt;br /&gt;
=== Особенности реализации последовательного алгоритма ===&lt;br /&gt;
&lt;br /&gt;
=== Локальность данных и вычислений ===&lt;br /&gt;
&lt;br /&gt;
=== Возможные способы и особенности параллельной реализации алгоритма ===&lt;br /&gt;
&lt;br /&gt;
=== Масштабируемость алгоритма и его реализации ===&lt;br /&gt;
Исследование масштабируемости параллельной реализации метода Якоби вычисления сингулярных чисел и векторов проводилось на суперкомпьютере &amp;quot;Ломоносов&amp;quot;.&lt;br /&gt;
&lt;br /&gt;
Набор и границы значений изменяемых параметров запуска реализации алгоритма: &lt;br /&gt;
&lt;br /&gt;
*	число процессоров [1 : 128] с шагом равным степени двойки;&lt;br /&gt;
*	размер матрицы [256 : 1792] с шагом 256.&lt;br /&gt;
&lt;br /&gt;
В результате проведённых экспериментов был получен следующий диапазон эффективности реализации алгоритма:&lt;br /&gt;
&lt;br /&gt;
*	минимальная эффективность реализации 0,023%;&lt;br /&gt;
*	максимальная эффективность реализации 8,84%.&lt;br /&gt;
&lt;br /&gt;
На следующих рисунках приведены графики производительности и эффективности выбранной реализации метода Якоби в зависимости от изменяемых параметров запуска.&lt;br /&gt;
&lt;br /&gt;
[[File:Performance.jpg|none|thumb|1000px|Рисунок 1. Параллельная реализация метода Якоби. Изменение производительности в зависимости от числа процессоров и размера матрицы.]]&lt;br /&gt;
&lt;br /&gt;
[[File:EfficiencyJackobi.jpg|none|thumb|1000px|Рисунок 2. Параллельная реализация метода Холецкого. Изменение эффективности в зависимости от числа процессоров и размера матрицы.]]&lt;br /&gt;
&lt;br /&gt;
=== Динамические характеристики и эффективность реализации алгоритма ===&lt;br /&gt;
&lt;br /&gt;
=== Выводы для классов архитектур ===&lt;br /&gt;
&lt;br /&gt;
=== Существующие реализации алгоритма ===&lt;br /&gt;
Метод Якоби нахождения сингулярных значений и векторов реализован в таких пакетах, как LAPACK &amp;lt;ref&amp;gt;http://www.netlib.org/scalapack/slug/&amp;lt;/ref&amp;gt;, LINPACK/EISPACK &amp;lt;ref&amp;gt; http://www.netlib.org/linpack/ &amp;lt;/ref&amp;gt;, Intel MKL &amp;lt;ref&amp;gt;https://software.intel.com/ru-ru/node/521153#CAF8CA08-1C69-48F8-B0C3-B2B27AFA92FA&amp;lt;/ref&amp;gt;.&lt;br /&gt;
&lt;br /&gt;
Так же функция Якоби реализована в пакете Matlab.&lt;br /&gt;
&lt;br /&gt;
Т. к. алгоритм считается медленным, он не включен во многие известные пакеты.&lt;br /&gt;
&lt;br /&gt;
== Литература ==&lt;br /&gt;
1. Дж. Деммель Вычислительная линейная алгебра. Изд. Мир, 2001.&lt;/div&gt;</summary>
		<author><name>Davletshuna Alexandra</name></author>
	</entry>
	<entry>
		<id>https://xn--80aecvaldz.xn--80ahdrnmvk.xn--p1ai/w/ru/index.php?title=%D0%A3%D1%87%D0%B0%D1%81%D1%82%D0%BD%D0%B8%D0%BA:Davletshuna_Alexandra/%D0%9C%D0%B5%D1%82%D0%BE%D0%B4_%D0%AF%D0%BA%D0%BE%D0%B1%D0%B8_%D0%B2%D1%8B%D1%87%D0%B8%D1%81%D0%BB%D0%B5%D0%BD%D0%B8%D1%8F_%D1%81%D0%B8%D0%BD%D0%B3%D1%83%D0%BB%D1%8F%D1%80%D0%BD%D1%8B%D1%85_%D1%87%D0%B8%D1%81%D0%B5%D0%BB_%D0%B8_%D0%B2%D0%B5%D0%BA%D1%82%D0%BE%D1%80%D0%BE%D0%B2&amp;diff=17675</id>
		<title>Участник:Davletshuna Alexandra/Метод Якоби вычисления сингулярных чисел и векторов</title>
		<link rel="alternate" type="text/html" href="https://xn--80aecvaldz.xn--80ahdrnmvk.xn--p1ai/w/ru/index.php?title=%D0%A3%D1%87%D0%B0%D1%81%D1%82%D0%BD%D0%B8%D0%BA:Davletshuna_Alexandra/%D0%9C%D0%B5%D1%82%D0%BE%D0%B4_%D0%AF%D0%BA%D0%BE%D0%B1%D0%B8_%D0%B2%D1%8B%D1%87%D0%B8%D1%81%D0%BB%D0%B5%D0%BD%D0%B8%D1%8F_%D1%81%D0%B8%D0%BD%D0%B3%D1%83%D0%BB%D1%8F%D1%80%D0%BD%D1%8B%D1%85_%D1%87%D0%B8%D1%81%D0%B5%D0%BB_%D0%B8_%D0%B2%D0%B5%D0%BA%D1%82%D0%BE%D1%80%D0%BE%D0%B2&amp;diff=17675"/>
		<updated>2016-11-16T12:56:17Z</updated>

		<summary type="html">&lt;p&gt;Davletshuna Alexandra: /* Существующие реализации алгоритма */&lt;/p&gt;
&lt;hr /&gt;
&lt;div&gt;{{algorithm&lt;br /&gt;
| name              = Метод Якоби вычисления сингулярных чисел и векторов&lt;br /&gt;
| serial_complexity = &amp;lt;math&amp;gt;O(n^3)&amp;lt;/math&amp;gt;&lt;br /&gt;
| pf_height         = &amp;lt;math&amp;gt;O(n^2)&amp;lt;/math&amp;gt;&lt;br /&gt;
| pf_width          = &amp;lt;math&amp;gt;O(n)&amp;lt;/math&amp;gt;&lt;br /&gt;
| input_data        = &amp;lt;math&amp;gt;n^2&amp;lt;/math&amp;gt;&lt;br /&gt;
| output_data       = &amp;lt;math&amp;gt;2n^2 + n&amp;lt;/math&amp;gt;&lt;br /&gt;
}}&lt;br /&gt;
&lt;br /&gt;
Авторы статьи: [[Участница:Davletshuna Alexandra|Давлетшина Александра]] (группа 619) пункты 1.1-1.4, 1.6, 2.7; [[Участница:Alek sandra|Зайцева Александра]] (группа 601) пункты 1.5, 1.7-1.10, 2.7.&lt;br /&gt;
&lt;br /&gt;
== Свойства и структура алгоритма ==&lt;br /&gt;
&lt;br /&gt;
=== Общее описание алгоритма ===&lt;br /&gt;
&#039;&#039;&#039;Сингулярным разложением&#039;&#039;&#039; называется разложение прямоугольной вещественной или комплексной матрицы, имеющее широкое применение, в силу своей наглядной геометрической интерпретации, при решении многих прикладных задач. Сингулярное разложение матрицы А позволяет вычислять сингулярные числа данной матрицы, а также, левые и правые сингулярные векторы матрицы А:&lt;br /&gt;
&lt;br /&gt;
•	левые сингулярные векторы матрицы А — это собственные векторы матрицы &amp;lt;math&amp;gt;AA^*&amp;lt;/math&amp;gt;;&lt;br /&gt;
&lt;br /&gt;
•	правые сингулярные векторы матрицы A — это собственные векторы матрицы &amp;lt;math&amp;gt;A^*A&amp;lt;/math&amp;gt;.&lt;br /&gt;
&lt;br /&gt;
Геометрическая интерпретация сингулярного разложения заключается в следующем факте из геометрии: &#039;&#039;Образом любого линейного преобразования, заданного с помощью матрицы &amp;lt;math&amp;gt;m&amp;lt;/math&amp;gt;x&amp;lt;math&amp;gt;n&amp;lt;/math&amp;gt;, примененного к единичной сфере является гиперэллипсоид&#039;&#039;.&lt;br /&gt;
&lt;br /&gt;
Из многочисленных разложений матриц, наиболее удобным является сингулярное разложение матрицы в виде: &amp;lt;math&amp;gt;A=U\Sigma V^*&amp;lt;/math&amp;gt;, где &amp;lt;math&amp;gt;U, V&amp;lt;/math&amp;gt; – унитарные матрицы, а &amp;lt;math&amp;gt;\Sigma&amp;lt;/math&amp;gt; – диагональная матрица с вещественными положительными числами на диагонали &amp;lt;ref&amp;gt;http://algorithms.parallel.ru/&amp;lt;/ref&amp;gt;.&lt;br /&gt;
&lt;br /&gt;
Диагональные элементы матрицы &amp;lt;math&amp;gt;\Sigma&amp;lt;/math&amp;gt; называются сингулярными числами матрицы &amp;lt;math&amp;gt;A&amp;lt;/math&amp;gt;, а столбцы матриц &amp;lt;math&amp;gt;U,V&amp;lt;/math&amp;gt; левыми и правыми сингулярными векторами соответственно.&lt;br /&gt;
&lt;br /&gt;
Алгоритм Якоби сингулярного разложения матрицы был предложен одним из первых в 1846 году. Он приводит прямоугольную матрицу к диагональной матрице с помощью последовательности элементарных вращений. Метод может найти все сингулярные значения с очень высокой точностью. Однако его производительность является довольно низкой, в сравнении с конкурирующими методами.&lt;br /&gt;
&lt;br /&gt;
&#039;&#039;Неявный&#039;&#039;&amp;lt;ref&amp;gt;Дж. Деммель «Вычислительная линейная алгебра» (стр. 261-264)&amp;lt;/ref&amp;gt; метод Якоби математически эквивалентен применению метода Якоби вычисления собственных значений к матрице &amp;lt;math&amp;gt;A = G^TG&amp;lt;/math&amp;gt;.&lt;br /&gt;
Это значит, что на каждом шаге вычисляется вращение Якоби &amp;lt;math&amp;gt;J&amp;lt;/math&amp;gt;, с помощью которого матрица &amp;lt;math&amp;gt;G^TG&amp;lt;/math&amp;gt; неявно пересчитывется в &amp;lt;math&amp;gt;J^TG^TGJ&amp;lt;/math&amp;gt;; вращение выбрано так, чтобы пара внедиагональных элементов из &amp;lt;math&amp;gt;G^TG&amp;lt;/math&amp;gt; обратилась в нули в матрице &amp;lt;math&amp;gt;J^TG^TGJ&amp;lt;/math&amp;gt;. При этом ни &amp;lt;math&amp;gt;G^TG&amp;lt;/math&amp;gt;, ни &amp;lt;math&amp;gt;J^TG^TGJ&amp;lt;/math&amp;gt; не вычисляются в явном виде; вместо них вычисляется матрица &amp;lt;math&amp;gt;GJ&amp;lt;/math&amp;gt;. Поэтому алгоритм называется &#039;&#039;методом односторонних вращений&#039;&#039;.&lt;br /&gt;
&lt;br /&gt;
=== Математическое описание алгоритма ===&lt;br /&gt;
Исходные данные: матрица &amp;lt;math&amp;gt;G&amp;lt;/math&amp;gt; (элементы &amp;lt;math&amp;gt;g_{ij}, i, j = 1, \ldots, n&amp;lt;/math&amp;gt;).&lt;br /&gt;
&lt;br /&gt;
Вычисляемые данные: матрица &amp;lt;math&amp;gt;\Sigma = diag(\sigma_{i})&amp;lt;/math&amp;gt;, где &amp;lt;math&amp;gt;\sigma_{i}&amp;lt;/math&amp;gt; - сингулярные числа, &amp;lt;math&amp;gt;U&amp;lt;/math&amp;gt; - матрица левых сингулярных векторов, &amp;lt;math&amp;gt;V&amp;lt;/math&amp;gt; - матрица правых сингулярных векторов.&lt;br /&gt;
&lt;br /&gt;
симметричную матрицу &amp;lt;math&amp;gt;A = (G^TG)&amp;lt;/math&amp;gt; можно привести к диагональному виду:&lt;br /&gt;
&amp;lt;math&amp;gt;RG^TGR^T&amp;lt;/math&amp;gt;, где&lt;br /&gt;
&lt;br /&gt;
&amp;lt;math&amp;gt;&lt;br /&gt;
R(j,k,\theta) = &lt;br /&gt;
\begin{matrix}&lt;br /&gt;
  \\&lt;br /&gt;
  \\&lt;br /&gt;
  \\&lt;br /&gt;
j \\&lt;br /&gt;
  \\&lt;br /&gt;
k \\&lt;br /&gt;
  \\&lt;br /&gt;
  \\&lt;br /&gt;
  \\&lt;br /&gt;
\end{matrix}&lt;br /&gt;
&amp;lt;/math&amp;gt;  &lt;br /&gt;
&amp;lt;math&amp;gt;&lt;br /&gt;
\begin{bmatrix}&lt;br /&gt;
  &amp;amp; 1 &amp;amp;   &amp;amp;        &amp;amp;              &amp;amp;        &amp;amp;               &amp;amp;         &amp;amp;    &amp;amp;   \\&lt;br /&gt;
  &amp;amp;   &amp;amp; 1 &amp;amp;        &amp;amp;              &amp;amp;        &amp;amp;               &amp;amp;         &amp;amp;    &amp;amp;   \\&lt;br /&gt;
  &amp;amp;   &amp;amp;   &amp;amp; \ddots &amp;amp;              &amp;amp;        &amp;amp;               &amp;amp;         &amp;amp;    &amp;amp;   \\&lt;br /&gt;
  &amp;amp;   &amp;amp;   &amp;amp;        &amp;amp; \cos(\theta) &amp;amp;        &amp;amp; -\sin(\theta) &amp;amp;         &amp;amp;    &amp;amp;   \\&lt;br /&gt;
  &amp;amp;   &amp;amp;   &amp;amp;        &amp;amp;              &amp;amp; \ddots &amp;amp;               &amp;amp;         &amp;amp;    &amp;amp;   \\&lt;br /&gt;
  &amp;amp;   &amp;amp;   &amp;amp;        &amp;amp; \sin(\theta) &amp;amp;        &amp;amp; \cos(\theta)  &amp;amp;         &amp;amp;    &amp;amp;   \\&lt;br /&gt;
  &amp;amp;   &amp;amp;   &amp;amp;        &amp;amp;              &amp;amp;        &amp;amp;               &amp;amp; \ddots  &amp;amp;    &amp;amp;   \\&lt;br /&gt;
  &amp;amp;   &amp;amp;   &amp;amp;        &amp;amp;              &amp;amp;        &amp;amp;               &amp;amp;         &amp;amp; 1  &amp;amp;   \\&lt;br /&gt;
  &amp;amp;   &amp;amp;   &amp;amp;        &amp;amp;              &amp;amp;        &amp;amp;               &amp;amp;         &amp;amp;    &amp;amp; 1 \\&lt;br /&gt;
\end{bmatrix}&lt;br /&gt;
&amp;lt;/math&amp;gt;&lt;br /&gt;
&lt;br /&gt;
Обозначим &amp;lt;math&amp;gt;s = \sin \theta&amp;lt;/math&amp;gt; и &amp;lt;math&amp;gt;c = \cos \theta&amp;lt;/math&amp;gt;.&lt;br /&gt;
&lt;br /&gt;
Перемножив матрицы &amp;lt;math&amp;gt;RG^TGR^T&amp;lt;/math&amp;gt;, получим следующие выражения&amp;lt;ref&amp;gt;http://www.astro.tsu.ru/OsChMet/5_2.html&amp;lt;/ref&amp;gt;:&lt;br /&gt;
&lt;br /&gt;
&amp;lt;math&amp;gt;\begin{align}&lt;br /&gt;
 a_{jj}^{(i+1)} &amp;amp;= c^2\, a_{jj}^{(i)}  -  2\, s c \,a_{jk}^{(i)}  +  s^2\, a_{kk}^{(i)} \\&lt;br /&gt;
 a_{kk}^{(i+1)} &amp;amp;= s^2 \,a_{jj}^{(i)}  +  2 s c\, a_{jk}^{(i)}  +  c^2 \, a_{kk}^{(i)} \\&lt;br /&gt;
 a_{jk}^{(i+1)} &amp;amp;= a_{kj}^{(i+1)} = (c^2 - s^2 ) \, a_{jk}^{(i)}  +  s c \, (a_{kk}^{(i)} - a_{jj}^{(i)} ) \\&lt;br /&gt;
 a_{jm}^{(i+1)} &amp;amp;= a_{mj}^{(i+1)} = c \, a_{jm}^{(i)}  -  s \, a_{km}^{(i)} &amp;amp; m \ne j,k \\&lt;br /&gt;
 a_{km}^{(i+1)} &amp;amp;= a_{mk}^{(i+1)} = s \, a_{jm}^{(i)}  + c \, a_{km}^{(i)} &amp;amp; m \ne j,k \\&lt;br /&gt;
 a_{ml}^{(i+1)} &amp;amp;= a_{ml}^{(i)} &amp;amp;m,l \ne j,k&lt;br /&gt;
\end{align}&amp;lt;/math&amp;gt;&lt;br /&gt;
&lt;br /&gt;
Т.к внедиагональные элементы должны быть равны 0, то выбираем &amp;lt;math&amp;gt;\theta&amp;lt;/math&amp;gt; так, чтобы &amp;lt;math&amp;gt;a_{jk}^{(i+1)} = 0&amp;lt;/math&amp;gt; и &amp;lt;math&amp;gt;a_{kj}^{(i+1)} = 0&amp;lt;/math&amp;gt;.&lt;br /&gt;
&lt;br /&gt;
Тогда решая уравнение получаем, что&lt;br /&gt;
&lt;br /&gt;
&amp;lt;math&amp;gt;&lt;br /&gt;
         \begin{align}&lt;br /&gt;
         \tau &amp;amp;= ({a_{jj} - a_{kk}})/{2a_{jk}} \\&lt;br /&gt;
         t &amp;amp;= {sign(\tau)}/(|\tau| + \sqrt{1 + \tau^2}) \\&lt;br /&gt;
         c &amp;amp;= 1/(\sqrt{1 + t^2}) \\&lt;br /&gt;
         s &amp;amp;= ct \\&lt;br /&gt;
         \end{align}&amp;lt;/math&amp;gt;&lt;br /&gt;
&lt;br /&gt;
Остановка вычислений алгоритма наступает, когда внедиагональные элементы становятся меньше некоторого наперед заданного числа &amp;lt;math&amp;gt;\varepsilon&amp;lt;/math&amp;gt;.&lt;br /&gt;
&lt;br /&gt;
=== Вычислительное ядро алгоритма ===&lt;br /&gt;
Вычислительное ядро алгоритма составляет непосредственно вычисление одностороннего вращения Якоби, т.е. вычисление элементов матрицы &amp;lt;math&amp;gt;g_{jm}^{(i+1)} = g_{mj}^{(i+1)}&amp;lt;/math&amp;gt; и &amp;lt;math&amp;gt;g_{km}^{(i+1)} = g_{mk}^{(i+1)}&amp;lt;/math&amp;gt;, &amp;lt;math&amp;gt;m \ne j,k&amp;lt;/math&amp;gt;, а также вычисления элементов &amp;lt;math&amp;gt;g_{jj}^{(i+1)} &amp;lt;/math&amp;gt; и &amp;lt;math&amp;gt;g_{kk}^{(i+1)} &amp;lt;/math&amp;gt;, получившихся после умножения промежуточной матрицы на матрицу вращений Якоби:&lt;br /&gt;
&lt;br /&gt;
&amp;lt;math&amp;gt;\begin{align}&lt;br /&gt;
 g_{jj}^{(i+1)} &amp;amp;= c^2\, g_{jj}^{(i)}  -  2\, s c \,g_{jk}^{(i)}  +  s^2\, g_{kk}^{(i)} \\&lt;br /&gt;
 g_{kk}^{(i+1)} &amp;amp;= s^2 \,g_{jj}^{(i)}  +  2 s c\, g_{jk}^{(i)}  +  c^2 \, g_{kk}^{(i)} \\&lt;br /&gt;
 g_{jk}^{(i+1)} &amp;amp;= g_{kj}^{(i+1)} = (c^2 - s^2 ) \, g_{jk}^{(i)}  +  s c \, (g_{kk}^{(i)} - g_{jj}^{(i)} ) \\&lt;br /&gt;
 g_{jm}^{(i+1)} &amp;amp;= g_{mj}^{(i+1)} = c \, g_{jm}^{(i)}  -  s \, g_{km}^{(i)} &amp;amp; m \ne j,k \\&lt;br /&gt;
 g_{km}^{(i+1)} &amp;amp;= g_{mk}^{(i+1)} = s \, g_{jm}^{(i)}  + c \, g_{km}^{(i)} &amp;amp; m \ne j,k \\&lt;br /&gt;
 g_{ml}^{(i+1)} &amp;amp;= g_{ml}^{(i)} &amp;amp;m,l \ne j,k&lt;br /&gt;
\end{align}&amp;lt;/math&amp;gt;&lt;br /&gt;
&lt;br /&gt;
=== Макроструктура алгоритма ===&lt;br /&gt;
Основную часть метода составляет процедура односторонних вращений матрицы, которая в свою очередь состоит из:&lt;br /&gt;
&lt;br /&gt;
#Вычисление &amp;lt;math&amp;gt;\tau, c, s, t&amp;lt;/math&amp;gt;.&lt;br /&gt;
#Одностороннее вращение матрицы. &lt;br /&gt;
&lt;br /&gt;
Что требует &amp;lt;math&amp;gt;O(n)&amp;lt;/math&amp;gt; операций.&lt;br /&gt;
&lt;br /&gt;
После этого необходимо:&lt;br /&gt;
&lt;br /&gt;
#Вычислить сингулярные числа &amp;lt;math&amp;gt;\sigma_i&amp;lt;/math&amp;gt;.  Что требует &amp;lt;math&amp;gt;O(n)&amp;lt;/math&amp;gt; операций.&lt;br /&gt;
#Вычислить &amp;lt;math&amp;gt;U&amp;lt;/math&amp;gt; и &amp;lt;math&amp;gt;V&amp;lt;/math&amp;gt;. Что требует &amp;lt;math&amp;gt;O(n^2)&amp;lt;/math&amp;gt; операций.&lt;br /&gt;
&lt;br /&gt;
=== Схема реализации последовательного алгоритма ===&lt;br /&gt;
Применение метода Якоби к матрице &amp;lt;math&amp;gt;A = (G^TG)&amp;lt;/math&amp;gt; можно описать следующим образом&amp;lt;ref&amp;gt;Дж. Деммель «Вычислительная линейная алгебра» (стр. 261-263)&amp;lt;/ref&amp;gt;:&lt;br /&gt;
&lt;br /&gt;
Если &amp;lt;math&amp;gt;G = U\Sigma V^T&amp;lt;/math&amp;gt; и &amp;lt;math&amp;gt;\Sigma = diag(\sigma_{i})&amp;lt;/math&amp;gt;, то алгоритм вычисляет сингулярные числа &amp;lt;math&amp;gt;\sigma_{i}&amp;lt;/math&amp;gt;, матрицу &amp;lt;math&amp;gt;U&amp;lt;/math&amp;gt; левых сингулярных векторов и матрицу &amp;lt;math&amp;gt;V&amp;lt;/math&amp;gt; правых сингулярных векторов по следующей схеме:&lt;br /&gt;
&lt;br /&gt;
 repeat&lt;br /&gt;
     for &amp;lt;math&amp;gt;j=1&amp;lt;/math&amp;gt; to &amp;lt;math&amp;gt;n-1&amp;lt;/math&amp;gt;&lt;br /&gt;
         for &amp;lt;math&amp;gt;k=j+1&amp;lt;/math&amp;gt; to &amp;lt;math&amp;gt;n&amp;lt;/math&amp;gt;&lt;br /&gt;
             обратиться к процедуре &#039;&#039;&#039;&#039;&#039;One-Sided-Jacobi-Rotation&amp;lt;math&amp;gt;(G,j,k)&amp;lt;/math&amp;gt;&#039;&#039;&#039;&#039;&#039;&lt;br /&gt;
         end for&lt;br /&gt;
     end for&lt;br /&gt;
 пока &amp;lt;math&amp;gt;G^TG&amp;lt;/math&amp;gt; не станет достаточно близка к диагональной матрице&lt;br /&gt;
 Положить &amp;lt;math&amp;gt;\sigma_{i} = ||G(:,i)||_2 &amp;lt;/math&amp;gt; (норма &amp;lt;math&amp;gt;i&amp;lt;/math&amp;gt;-го столбца в &amp;lt;math&amp;gt;G&amp;lt;/math&amp;gt;)&lt;br /&gt;
 Положить &amp;lt;math&amp;gt;U = [u_{1},\dots, u_{n}]&amp;lt;/math&amp;gt;, где &amp;lt;math&amp;gt;u_{i} = G(:,i)/\sigma_{i}&amp;lt;/math&amp;gt;&lt;br /&gt;
 Положить &amp;lt;math&amp;gt;V = J&amp;lt;/math&amp;gt;, где &amp;lt;math&amp;gt;J&amp;lt;/math&amp;gt; - накопленное произведение вращений Якоби.&lt;br /&gt;
&lt;br /&gt;
Где процедура &#039;&#039;&#039;&#039;&#039;One-Sided-Jacobi-Rotation&#039;&#039;&#039;&#039;&#039; является метод односторонних вращений Якоби:&lt;br /&gt;
&lt;br /&gt;
 proc &#039;&#039;&#039;&#039;&#039;One-Sided-Jacobi-Rotation&amp;lt;math&amp;gt;(G,j,k)&amp;lt;/math&amp;gt;&#039;&#039;&#039;&#039;&#039;&lt;br /&gt;
     вычислить &amp;lt;math&amp;gt;a_{jj} = (G^TG)_{jj}, a_{jk} = (G^TG)_{jk}&amp;lt;/math&amp;gt; и &amp;lt;math&amp;gt;a_{kk} = (G^TG)_{kk}&amp;lt;/math&amp;gt;&lt;br /&gt;
     if &amp;lt;math&amp;gt;|a_{jk}|&amp;lt;/math&amp;gt; не слишком мал&lt;br /&gt;
         &amp;lt;math&amp;gt;&lt;br /&gt;
         \begin{align}&lt;br /&gt;
         \tau &amp;amp;= ({a_{jj} - a_{kk}})/{2a_{jk}} \\&lt;br /&gt;
         t &amp;amp;= {sign(\tau)}/(|\tau| + \sqrt{1 + \tau^2}) \\&lt;br /&gt;
         c &amp;amp;= 1/(\sqrt{1 + t^2}) \\&lt;br /&gt;
         s &amp;amp;= ct \\&lt;br /&gt;
         G &amp;amp;= GR(j,k,\theta) \  \dots c=cos\theta, s=sin\theta \end{align}&amp;lt;/math&amp;gt;&lt;br /&gt;
         if нужны правые сингулярные векторы &lt;br /&gt;
             &amp;lt;math&amp;gt;J = JR(j,k,\theta)&amp;lt;/math&amp;gt;&lt;br /&gt;
         end if&lt;br /&gt;
     end if&lt;br /&gt;
&lt;br /&gt;
=== Последовательная сложность алгоритма ===&lt;br /&gt;
Для одного вращения Якоби необходимо выполнить &amp;lt;math&amp;gt;O(n)&amp;lt;/math&amp;gt; операций умножения и сложения. &lt;br /&gt;
&lt;br /&gt;
Всего вариантов выбора &amp;lt;math&amp;gt;j&amp;lt;/math&amp;gt; и &amp;lt;math&amp;gt;k&amp;lt;/math&amp;gt; существует &amp;lt;math&amp;gt;\frac{n(n-1)}{2}&amp;lt;/math&amp;gt;.&lt;br /&gt;
&lt;br /&gt;
Таким образом последовательный алгоритм Якоби вычисления сингулярных чисел и векторов является алгоритмом с кубической сложностью.&lt;br /&gt;
&lt;br /&gt;
=== Информационный граф ===&lt;br /&gt;
Граф алгоритма состоит из четырех групп вершин&lt;br /&gt;
&lt;br /&gt;
(А)Первая группа вершин расположена в двумерной области, соответствующая ей операция - вычисление элементов &amp;lt;math&amp;gt;a_{jj},a_{jk},a_{kk}&amp;lt;/math&amp;gt; матрицы произведения &amp;lt;math&amp;gt;A = (G^TG)&amp;lt;/math&amp;gt;. Где &amp;lt;math&amp;gt;j&amp;lt;/math&amp;gt; изменяется от &amp;lt;math&amp;gt;1&amp;lt;/math&amp;gt; до &amp;lt;math&amp;gt;n-1&amp;lt;/math&amp;gt;, принимая все целочисленные значения, &amp;lt;math&amp;gt;k&amp;lt;/math&amp;gt;  изменяется от &amp;lt;math&amp;gt;j+1&amp;lt;/math&amp;gt; до &amp;lt;math&amp;gt;n&amp;lt;/math&amp;gt;, принимая все целочисленные значения.&lt;br /&gt;
&lt;br /&gt;
Граф вычисления каждого из элементов приведен на рисунке 1, где значениям &amp;lt;math&amp;gt;g_{ij}&amp;lt;/math&amp;gt; соответствуют обозначения &amp;lt;math&amp;gt;x_{ij}&amp;lt;/math&amp;gt;, а элементам &amp;lt;math&amp;gt;g^T_{ij}&amp;lt;/math&amp;gt; обозначения &amp;lt;math&amp;gt;z_{ij}&amp;lt;/math&amp;gt;. Значение &amp;lt;math&amp;gt;s_{ij}&amp;lt;/math&amp;gt; является значением результирующего элемента.&lt;br /&gt;
&lt;br /&gt;
(Б)Вторая группа вершин расположена в двумерной области, соответствующая ей операция – вычисление &amp;lt;math&amp;gt;c&amp;lt;/math&amp;gt; и &amp;lt;math&amp;gt;s&amp;lt;/math&amp;gt;.&lt;br /&gt;
&lt;br /&gt;
Информационный граф с входными и выходными данными вычисления пункта (Б) представлен на рисунке 2.&lt;br /&gt;
&lt;br /&gt;
(В)Третья группа вершин расположена в двумерной области, соответствующая ей операция вычисление значений элементов &amp;lt;math&amp;gt;g_{jm}^{(i+1)} = g_{mj}^{(i+1)}&amp;lt;/math&amp;gt; и &amp;lt;math&amp;gt;g_{km}^{(i+1)} = g_{mk}^{(i+1)}&amp;lt;/math&amp;gt;, &amp;lt;math&amp;gt;m \ne j,k&amp;lt;/math&amp;gt;.&lt;br /&gt;
&lt;br /&gt;
(Г)Четвертая группа вершин расположена в двумерной области, соответствующая ей операция вычисление значений элементов &amp;lt;math&amp;gt;g_{jj}^{(i+1)} &amp;lt;/math&amp;gt; и &amp;lt;math&amp;gt;g_{kk}^{(i+1)} &amp;lt;/math&amp;gt;.&lt;br /&gt;
&lt;br /&gt;
Элементы групп (В) и (Г) вычисляются аналогично вычислению элементов матрицы произведения, т.к. фактически представляют собой перемножение матриц &amp;lt;math&amp;gt;G&amp;lt;/math&amp;gt; и &amp;lt;math&amp;gt;R&amp;lt;/math&amp;gt;&lt;br /&gt;
&lt;br /&gt;
[[File:Jacobi_2.jpg|none|thumb|1000px|Рисунок 1. Информационный граф с входными и выходными параметрами вычисления каждого элемента матрицы произведения.]]&lt;br /&gt;
&lt;br /&gt;
[[File:Jacobi_1.jpg|none|thumb|1000px|Рисунок 2. Информационный граф с входными и выходными параметрами вычисления значений &amp;lt;math&amp;gt;c&amp;lt;/math&amp;gt; и &amp;lt;math&amp;gt;s&amp;lt;/math&amp;gt;.]]&lt;br /&gt;
&lt;br /&gt;
Обобщенный граф метода Якоби представлен на рисунке 3, где буквами А, Б, В и Г обозначено вычисление групп вершин (А), (Б), (В) и (Г).&lt;br /&gt;
&lt;br /&gt;
[[File:Graf21.png|none|thumb|2000px|Рисунок 3. Обобщенный граф алгоритма вычисления сингулярных чисел и векторов методом Якоби.]]&lt;br /&gt;
&lt;br /&gt;
=== Ресурс параллелизма алгоритма ===&lt;br /&gt;
Для выполнения одной итерации метода Якоби требуется последовательно выполнить несколько ярусов:&lt;br /&gt;
# вычислить &amp;lt;math&amp;gt;\tau&amp;lt;/math&amp;gt; &lt;br /&gt;
# вычислить &amp;lt;math&amp;gt;t&amp;lt;/math&amp;gt; &lt;br /&gt;
# вычислить &amp;lt;math&amp;gt;c&amp;lt;/math&amp;gt; &lt;br /&gt;
# вычислить &amp;lt;math&amp;gt;s&amp;lt;/math&amp;gt;&lt;br /&gt;
# выполнить поворот матрицы &amp;lt;math&amp;gt;G&amp;lt;/math&amp;gt; с параллельным выполнением &amp;lt;math&amp;gt;2(n-2)&amp;lt;/math&amp;gt; операций вычисления элементов матрицы &amp;lt;math&amp;gt;g_{jm}^{(i+1)} = g_{mj}^{(i+1)}&amp;lt;/math&amp;gt; и &amp;lt;math&amp;gt;g_{km}^{(i+1)} = g_{mk}^{(i+1)}&amp;lt;/math&amp;gt;, &amp;lt;math&amp;gt;m \ne j,k&amp;lt;/math&amp;gt;, а также вычисления элементов &amp;lt;math&amp;gt;g_{jj}^{(i+1)} &amp;lt;/math&amp;gt; и &amp;lt;math&amp;gt;g_{kk}^{(i+1)} &amp;lt;/math&amp;gt;. &lt;br /&gt;
&lt;br /&gt;
Суммарное количество итераций равно &amp;lt;math&amp;gt;\frac{n(n-1)}{2}&amp;lt;/math&amp;gt; (Различные варианты выбора &amp;lt;math&amp;gt;j&amp;lt;/math&amp;gt; и &amp;lt;math&amp;gt;k&amp;lt;/math&amp;gt;). &lt;br /&gt;
&lt;br /&gt;
Асимптотически метод сходится квадратично. &lt;br /&gt;
&lt;br /&gt;
Таким образом, при классификации по высоте ЯПФ метод Якоби относится к алгоритмам со сложностью &amp;lt;math&amp;gt;O(n^2)&amp;lt;/math&amp;gt;&amp;amp;nbsp;, а при классификации по ширине ЯПФ — к алгоритмам со сложностью &amp;lt;math&amp;gt;O(n)&amp;lt;/math&amp;gt;.&lt;br /&gt;
&lt;br /&gt;
=== Входные и выходные данные алгоритма ===&lt;br /&gt;
&#039;&#039;&#039;Входные данные&#039;&#039;&#039;: плотная матрица &amp;lt;math&amp;gt;G&amp;lt;/math&amp;gt; размера &amp;lt;math&amp;gt;n&amp;lt;/math&amp;gt;х&amp;lt;math&amp;gt;n&amp;lt;/math&amp;gt;, где &amp;lt;math&amp;gt;A= G^TG&amp;lt;/math&amp;gt; – симметрическая матрица.&lt;br /&gt;
&lt;br /&gt;
&#039;&#039;&#039;Объём входных данных&#039;&#039;&#039;: &amp;lt;math&amp;gt;n^2&amp;lt;/math&amp;gt; (т.к. для хранения матрицы &amp;lt;math&amp;gt;G&amp;lt;/math&amp;gt; используем двумерный массив размера &amp;lt;math&amp;gt;n&amp;lt;/math&amp;gt;х&amp;lt;math&amp;gt;n&amp;lt;/math&amp;gt;)&lt;br /&gt;
&lt;br /&gt;
&#039;&#039;&#039;Выходные данные&#039;&#039;&#039;: &amp;lt;math&amp;gt;\sigma_{i}&amp;lt;/math&amp;gt;  - сингулярные числа, матрица &amp;lt;math&amp;gt;U&amp;lt;/math&amp;gt; левых сингулярных векторов и матрица &amp;lt;math&amp;gt;V&amp;lt;/math&amp;gt; правых сингулярных векторов.&lt;br /&gt;
&lt;br /&gt;
&#039;&#039;&#039;Объём выходных данных&#039;&#039;&#039;: &amp;lt;math&amp;gt;2n^2 + n&amp;lt;/math&amp;gt; (т.к. необходимо хранить вектор сингулярных чисел длины &amp;lt;math&amp;gt;n&amp;lt;/math&amp;gt;, а также две матрицы &amp;lt;math&amp;gt;U, V&amp;lt;/math&amp;gt; левых и правых сингулярных векторов размера &amp;lt;math&amp;gt;n&amp;lt;/math&amp;gt;х&amp;lt;math&amp;gt;n&amp;lt;/math&amp;gt;).&lt;br /&gt;
&lt;br /&gt;
=== Свойства алгоритма ===&lt;br /&gt;
Метод Якоби является самым медленным из имеющихся алгоритмов вычисления сингулярных чисел и сингулярных векторов матрицы. Тем не менее, для  матриц &amp;lt;math&amp;gt;G&amp;lt;/math&amp;gt;, которые могут быть представлены в виде &amp;lt;math&amp;gt;G=DX&amp;lt;/math&amp;gt;, где &amp;lt;math&amp;gt;D&amp;lt;/math&amp;gt; - диагональная, а &amp;lt;math&amp;gt;X&amp;lt;/math&amp;gt; - хорошо обусловлена, он способен вычислять сингулярные числа и вектора намного точнее, чем другие методы&amp;lt;ref&amp;gt;Дж. Деммель «Вычислительная линейная алгебра» (стр. 261-264)&amp;lt;/ref&amp;gt;. &lt;br /&gt;
&lt;br /&gt;
Вычислительная мощность алгоритма, как отношение числа операций к суммарному объему входных и выходных данных является линейной.&lt;br /&gt;
&lt;br /&gt;
Метод Якоби не детерминирован, так как является итерационным алгоритмом с выходом по точности (число итераций зависит от входных данных и порогового значения).&lt;br /&gt;
&lt;br /&gt;
== Программная реализация алгоритма ==&lt;br /&gt;
&lt;br /&gt;
=== Особенности реализации последовательного алгоритма ===&lt;br /&gt;
&lt;br /&gt;
=== Локальность данных и вычислений ===&lt;br /&gt;
&lt;br /&gt;
=== Возможные способы и особенности параллельной реализации алгоритма ===&lt;br /&gt;
&lt;br /&gt;
=== Масштабируемость алгоритма и его реализации ===&lt;br /&gt;
&lt;br /&gt;
=== Динамические характеристики и эффективность реализации алгоритма ===&lt;br /&gt;
&lt;br /&gt;
=== Выводы для классов архитектур ===&lt;br /&gt;
&lt;br /&gt;
=== Существующие реализации алгоритма ===&lt;br /&gt;
Метод Якоби нахождения сингулярных значений и векторов реализован в таких пакетах, как LAPACK &amp;lt;ref&amp;gt;http://www.netlib.org/scalapack/slug/&amp;lt;/ref&amp;gt;, LINPACK/EISPACK &amp;lt;ref&amp;gt; http://www.netlib.org/linpack/ &amp;lt;/ref&amp;gt;, Intel MKL &amp;lt;ref&amp;gt;https://software.intel.com/ru-ru/node/521153#CAF8CA08-1C69-48F8-B0C3-B2B27AFA92FA&amp;lt;/ref&amp;gt;.&lt;br /&gt;
&lt;br /&gt;
Так же функция Якоби реализована в пакете Matlab.&lt;br /&gt;
&lt;br /&gt;
Т. к. алгоритм считается медленным, он не включен во многие известные пакеты.&lt;br /&gt;
&lt;br /&gt;
== Литература ==&lt;br /&gt;
1. Дж. Деммель Вычислительная линейная алгебра. Изд. Мир, 2001.&lt;/div&gt;</summary>
		<author><name>Davletshuna Alexandra</name></author>
	</entry>
	<entry>
		<id>https://xn--80aecvaldz.xn--80ahdrnmvk.xn--p1ai/w/ru/index.php?title=%D0%A3%D1%87%D0%B0%D1%81%D1%82%D0%BD%D0%B8%D0%BA:Davletshuna_Alexandra/%D0%9C%D0%B5%D1%82%D0%BE%D0%B4_%D0%AF%D0%BA%D0%BE%D0%B1%D0%B8_%D0%B2%D1%8B%D1%87%D0%B8%D1%81%D0%BB%D0%B5%D0%BD%D0%B8%D1%8F_%D1%81%D0%B8%D0%BD%D0%B3%D1%83%D0%BB%D1%8F%D1%80%D0%BD%D1%8B%D1%85_%D1%87%D0%B8%D1%81%D0%B5%D0%BB_%D0%B8_%D0%B2%D0%B5%D0%BA%D1%82%D0%BE%D1%80%D0%BE%D0%B2&amp;diff=17371</id>
		<title>Участник:Davletshuna Alexandra/Метод Якоби вычисления сингулярных чисел и векторов</title>
		<link rel="alternate" type="text/html" href="https://xn--80aecvaldz.xn--80ahdrnmvk.xn--p1ai/w/ru/index.php?title=%D0%A3%D1%87%D0%B0%D1%81%D1%82%D0%BD%D0%B8%D0%BA:Davletshuna_Alexandra/%D0%9C%D0%B5%D1%82%D0%BE%D0%B4_%D0%AF%D0%BA%D0%BE%D0%B1%D0%B8_%D0%B2%D1%8B%D1%87%D0%B8%D1%81%D0%BB%D0%B5%D0%BD%D0%B8%D1%8F_%D1%81%D0%B8%D0%BD%D0%B3%D1%83%D0%BB%D1%8F%D1%80%D0%BD%D1%8B%D1%85_%D1%87%D0%B8%D1%81%D0%B5%D0%BB_%D0%B8_%D0%B2%D0%B5%D0%BA%D1%82%D0%BE%D1%80%D0%BE%D0%B2&amp;diff=17371"/>
		<updated>2016-11-15T19:07:44Z</updated>

		<summary type="html">&lt;p&gt;Davletshuna Alexandra: /* Ресурс параллелизма алгоритма */&lt;/p&gt;
&lt;hr /&gt;
&lt;div&gt;{{Assignment|ASA}}&lt;br /&gt;
&lt;br /&gt;
{{algorithm&lt;br /&gt;
| name              = Метод Якоби вычисления сингулярных чисел и векторов&lt;br /&gt;
| serial_complexity = &amp;lt;math&amp;gt;O(n^3)&amp;lt;/math&amp;gt;&lt;br /&gt;
| pf_height         = &amp;lt;math&amp;gt;O(n^2)&amp;lt;/math&amp;gt;&lt;br /&gt;
| pf_width          = &amp;lt;math&amp;gt;O(n)&amp;lt;/math&amp;gt;&lt;br /&gt;
| input_data        = &amp;lt;math&amp;gt;n^2&amp;lt;/math&amp;gt;&lt;br /&gt;
| output_data       = &amp;lt;math&amp;gt;2n^2 + n&amp;lt;/math&amp;gt;&lt;br /&gt;
}}&lt;br /&gt;
&lt;br /&gt;
Авторы статьи: [[Участница:Davletshuna Alexandra|Давлетшина Александра]] (группа 619) пункты 1.1-1.4, 1.6, 2.7; [[Участница:Alek sandra|Зайцева Александра]] (группа 601) пункты 1.5, 1.7-1.10, 2.7.&lt;br /&gt;
&lt;br /&gt;
== Свойства и структура алгоритма ==&lt;br /&gt;
&lt;br /&gt;
=== Общее описание алгоритма ===&lt;br /&gt;
&#039;&#039;&#039;Сингулярным разложением&#039;&#039;&#039; называется разложение прямоугольной вещественной или комплексной матрицы, имеющее широкое применение, в силу своей наглядной геометрической интерпретации, при решении многих прикладных задач. Сингулярное разложение матрицы А позволяет вычислять сингулярные числа данной матрицы, а также, левые и правые сингулярные векторы матрицы А:&lt;br /&gt;
&lt;br /&gt;
•	левые сингулярные векторы матрицы А — это собственные векторы матрицы &amp;lt;math&amp;gt;AA^*&amp;lt;/math&amp;gt;;&lt;br /&gt;
&lt;br /&gt;
•	правые сингулярные векторы матрицы A — это собственные векторы матрицы &amp;lt;math&amp;gt;A^*A&amp;lt;/math&amp;gt;.&lt;br /&gt;
&lt;br /&gt;
Геометрическая интерпретация сингулярного разложения заключается в следующем факте из геометрии: &#039;&#039;Образом любого линейного преобразования, заданного с помощью матрицы &amp;lt;math&amp;gt;m&amp;lt;/math&amp;gt;x&amp;lt;math&amp;gt;n&amp;lt;/math&amp;gt;, примененного к единичной сфере является гиперэллипсоид&#039;&#039;.&lt;br /&gt;
&lt;br /&gt;
Из многочисленных разложений матриц, наиболее удобным является сингулярное разложение матрицы в виде: &amp;lt;math&amp;gt;A=U\Sigma V^*&amp;lt;/math&amp;gt;, где &amp;lt;math&amp;gt;U, V&amp;lt;/math&amp;gt; – унитарные матрицы, а &amp;lt;math&amp;gt;\Sigma&amp;lt;/math&amp;gt; – диагональная матрица с вещественными положительными числами на диагонали &amp;lt;ref&amp;gt;http://algorithms.parallel.ru/&amp;lt;/ref&amp;gt;.&lt;br /&gt;
&lt;br /&gt;
Диагональные элементы матрицы &amp;lt;math&amp;gt;\Sigma&amp;lt;/math&amp;gt; называются сингулярными числами матрицы &amp;lt;math&amp;gt;A&amp;lt;/math&amp;gt;, а столбцы матриц &amp;lt;math&amp;gt;U,V&amp;lt;/math&amp;gt; левыми и правыми сингулярными векторами соответственно.&lt;br /&gt;
&lt;br /&gt;
Алгоритм Якоби сингулярного разложения матрицы был предложен одним из первых в 1846 году. Он приводит прямоугольную матрицу к диагональной матрице с помощью последовательности элементарных вращений. Метод может найти все сингулярные значения с очень высокой точностью. Однако его производительность является довольно низкой, в сравнении с конкурирующими методами.&lt;br /&gt;
&lt;br /&gt;
&#039;&#039;Неявный&#039;&#039;&amp;lt;ref&amp;gt;Дж. Деммель «Вычислительная линейная алгебра» (стр. 261-264)&amp;lt;/ref&amp;gt; метод Якоби математически эквивалентен применению метода Якоби вычисления собственных значений к матрице &amp;lt;math&amp;gt;A = G^TG&amp;lt;/math&amp;gt;.&lt;br /&gt;
Это значит, что на каждом шаге вычисляется вращение Якоби &amp;lt;math&amp;gt;J&amp;lt;/math&amp;gt;, с помощью которого матрица &amp;lt;math&amp;gt;G^TG&amp;lt;/math&amp;gt; неявно пересчитывется в &amp;lt;math&amp;gt;J^TG^TGJ&amp;lt;/math&amp;gt;; вращение выбрано так, чтобы пара внедиагональных элементов из &amp;lt;math&amp;gt;G^TG&amp;lt;/math&amp;gt; обратилась в нули в матрице &amp;lt;math&amp;gt;J^TG^TGJ&amp;lt;/math&amp;gt;. При этом ни &amp;lt;math&amp;gt;G^TG&amp;lt;/math&amp;gt;, ни &amp;lt;math&amp;gt;J^TG^TGJ&amp;lt;/math&amp;gt; не вычисляются в явном виде; вместо них вычисляется матрица &amp;lt;math&amp;gt;GJ&amp;lt;/math&amp;gt;. Поэтому алгоритм называется &#039;&#039;методом односторонних вращений&#039;&#039;.&lt;br /&gt;
&lt;br /&gt;
=== Математическое описание алгоритма ===&lt;br /&gt;
Исходные данные: матрица &amp;lt;math&amp;gt;G&amp;lt;/math&amp;gt; (элементы &amp;lt;math&amp;gt;g_{ij}, i, j = 1, \ldots, n&amp;lt;/math&amp;gt;).&lt;br /&gt;
&lt;br /&gt;
Вычисляемые данные: матрица &amp;lt;math&amp;gt;\Sigma = diag(\sigma_{i})&amp;lt;/math&amp;gt;, где &amp;lt;math&amp;gt;\sigma_{i}&amp;lt;/math&amp;gt; - сингулярные числа, &amp;lt;math&amp;gt;U&amp;lt;/math&amp;gt; - матрица левых сингулярных векторов, &amp;lt;math&amp;gt;V&amp;lt;/math&amp;gt; - матрица правых сингулярных векторов.&lt;br /&gt;
&lt;br /&gt;
симметричную матрицу &amp;lt;math&amp;gt;A = (G^TG)&amp;lt;/math&amp;gt; можно привести к диагональному виду:&lt;br /&gt;
&amp;lt;math&amp;gt;RG^TGR^T&amp;lt;/math&amp;gt;, где&lt;br /&gt;
&lt;br /&gt;
&amp;lt;math&amp;gt;&lt;br /&gt;
R(j,k,\theta) = &lt;br /&gt;
\begin{matrix}&lt;br /&gt;
  \\&lt;br /&gt;
  \\&lt;br /&gt;
  \\&lt;br /&gt;
j \\&lt;br /&gt;
  \\&lt;br /&gt;
k \\&lt;br /&gt;
  \\&lt;br /&gt;
  \\&lt;br /&gt;
  \\&lt;br /&gt;
\end{matrix}&lt;br /&gt;
&amp;lt;/math&amp;gt;  &lt;br /&gt;
&amp;lt;math&amp;gt;&lt;br /&gt;
\begin{bmatrix}&lt;br /&gt;
  &amp;amp; 1 &amp;amp;   &amp;amp;        &amp;amp;              &amp;amp;        &amp;amp;               &amp;amp;         &amp;amp;    &amp;amp;   \\&lt;br /&gt;
  &amp;amp;   &amp;amp; 1 &amp;amp;        &amp;amp;              &amp;amp;        &amp;amp;               &amp;amp;         &amp;amp;    &amp;amp;   \\&lt;br /&gt;
  &amp;amp;   &amp;amp;   &amp;amp; \ddots &amp;amp;              &amp;amp;        &amp;amp;               &amp;amp;         &amp;amp;    &amp;amp;   \\&lt;br /&gt;
  &amp;amp;   &amp;amp;   &amp;amp;        &amp;amp; \cos(\theta) &amp;amp;        &amp;amp; -\sin(\theta) &amp;amp;         &amp;amp;    &amp;amp;   \\&lt;br /&gt;
  &amp;amp;   &amp;amp;   &amp;amp;        &amp;amp;              &amp;amp; \ddots &amp;amp;               &amp;amp;         &amp;amp;    &amp;amp;   \\&lt;br /&gt;
  &amp;amp;   &amp;amp;   &amp;amp;        &amp;amp; \sin(\theta) &amp;amp;        &amp;amp; \cos(\theta)  &amp;amp;         &amp;amp;    &amp;amp;   \\&lt;br /&gt;
  &amp;amp;   &amp;amp;   &amp;amp;        &amp;amp;              &amp;amp;        &amp;amp;               &amp;amp; \ddots  &amp;amp;    &amp;amp;   \\&lt;br /&gt;
  &amp;amp;   &amp;amp;   &amp;amp;        &amp;amp;              &amp;amp;        &amp;amp;               &amp;amp;         &amp;amp; 1  &amp;amp;   \\&lt;br /&gt;
  &amp;amp;   &amp;amp;   &amp;amp;        &amp;amp;              &amp;amp;        &amp;amp;               &amp;amp;         &amp;amp;    &amp;amp; 1 \\&lt;br /&gt;
\end{bmatrix}&lt;br /&gt;
&amp;lt;/math&amp;gt;&lt;br /&gt;
&lt;br /&gt;
Обозначим &amp;lt;math&amp;gt;s = \sin \theta&amp;lt;/math&amp;gt; и &amp;lt;math&amp;gt;c = \cos \theta&amp;lt;/math&amp;gt;.&lt;br /&gt;
&lt;br /&gt;
Перемножив матрицы &amp;lt;math&amp;gt;RG^TGR^T&amp;lt;/math&amp;gt;, получим следующие выражения&amp;lt;ref&amp;gt;http://www.astro.tsu.ru/OsChMet/5_2.html&amp;lt;/ref&amp;gt;:&lt;br /&gt;
&lt;br /&gt;
&amp;lt;math&amp;gt;\begin{align}&lt;br /&gt;
 a_{jj}^{(i+1)} &amp;amp;= c^2\, a_{jj}^{(i)}  -  2\, s c \,a_{jk}^{(i)}  +  s^2\, a_{kk}^{(i)} \\&lt;br /&gt;
 a_{kk}^{(i+1)} &amp;amp;= s^2 \,a_{jj}^{(i)}  +  2 s c\, a_{jk}^{(i)}  +  c^2 \, a_{kk}^{(i)} \\&lt;br /&gt;
 a_{jk}^{(i+1)} &amp;amp;= a_{kj}^{(i+1)} = (c^2 - s^2 ) \, a_{jk}^{(i)}  +  s c \, (a_{kk}^{(i)} - a_{jj}^{(i)} ) \\&lt;br /&gt;
 a_{jm}^{(i+1)} &amp;amp;= a_{mj}^{(i+1)} = c \, a_{jm}^{(i)}  -  s \, a_{km}^{(i)} &amp;amp; m \ne j,k \\&lt;br /&gt;
 a_{km}^{(i+1)} &amp;amp;= a_{mk}^{(i+1)} = s \, a_{jm}^{(i)}  + c \, a_{km}^{(i)} &amp;amp; m \ne j,k \\&lt;br /&gt;
 a_{ml}^{(i+1)} &amp;amp;= a_{ml}^{(i)} &amp;amp;m,l \ne j,k&lt;br /&gt;
\end{align}&amp;lt;/math&amp;gt;&lt;br /&gt;
&lt;br /&gt;
Т.к внедиагональные элементы должны быть равны 0, то выбираем &amp;lt;math&amp;gt;\theta&amp;lt;/math&amp;gt; так, чтобы &amp;lt;math&amp;gt;a_{jk}^{(i+1)} = 0&amp;lt;/math&amp;gt; и &amp;lt;math&amp;gt;a_{kj}^{(i+1)} = 0&amp;lt;/math&amp;gt;.&lt;br /&gt;
&lt;br /&gt;
Тогда решая уравнение получаем, что&lt;br /&gt;
&lt;br /&gt;
&amp;lt;math&amp;gt;&lt;br /&gt;
         \begin{align}&lt;br /&gt;
         \tau &amp;amp;= ({a_{jj} - a_{kk}})/{2a_{jk}} \\&lt;br /&gt;
         t &amp;amp;= {sign(\tau)}/(|\tau| + \sqrt{1 + \tau^2}) \\&lt;br /&gt;
         c &amp;amp;= 1/(\sqrt{1 + t^2}) \\&lt;br /&gt;
         s &amp;amp;= ct \\&lt;br /&gt;
         \end{align}&amp;lt;/math&amp;gt;&lt;br /&gt;
&lt;br /&gt;
Остановка вычислений алгоритма наступает, когда внедиагональные элементы становятся меньше некоторого наперед заданного числа &amp;lt;math&amp;gt;\varepsilon&amp;lt;/math&amp;gt;.&lt;br /&gt;
&lt;br /&gt;
=== Вычислительное ядро алгоритма ===&lt;br /&gt;
Вычислительное ядро алгоритма составляет непосредственно вычисление одностороннего вращения Якоби, т.е. вычисление элементов матрицы &amp;lt;math&amp;gt;g_{jm}^{(i+1)} = g_{mj}^{(i+1)}&amp;lt;/math&amp;gt; и &amp;lt;math&amp;gt;g_{km}^{(i+1)} = g_{mk}^{(i+1)}&amp;lt;/math&amp;gt;, &amp;lt;math&amp;gt;m \ne j,k&amp;lt;/math&amp;gt;, а также вычисления элементов &amp;lt;math&amp;gt;g_{jj}^{(i+1)} &amp;lt;/math&amp;gt; и &amp;lt;math&amp;gt;g_{kk}^{(i+1)} &amp;lt;/math&amp;gt;, получившихся после умножения промежуточной матрицы на матрицу вращений Якоби:&lt;br /&gt;
&lt;br /&gt;
&amp;lt;math&amp;gt;\begin{align}&lt;br /&gt;
 g_{jj}^{(i+1)} &amp;amp;= c^2\, g_{jj}^{(i)}  -  2\, s c \,g_{jk}^{(i)}  +  s^2\, g_{kk}^{(i)} \\&lt;br /&gt;
 g_{kk}^{(i+1)} &amp;amp;= s^2 \,g_{jj}^{(i)}  +  2 s c\, g_{jk}^{(i)}  +  c^2 \, g_{kk}^{(i)} \\&lt;br /&gt;
 g_{jk}^{(i+1)} &amp;amp;= g_{kj}^{(i+1)} = (c^2 - s^2 ) \, g_{jk}^{(i)}  +  s c \, (g_{kk}^{(i)} - g_{jj}^{(i)} ) \\&lt;br /&gt;
 g_{jm}^{(i+1)} &amp;amp;= g_{mj}^{(i+1)} = c \, g_{jm}^{(i)}  -  s \, g_{km}^{(i)} &amp;amp; m \ne j,k \\&lt;br /&gt;
 g_{km}^{(i+1)} &amp;amp;= g_{mk}^{(i+1)} = s \, g_{jm}^{(i)}  + c \, g_{km}^{(i)} &amp;amp; m \ne j,k \\&lt;br /&gt;
 g_{ml}^{(i+1)} &amp;amp;= g_{ml}^{(i)} &amp;amp;m,l \ne j,k&lt;br /&gt;
\end{align}&amp;lt;/math&amp;gt;&lt;br /&gt;
&lt;br /&gt;
=== Макроструктура алгоритма ===&lt;br /&gt;
Основную часть метода составляет процедура односторонних вращений матрицы, которая в свою очередь состоит из:&lt;br /&gt;
&lt;br /&gt;
#Вычисление &amp;lt;math&amp;gt;\tau, c, s, t&amp;lt;/math&amp;gt;.&lt;br /&gt;
#Одностороннее вращение матрицы. &lt;br /&gt;
&lt;br /&gt;
Что требует &amp;lt;math&amp;gt;O(n)&amp;lt;/math&amp;gt; операций.&lt;br /&gt;
&lt;br /&gt;
После этого необходимо:&lt;br /&gt;
&lt;br /&gt;
#Вычислить сингулярные числа &amp;lt;math&amp;gt;\sigma_i&amp;lt;/math&amp;gt;.  Что требует &amp;lt;math&amp;gt;O(n)&amp;lt;/math&amp;gt; операций.&lt;br /&gt;
#Вычислить &amp;lt;math&amp;gt;U&amp;lt;/math&amp;gt; и &amp;lt;math&amp;gt;V&amp;lt;/math&amp;gt;. Что требует &amp;lt;math&amp;gt;O(n^2)&amp;lt;/math&amp;gt; операций.&lt;br /&gt;
&lt;br /&gt;
=== Схема реализации последовательного алгоритма ===&lt;br /&gt;
Применение метода Якоби к матрице &amp;lt;math&amp;gt;A = (G^TG)&amp;lt;/math&amp;gt; можно описать следующим образом&amp;lt;ref&amp;gt;Дж. Деммель «Вычислительная линейная алгебра» (стр. 261-263)&amp;lt;/ref&amp;gt;:&lt;br /&gt;
&lt;br /&gt;
Если &amp;lt;math&amp;gt;G = U\Sigma V^T&amp;lt;/math&amp;gt; и &amp;lt;math&amp;gt;\Sigma = diag(\sigma_{i})&amp;lt;/math&amp;gt;, то алгоритм вычисляет сингулярные числа &amp;lt;math&amp;gt;\sigma_{i}&amp;lt;/math&amp;gt;, матрицу &amp;lt;math&amp;gt;U&amp;lt;/math&amp;gt; левых сингулярных векторов и матрицу &amp;lt;math&amp;gt;V&amp;lt;/math&amp;gt; правых сингулярных векторов по следующей схеме:&lt;br /&gt;
&lt;br /&gt;
 repeat&lt;br /&gt;
     for &amp;lt;math&amp;gt;j=1&amp;lt;/math&amp;gt; to &amp;lt;math&amp;gt;n-1&amp;lt;/math&amp;gt;&lt;br /&gt;
         for &amp;lt;math&amp;gt;k=j+1&amp;lt;/math&amp;gt; to &amp;lt;math&amp;gt;n&amp;lt;/math&amp;gt;&lt;br /&gt;
             обратиться к процедуре &#039;&#039;&#039;&#039;&#039;One-Sided-Jacobi-Rotation&amp;lt;math&amp;gt;(G,j,k)&amp;lt;/math&amp;gt;&#039;&#039;&#039;&#039;&#039;&lt;br /&gt;
         end for&lt;br /&gt;
     end for&lt;br /&gt;
 пока &amp;lt;math&amp;gt;G^TG&amp;lt;/math&amp;gt; не станет достаточно близка к диагональной матрице&lt;br /&gt;
 Положить &amp;lt;math&amp;gt;\sigma_{i} = ||G(:,i)||_2 &amp;lt;/math&amp;gt; (норма &amp;lt;math&amp;gt;i&amp;lt;/math&amp;gt;-го столбца в &amp;lt;math&amp;gt;G&amp;lt;/math&amp;gt;)&lt;br /&gt;
 Положить &amp;lt;math&amp;gt;U = [u_{1},\dots, u_{n}]&amp;lt;/math&amp;gt;, где &amp;lt;math&amp;gt;u_{i} = G(:,i)/\sigma_{i}&amp;lt;/math&amp;gt;&lt;br /&gt;
 Положить &amp;lt;math&amp;gt;V = J&amp;lt;/math&amp;gt;, где &amp;lt;math&amp;gt;J&amp;lt;/math&amp;gt; - накопленное произведение вращений Якоби.&lt;br /&gt;
&lt;br /&gt;
Где процедура &#039;&#039;&#039;&#039;&#039;One-Sided-Jacobi-Rotation&#039;&#039;&#039;&#039;&#039; является метод односторонних вращений Якоби:&lt;br /&gt;
&lt;br /&gt;
 proc &#039;&#039;&#039;&#039;&#039;One-Sided-Jacobi-Rotation&amp;lt;math&amp;gt;(G,j,k)&amp;lt;/math&amp;gt;&#039;&#039;&#039;&#039;&#039;&lt;br /&gt;
     вычислить &amp;lt;math&amp;gt;a_{jj} = (G^TG)_{jj}, a_{jk} = (G^TG)_{jk}&amp;lt;/math&amp;gt; и &amp;lt;math&amp;gt;a_{kk} = (G^TG)_{kk}&amp;lt;/math&amp;gt;&lt;br /&gt;
     if &amp;lt;math&amp;gt;|a_{jk}|&amp;lt;/math&amp;gt; не слишком мал&lt;br /&gt;
         &amp;lt;math&amp;gt;&lt;br /&gt;
         \begin{align}&lt;br /&gt;
         \tau &amp;amp;= ({a_{jj} - a_{kk}})/{2a_{jk}} \\&lt;br /&gt;
         t &amp;amp;= {sign(\tau)}/(|\tau| + \sqrt{1 + \tau^2}) \\&lt;br /&gt;
         c &amp;amp;= 1/(\sqrt{1 + t^2}) \\&lt;br /&gt;
         s &amp;amp;= ct \\&lt;br /&gt;
         G &amp;amp;= GR(j,k,\theta) \  \dots c=cos\theta, s=sin\theta \end{align}&amp;lt;/math&amp;gt;&lt;br /&gt;
         if нужны правые сингулярные векторы &lt;br /&gt;
             &amp;lt;math&amp;gt;J = JR(j,k,\theta)&amp;lt;/math&amp;gt;&lt;br /&gt;
         end if&lt;br /&gt;
     end if&lt;br /&gt;
&lt;br /&gt;
=== Последовательная сложность алгоритма ===&lt;br /&gt;
Для одного вращения Якоби необходимо выполнить &amp;lt;math&amp;gt;O(n)&amp;lt;/math&amp;gt; операций умножения и сложения. &lt;br /&gt;
&lt;br /&gt;
Всего вариантов выбора &amp;lt;math&amp;gt;j&amp;lt;/math&amp;gt; и &amp;lt;math&amp;gt;k&amp;lt;/math&amp;gt; существует &amp;lt;math&amp;gt;\frac{n(n-1)}{2}&amp;lt;/math&amp;gt;.&lt;br /&gt;
&lt;br /&gt;
Таким образом последовательный алгоритм Якоби вычисления сингулярных чисел и векторов является алгоритмом с кубической сложностью.&lt;br /&gt;
&lt;br /&gt;
=== Информационный граф ===&lt;br /&gt;
Граф алгоритма состоит из четырех групп вершин&lt;br /&gt;
&lt;br /&gt;
(А)Первая группа вершин расположена в двумерной области, соответствующая ей операция - вычисление элементов &amp;lt;math&amp;gt;a_{jj},a_{jk},a_{kk}&amp;lt;/math&amp;gt; матрицы произведения &amp;lt;math&amp;gt;A = (G^TG)&amp;lt;/math&amp;gt;. Где &amp;lt;math&amp;gt;j&amp;lt;/math&amp;gt; изменяется от &amp;lt;math&amp;gt;1&amp;lt;/math&amp;gt; до &amp;lt;math&amp;gt;n-1&amp;lt;/math&amp;gt;, принимая все целочисленные значения, &amp;lt;math&amp;gt;k&amp;lt;/math&amp;gt;  изменяется от &amp;lt;math&amp;gt;j+1&amp;lt;/math&amp;gt; до &amp;lt;math&amp;gt;n&amp;lt;/math&amp;gt;, принимая все целочисленные значения.&lt;br /&gt;
&lt;br /&gt;
Граф вычисления каждого из элементов приведен на рисунке 1, где значениям &amp;lt;math&amp;gt;g_{ij}&amp;lt;/math&amp;gt; соответствуют обозначения &amp;lt;math&amp;gt;x_{ij}&amp;lt;/math&amp;gt;, а элементам &amp;lt;math&amp;gt;g^T_{ij}&amp;lt;/math&amp;gt; обозначения &amp;lt;math&amp;gt;z_{ij}&amp;lt;/math&amp;gt;. Значение &amp;lt;math&amp;gt;s_{ij}&amp;lt;/math&amp;gt; является значением результирующего элемента.&lt;br /&gt;
&lt;br /&gt;
(Б)Вторая группа вершин расположена в двумерной области, соответствующая ей операция – вычисление &amp;lt;math&amp;gt;c&amp;lt;/math&amp;gt; и &amp;lt;math&amp;gt;s&amp;lt;/math&amp;gt;.&lt;br /&gt;
&lt;br /&gt;
Информационный граф с входными и выходными данными вычисления пункта (Б) представлен на рисунке 2.&lt;br /&gt;
&lt;br /&gt;
(В)Третья группа вершин расположена в двумерной области, соответствующая ей операция вычисление значений элементов &amp;lt;math&amp;gt;g_{jm}^{(i+1)} = g_{mj}^{(i+1)}&amp;lt;/math&amp;gt; и &amp;lt;math&amp;gt;g_{km}^{(i+1)} = g_{mk}^{(i+1)}&amp;lt;/math&amp;gt;, &amp;lt;math&amp;gt;m \ne j,k&amp;lt;/math&amp;gt;.&lt;br /&gt;
&lt;br /&gt;
(Г)Четвертая группа вершин расположена в двумерной области, соответствующая ей операция вычисление значений элементов &amp;lt;math&amp;gt;g_{jj}^{(i+1)} &amp;lt;/math&amp;gt; и &amp;lt;math&amp;gt;g_{kk}^{(i+1)} &amp;lt;/math&amp;gt;.&lt;br /&gt;
&lt;br /&gt;
Элементы групп (В) и (Г) вычисляются аналогично вычислению элементов матрицы произведения, т.к. фактически представляют собой перемножение матриц &amp;lt;math&amp;gt;G&amp;lt;/math&amp;gt; и &amp;lt;math&amp;gt;R&amp;lt;/math&amp;gt;&lt;br /&gt;
&lt;br /&gt;
[[File:Jacobi_2.jpg|none|thumb|1000px|Рисунок 1. Информационный граф с входными и выходными параметрами вычисления каждого элемента матрицы произведения.]]&lt;br /&gt;
&lt;br /&gt;
[[File:Jacobi_1.jpg|none|thumb|1000px|Рисунок 2. Информационный граф с входными и выходными параметрами вычисления значений &amp;lt;math&amp;gt;c&amp;lt;/math&amp;gt; и &amp;lt;math&amp;gt;s&amp;lt;/math&amp;gt;.]]&lt;br /&gt;
&lt;br /&gt;
Обобщенный граф метода Якоби представлен на рисунке 3, где буквами А, Б, В и Г обозначено вычисление групп вершин (А), (Б), (В) и (Г).&lt;br /&gt;
&lt;br /&gt;
[[File:Graf21.png|none|thumb|2000px|Рисунок 3. Обобщенный граф алгоритма вычисления сингулярных чисел и векторов методом Якоби.]]&lt;br /&gt;
&lt;br /&gt;
=== Ресурс параллелизма алгоритма ===&lt;br /&gt;
Для выполнения одной итерации метода Якоби требуется последовательно выполнить несколько ярусов:&lt;br /&gt;
# вычислить &amp;lt;math&amp;gt;\tau&amp;lt;/math&amp;gt; &lt;br /&gt;
# вычислить &amp;lt;math&amp;gt;t&amp;lt;/math&amp;gt; &lt;br /&gt;
# вычислить &amp;lt;math&amp;gt;c&amp;lt;/math&amp;gt; &lt;br /&gt;
# вычислить &amp;lt;math&amp;gt;s&amp;lt;/math&amp;gt;&lt;br /&gt;
# выполнить поворот матрицы &amp;lt;math&amp;gt;G&amp;lt;/math&amp;gt; с параллельным выполнением &amp;lt;math&amp;gt;2(n-2)&amp;lt;/math&amp;gt; операций вычисления элементов матрицы &amp;lt;math&amp;gt;g_{jm}^{(i+1)} = g_{mj}^{(i+1)}&amp;lt;/math&amp;gt; и &amp;lt;math&amp;gt;g_{km}^{(i+1)} = g_{mk}^{(i+1)}&amp;lt;/math&amp;gt;, &amp;lt;math&amp;gt;m \ne j,k&amp;lt;/math&amp;gt;, а также вычисления элементов &amp;lt;math&amp;gt;g_{jj}^{(i+1)} &amp;lt;/math&amp;gt; и &amp;lt;math&amp;gt;g_{kk}^{(i+1)} &amp;lt;/math&amp;gt;. &lt;br /&gt;
&lt;br /&gt;
Суммарное количество итераций равно &amp;lt;math&amp;gt;\frac{n(n-1)}{2}&amp;lt;/math&amp;gt; (Различные варианты выбора &amp;lt;math&amp;gt;j&amp;lt;/math&amp;gt; и &amp;lt;math&amp;gt;k&amp;lt;/math&amp;gt;). &lt;br /&gt;
&lt;br /&gt;
Асимптотически метод сходится квадратично. &lt;br /&gt;
&lt;br /&gt;
Таким образом, при классификации по высоте ЯПФ метод Якоби относится к алгоритмам со сложностью &amp;lt;math&amp;gt;O(n^2)&amp;lt;/math&amp;gt;&amp;amp;nbsp;, а при классификации по ширине ЯПФ — к алгоритмам со сложностью &amp;lt;math&amp;gt;O(n)&amp;lt;/math&amp;gt;.&lt;br /&gt;
&lt;br /&gt;
=== Входные и выходные данные алгоритма ===&lt;br /&gt;
&#039;&#039;&#039;Входные данные&#039;&#039;&#039;: плотная матрица &amp;lt;math&amp;gt;G&amp;lt;/math&amp;gt; размера &amp;lt;math&amp;gt;n&amp;lt;/math&amp;gt;х&amp;lt;math&amp;gt;n&amp;lt;/math&amp;gt;, где &amp;lt;math&amp;gt;A= G^TG&amp;lt;/math&amp;gt; – симметрическая матрица.&lt;br /&gt;
&lt;br /&gt;
&#039;&#039;&#039;Объём входных данных&#039;&#039;&#039;: &amp;lt;math&amp;gt;n^2&amp;lt;/math&amp;gt; (т.к. для хранения матрицы &amp;lt;math&amp;gt;G&amp;lt;/math&amp;gt; используем двумерный массив размера &amp;lt;math&amp;gt;n&amp;lt;/math&amp;gt;х&amp;lt;math&amp;gt;n&amp;lt;/math&amp;gt;)&lt;br /&gt;
&lt;br /&gt;
&#039;&#039;&#039;Выходные данные&#039;&#039;&#039;: &amp;lt;math&amp;gt;\sigma_{i}&amp;lt;/math&amp;gt;  - сингулярные числа, матрица &amp;lt;math&amp;gt;U&amp;lt;/math&amp;gt; левых сингулярных векторов и матрица &amp;lt;math&amp;gt;V&amp;lt;/math&amp;gt; правых сингулярных векторов.&lt;br /&gt;
&lt;br /&gt;
&#039;&#039;&#039;Объём выходных данных&#039;&#039;&#039;: &amp;lt;math&amp;gt;2n^2 + n&amp;lt;/math&amp;gt; (т.к. необходимо хранить вектор сингулярных чисел длины &amp;lt;math&amp;gt;n&amp;lt;/math&amp;gt;, а также две матрицы &amp;lt;math&amp;gt;U, V&amp;lt;/math&amp;gt; левых и правых сингулярных векторов размера &amp;lt;math&amp;gt;n&amp;lt;/math&amp;gt;х&amp;lt;math&amp;gt;n&amp;lt;/math&amp;gt;).&lt;br /&gt;
&lt;br /&gt;
=== Свойства алгоритма ===&lt;br /&gt;
Метод Якоби является самым медленным из имеющихся алгоритмов вычисления сингулярных чисел и сингулярных векторов матрицы. Тем не менее, для  матриц &amp;lt;math&amp;gt;G&amp;lt;/math&amp;gt;, которые могут быть представлены в виде &amp;lt;math&amp;gt;G=DX&amp;lt;/math&amp;gt;, где &amp;lt;math&amp;gt;D&amp;lt;/math&amp;gt; - диагональная, а &amp;lt;math&amp;gt;X&amp;lt;/math&amp;gt; - хорошо обусловлена, он способен вычислять сингулярные числа и вектора намного точнее, чем другие методы&amp;lt;ref&amp;gt;Дж. Деммель «Вычислительная линейная алгебра» (стр. 261-264)&amp;lt;/ref&amp;gt;. &lt;br /&gt;
&lt;br /&gt;
Вычислительная мощность алгоритма, как отношение числа операций к суммарному объему входных и выходных данных является линейной.&lt;br /&gt;
&lt;br /&gt;
Метод Якоби не детерминирован, так как является итерационным алгоритмом с выходом по точности (число итераций зависит от входных данных и порогового значения).&lt;br /&gt;
&lt;br /&gt;
== Программная реализация алгоритма ==&lt;br /&gt;
&lt;br /&gt;
=== Особенности реализации последовательного алгоритма ===&lt;br /&gt;
&lt;br /&gt;
=== Локальность данных и вычислений ===&lt;br /&gt;
&lt;br /&gt;
=== Возможные способы и особенности параллельной реализации алгоритма ===&lt;br /&gt;
&lt;br /&gt;
=== Масштабируемость алгоритма и его реализации ===&lt;br /&gt;
&lt;br /&gt;
=== Динамические характеристики и эффективность реализации алгоритма ===&lt;br /&gt;
&lt;br /&gt;
=== Выводы для классов архитектур ===&lt;br /&gt;
&lt;br /&gt;
=== Существующие реализации алгоритма ===&lt;br /&gt;
Метод Якоби нахождения сингулярных значений и векторов реализован в таких пакетах, как LAPACK, LINPACK/EISPACK, Intel MKL &amp;lt;ref&amp;gt;https://software.intel.com/ru-ru/node/521153#CAF8CA08-1C69-48F8-B0C3-B2B27AFA92FA&amp;lt;/ref&amp;gt;.&lt;br /&gt;
&lt;br /&gt;
Так же функция Якоби реализована в пакете Matlab.&lt;br /&gt;
&lt;br /&gt;
Т. к. алгоритм считается медленным, он не включен во многие известные пакеты.&lt;br /&gt;
&lt;br /&gt;
== Литература ==&lt;br /&gt;
1. Дж. Деммель Вычислительная линейная алгебра. Изд. Мир, 2001.&lt;/div&gt;</summary>
		<author><name>Davletshuna Alexandra</name></author>
	</entry>
	<entry>
		<id>https://xn--80aecvaldz.xn--80ahdrnmvk.xn--p1ai/w/ru/index.php?title=%D0%A3%D1%87%D0%B0%D1%81%D1%82%D0%BD%D0%B8%D0%BA:Davletshuna_Alexandra/%D0%9C%D0%B5%D1%82%D0%BE%D0%B4_%D0%AF%D0%BA%D0%BE%D0%B1%D0%B8_%D0%B2%D1%8B%D1%87%D0%B8%D1%81%D0%BB%D0%B5%D0%BD%D0%B8%D1%8F_%D1%81%D0%B8%D0%BD%D0%B3%D1%83%D0%BB%D1%8F%D1%80%D0%BD%D1%8B%D1%85_%D1%87%D0%B8%D1%81%D0%B5%D0%BB_%D0%B8_%D0%B2%D0%B5%D0%BA%D1%82%D0%BE%D1%80%D0%BE%D0%B2&amp;diff=17367</id>
		<title>Участник:Davletshuna Alexandra/Метод Якоби вычисления сингулярных чисел и векторов</title>
		<link rel="alternate" type="text/html" href="https://xn--80aecvaldz.xn--80ahdrnmvk.xn--p1ai/w/ru/index.php?title=%D0%A3%D1%87%D0%B0%D1%81%D1%82%D0%BD%D0%B8%D0%BA:Davletshuna_Alexandra/%D0%9C%D0%B5%D1%82%D0%BE%D0%B4_%D0%AF%D0%BA%D0%BE%D0%B1%D0%B8_%D0%B2%D1%8B%D1%87%D0%B8%D1%81%D0%BB%D0%B5%D0%BD%D0%B8%D1%8F_%D1%81%D0%B8%D0%BD%D0%B3%D1%83%D0%BB%D1%8F%D1%80%D0%BD%D1%8B%D1%85_%D1%87%D0%B8%D1%81%D0%B5%D0%BB_%D0%B8_%D0%B2%D0%B5%D0%BA%D1%82%D0%BE%D1%80%D0%BE%D0%B2&amp;diff=17367"/>
		<updated>2016-11-15T19:05:02Z</updated>

		<summary type="html">&lt;p&gt;Davletshuna Alexandra: /* Схема реализации последовательного алгоритма */&lt;/p&gt;
&lt;hr /&gt;
&lt;div&gt;{{Assignment|ASA}}&lt;br /&gt;
&lt;br /&gt;
{{algorithm&lt;br /&gt;
| name              = Метод Якоби вычисления сингулярных чисел и векторов&lt;br /&gt;
| serial_complexity = &amp;lt;math&amp;gt;O(n^3)&amp;lt;/math&amp;gt;&lt;br /&gt;
| pf_height         = &amp;lt;math&amp;gt;O(n^2)&amp;lt;/math&amp;gt;&lt;br /&gt;
| pf_width          = &amp;lt;math&amp;gt;O(n)&amp;lt;/math&amp;gt;&lt;br /&gt;
| input_data        = &amp;lt;math&amp;gt;n^2&amp;lt;/math&amp;gt;&lt;br /&gt;
| output_data       = &amp;lt;math&amp;gt;2n^2 + n&amp;lt;/math&amp;gt;&lt;br /&gt;
}}&lt;br /&gt;
&lt;br /&gt;
Авторы статьи: [[Участница:Davletshuna Alexandra|Давлетшина Александра]] (группа 619) пункты 1.1-1.4, 1.6, 2.7; [[Участница:Alek sandra|Зайцева Александра]] (группа 601) пункты 1.5, 1.7-1.10, 2.7.&lt;br /&gt;
&lt;br /&gt;
== Свойства и структура алгоритма ==&lt;br /&gt;
&lt;br /&gt;
=== Общее описание алгоритма ===&lt;br /&gt;
&#039;&#039;&#039;Сингулярным разложением&#039;&#039;&#039; называется разложение прямоугольной вещественной или комплексной матрицы, имеющее широкое применение, в силу своей наглядной геометрической интерпретации, при решении многих прикладных задач. Сингулярное разложение матрицы А позволяет вычислять сингулярные числа данной матрицы, а также, левые и правые сингулярные векторы матрицы А:&lt;br /&gt;
&lt;br /&gt;
•	левые сингулярные векторы матрицы А — это собственные векторы матрицы &amp;lt;math&amp;gt;AA^*&amp;lt;/math&amp;gt;;&lt;br /&gt;
&lt;br /&gt;
•	правые сингулярные векторы матрицы A — это собственные векторы матрицы &amp;lt;math&amp;gt;A^*A&amp;lt;/math&amp;gt;.&lt;br /&gt;
&lt;br /&gt;
Геометрическая интерпретация сингулярного разложения заключается в следующем факте из геометрии: &#039;&#039;Образом любого линейного преобразования, заданного с помощью матрицы &amp;lt;math&amp;gt;m&amp;lt;/math&amp;gt;x&amp;lt;math&amp;gt;n&amp;lt;/math&amp;gt;, примененного к единичной сфере является гиперэллипсоид&#039;&#039;.&lt;br /&gt;
&lt;br /&gt;
Из многочисленных разложений матриц, наиболее удобным является сингулярное разложение матрицы в виде: &amp;lt;math&amp;gt;A=U\Sigma V^*&amp;lt;/math&amp;gt;, где &amp;lt;math&amp;gt;U, V&amp;lt;/math&amp;gt; – унитарные матрицы, а &amp;lt;math&amp;gt;\Sigma&amp;lt;/math&amp;gt; – диагональная матрица с вещественными положительными числами на диагонали &amp;lt;ref&amp;gt;http://algorithms.parallel.ru/&amp;lt;/ref&amp;gt;.&lt;br /&gt;
&lt;br /&gt;
Диагональные элементы матрицы &amp;lt;math&amp;gt;\Sigma&amp;lt;/math&amp;gt; называются сингулярными числами матрицы &amp;lt;math&amp;gt;A&amp;lt;/math&amp;gt;, а столбцы матриц &amp;lt;math&amp;gt;U,V&amp;lt;/math&amp;gt; левыми и правыми сингулярными векторами соответственно.&lt;br /&gt;
&lt;br /&gt;
Алгоритм Якоби сингулярного разложения матрицы был предложен одним из первых в 1846 году. Он приводит прямоугольную матрицу к диагональной матрице с помощью последовательности элементарных вращений. Метод может найти все сингулярные значения с очень высокой точностью. Однако его производительность является довольно низкой, в сравнении с конкурирующими методами.&lt;br /&gt;
&lt;br /&gt;
&#039;&#039;Неявный&#039;&#039;&amp;lt;ref&amp;gt;Дж. Деммель «Вычислительная линейная алгебра» (стр. 261-264)&amp;lt;/ref&amp;gt; метод Якоби математически эквивалентен применению метода Якоби вычисления собственных значений к матрице &amp;lt;math&amp;gt;A = G^TG&amp;lt;/math&amp;gt;.&lt;br /&gt;
Это значит, что на каждом шаге вычисляется вращение Якоби &amp;lt;math&amp;gt;J&amp;lt;/math&amp;gt;, с помощью которого матрица &amp;lt;math&amp;gt;G^TG&amp;lt;/math&amp;gt; неявно пересчитывется в &amp;lt;math&amp;gt;J^TG^TGJ&amp;lt;/math&amp;gt;; вращение выбрано так, чтобы пара внедиагональных элементов из &amp;lt;math&amp;gt;G^TG&amp;lt;/math&amp;gt; обратилась в нули в матрице &amp;lt;math&amp;gt;J^TG^TGJ&amp;lt;/math&amp;gt;. При этом ни &amp;lt;math&amp;gt;G^TG&amp;lt;/math&amp;gt;, ни &amp;lt;math&amp;gt;J^TG^TGJ&amp;lt;/math&amp;gt; не вычисляются в явном виде; вместо них вычисляется матрица &amp;lt;math&amp;gt;GJ&amp;lt;/math&amp;gt;. Поэтому алгоритм называется &#039;&#039;методом односторонних вращений&#039;&#039;.&lt;br /&gt;
&lt;br /&gt;
=== Математическое описание алгоритма ===&lt;br /&gt;
Исходные данные: матрица &amp;lt;math&amp;gt;G&amp;lt;/math&amp;gt; (элементы &amp;lt;math&amp;gt;g_{ij}, i, j = 1, \ldots, n&amp;lt;/math&amp;gt;).&lt;br /&gt;
&lt;br /&gt;
Вычисляемые данные: матрица &amp;lt;math&amp;gt;\Sigma = diag(\sigma_{i})&amp;lt;/math&amp;gt;, где &amp;lt;math&amp;gt;\sigma_{i}&amp;lt;/math&amp;gt; - сингулярные числа, &amp;lt;math&amp;gt;U&amp;lt;/math&amp;gt; - матрица левых сингулярных векторов, &amp;lt;math&amp;gt;V&amp;lt;/math&amp;gt; - матрица правых сингулярных векторов.&lt;br /&gt;
&lt;br /&gt;
симметричную матрицу &amp;lt;math&amp;gt;A = (G^TG)&amp;lt;/math&amp;gt; можно привести к диагональному виду:&lt;br /&gt;
&amp;lt;math&amp;gt;RG^TGR^T&amp;lt;/math&amp;gt;, где&lt;br /&gt;
&lt;br /&gt;
&amp;lt;math&amp;gt;&lt;br /&gt;
R(j,k,\theta) = &lt;br /&gt;
\begin{matrix}&lt;br /&gt;
  \\&lt;br /&gt;
  \\&lt;br /&gt;
  \\&lt;br /&gt;
j \\&lt;br /&gt;
  \\&lt;br /&gt;
k \\&lt;br /&gt;
  \\&lt;br /&gt;
  \\&lt;br /&gt;
  \\&lt;br /&gt;
\end{matrix}&lt;br /&gt;
&amp;lt;/math&amp;gt;  &lt;br /&gt;
&amp;lt;math&amp;gt;&lt;br /&gt;
\begin{bmatrix}&lt;br /&gt;
  &amp;amp; 1 &amp;amp;   &amp;amp;        &amp;amp;              &amp;amp;        &amp;amp;               &amp;amp;         &amp;amp;    &amp;amp;   \\&lt;br /&gt;
  &amp;amp;   &amp;amp; 1 &amp;amp;        &amp;amp;              &amp;amp;        &amp;amp;               &amp;amp;         &amp;amp;    &amp;amp;   \\&lt;br /&gt;
  &amp;amp;   &amp;amp;   &amp;amp; \ddots &amp;amp;              &amp;amp;        &amp;amp;               &amp;amp;         &amp;amp;    &amp;amp;   \\&lt;br /&gt;
  &amp;amp;   &amp;amp;   &amp;amp;        &amp;amp; \cos(\theta) &amp;amp;        &amp;amp; -\sin(\theta) &amp;amp;         &amp;amp;    &amp;amp;   \\&lt;br /&gt;
  &amp;amp;   &amp;amp;   &amp;amp;        &amp;amp;              &amp;amp; \ddots &amp;amp;               &amp;amp;         &amp;amp;    &amp;amp;   \\&lt;br /&gt;
  &amp;amp;   &amp;amp;   &amp;amp;        &amp;amp; \sin(\theta) &amp;amp;        &amp;amp; \cos(\theta)  &amp;amp;         &amp;amp;    &amp;amp;   \\&lt;br /&gt;
  &amp;amp;   &amp;amp;   &amp;amp;        &amp;amp;              &amp;amp;        &amp;amp;               &amp;amp; \ddots  &amp;amp;    &amp;amp;   \\&lt;br /&gt;
  &amp;amp;   &amp;amp;   &amp;amp;        &amp;amp;              &amp;amp;        &amp;amp;               &amp;amp;         &amp;amp; 1  &amp;amp;   \\&lt;br /&gt;
  &amp;amp;   &amp;amp;   &amp;amp;        &amp;amp;              &amp;amp;        &amp;amp;               &amp;amp;         &amp;amp;    &amp;amp; 1 \\&lt;br /&gt;
\end{bmatrix}&lt;br /&gt;
&amp;lt;/math&amp;gt;&lt;br /&gt;
&lt;br /&gt;
Обозначим &amp;lt;math&amp;gt;s = \sin \theta&amp;lt;/math&amp;gt; и &amp;lt;math&amp;gt;c = \cos \theta&amp;lt;/math&amp;gt;.&lt;br /&gt;
&lt;br /&gt;
Перемножив матрицы &amp;lt;math&amp;gt;RG^TGR^T&amp;lt;/math&amp;gt;, получим следующие выражения&amp;lt;ref&amp;gt;http://www.astro.tsu.ru/OsChMet/5_2.html&amp;lt;/ref&amp;gt;:&lt;br /&gt;
&lt;br /&gt;
&amp;lt;math&amp;gt;\begin{align}&lt;br /&gt;
 a_{jj}^{(i+1)} &amp;amp;= c^2\, a_{jj}^{(i)}  -  2\, s c \,a_{jk}^{(i)}  +  s^2\, a_{kk}^{(i)} \\&lt;br /&gt;
 a_{kk}^{(i+1)} &amp;amp;= s^2 \,a_{jj}^{(i)}  +  2 s c\, a_{jk}^{(i)}  +  c^2 \, a_{kk}^{(i)} \\&lt;br /&gt;
 a_{jk}^{(i+1)} &amp;amp;= a_{kj}^{(i+1)} = (c^2 - s^2 ) \, a_{jk}^{(i)}  +  s c \, (a_{kk}^{(i)} - a_{jj}^{(i)} ) \\&lt;br /&gt;
 a_{jm}^{(i+1)} &amp;amp;= a_{mj}^{(i+1)} = c \, a_{jm}^{(i)}  -  s \, a_{km}^{(i)} &amp;amp; m \ne j,k \\&lt;br /&gt;
 a_{km}^{(i+1)} &amp;amp;= a_{mk}^{(i+1)} = s \, a_{jm}^{(i)}  + c \, a_{km}^{(i)} &amp;amp; m \ne j,k \\&lt;br /&gt;
 a_{ml}^{(i+1)} &amp;amp;= a_{ml}^{(i)} &amp;amp;m,l \ne j,k&lt;br /&gt;
\end{align}&amp;lt;/math&amp;gt;&lt;br /&gt;
&lt;br /&gt;
Т.к внедиагональные элементы должны быть равны 0, то выбираем &amp;lt;math&amp;gt;\theta&amp;lt;/math&amp;gt; так, чтобы &amp;lt;math&amp;gt;a_{jk}^{(i+1)} = 0&amp;lt;/math&amp;gt; и &amp;lt;math&amp;gt;a_{kj}^{(i+1)} = 0&amp;lt;/math&amp;gt;.&lt;br /&gt;
&lt;br /&gt;
Тогда решая уравнение получаем, что&lt;br /&gt;
&lt;br /&gt;
&amp;lt;math&amp;gt;&lt;br /&gt;
         \begin{align}&lt;br /&gt;
         \tau &amp;amp;= ({a_{jj} - a_{kk}})/{2a_{jk}} \\&lt;br /&gt;
         t &amp;amp;= {sign(\tau)}/(|\tau| + \sqrt{1 + \tau^2}) \\&lt;br /&gt;
         c &amp;amp;= 1/(\sqrt{1 + t^2}) \\&lt;br /&gt;
         s &amp;amp;= ct \\&lt;br /&gt;
         \end{align}&amp;lt;/math&amp;gt;&lt;br /&gt;
&lt;br /&gt;
Остановка вычислений алгоритма наступает, когда внедиагональные элементы становятся меньше некоторого наперед заданного числа &amp;lt;math&amp;gt;\varepsilon&amp;lt;/math&amp;gt;.&lt;br /&gt;
&lt;br /&gt;
=== Вычислительное ядро алгоритма ===&lt;br /&gt;
Вычислительное ядро алгоритма составляет непосредственно вычисление одностороннего вращения Якоби, т.е. вычисление элементов матрицы &amp;lt;math&amp;gt;g_{jm}^{(i+1)} = g_{mj}^{(i+1)}&amp;lt;/math&amp;gt; и &amp;lt;math&amp;gt;g_{km}^{(i+1)} = g_{mk}^{(i+1)}&amp;lt;/math&amp;gt;, &amp;lt;math&amp;gt;m \ne j,k&amp;lt;/math&amp;gt;, а также вычисления элементов &amp;lt;math&amp;gt;g_{jj}^{(i+1)} &amp;lt;/math&amp;gt; и &amp;lt;math&amp;gt;g_{kk}^{(i+1)} &amp;lt;/math&amp;gt;, получившихся после умножения промежуточной матрицы на матрицу вращений Якоби:&lt;br /&gt;
&lt;br /&gt;
&amp;lt;math&amp;gt;\begin{align}&lt;br /&gt;
 g_{jj}^{(i+1)} &amp;amp;= c^2\, g_{jj}^{(i)}  -  2\, s c \,g_{jk}^{(i)}  +  s^2\, g_{kk}^{(i)} \\&lt;br /&gt;
 g_{kk}^{(i+1)} &amp;amp;= s^2 \,g_{jj}^{(i)}  +  2 s c\, g_{jk}^{(i)}  +  c^2 \, g_{kk}^{(i)} \\&lt;br /&gt;
 g_{jk}^{(i+1)} &amp;amp;= g_{kj}^{(i+1)} = (c^2 - s^2 ) \, g_{jk}^{(i)}  +  s c \, (g_{kk}^{(i)} - g_{jj}^{(i)} ) \\&lt;br /&gt;
 g_{jm}^{(i+1)} &amp;amp;= g_{mj}^{(i+1)} = c \, g_{jm}^{(i)}  -  s \, g_{km}^{(i)} &amp;amp; m \ne j,k \\&lt;br /&gt;
 g_{km}^{(i+1)} &amp;amp;= g_{mk}^{(i+1)} = s \, g_{jm}^{(i)}  + c \, g_{km}^{(i)} &amp;amp; m \ne j,k \\&lt;br /&gt;
 g_{ml}^{(i+1)} &amp;amp;= g_{ml}^{(i)} &amp;amp;m,l \ne j,k&lt;br /&gt;
\end{align}&amp;lt;/math&amp;gt;&lt;br /&gt;
&lt;br /&gt;
=== Макроструктура алгоритма ===&lt;br /&gt;
Основную часть метода составляет процедура односторонних вращений матрицы, которая в свою очередь состоит из:&lt;br /&gt;
&lt;br /&gt;
#Вычисление &amp;lt;math&amp;gt;\tau, c, s, t&amp;lt;/math&amp;gt;.&lt;br /&gt;
#Одностороннее вращение матрицы. &lt;br /&gt;
&lt;br /&gt;
Что требует &amp;lt;math&amp;gt;O(n)&amp;lt;/math&amp;gt; операций.&lt;br /&gt;
&lt;br /&gt;
После этого необходимо:&lt;br /&gt;
&lt;br /&gt;
#Вычислить сингулярные числа &amp;lt;math&amp;gt;\sigma_i&amp;lt;/math&amp;gt;.  Что требует &amp;lt;math&amp;gt;O(n)&amp;lt;/math&amp;gt; операций.&lt;br /&gt;
#Вычислить &amp;lt;math&amp;gt;U&amp;lt;/math&amp;gt; и &amp;lt;math&amp;gt;V&amp;lt;/math&amp;gt;. Что требует &amp;lt;math&amp;gt;O(n^2)&amp;lt;/math&amp;gt; операций.&lt;br /&gt;
&lt;br /&gt;
=== Схема реализации последовательного алгоритма ===&lt;br /&gt;
Применение метода Якоби к матрице &amp;lt;math&amp;gt;A = (G^TG)&amp;lt;/math&amp;gt; можно описать следующим образом&amp;lt;ref&amp;gt;Дж. Деммель «Вычислительная линейная алгебра» (стр. 261-263)&amp;lt;/ref&amp;gt;:&lt;br /&gt;
&lt;br /&gt;
Если &amp;lt;math&amp;gt;G = U\Sigma V^T&amp;lt;/math&amp;gt; и &amp;lt;math&amp;gt;\Sigma = diag(\sigma_{i})&amp;lt;/math&amp;gt;, то алгоритм вычисляет сингулярные числа &amp;lt;math&amp;gt;\sigma_{i}&amp;lt;/math&amp;gt;, матрицу &amp;lt;math&amp;gt;U&amp;lt;/math&amp;gt; левых сингулярных векторов и матрицу &amp;lt;math&amp;gt;V&amp;lt;/math&amp;gt; правых сингулярных векторов по следующей схеме:&lt;br /&gt;
&lt;br /&gt;
 repeat&lt;br /&gt;
     for &amp;lt;math&amp;gt;j=1&amp;lt;/math&amp;gt; to &amp;lt;math&amp;gt;n-1&amp;lt;/math&amp;gt;&lt;br /&gt;
         for &amp;lt;math&amp;gt;k=j+1&amp;lt;/math&amp;gt; to &amp;lt;math&amp;gt;n&amp;lt;/math&amp;gt;&lt;br /&gt;
             обратиться к процедуре &#039;&#039;&#039;&#039;&#039;One-Sided-Jacobi-Rotation&amp;lt;math&amp;gt;(G,j,k)&amp;lt;/math&amp;gt;&#039;&#039;&#039;&#039;&#039;&lt;br /&gt;
         end for&lt;br /&gt;
     end for&lt;br /&gt;
 пока &amp;lt;math&amp;gt;G^TG&amp;lt;/math&amp;gt; не станет достаточно близка к диагональной матрице&lt;br /&gt;
 Положить &amp;lt;math&amp;gt;\sigma_{i} = ||G(:,i)||_2 &amp;lt;/math&amp;gt; (норма &amp;lt;math&amp;gt;i&amp;lt;/math&amp;gt;-го столбца в &amp;lt;math&amp;gt;G&amp;lt;/math&amp;gt;)&lt;br /&gt;
 Положить &amp;lt;math&amp;gt;U = [u_{1},\dots, u_{n}]&amp;lt;/math&amp;gt;, где &amp;lt;math&amp;gt;u_{i} = G(:,i)/\sigma_{i}&amp;lt;/math&amp;gt;&lt;br /&gt;
 Положить &amp;lt;math&amp;gt;V = J&amp;lt;/math&amp;gt;, где &amp;lt;math&amp;gt;J&amp;lt;/math&amp;gt; - накопленное произведение вращений Якоби.&lt;br /&gt;
&lt;br /&gt;
Где процедура &#039;&#039;&#039;&#039;&#039;One-Sided-Jacobi-Rotation&#039;&#039;&#039;&#039;&#039; является метод односторонних вращений Якоби:&lt;br /&gt;
&lt;br /&gt;
 proc &#039;&#039;&#039;&#039;&#039;One-Sided-Jacobi-Rotation&amp;lt;math&amp;gt;(G,j,k)&amp;lt;/math&amp;gt;&#039;&#039;&#039;&#039;&#039;&lt;br /&gt;
     вычислить &amp;lt;math&amp;gt;a_{jj} = (G^TG)_{jj}, a_{jk} = (G^TG)_{jk}&amp;lt;/math&amp;gt; и &amp;lt;math&amp;gt;a_{kk} = (G^TG)_{kk}&amp;lt;/math&amp;gt;&lt;br /&gt;
     if &amp;lt;math&amp;gt;|a_{jk}|&amp;lt;/math&amp;gt; не слишком мал&lt;br /&gt;
         &amp;lt;math&amp;gt;&lt;br /&gt;
         \begin{align}&lt;br /&gt;
         \tau &amp;amp;= ({a_{jj} - a_{kk}})/{2a_{jk}} \\&lt;br /&gt;
         t &amp;amp;= {sign(\tau)}/(|\tau| + \sqrt{1 + \tau^2}) \\&lt;br /&gt;
         c &amp;amp;= 1/(\sqrt{1 + t^2}) \\&lt;br /&gt;
         s &amp;amp;= ct \\&lt;br /&gt;
         G &amp;amp;= GR(j,k,\theta) \  \dots c=cos\theta, s=sin\theta \end{align}&amp;lt;/math&amp;gt;&lt;br /&gt;
         if нужны правые сингулярные векторы &lt;br /&gt;
             &amp;lt;math&amp;gt;J = JR(j,k,\theta)&amp;lt;/math&amp;gt;&lt;br /&gt;
         end if&lt;br /&gt;
     end if&lt;br /&gt;
&lt;br /&gt;
=== Последовательная сложность алгоритма ===&lt;br /&gt;
Для одного вращения Якоби необходимо выполнить &amp;lt;math&amp;gt;O(n)&amp;lt;/math&amp;gt; операций умножения и сложения. &lt;br /&gt;
&lt;br /&gt;
Всего вариантов выбора &amp;lt;math&amp;gt;j&amp;lt;/math&amp;gt; и &amp;lt;math&amp;gt;k&amp;lt;/math&amp;gt; существует &amp;lt;math&amp;gt;\frac{n(n-1)}{2}&amp;lt;/math&amp;gt;.&lt;br /&gt;
&lt;br /&gt;
Таким образом последовательный алгоритм Якоби вычисления сингулярных чисел и векторов является алгоритмом с кубической сложностью.&lt;br /&gt;
&lt;br /&gt;
=== Информационный граф ===&lt;br /&gt;
Граф алгоритма состоит из четырех групп вершин&lt;br /&gt;
&lt;br /&gt;
(А)Первая группа вершин расположена в двумерной области, соответствующая ей операция - вычисление элементов &amp;lt;math&amp;gt;a_{jj},a_{jk},a_{kk}&amp;lt;/math&amp;gt; матрицы произведения &amp;lt;math&amp;gt;A = (G^TG)&amp;lt;/math&amp;gt;. Где &amp;lt;math&amp;gt;j&amp;lt;/math&amp;gt; изменяется от &amp;lt;math&amp;gt;1&amp;lt;/math&amp;gt; до &amp;lt;math&amp;gt;n-1&amp;lt;/math&amp;gt;, принимая все целочисленные значения, &amp;lt;math&amp;gt;k&amp;lt;/math&amp;gt;  изменяется от &amp;lt;math&amp;gt;j+1&amp;lt;/math&amp;gt; до &amp;lt;math&amp;gt;n&amp;lt;/math&amp;gt;, принимая все целочисленные значения.&lt;br /&gt;
&lt;br /&gt;
Граф вычисления каждого из элементов приведен на рисунке 1, где значениям &amp;lt;math&amp;gt;g_{ij}&amp;lt;/math&amp;gt; соответствуют обозначения &amp;lt;math&amp;gt;x_{ij}&amp;lt;/math&amp;gt;, а элементам &amp;lt;math&amp;gt;g^T_{ij}&amp;lt;/math&amp;gt; обозначения &amp;lt;math&amp;gt;z_{ij}&amp;lt;/math&amp;gt;. Значение &amp;lt;math&amp;gt;s_{ij}&amp;lt;/math&amp;gt; является значением результирующего элемента.&lt;br /&gt;
&lt;br /&gt;
(Б)Вторая группа вершин расположена в двумерной области, соответствующая ей операция – вычисление &amp;lt;math&amp;gt;c&amp;lt;/math&amp;gt; и &amp;lt;math&amp;gt;s&amp;lt;/math&amp;gt;.&lt;br /&gt;
&lt;br /&gt;
Информационный граф с входными и выходными данными вычисления пункта (Б) представлен на рисунке 2.&lt;br /&gt;
&lt;br /&gt;
(В)Третья группа вершин расположена в двумерной области, соответствующая ей операция вычисление значений элементов &amp;lt;math&amp;gt;g_{jm}^{(i+1)} = g_{mj}^{(i+1)}&amp;lt;/math&amp;gt; и &amp;lt;math&amp;gt;g_{km}^{(i+1)} = g_{mk}^{(i+1)}&amp;lt;/math&amp;gt;, &amp;lt;math&amp;gt;m \ne j,k&amp;lt;/math&amp;gt;.&lt;br /&gt;
&lt;br /&gt;
(Г)Четвертая группа вершин расположена в двумерной области, соответствующая ей операция вычисление значений элементов &amp;lt;math&amp;gt;g_{jj}^{(i+1)} &amp;lt;/math&amp;gt; и &amp;lt;math&amp;gt;g_{kk}^{(i+1)} &amp;lt;/math&amp;gt;.&lt;br /&gt;
&lt;br /&gt;
Элементы групп (В) и (Г) вычисляются аналогично вычислению элементов матрицы произведения, т.к. фактически представляют собой перемножение матриц &amp;lt;math&amp;gt;G&amp;lt;/math&amp;gt; и &amp;lt;math&amp;gt;R&amp;lt;/math&amp;gt;&lt;br /&gt;
&lt;br /&gt;
[[File:Jacobi_2.jpg|none|thumb|1000px|Рисунок 1. Информационный граф с входными и выходными параметрами вычисления каждого элемента матрицы произведения.]]&lt;br /&gt;
&lt;br /&gt;
[[File:Jacobi_1.jpg|none|thumb|1000px|Рисунок 2. Информационный граф с входными и выходными параметрами вычисления значений &amp;lt;math&amp;gt;c&amp;lt;/math&amp;gt; и &amp;lt;math&amp;gt;s&amp;lt;/math&amp;gt;.]]&lt;br /&gt;
&lt;br /&gt;
Обобщенный граф метода Якоби представлен на рисунке 3, где буквами А, Б, В и Г обозначено вычисление групп вершин (А), (Б), (В) и (Г).&lt;br /&gt;
&lt;br /&gt;
[[File:Graf21.png|none|thumb|2000px|Рисунок 3. Обобщенный граф алгоритма вычисления сингулярных чисел и векторов методом Якоби.]]&lt;br /&gt;
&lt;br /&gt;
=== Ресурс параллелизма алгоритма ===&lt;br /&gt;
Для выполнения одной итерации метода Якоби требуется последовательно выполнить несколько ярусов:&lt;br /&gt;
# вычислить &amp;lt;math&amp;gt;\tau&amp;lt;/math&amp;gt; &lt;br /&gt;
# вычислить &amp;lt;math&amp;gt;t&amp;lt;/math&amp;gt; &lt;br /&gt;
# вычислить &amp;lt;math&amp;gt;c&amp;lt;/math&amp;gt; &lt;br /&gt;
# выполнить поворот матрицы &amp;lt;math&amp;gt;G&amp;lt;/math&amp;gt; с параллельным выполнением &amp;lt;math&amp;gt;2(n-2)&amp;lt;/math&amp;gt; операций вычисления элементов матрицы &amp;lt;math&amp;gt;g_{jm}^{(i+1)} = g_{mj}^{(i+1)}&amp;lt;/math&amp;gt; и &amp;lt;math&amp;gt;g_{km}^{(i+1)} = g_{mk}^{(i+1)}&amp;lt;/math&amp;gt;, &amp;lt;math&amp;gt;m \ne j,k&amp;lt;/math&amp;gt;, а также вычисления элементов &amp;lt;math&amp;gt;g_{jj}^{(i+1)} &amp;lt;/math&amp;gt; и &amp;lt;math&amp;gt;g_{kk}^{(i+1)} &amp;lt;/math&amp;gt;. &lt;br /&gt;
&lt;br /&gt;
Суммарное количество итераций равно &amp;lt;math&amp;gt;\frac{n(n-1)}{2}&amp;lt;/math&amp;gt; (Различные варианты выбора &amp;lt;math&amp;gt;j&amp;lt;/math&amp;gt; и &amp;lt;math&amp;gt;k&amp;lt;/math&amp;gt;). &lt;br /&gt;
&lt;br /&gt;
Асимптотически метод сходится квадратично. &lt;br /&gt;
&lt;br /&gt;
Таким образом, при классификации по высоте ЯПФ метод Якоби относится к алгоритмам со сложностью &amp;lt;math&amp;gt;O(n^2)&amp;lt;/math&amp;gt;&amp;amp;nbsp;, а при классификации по ширине ЯПФ — к алгоритмам со сложностью &amp;lt;math&amp;gt;O(n)&amp;lt;/math&amp;gt;.&lt;br /&gt;
&lt;br /&gt;
=== Входные и выходные данные алгоритма ===&lt;br /&gt;
&#039;&#039;&#039;Входные данные&#039;&#039;&#039;: плотная матрица &amp;lt;math&amp;gt;G&amp;lt;/math&amp;gt; размера &amp;lt;math&amp;gt;n&amp;lt;/math&amp;gt;х&amp;lt;math&amp;gt;n&amp;lt;/math&amp;gt;, где &amp;lt;math&amp;gt;A= G^TG&amp;lt;/math&amp;gt; – симметрическая матрица.&lt;br /&gt;
&lt;br /&gt;
&#039;&#039;&#039;Объём входных данных&#039;&#039;&#039;: &amp;lt;math&amp;gt;n^2&amp;lt;/math&amp;gt; (т.к. для хранения матрицы &amp;lt;math&amp;gt;G&amp;lt;/math&amp;gt; используем двумерный массив размера &amp;lt;math&amp;gt;n&amp;lt;/math&amp;gt;х&amp;lt;math&amp;gt;n&amp;lt;/math&amp;gt;)&lt;br /&gt;
&lt;br /&gt;
&#039;&#039;&#039;Выходные данные&#039;&#039;&#039;: &amp;lt;math&amp;gt;\sigma_{i}&amp;lt;/math&amp;gt;  - сингулярные числа, матрица &amp;lt;math&amp;gt;U&amp;lt;/math&amp;gt; левых сингулярных векторов и матрица &amp;lt;math&amp;gt;V&amp;lt;/math&amp;gt; правых сингулярных векторов.&lt;br /&gt;
&lt;br /&gt;
&#039;&#039;&#039;Объём выходных данных&#039;&#039;&#039;: &amp;lt;math&amp;gt;2n^2 + n&amp;lt;/math&amp;gt; (т.к. необходимо хранить вектор сингулярных чисел длины &amp;lt;math&amp;gt;n&amp;lt;/math&amp;gt;, а также две матрицы &amp;lt;math&amp;gt;U, V&amp;lt;/math&amp;gt; левых и правых сингулярных векторов размера &amp;lt;math&amp;gt;n&amp;lt;/math&amp;gt;х&amp;lt;math&amp;gt;n&amp;lt;/math&amp;gt;).&lt;br /&gt;
&lt;br /&gt;
=== Свойства алгоритма ===&lt;br /&gt;
Метод Якоби является самым медленным из имеющихся алгоритмов вычисления сингулярных чисел и сингулярных векторов матрицы. Тем не менее, для  матриц &amp;lt;math&amp;gt;G&amp;lt;/math&amp;gt;, которые могут быть представлены в виде &amp;lt;math&amp;gt;G=DX&amp;lt;/math&amp;gt;, где &amp;lt;math&amp;gt;D&amp;lt;/math&amp;gt; - диагональная, а &amp;lt;math&amp;gt;X&amp;lt;/math&amp;gt; - хорошо обусловлена, он способен вычислять сингулярные числа и вектора намного точнее, чем другие методы&amp;lt;ref&amp;gt;Дж. Деммель «Вычислительная линейная алгебра» (стр. 261-264)&amp;lt;/ref&amp;gt;. &lt;br /&gt;
&lt;br /&gt;
Вычислительная мощность алгоритма, как отношение числа операций к суммарному объему входных и выходных данных является линейной.&lt;br /&gt;
&lt;br /&gt;
Метод Якоби не детерминирован, так как является итерационным алгоритмом с выходом по точности (число итераций зависит от входных данных и порогового значения).&lt;br /&gt;
&lt;br /&gt;
== Программная реализация алгоритма ==&lt;br /&gt;
&lt;br /&gt;
=== Особенности реализации последовательного алгоритма ===&lt;br /&gt;
&lt;br /&gt;
=== Локальность данных и вычислений ===&lt;br /&gt;
&lt;br /&gt;
=== Возможные способы и особенности параллельной реализации алгоритма ===&lt;br /&gt;
&lt;br /&gt;
=== Масштабируемость алгоритма и его реализации ===&lt;br /&gt;
&lt;br /&gt;
=== Динамические характеристики и эффективность реализации алгоритма ===&lt;br /&gt;
&lt;br /&gt;
=== Выводы для классов архитектур ===&lt;br /&gt;
&lt;br /&gt;
=== Существующие реализации алгоритма ===&lt;br /&gt;
Метод Якоби нахождения сингулярных значений и векторов реализован в таких пакетах, как LAPACK, LINPACK/EISPACK, Intel MKL &amp;lt;ref&amp;gt;https://software.intel.com/ru-ru/node/521153#CAF8CA08-1C69-48F8-B0C3-B2B27AFA92FA&amp;lt;/ref&amp;gt;.&lt;br /&gt;
&lt;br /&gt;
Так же функция Якоби реализована в пакете Matlab.&lt;br /&gt;
&lt;br /&gt;
Т. к. алгоритм считается медленным, он не включен во многие известные пакеты.&lt;br /&gt;
&lt;br /&gt;
== Литература ==&lt;br /&gt;
1. Дж. Деммель Вычислительная линейная алгебра. Изд. Мир, 2001.&lt;/div&gt;</summary>
		<author><name>Davletshuna Alexandra</name></author>
	</entry>
	<entry>
		<id>https://xn--80aecvaldz.xn--80ahdrnmvk.xn--p1ai/w/ru/index.php?title=%D0%A3%D1%87%D0%B0%D1%81%D1%82%D0%BD%D0%B8%D0%BA:Davletshuna_Alexandra/%D0%9C%D0%B5%D1%82%D0%BE%D0%B4_%D0%AF%D0%BA%D0%BE%D0%B1%D0%B8_%D0%B2%D1%8B%D1%87%D0%B8%D1%81%D0%BB%D0%B5%D0%BD%D0%B8%D1%8F_%D1%81%D0%B8%D0%BD%D0%B3%D1%83%D0%BB%D1%8F%D1%80%D0%BD%D1%8B%D1%85_%D1%87%D0%B8%D1%81%D0%B5%D0%BB_%D0%B8_%D0%B2%D0%B5%D0%BA%D1%82%D0%BE%D1%80%D0%BE%D0%B2&amp;diff=17365</id>
		<title>Участник:Davletshuna Alexandra/Метод Якоби вычисления сингулярных чисел и векторов</title>
		<link rel="alternate" type="text/html" href="https://xn--80aecvaldz.xn--80ahdrnmvk.xn--p1ai/w/ru/index.php?title=%D0%A3%D1%87%D0%B0%D1%81%D1%82%D0%BD%D0%B8%D0%BA:Davletshuna_Alexandra/%D0%9C%D0%B5%D1%82%D0%BE%D0%B4_%D0%AF%D0%BA%D0%BE%D0%B1%D0%B8_%D0%B2%D1%8B%D1%87%D0%B8%D1%81%D0%BB%D0%B5%D0%BD%D0%B8%D1%8F_%D1%81%D0%B8%D0%BD%D0%B3%D1%83%D0%BB%D1%8F%D1%80%D0%BD%D1%8B%D1%85_%D1%87%D0%B8%D1%81%D0%B5%D0%BB_%D0%B8_%D0%B2%D0%B5%D0%BA%D1%82%D0%BE%D1%80%D0%BE%D0%B2&amp;diff=17365"/>
		<updated>2016-11-15T19:04:24Z</updated>

		<summary type="html">&lt;p&gt;Davletshuna Alexandra: /* Математическое описание алгоритма */&lt;/p&gt;
&lt;hr /&gt;
&lt;div&gt;{{Assignment|ASA}}&lt;br /&gt;
&lt;br /&gt;
{{algorithm&lt;br /&gt;
| name              = Метод Якоби вычисления сингулярных чисел и векторов&lt;br /&gt;
| serial_complexity = &amp;lt;math&amp;gt;O(n^3)&amp;lt;/math&amp;gt;&lt;br /&gt;
| pf_height         = &amp;lt;math&amp;gt;O(n^2)&amp;lt;/math&amp;gt;&lt;br /&gt;
| pf_width          = &amp;lt;math&amp;gt;O(n)&amp;lt;/math&amp;gt;&lt;br /&gt;
| input_data        = &amp;lt;math&amp;gt;n^2&amp;lt;/math&amp;gt;&lt;br /&gt;
| output_data       = &amp;lt;math&amp;gt;2n^2 + n&amp;lt;/math&amp;gt;&lt;br /&gt;
}}&lt;br /&gt;
&lt;br /&gt;
Авторы статьи: [[Участница:Davletshuna Alexandra|Давлетшина Александра]] (группа 619) пункты 1.1-1.4, 1.6, 2.7; [[Участница:Alek sandra|Зайцева Александра]] (группа 601) пункты 1.5, 1.7-1.10, 2.7.&lt;br /&gt;
&lt;br /&gt;
== Свойства и структура алгоритма ==&lt;br /&gt;
&lt;br /&gt;
=== Общее описание алгоритма ===&lt;br /&gt;
&#039;&#039;&#039;Сингулярным разложением&#039;&#039;&#039; называется разложение прямоугольной вещественной или комплексной матрицы, имеющее широкое применение, в силу своей наглядной геометрической интерпретации, при решении многих прикладных задач. Сингулярное разложение матрицы А позволяет вычислять сингулярные числа данной матрицы, а также, левые и правые сингулярные векторы матрицы А:&lt;br /&gt;
&lt;br /&gt;
•	левые сингулярные векторы матрицы А — это собственные векторы матрицы &amp;lt;math&amp;gt;AA^*&amp;lt;/math&amp;gt;;&lt;br /&gt;
&lt;br /&gt;
•	правые сингулярные векторы матрицы A — это собственные векторы матрицы &amp;lt;math&amp;gt;A^*A&amp;lt;/math&amp;gt;.&lt;br /&gt;
&lt;br /&gt;
Геометрическая интерпретация сингулярного разложения заключается в следующем факте из геометрии: &#039;&#039;Образом любого линейного преобразования, заданного с помощью матрицы &amp;lt;math&amp;gt;m&amp;lt;/math&amp;gt;x&amp;lt;math&amp;gt;n&amp;lt;/math&amp;gt;, примененного к единичной сфере является гиперэллипсоид&#039;&#039;.&lt;br /&gt;
&lt;br /&gt;
Из многочисленных разложений матриц, наиболее удобным является сингулярное разложение матрицы в виде: &amp;lt;math&amp;gt;A=U\Sigma V^*&amp;lt;/math&amp;gt;, где &amp;lt;math&amp;gt;U, V&amp;lt;/math&amp;gt; – унитарные матрицы, а &amp;lt;math&amp;gt;\Sigma&amp;lt;/math&amp;gt; – диагональная матрица с вещественными положительными числами на диагонали &amp;lt;ref&amp;gt;http://algorithms.parallel.ru/&amp;lt;/ref&amp;gt;.&lt;br /&gt;
&lt;br /&gt;
Диагональные элементы матрицы &amp;lt;math&amp;gt;\Sigma&amp;lt;/math&amp;gt; называются сингулярными числами матрицы &amp;lt;math&amp;gt;A&amp;lt;/math&amp;gt;, а столбцы матриц &amp;lt;math&amp;gt;U,V&amp;lt;/math&amp;gt; левыми и правыми сингулярными векторами соответственно.&lt;br /&gt;
&lt;br /&gt;
Алгоритм Якоби сингулярного разложения матрицы был предложен одним из первых в 1846 году. Он приводит прямоугольную матрицу к диагональной матрице с помощью последовательности элементарных вращений. Метод может найти все сингулярные значения с очень высокой точностью. Однако его производительность является довольно низкой, в сравнении с конкурирующими методами.&lt;br /&gt;
&lt;br /&gt;
&#039;&#039;Неявный&#039;&#039;&amp;lt;ref&amp;gt;Дж. Деммель «Вычислительная линейная алгебра» (стр. 261-264)&amp;lt;/ref&amp;gt; метод Якоби математически эквивалентен применению метода Якоби вычисления собственных значений к матрице &amp;lt;math&amp;gt;A = G^TG&amp;lt;/math&amp;gt;.&lt;br /&gt;
Это значит, что на каждом шаге вычисляется вращение Якоби &amp;lt;math&amp;gt;J&amp;lt;/math&amp;gt;, с помощью которого матрица &amp;lt;math&amp;gt;G^TG&amp;lt;/math&amp;gt; неявно пересчитывется в &amp;lt;math&amp;gt;J^TG^TGJ&amp;lt;/math&amp;gt;; вращение выбрано так, чтобы пара внедиагональных элементов из &amp;lt;math&amp;gt;G^TG&amp;lt;/math&amp;gt; обратилась в нули в матрице &amp;lt;math&amp;gt;J^TG^TGJ&amp;lt;/math&amp;gt;. При этом ни &amp;lt;math&amp;gt;G^TG&amp;lt;/math&amp;gt;, ни &amp;lt;math&amp;gt;J^TG^TGJ&amp;lt;/math&amp;gt; не вычисляются в явном виде; вместо них вычисляется матрица &amp;lt;math&amp;gt;GJ&amp;lt;/math&amp;gt;. Поэтому алгоритм называется &#039;&#039;методом односторонних вращений&#039;&#039;.&lt;br /&gt;
&lt;br /&gt;
=== Математическое описание алгоритма ===&lt;br /&gt;
Исходные данные: матрица &amp;lt;math&amp;gt;G&amp;lt;/math&amp;gt; (элементы &amp;lt;math&amp;gt;g_{ij}, i, j = 1, \ldots, n&amp;lt;/math&amp;gt;).&lt;br /&gt;
&lt;br /&gt;
Вычисляемые данные: матрица &amp;lt;math&amp;gt;\Sigma = diag(\sigma_{i})&amp;lt;/math&amp;gt;, где &amp;lt;math&amp;gt;\sigma_{i}&amp;lt;/math&amp;gt; - сингулярные числа, &amp;lt;math&amp;gt;U&amp;lt;/math&amp;gt; - матрица левых сингулярных векторов, &amp;lt;math&amp;gt;V&amp;lt;/math&amp;gt; - матрица правых сингулярных векторов.&lt;br /&gt;
&lt;br /&gt;
симметричную матрицу &amp;lt;math&amp;gt;A = (G^TG)&amp;lt;/math&amp;gt; можно привести к диагональному виду:&lt;br /&gt;
&amp;lt;math&amp;gt;RG^TGR^T&amp;lt;/math&amp;gt;, где&lt;br /&gt;
&lt;br /&gt;
&amp;lt;math&amp;gt;&lt;br /&gt;
R(j,k,\theta) = &lt;br /&gt;
\begin{matrix}&lt;br /&gt;
  \\&lt;br /&gt;
  \\&lt;br /&gt;
  \\&lt;br /&gt;
j \\&lt;br /&gt;
  \\&lt;br /&gt;
k \\&lt;br /&gt;
  \\&lt;br /&gt;
  \\&lt;br /&gt;
  \\&lt;br /&gt;
\end{matrix}&lt;br /&gt;
&amp;lt;/math&amp;gt;  &lt;br /&gt;
&amp;lt;math&amp;gt;&lt;br /&gt;
\begin{bmatrix}&lt;br /&gt;
  &amp;amp; 1 &amp;amp;   &amp;amp;        &amp;amp;              &amp;amp;        &amp;amp;               &amp;amp;         &amp;amp;    &amp;amp;   \\&lt;br /&gt;
  &amp;amp;   &amp;amp; 1 &amp;amp;        &amp;amp;              &amp;amp;        &amp;amp;               &amp;amp;         &amp;amp;    &amp;amp;   \\&lt;br /&gt;
  &amp;amp;   &amp;amp;   &amp;amp; \ddots &amp;amp;              &amp;amp;        &amp;amp;               &amp;amp;         &amp;amp;    &amp;amp;   \\&lt;br /&gt;
  &amp;amp;   &amp;amp;   &amp;amp;        &amp;amp; \cos(\theta) &amp;amp;        &amp;amp; -\sin(\theta) &amp;amp;         &amp;amp;    &amp;amp;   \\&lt;br /&gt;
  &amp;amp;   &amp;amp;   &amp;amp;        &amp;amp;              &amp;amp; \ddots &amp;amp;               &amp;amp;         &amp;amp;    &amp;amp;   \\&lt;br /&gt;
  &amp;amp;   &amp;amp;   &amp;amp;        &amp;amp; \sin(\theta) &amp;amp;        &amp;amp; \cos(\theta)  &amp;amp;         &amp;amp;    &amp;amp;   \\&lt;br /&gt;
  &amp;amp;   &amp;amp;   &amp;amp;        &amp;amp;              &amp;amp;        &amp;amp;               &amp;amp; \ddots  &amp;amp;    &amp;amp;   \\&lt;br /&gt;
  &amp;amp;   &amp;amp;   &amp;amp;        &amp;amp;              &amp;amp;        &amp;amp;               &amp;amp;         &amp;amp; 1  &amp;amp;   \\&lt;br /&gt;
  &amp;amp;   &amp;amp;   &amp;amp;        &amp;amp;              &amp;amp;        &amp;amp;               &amp;amp;         &amp;amp;    &amp;amp; 1 \\&lt;br /&gt;
\end{bmatrix}&lt;br /&gt;
&amp;lt;/math&amp;gt;&lt;br /&gt;
&lt;br /&gt;
Обозначим &amp;lt;math&amp;gt;s = \sin \theta&amp;lt;/math&amp;gt; и &amp;lt;math&amp;gt;c = \cos \theta&amp;lt;/math&amp;gt;.&lt;br /&gt;
&lt;br /&gt;
Перемножив матрицы &amp;lt;math&amp;gt;RG^TGR^T&amp;lt;/math&amp;gt;, получим следующие выражения&amp;lt;ref&amp;gt;http://www.astro.tsu.ru/OsChMet/5_2.html&amp;lt;/ref&amp;gt;:&lt;br /&gt;
&lt;br /&gt;
&amp;lt;math&amp;gt;\begin{align}&lt;br /&gt;
 a_{jj}^{(i+1)} &amp;amp;= c^2\, a_{jj}^{(i)}  -  2\, s c \,a_{jk}^{(i)}  +  s^2\, a_{kk}^{(i)} \\&lt;br /&gt;
 a_{kk}^{(i+1)} &amp;amp;= s^2 \,a_{jj}^{(i)}  +  2 s c\, a_{jk}^{(i)}  +  c^2 \, a_{kk}^{(i)} \\&lt;br /&gt;
 a_{jk}^{(i+1)} &amp;amp;= a_{kj}^{(i+1)} = (c^2 - s^2 ) \, a_{jk}^{(i)}  +  s c \, (a_{kk}^{(i)} - a_{jj}^{(i)} ) \\&lt;br /&gt;
 a_{jm}^{(i+1)} &amp;amp;= a_{mj}^{(i+1)} = c \, a_{jm}^{(i)}  -  s \, a_{km}^{(i)} &amp;amp; m \ne j,k \\&lt;br /&gt;
 a_{km}^{(i+1)} &amp;amp;= a_{mk}^{(i+1)} = s \, a_{jm}^{(i)}  + c \, a_{km}^{(i)} &amp;amp; m \ne j,k \\&lt;br /&gt;
 a_{ml}^{(i+1)} &amp;amp;= a_{ml}^{(i)} &amp;amp;m,l \ne j,k&lt;br /&gt;
\end{align}&amp;lt;/math&amp;gt;&lt;br /&gt;
&lt;br /&gt;
Т.к внедиагональные элементы должны быть равны 0, то выбираем &amp;lt;math&amp;gt;\theta&amp;lt;/math&amp;gt; так, чтобы &amp;lt;math&amp;gt;a_{jk}^{(i+1)} = 0&amp;lt;/math&amp;gt; и &amp;lt;math&amp;gt;a_{kj}^{(i+1)} = 0&amp;lt;/math&amp;gt;.&lt;br /&gt;
&lt;br /&gt;
Тогда решая уравнение получаем, что&lt;br /&gt;
&lt;br /&gt;
&amp;lt;math&amp;gt;&lt;br /&gt;
         \begin{align}&lt;br /&gt;
         \tau &amp;amp;= ({a_{jj} - a_{kk}})/{2a_{jk}} \\&lt;br /&gt;
         t &amp;amp;= {sign(\tau)}/(|\tau| + \sqrt{1 + \tau^2}) \\&lt;br /&gt;
         c &amp;amp;= 1/(\sqrt{1 + t^2}) \\&lt;br /&gt;
         s &amp;amp;= ct \\&lt;br /&gt;
         \end{align}&amp;lt;/math&amp;gt;&lt;br /&gt;
&lt;br /&gt;
Остановка вычислений алгоритма наступает, когда внедиагональные элементы становятся меньше некоторого наперед заданного числа &amp;lt;math&amp;gt;\varepsilon&amp;lt;/math&amp;gt;.&lt;br /&gt;
&lt;br /&gt;
=== Вычислительное ядро алгоритма ===&lt;br /&gt;
Вычислительное ядро алгоритма составляет непосредственно вычисление одностороннего вращения Якоби, т.е. вычисление элементов матрицы &amp;lt;math&amp;gt;g_{jm}^{(i+1)} = g_{mj}^{(i+1)}&amp;lt;/math&amp;gt; и &amp;lt;math&amp;gt;g_{km}^{(i+1)} = g_{mk}^{(i+1)}&amp;lt;/math&amp;gt;, &amp;lt;math&amp;gt;m \ne j,k&amp;lt;/math&amp;gt;, а также вычисления элементов &amp;lt;math&amp;gt;g_{jj}^{(i+1)} &amp;lt;/math&amp;gt; и &amp;lt;math&amp;gt;g_{kk}^{(i+1)} &amp;lt;/math&amp;gt;, получившихся после умножения промежуточной матрицы на матрицу вращений Якоби:&lt;br /&gt;
&lt;br /&gt;
&amp;lt;math&amp;gt;\begin{align}&lt;br /&gt;
 g_{jj}^{(i+1)} &amp;amp;= c^2\, g_{jj}^{(i)}  -  2\, s c \,g_{jk}^{(i)}  +  s^2\, g_{kk}^{(i)} \\&lt;br /&gt;
 g_{kk}^{(i+1)} &amp;amp;= s^2 \,g_{jj}^{(i)}  +  2 s c\, g_{jk}^{(i)}  +  c^2 \, g_{kk}^{(i)} \\&lt;br /&gt;
 g_{jk}^{(i+1)} &amp;amp;= g_{kj}^{(i+1)} = (c^2 - s^2 ) \, g_{jk}^{(i)}  +  s c \, (g_{kk}^{(i)} - g_{jj}^{(i)} ) \\&lt;br /&gt;
 g_{jm}^{(i+1)} &amp;amp;= g_{mj}^{(i+1)} = c \, g_{jm}^{(i)}  -  s \, g_{km}^{(i)} &amp;amp; m \ne j,k \\&lt;br /&gt;
 g_{km}^{(i+1)} &amp;amp;= g_{mk}^{(i+1)} = s \, g_{jm}^{(i)}  + c \, g_{km}^{(i)} &amp;amp; m \ne j,k \\&lt;br /&gt;
 g_{ml}^{(i+1)} &amp;amp;= g_{ml}^{(i)} &amp;amp;m,l \ne j,k&lt;br /&gt;
\end{align}&amp;lt;/math&amp;gt;&lt;br /&gt;
&lt;br /&gt;
=== Макроструктура алгоритма ===&lt;br /&gt;
Основную часть метода составляет процедура односторонних вращений матрицы, которая в свою очередь состоит из:&lt;br /&gt;
&lt;br /&gt;
#Вычисление &amp;lt;math&amp;gt;\tau, c, s, t&amp;lt;/math&amp;gt;.&lt;br /&gt;
#Одностороннее вращение матрицы. &lt;br /&gt;
&lt;br /&gt;
Что требует &amp;lt;math&amp;gt;O(n)&amp;lt;/math&amp;gt; операций.&lt;br /&gt;
&lt;br /&gt;
После этого необходимо:&lt;br /&gt;
&lt;br /&gt;
#Вычислить сингулярные числа &amp;lt;math&amp;gt;\sigma_i&amp;lt;/math&amp;gt;.  Что требует &amp;lt;math&amp;gt;O(n)&amp;lt;/math&amp;gt; операций.&lt;br /&gt;
#Вычислить &amp;lt;math&amp;gt;U&amp;lt;/math&amp;gt; и &amp;lt;math&amp;gt;V&amp;lt;/math&amp;gt;. Что требует &amp;lt;math&amp;gt;O(n^2)&amp;lt;/math&amp;gt; операций.&lt;br /&gt;
&lt;br /&gt;
=== Схема реализации последовательного алгоритма ===&lt;br /&gt;
Применение метода Якоби к матрице &amp;lt;math&amp;gt;A = (G^TG)&amp;lt;/math&amp;gt; можно описать следующим образом&amp;lt;ref&amp;gt;Дж. Деммель «Вычислительная линейная алгебра» (стр. 261-263)&amp;lt;/ref&amp;gt;:&lt;br /&gt;
&lt;br /&gt;
Если &amp;lt;math&amp;gt;G = U\Sigma V^T&amp;lt;/math&amp;gt; и &amp;lt;math&amp;gt;\Sigma = diag(\sigma_{i})&amp;lt;/math&amp;gt;, то алгоритм вычисляет сингулярные числа &amp;lt;math&amp;gt;\sigma_{i}&amp;lt;/math&amp;gt;, матрицу &amp;lt;math&amp;gt;U&amp;lt;/math&amp;gt; левых сингулярных векторов и матрицу &amp;lt;math&amp;gt;V&amp;lt;/math&amp;gt; правых сингулярных векторов по следующей схеме:&lt;br /&gt;
&lt;br /&gt;
 repeat&lt;br /&gt;
     for &amp;lt;math&amp;gt;j=1&amp;lt;/math&amp;gt; to &amp;lt;math&amp;gt;n-1&amp;lt;/math&amp;gt;&lt;br /&gt;
         for &amp;lt;math&amp;gt;k=j+1&amp;lt;/math&amp;gt; to &amp;lt;math&amp;gt;n&amp;lt;/math&amp;gt;&lt;br /&gt;
             обратиться к процедуре &#039;&#039;&#039;&#039;&#039;One-Sided-Jacobi-Rotation&amp;lt;math&amp;gt;(G,j,k)&amp;lt;/math&amp;gt;&#039;&#039;&#039;&#039;&#039;&lt;br /&gt;
         end for&lt;br /&gt;
     end for&lt;br /&gt;
 пока &amp;lt;math&amp;gt;G^TG&amp;lt;/math&amp;gt; не станет достаточно близка к диагональной матрице&lt;br /&gt;
 Положить &amp;lt;math&amp;gt;\sigma_{i} = ||G(:,i)||_2 &amp;lt;/math&amp;gt; (норма &amp;lt;math&amp;gt;i&amp;lt;/math&amp;gt;-го столбца в &amp;lt;math&amp;gt;G&amp;lt;/math&amp;gt;)&lt;br /&gt;
 Положить &amp;lt;math&amp;gt;U = [u_{1},\dots, u_{n}]&amp;lt;/math&amp;gt;, где &amp;lt;math&amp;gt;u_{i} = G(:,i)/\sigma_{i}&amp;lt;/math&amp;gt;&lt;br /&gt;
 Положить &amp;lt;math&amp;gt;V = J&amp;lt;/math&amp;gt;, где &amp;lt;math&amp;gt;J&amp;lt;/math&amp;gt; - накопленное произведение вращений Якоби.&lt;br /&gt;
&lt;br /&gt;
Где процедура &#039;&#039;&#039;&#039;&#039;One-Sided-Jacobi-Rotation&#039;&#039;&#039;&#039;&#039; является метод односторонних вращений Якоби:&lt;br /&gt;
&lt;br /&gt;
 proc &#039;&#039;&#039;&#039;&#039;One-Sided-Jacobi-Rotation&amp;lt;math&amp;gt;(G,j,k)&amp;lt;/math&amp;gt;&#039;&#039;&#039;&#039;&#039;&lt;br /&gt;
     вычислить &amp;lt;math&amp;gt;a_{jj} = (G^TG)_{jj}, a_{jk} = (G^TG)_{jk}&amp;lt;/math&amp;gt; и &amp;lt;math&amp;gt;a_{kk} = (G^TG)_{kk}&amp;lt;/math&amp;gt;&lt;br /&gt;
     if &amp;lt;math&amp;gt;|a_{jk}|&amp;lt;/math&amp;gt; не слишком мал&lt;br /&gt;
         &amp;lt;math&amp;gt;&lt;br /&gt;
         \begin{align}&lt;br /&gt;
         \tau &amp;amp;= {a_{jj} - a_{kk}}/{2a_{jk}} \\&lt;br /&gt;
         t &amp;amp;= {sign(\tau)}/(|\tau| + \sqrt{1 + \tau^2}) \\&lt;br /&gt;
         c &amp;amp;= 1/(\sqrt{1 + t^2}) \\&lt;br /&gt;
         s &amp;amp;= ct \\&lt;br /&gt;
         G &amp;amp;= GR(j,k,\theta) \  \dots c=cos\theta, s=sin\theta \end{align}&amp;lt;/math&amp;gt;&lt;br /&gt;
         if нужны правые сингулярные векторы &lt;br /&gt;
             &amp;lt;math&amp;gt;J = JR(j,k,\theta)&amp;lt;/math&amp;gt;&lt;br /&gt;
         end if&lt;br /&gt;
     end if&lt;br /&gt;
&lt;br /&gt;
=== Последовательная сложность алгоритма ===&lt;br /&gt;
Для одного вращения Якоби необходимо выполнить &amp;lt;math&amp;gt;O(n)&amp;lt;/math&amp;gt; операций умножения и сложения. &lt;br /&gt;
&lt;br /&gt;
Всего вариантов выбора &amp;lt;math&amp;gt;j&amp;lt;/math&amp;gt; и &amp;lt;math&amp;gt;k&amp;lt;/math&amp;gt; существует &amp;lt;math&amp;gt;\frac{n(n-1)}{2}&amp;lt;/math&amp;gt;.&lt;br /&gt;
&lt;br /&gt;
Таким образом последовательный алгоритм Якоби вычисления сингулярных чисел и векторов является алгоритмом с кубической сложностью.&lt;br /&gt;
&lt;br /&gt;
=== Информационный граф ===&lt;br /&gt;
Граф алгоритма состоит из четырех групп вершин&lt;br /&gt;
&lt;br /&gt;
(А)Первая группа вершин расположена в двумерной области, соответствующая ей операция - вычисление элементов &amp;lt;math&amp;gt;a_{jj},a_{jk},a_{kk}&amp;lt;/math&amp;gt; матрицы произведения &amp;lt;math&amp;gt;A = (G^TG)&amp;lt;/math&amp;gt;. Где &amp;lt;math&amp;gt;j&amp;lt;/math&amp;gt; изменяется от &amp;lt;math&amp;gt;1&amp;lt;/math&amp;gt; до &amp;lt;math&amp;gt;n-1&amp;lt;/math&amp;gt;, принимая все целочисленные значения, &amp;lt;math&amp;gt;k&amp;lt;/math&amp;gt;  изменяется от &amp;lt;math&amp;gt;j+1&amp;lt;/math&amp;gt; до &amp;lt;math&amp;gt;n&amp;lt;/math&amp;gt;, принимая все целочисленные значения.&lt;br /&gt;
&lt;br /&gt;
Граф вычисления каждого из элементов приведен на рисунке 1, где значениям &amp;lt;math&amp;gt;g_{ij}&amp;lt;/math&amp;gt; соответствуют обозначения &amp;lt;math&amp;gt;x_{ij}&amp;lt;/math&amp;gt;, а элементам &amp;lt;math&amp;gt;g^T_{ij}&amp;lt;/math&amp;gt; обозначения &amp;lt;math&amp;gt;z_{ij}&amp;lt;/math&amp;gt;. Значение &amp;lt;math&amp;gt;s_{ij}&amp;lt;/math&amp;gt; является значением результирующего элемента.&lt;br /&gt;
&lt;br /&gt;
(Б)Вторая группа вершин расположена в двумерной области, соответствующая ей операция – вычисление &amp;lt;math&amp;gt;c&amp;lt;/math&amp;gt; и &amp;lt;math&amp;gt;s&amp;lt;/math&amp;gt;.&lt;br /&gt;
&lt;br /&gt;
Информационный граф с входными и выходными данными вычисления пункта (Б) представлен на рисунке 2.&lt;br /&gt;
&lt;br /&gt;
(В)Третья группа вершин расположена в двумерной области, соответствующая ей операция вычисление значений элементов &amp;lt;math&amp;gt;g_{jm}^{(i+1)} = g_{mj}^{(i+1)}&amp;lt;/math&amp;gt; и &amp;lt;math&amp;gt;g_{km}^{(i+1)} = g_{mk}^{(i+1)}&amp;lt;/math&amp;gt;, &amp;lt;math&amp;gt;m \ne j,k&amp;lt;/math&amp;gt;.&lt;br /&gt;
&lt;br /&gt;
(Г)Четвертая группа вершин расположена в двумерной области, соответствующая ей операция вычисление значений элементов &amp;lt;math&amp;gt;g_{jj}^{(i+1)} &amp;lt;/math&amp;gt; и &amp;lt;math&amp;gt;g_{kk}^{(i+1)} &amp;lt;/math&amp;gt;.&lt;br /&gt;
&lt;br /&gt;
Элементы групп (В) и (Г) вычисляются аналогично вычислению элементов матрицы произведения, т.к. фактически представляют собой перемножение матриц &amp;lt;math&amp;gt;G&amp;lt;/math&amp;gt; и &amp;lt;math&amp;gt;R&amp;lt;/math&amp;gt;&lt;br /&gt;
&lt;br /&gt;
[[File:Jacobi_2.jpg|none|thumb|1000px|Рисунок 1. Информационный граф с входными и выходными параметрами вычисления каждого элемента матрицы произведения.]]&lt;br /&gt;
&lt;br /&gt;
[[File:Jacobi_1.jpg|none|thumb|1000px|Рисунок 2. Информационный граф с входными и выходными параметрами вычисления значений &amp;lt;math&amp;gt;c&amp;lt;/math&amp;gt; и &amp;lt;math&amp;gt;s&amp;lt;/math&amp;gt;.]]&lt;br /&gt;
&lt;br /&gt;
Обобщенный граф метода Якоби представлен на рисунке 3, где буквами А, Б, В и Г обозначено вычисление групп вершин (А), (Б), (В) и (Г).&lt;br /&gt;
&lt;br /&gt;
[[File:Graf21.png|none|thumb|2000px|Рисунок 3. Обобщенный граф алгоритма вычисления сингулярных чисел и векторов методом Якоби.]]&lt;br /&gt;
&lt;br /&gt;
=== Ресурс параллелизма алгоритма ===&lt;br /&gt;
Для выполнения одной итерации метода Якоби требуется последовательно выполнить несколько ярусов:&lt;br /&gt;
# вычислить &amp;lt;math&amp;gt;\tau&amp;lt;/math&amp;gt; &lt;br /&gt;
# вычислить &amp;lt;math&amp;gt;t&amp;lt;/math&amp;gt; &lt;br /&gt;
# вычислить &amp;lt;math&amp;gt;c&amp;lt;/math&amp;gt; &lt;br /&gt;
# выполнить поворот матрицы &amp;lt;math&amp;gt;G&amp;lt;/math&amp;gt; с параллельным выполнением &amp;lt;math&amp;gt;2(n-2)&amp;lt;/math&amp;gt; операций вычисления элементов матрицы &amp;lt;math&amp;gt;g_{jm}^{(i+1)} = g_{mj}^{(i+1)}&amp;lt;/math&amp;gt; и &amp;lt;math&amp;gt;g_{km}^{(i+1)} = g_{mk}^{(i+1)}&amp;lt;/math&amp;gt;, &amp;lt;math&amp;gt;m \ne j,k&amp;lt;/math&amp;gt;, а также вычисления элементов &amp;lt;math&amp;gt;g_{jj}^{(i+1)} &amp;lt;/math&amp;gt; и &amp;lt;math&amp;gt;g_{kk}^{(i+1)} &amp;lt;/math&amp;gt;. &lt;br /&gt;
&lt;br /&gt;
Суммарное количество итераций равно &amp;lt;math&amp;gt;\frac{n(n-1)}{2}&amp;lt;/math&amp;gt; (Различные варианты выбора &amp;lt;math&amp;gt;j&amp;lt;/math&amp;gt; и &amp;lt;math&amp;gt;k&amp;lt;/math&amp;gt;). &lt;br /&gt;
&lt;br /&gt;
Асимптотически метод сходится квадратично. &lt;br /&gt;
&lt;br /&gt;
Таким образом, при классификации по высоте ЯПФ метод Якоби относится к алгоритмам со сложностью &amp;lt;math&amp;gt;O(n^2)&amp;lt;/math&amp;gt;&amp;amp;nbsp;, а при классификации по ширине ЯПФ — к алгоритмам со сложностью &amp;lt;math&amp;gt;O(n)&amp;lt;/math&amp;gt;.&lt;br /&gt;
&lt;br /&gt;
=== Входные и выходные данные алгоритма ===&lt;br /&gt;
&#039;&#039;&#039;Входные данные&#039;&#039;&#039;: плотная матрица &amp;lt;math&amp;gt;G&amp;lt;/math&amp;gt; размера &amp;lt;math&amp;gt;n&amp;lt;/math&amp;gt;х&amp;lt;math&amp;gt;n&amp;lt;/math&amp;gt;, где &amp;lt;math&amp;gt;A= G^TG&amp;lt;/math&amp;gt; – симметрическая матрица.&lt;br /&gt;
&lt;br /&gt;
&#039;&#039;&#039;Объём входных данных&#039;&#039;&#039;: &amp;lt;math&amp;gt;n^2&amp;lt;/math&amp;gt; (т.к. для хранения матрицы &amp;lt;math&amp;gt;G&amp;lt;/math&amp;gt; используем двумерный массив размера &amp;lt;math&amp;gt;n&amp;lt;/math&amp;gt;х&amp;lt;math&amp;gt;n&amp;lt;/math&amp;gt;)&lt;br /&gt;
&lt;br /&gt;
&#039;&#039;&#039;Выходные данные&#039;&#039;&#039;: &amp;lt;math&amp;gt;\sigma_{i}&amp;lt;/math&amp;gt;  - сингулярные числа, матрица &amp;lt;math&amp;gt;U&amp;lt;/math&amp;gt; левых сингулярных векторов и матрица &amp;lt;math&amp;gt;V&amp;lt;/math&amp;gt; правых сингулярных векторов.&lt;br /&gt;
&lt;br /&gt;
&#039;&#039;&#039;Объём выходных данных&#039;&#039;&#039;: &amp;lt;math&amp;gt;2n^2 + n&amp;lt;/math&amp;gt; (т.к. необходимо хранить вектор сингулярных чисел длины &amp;lt;math&amp;gt;n&amp;lt;/math&amp;gt;, а также две матрицы &amp;lt;math&amp;gt;U, V&amp;lt;/math&amp;gt; левых и правых сингулярных векторов размера &amp;lt;math&amp;gt;n&amp;lt;/math&amp;gt;х&amp;lt;math&amp;gt;n&amp;lt;/math&amp;gt;).&lt;br /&gt;
&lt;br /&gt;
=== Свойства алгоритма ===&lt;br /&gt;
Метод Якоби является самым медленным из имеющихся алгоритмов вычисления сингулярных чисел и сингулярных векторов матрицы. Тем не менее, для  матриц &amp;lt;math&amp;gt;G&amp;lt;/math&amp;gt;, которые могут быть представлены в виде &amp;lt;math&amp;gt;G=DX&amp;lt;/math&amp;gt;, где &amp;lt;math&amp;gt;D&amp;lt;/math&amp;gt; - диагональная, а &amp;lt;math&amp;gt;X&amp;lt;/math&amp;gt; - хорошо обусловлена, он способен вычислять сингулярные числа и вектора намного точнее, чем другие методы&amp;lt;ref&amp;gt;Дж. Деммель «Вычислительная линейная алгебра» (стр. 261-264)&amp;lt;/ref&amp;gt;. &lt;br /&gt;
&lt;br /&gt;
Вычислительная мощность алгоритма, как отношение числа операций к суммарному объему входных и выходных данных является линейной.&lt;br /&gt;
&lt;br /&gt;
Метод Якоби не детерминирован, так как является итерационным алгоритмом с выходом по точности (число итераций зависит от входных данных и порогового значения).&lt;br /&gt;
&lt;br /&gt;
== Программная реализация алгоритма ==&lt;br /&gt;
&lt;br /&gt;
=== Особенности реализации последовательного алгоритма ===&lt;br /&gt;
&lt;br /&gt;
=== Локальность данных и вычислений ===&lt;br /&gt;
&lt;br /&gt;
=== Возможные способы и особенности параллельной реализации алгоритма ===&lt;br /&gt;
&lt;br /&gt;
=== Масштабируемость алгоритма и его реализации ===&lt;br /&gt;
&lt;br /&gt;
=== Динамические характеристики и эффективность реализации алгоритма ===&lt;br /&gt;
&lt;br /&gt;
=== Выводы для классов архитектур ===&lt;br /&gt;
&lt;br /&gt;
=== Существующие реализации алгоритма ===&lt;br /&gt;
Метод Якоби нахождения сингулярных значений и векторов реализован в таких пакетах, как LAPACK, LINPACK/EISPACK, Intel MKL &amp;lt;ref&amp;gt;https://software.intel.com/ru-ru/node/521153#CAF8CA08-1C69-48F8-B0C3-B2B27AFA92FA&amp;lt;/ref&amp;gt;.&lt;br /&gt;
&lt;br /&gt;
Так же функция Якоби реализована в пакете Matlab.&lt;br /&gt;
&lt;br /&gt;
Т. к. алгоритм считается медленным, он не включен во многие известные пакеты.&lt;br /&gt;
&lt;br /&gt;
== Литература ==&lt;br /&gt;
1. Дж. Деммель Вычислительная линейная алгебра. Изд. Мир, 2001.&lt;/div&gt;</summary>
		<author><name>Davletshuna Alexandra</name></author>
	</entry>
	<entry>
		<id>https://xn--80aecvaldz.xn--80ahdrnmvk.xn--p1ai/w/ru/index.php?title=%D0%A3%D1%87%D0%B0%D1%81%D1%82%D0%BD%D0%B8%D0%BA:Davletshuna_Alexandra/%D0%9C%D0%B5%D1%82%D0%BE%D0%B4_%D0%AF%D0%BA%D0%BE%D0%B1%D0%B8_%D0%B2%D1%8B%D1%87%D0%B8%D1%81%D0%BB%D0%B5%D0%BD%D0%B8%D1%8F_%D1%81%D0%B8%D0%BD%D0%B3%D1%83%D0%BB%D1%8F%D1%80%D0%BD%D1%8B%D1%85_%D1%87%D0%B8%D1%81%D0%B5%D0%BB_%D0%B8_%D0%B2%D0%B5%D0%BA%D1%82%D0%BE%D1%80%D0%BE%D0%B2&amp;diff=17364</id>
		<title>Участник:Davletshuna Alexandra/Метод Якоби вычисления сингулярных чисел и векторов</title>
		<link rel="alternate" type="text/html" href="https://xn--80aecvaldz.xn--80ahdrnmvk.xn--p1ai/w/ru/index.php?title=%D0%A3%D1%87%D0%B0%D1%81%D1%82%D0%BD%D0%B8%D0%BA:Davletshuna_Alexandra/%D0%9C%D0%B5%D1%82%D0%BE%D0%B4_%D0%AF%D0%BA%D0%BE%D0%B1%D0%B8_%D0%B2%D1%8B%D1%87%D0%B8%D1%81%D0%BB%D0%B5%D0%BD%D0%B8%D1%8F_%D1%81%D0%B8%D0%BD%D0%B3%D1%83%D0%BB%D1%8F%D1%80%D0%BD%D1%8B%D1%85_%D1%87%D0%B8%D1%81%D0%B5%D0%BB_%D0%B8_%D0%B2%D0%B5%D0%BA%D1%82%D0%BE%D1%80%D0%BE%D0%B2&amp;diff=17364"/>
		<updated>2016-11-15T19:03:56Z</updated>

		<summary type="html">&lt;p&gt;Davletshuna Alexandra: /* Существующие реализации алгоритма */&lt;/p&gt;
&lt;hr /&gt;
&lt;div&gt;{{Assignment|ASA}}&lt;br /&gt;
&lt;br /&gt;
{{algorithm&lt;br /&gt;
| name              = Метод Якоби вычисления сингулярных чисел и векторов&lt;br /&gt;
| serial_complexity = &amp;lt;math&amp;gt;O(n^3)&amp;lt;/math&amp;gt;&lt;br /&gt;
| pf_height         = &amp;lt;math&amp;gt;O(n^2)&amp;lt;/math&amp;gt;&lt;br /&gt;
| pf_width          = &amp;lt;math&amp;gt;O(n)&amp;lt;/math&amp;gt;&lt;br /&gt;
| input_data        = &amp;lt;math&amp;gt;n^2&amp;lt;/math&amp;gt;&lt;br /&gt;
| output_data       = &amp;lt;math&amp;gt;2n^2 + n&amp;lt;/math&amp;gt;&lt;br /&gt;
}}&lt;br /&gt;
&lt;br /&gt;
Авторы статьи: [[Участница:Davletshuna Alexandra|Давлетшина Александра]] (группа 619) пункты 1.1-1.4, 1.6, 2.7; [[Участница:Alek sandra|Зайцева Александра]] (группа 601) пункты 1.5, 1.7-1.10, 2.7.&lt;br /&gt;
&lt;br /&gt;
== Свойства и структура алгоритма ==&lt;br /&gt;
&lt;br /&gt;
=== Общее описание алгоритма ===&lt;br /&gt;
&#039;&#039;&#039;Сингулярным разложением&#039;&#039;&#039; называется разложение прямоугольной вещественной или комплексной матрицы, имеющее широкое применение, в силу своей наглядной геометрической интерпретации, при решении многих прикладных задач. Сингулярное разложение матрицы А позволяет вычислять сингулярные числа данной матрицы, а также, левые и правые сингулярные векторы матрицы А:&lt;br /&gt;
&lt;br /&gt;
•	левые сингулярные векторы матрицы А — это собственные векторы матрицы &amp;lt;math&amp;gt;AA^*&amp;lt;/math&amp;gt;;&lt;br /&gt;
&lt;br /&gt;
•	правые сингулярные векторы матрицы A — это собственные векторы матрицы &amp;lt;math&amp;gt;A^*A&amp;lt;/math&amp;gt;.&lt;br /&gt;
&lt;br /&gt;
Геометрическая интерпретация сингулярного разложения заключается в следующем факте из геометрии: &#039;&#039;Образом любого линейного преобразования, заданного с помощью матрицы &amp;lt;math&amp;gt;m&amp;lt;/math&amp;gt;x&amp;lt;math&amp;gt;n&amp;lt;/math&amp;gt;, примененного к единичной сфере является гиперэллипсоид&#039;&#039;.&lt;br /&gt;
&lt;br /&gt;
Из многочисленных разложений матриц, наиболее удобным является сингулярное разложение матрицы в виде: &amp;lt;math&amp;gt;A=U\Sigma V^*&amp;lt;/math&amp;gt;, где &amp;lt;math&amp;gt;U, V&amp;lt;/math&amp;gt; – унитарные матрицы, а &amp;lt;math&amp;gt;\Sigma&amp;lt;/math&amp;gt; – диагональная матрица с вещественными положительными числами на диагонали &amp;lt;ref&amp;gt;http://algorithms.parallel.ru/&amp;lt;/ref&amp;gt;.&lt;br /&gt;
&lt;br /&gt;
Диагональные элементы матрицы &amp;lt;math&amp;gt;\Sigma&amp;lt;/math&amp;gt; называются сингулярными числами матрицы &amp;lt;math&amp;gt;A&amp;lt;/math&amp;gt;, а столбцы матриц &amp;lt;math&amp;gt;U,V&amp;lt;/math&amp;gt; левыми и правыми сингулярными векторами соответственно.&lt;br /&gt;
&lt;br /&gt;
Алгоритм Якоби сингулярного разложения матрицы был предложен одним из первых в 1846 году. Он приводит прямоугольную матрицу к диагональной матрице с помощью последовательности элементарных вращений. Метод может найти все сингулярные значения с очень высокой точностью. Однако его производительность является довольно низкой, в сравнении с конкурирующими методами.&lt;br /&gt;
&lt;br /&gt;
&#039;&#039;Неявный&#039;&#039;&amp;lt;ref&amp;gt;Дж. Деммель «Вычислительная линейная алгебра» (стр. 261-264)&amp;lt;/ref&amp;gt; метод Якоби математически эквивалентен применению метода Якоби вычисления собственных значений к матрице &amp;lt;math&amp;gt;A = G^TG&amp;lt;/math&amp;gt;.&lt;br /&gt;
Это значит, что на каждом шаге вычисляется вращение Якоби &amp;lt;math&amp;gt;J&amp;lt;/math&amp;gt;, с помощью которого матрица &amp;lt;math&amp;gt;G^TG&amp;lt;/math&amp;gt; неявно пересчитывется в &amp;lt;math&amp;gt;J^TG^TGJ&amp;lt;/math&amp;gt;; вращение выбрано так, чтобы пара внедиагональных элементов из &amp;lt;math&amp;gt;G^TG&amp;lt;/math&amp;gt; обратилась в нули в матрице &amp;lt;math&amp;gt;J^TG^TGJ&amp;lt;/math&amp;gt;. При этом ни &amp;lt;math&amp;gt;G^TG&amp;lt;/math&amp;gt;, ни &amp;lt;math&amp;gt;J^TG^TGJ&amp;lt;/math&amp;gt; не вычисляются в явном виде; вместо них вычисляется матрица &amp;lt;math&amp;gt;GJ&amp;lt;/math&amp;gt;. Поэтому алгоритм называется &#039;&#039;методом односторонних вращений&#039;&#039;.&lt;br /&gt;
&lt;br /&gt;
=== Математическое описание алгоритма ===&lt;br /&gt;
Исходные данные: матрица &amp;lt;math&amp;gt;G&amp;lt;/math&amp;gt; (элементы &amp;lt;math&amp;gt;g_{ij}, i, j = 1, \ldots, n&amp;lt;/math&amp;gt;).&lt;br /&gt;
&lt;br /&gt;
Вычисляемые данные: матрица &amp;lt;math&amp;gt;\Sigma = diag(\sigma_{i})&amp;lt;/math&amp;gt;, где &amp;lt;math&amp;gt;\sigma_{i}&amp;lt;/math&amp;gt; - сингулярные числа, &amp;lt;math&amp;gt;U&amp;lt;/math&amp;gt; - матрица левых сингулярных векторов, &amp;lt;math&amp;gt;V&amp;lt;/math&amp;gt; - матрица правых сингулярных векторов.&lt;br /&gt;
&lt;br /&gt;
симметричную матрицу &amp;lt;math&amp;gt;A = (G^TG)&amp;lt;/math&amp;gt; можно привести к диагональному виду:&lt;br /&gt;
&amp;lt;math&amp;gt;RG^TGR^T&amp;lt;/math&amp;gt;, где&lt;br /&gt;
&lt;br /&gt;
&amp;lt;math&amp;gt;&lt;br /&gt;
R(j,k,\theta) = &lt;br /&gt;
\begin{matrix}&lt;br /&gt;
  \\&lt;br /&gt;
  \\&lt;br /&gt;
  \\&lt;br /&gt;
j \\&lt;br /&gt;
  \\&lt;br /&gt;
k \\&lt;br /&gt;
  \\&lt;br /&gt;
  \\&lt;br /&gt;
  \\&lt;br /&gt;
\end{matrix}&lt;br /&gt;
&amp;lt;/math&amp;gt;  &lt;br /&gt;
&amp;lt;math&amp;gt;&lt;br /&gt;
\begin{bmatrix}&lt;br /&gt;
  &amp;amp; 1 &amp;amp;   &amp;amp;        &amp;amp;              &amp;amp;        &amp;amp;               &amp;amp;         &amp;amp;    &amp;amp;   \\&lt;br /&gt;
  &amp;amp;   &amp;amp; 1 &amp;amp;        &amp;amp;              &amp;amp;        &amp;amp;               &amp;amp;         &amp;amp;    &amp;amp;   \\&lt;br /&gt;
  &amp;amp;   &amp;amp;   &amp;amp; \ddots &amp;amp;              &amp;amp;        &amp;amp;               &amp;amp;         &amp;amp;    &amp;amp;   \\&lt;br /&gt;
  &amp;amp;   &amp;amp;   &amp;amp;        &amp;amp; \cos(\theta) &amp;amp;        &amp;amp; -\sin(\theta) &amp;amp;         &amp;amp;    &amp;amp;   \\&lt;br /&gt;
  &amp;amp;   &amp;amp;   &amp;amp;        &amp;amp;              &amp;amp; \ddots &amp;amp;               &amp;amp;         &amp;amp;    &amp;amp;   \\&lt;br /&gt;
  &amp;amp;   &amp;amp;   &amp;amp;        &amp;amp; \sin(\theta) &amp;amp;        &amp;amp; \cos(\theta)  &amp;amp;         &amp;amp;    &amp;amp;   \\&lt;br /&gt;
  &amp;amp;   &amp;amp;   &amp;amp;        &amp;amp;              &amp;amp;        &amp;amp;               &amp;amp; \ddots  &amp;amp;    &amp;amp;   \\&lt;br /&gt;
  &amp;amp;   &amp;amp;   &amp;amp;        &amp;amp;              &amp;amp;        &amp;amp;               &amp;amp;         &amp;amp; 1  &amp;amp;   \\&lt;br /&gt;
  &amp;amp;   &amp;amp;   &amp;amp;        &amp;amp;              &amp;amp;        &amp;amp;               &amp;amp;         &amp;amp;    &amp;amp; 1 \\&lt;br /&gt;
\end{bmatrix}&lt;br /&gt;
&amp;lt;/math&amp;gt;&lt;br /&gt;
&lt;br /&gt;
Обозначим &amp;lt;math&amp;gt;s = \sin \theta&amp;lt;/math&amp;gt; и &amp;lt;math&amp;gt;c = \cos \theta&amp;lt;/math&amp;gt;.&lt;br /&gt;
&lt;br /&gt;
Перемножив матрицы &amp;lt;math&amp;gt;RG^TGR^T&amp;lt;/math&amp;gt;, получим следующие выражения&amp;lt;ref&amp;gt;http://www.astro.tsu.ru/OsChMet/5_2.html&amp;lt;/ref&amp;gt;:&lt;br /&gt;
&lt;br /&gt;
&amp;lt;math&amp;gt;\begin{align}&lt;br /&gt;
 a_{jj}^{(i+1)} &amp;amp;= c^2\, a_{jj}^{(i)}  -  2\, s c \,a_{jk}^{(i)}  +  s^2\, a_{kk}^{(i)} \\&lt;br /&gt;
 a_{kk}^{(i+1)} &amp;amp;= s^2 \,a_{jj}^{(i)}  +  2 s c\, a_{jk}^{(i)}  +  c^2 \, a_{kk}^{(i)} \\&lt;br /&gt;
 a_{jk}^{(i+1)} &amp;amp;= a_{kj}^{(i+1)} = (c^2 - s^2 ) \, a_{jk}^{(i)}  +  s c \, (a_{kk}^{(i)} - a_{jj}^{(i)} ) \\&lt;br /&gt;
 a_{jm}^{(i+1)} &amp;amp;= a_{mj}^{(i+1)} = c \, a_{jm}^{(i)}  -  s \, a_{km}^{(i)} &amp;amp; m \ne j,k \\&lt;br /&gt;
 a_{km}^{(i+1)} &amp;amp;= a_{mk}^{(i+1)} = s \, a_{jm}^{(i)}  + c \, a_{km}^{(i)} &amp;amp; m \ne j,k \\&lt;br /&gt;
 a_{ml}^{(i+1)} &amp;amp;= a_{ml}^{(i)} &amp;amp;m,l \ne j,k&lt;br /&gt;
\end{align}&amp;lt;/math&amp;gt;&lt;br /&gt;
&lt;br /&gt;
Т.к внедиагональные элементы должны быть равны 0, то выбираем &amp;lt;math&amp;gt;\theta&amp;lt;/math&amp;gt; так, чтобы &amp;lt;math&amp;gt;a_{jk}^{(i+1)} = 0&amp;lt;/math&amp;gt; и &amp;lt;math&amp;gt;a_{kj}^{(i+1)} = 0&amp;lt;/math&amp;gt;.&lt;br /&gt;
&lt;br /&gt;
Тогда решая уравнение получаем, что&lt;br /&gt;
&lt;br /&gt;
&amp;lt;math&amp;gt;&lt;br /&gt;
         \begin{align}&lt;br /&gt;
         \tau &amp;amp;= {a_{jj} - a_{kk}}/{2a_{jk}} \\&lt;br /&gt;
         t &amp;amp;= {sign(\tau)}/(|\tau| + \sqrt{1 + \tau^2}) \\&lt;br /&gt;
         c &amp;amp;= 1/(\sqrt{1 + t^2}) \\&lt;br /&gt;
         s &amp;amp;= ct \\&lt;br /&gt;
         \end{align}&amp;lt;/math&amp;gt;&lt;br /&gt;
&lt;br /&gt;
Остановка вычислений алгоритма наступает, когда внедиагональные элементы становятся меньше некоторого наперед заданного числа &amp;lt;math&amp;gt;\varepsilon&amp;lt;/math&amp;gt;.&lt;br /&gt;
&lt;br /&gt;
=== Вычислительное ядро алгоритма ===&lt;br /&gt;
Вычислительное ядро алгоритма составляет непосредственно вычисление одностороннего вращения Якоби, т.е. вычисление элементов матрицы &amp;lt;math&amp;gt;g_{jm}^{(i+1)} = g_{mj}^{(i+1)}&amp;lt;/math&amp;gt; и &amp;lt;math&amp;gt;g_{km}^{(i+1)} = g_{mk}^{(i+1)}&amp;lt;/math&amp;gt;, &amp;lt;math&amp;gt;m \ne j,k&amp;lt;/math&amp;gt;, а также вычисления элементов &amp;lt;math&amp;gt;g_{jj}^{(i+1)} &amp;lt;/math&amp;gt; и &amp;lt;math&amp;gt;g_{kk}^{(i+1)} &amp;lt;/math&amp;gt;, получившихся после умножения промежуточной матрицы на матрицу вращений Якоби:&lt;br /&gt;
&lt;br /&gt;
&amp;lt;math&amp;gt;\begin{align}&lt;br /&gt;
 g_{jj}^{(i+1)} &amp;amp;= c^2\, g_{jj}^{(i)}  -  2\, s c \,g_{jk}^{(i)}  +  s^2\, g_{kk}^{(i)} \\&lt;br /&gt;
 g_{kk}^{(i+1)} &amp;amp;= s^2 \,g_{jj}^{(i)}  +  2 s c\, g_{jk}^{(i)}  +  c^2 \, g_{kk}^{(i)} \\&lt;br /&gt;
 g_{jk}^{(i+1)} &amp;amp;= g_{kj}^{(i+1)} = (c^2 - s^2 ) \, g_{jk}^{(i)}  +  s c \, (g_{kk}^{(i)} - g_{jj}^{(i)} ) \\&lt;br /&gt;
 g_{jm}^{(i+1)} &amp;amp;= g_{mj}^{(i+1)} = c \, g_{jm}^{(i)}  -  s \, g_{km}^{(i)} &amp;amp; m \ne j,k \\&lt;br /&gt;
 g_{km}^{(i+1)} &amp;amp;= g_{mk}^{(i+1)} = s \, g_{jm}^{(i)}  + c \, g_{km}^{(i)} &amp;amp; m \ne j,k \\&lt;br /&gt;
 g_{ml}^{(i+1)} &amp;amp;= g_{ml}^{(i)} &amp;amp;m,l \ne j,k&lt;br /&gt;
\end{align}&amp;lt;/math&amp;gt;&lt;br /&gt;
&lt;br /&gt;
=== Макроструктура алгоритма ===&lt;br /&gt;
Основную часть метода составляет процедура односторонних вращений матрицы, которая в свою очередь состоит из:&lt;br /&gt;
&lt;br /&gt;
#Вычисление &amp;lt;math&amp;gt;\tau, c, s, t&amp;lt;/math&amp;gt;.&lt;br /&gt;
#Одностороннее вращение матрицы. &lt;br /&gt;
&lt;br /&gt;
Что требует &amp;lt;math&amp;gt;O(n)&amp;lt;/math&amp;gt; операций.&lt;br /&gt;
&lt;br /&gt;
После этого необходимо:&lt;br /&gt;
&lt;br /&gt;
#Вычислить сингулярные числа &amp;lt;math&amp;gt;\sigma_i&amp;lt;/math&amp;gt;.  Что требует &amp;lt;math&amp;gt;O(n)&amp;lt;/math&amp;gt; операций.&lt;br /&gt;
#Вычислить &amp;lt;math&amp;gt;U&amp;lt;/math&amp;gt; и &amp;lt;math&amp;gt;V&amp;lt;/math&amp;gt;. Что требует &amp;lt;math&amp;gt;O(n^2)&amp;lt;/math&amp;gt; операций.&lt;br /&gt;
&lt;br /&gt;
=== Схема реализации последовательного алгоритма ===&lt;br /&gt;
Применение метода Якоби к матрице &amp;lt;math&amp;gt;A = (G^TG)&amp;lt;/math&amp;gt; можно описать следующим образом&amp;lt;ref&amp;gt;Дж. Деммель «Вычислительная линейная алгебра» (стр. 261-263)&amp;lt;/ref&amp;gt;:&lt;br /&gt;
&lt;br /&gt;
Если &amp;lt;math&amp;gt;G = U\Sigma V^T&amp;lt;/math&amp;gt; и &amp;lt;math&amp;gt;\Sigma = diag(\sigma_{i})&amp;lt;/math&amp;gt;, то алгоритм вычисляет сингулярные числа &amp;lt;math&amp;gt;\sigma_{i}&amp;lt;/math&amp;gt;, матрицу &amp;lt;math&amp;gt;U&amp;lt;/math&amp;gt; левых сингулярных векторов и матрицу &amp;lt;math&amp;gt;V&amp;lt;/math&amp;gt; правых сингулярных векторов по следующей схеме:&lt;br /&gt;
&lt;br /&gt;
 repeat&lt;br /&gt;
     for &amp;lt;math&amp;gt;j=1&amp;lt;/math&amp;gt; to &amp;lt;math&amp;gt;n-1&amp;lt;/math&amp;gt;&lt;br /&gt;
         for &amp;lt;math&amp;gt;k=j+1&amp;lt;/math&amp;gt; to &amp;lt;math&amp;gt;n&amp;lt;/math&amp;gt;&lt;br /&gt;
             обратиться к процедуре &#039;&#039;&#039;&#039;&#039;One-Sided-Jacobi-Rotation&amp;lt;math&amp;gt;(G,j,k)&amp;lt;/math&amp;gt;&#039;&#039;&#039;&#039;&#039;&lt;br /&gt;
         end for&lt;br /&gt;
     end for&lt;br /&gt;
 пока &amp;lt;math&amp;gt;G^TG&amp;lt;/math&amp;gt; не станет достаточно близка к диагональной матрице&lt;br /&gt;
 Положить &amp;lt;math&amp;gt;\sigma_{i} = ||G(:,i)||_2 &amp;lt;/math&amp;gt; (норма &amp;lt;math&amp;gt;i&amp;lt;/math&amp;gt;-го столбца в &amp;lt;math&amp;gt;G&amp;lt;/math&amp;gt;)&lt;br /&gt;
 Положить &amp;lt;math&amp;gt;U = [u_{1},\dots, u_{n}]&amp;lt;/math&amp;gt;, где &amp;lt;math&amp;gt;u_{i} = G(:,i)/\sigma_{i}&amp;lt;/math&amp;gt;&lt;br /&gt;
 Положить &amp;lt;math&amp;gt;V = J&amp;lt;/math&amp;gt;, где &amp;lt;math&amp;gt;J&amp;lt;/math&amp;gt; - накопленное произведение вращений Якоби.&lt;br /&gt;
&lt;br /&gt;
Где процедура &#039;&#039;&#039;&#039;&#039;One-Sided-Jacobi-Rotation&#039;&#039;&#039;&#039;&#039; является метод односторонних вращений Якоби:&lt;br /&gt;
&lt;br /&gt;
 proc &#039;&#039;&#039;&#039;&#039;One-Sided-Jacobi-Rotation&amp;lt;math&amp;gt;(G,j,k)&amp;lt;/math&amp;gt;&#039;&#039;&#039;&#039;&#039;&lt;br /&gt;
     вычислить &amp;lt;math&amp;gt;a_{jj} = (G^TG)_{jj}, a_{jk} = (G^TG)_{jk}&amp;lt;/math&amp;gt; и &amp;lt;math&amp;gt;a_{kk} = (G^TG)_{kk}&amp;lt;/math&amp;gt;&lt;br /&gt;
     if &amp;lt;math&amp;gt;|a_{jk}|&amp;lt;/math&amp;gt; не слишком мал&lt;br /&gt;
         &amp;lt;math&amp;gt;&lt;br /&gt;
         \begin{align}&lt;br /&gt;
         \tau &amp;amp;= {a_{jj} - a_{kk}}/{2a_{jk}} \\&lt;br /&gt;
         t &amp;amp;= {sign(\tau)}/(|\tau| + \sqrt{1 + \tau^2}) \\&lt;br /&gt;
         c &amp;amp;= 1/(\sqrt{1 + t^2}) \\&lt;br /&gt;
         s &amp;amp;= ct \\&lt;br /&gt;
         G &amp;amp;= GR(j,k,\theta) \  \dots c=cos\theta, s=sin\theta \end{align}&amp;lt;/math&amp;gt;&lt;br /&gt;
         if нужны правые сингулярные векторы &lt;br /&gt;
             &amp;lt;math&amp;gt;J = JR(j,k,\theta)&amp;lt;/math&amp;gt;&lt;br /&gt;
         end if&lt;br /&gt;
     end if&lt;br /&gt;
&lt;br /&gt;
=== Последовательная сложность алгоритма ===&lt;br /&gt;
Для одного вращения Якоби необходимо выполнить &amp;lt;math&amp;gt;O(n)&amp;lt;/math&amp;gt; операций умножения и сложения. &lt;br /&gt;
&lt;br /&gt;
Всего вариантов выбора &amp;lt;math&amp;gt;j&amp;lt;/math&amp;gt; и &amp;lt;math&amp;gt;k&amp;lt;/math&amp;gt; существует &amp;lt;math&amp;gt;\frac{n(n-1)}{2}&amp;lt;/math&amp;gt;.&lt;br /&gt;
&lt;br /&gt;
Таким образом последовательный алгоритм Якоби вычисления сингулярных чисел и векторов является алгоритмом с кубической сложностью.&lt;br /&gt;
&lt;br /&gt;
=== Информационный граф ===&lt;br /&gt;
Граф алгоритма состоит из четырех групп вершин&lt;br /&gt;
&lt;br /&gt;
(А)Первая группа вершин расположена в двумерной области, соответствующая ей операция - вычисление элементов &amp;lt;math&amp;gt;a_{jj},a_{jk},a_{kk}&amp;lt;/math&amp;gt; матрицы произведения &amp;lt;math&amp;gt;A = (G^TG)&amp;lt;/math&amp;gt;. Где &amp;lt;math&amp;gt;j&amp;lt;/math&amp;gt; изменяется от &amp;lt;math&amp;gt;1&amp;lt;/math&amp;gt; до &amp;lt;math&amp;gt;n-1&amp;lt;/math&amp;gt;, принимая все целочисленные значения, &amp;lt;math&amp;gt;k&amp;lt;/math&amp;gt;  изменяется от &amp;lt;math&amp;gt;j+1&amp;lt;/math&amp;gt; до &amp;lt;math&amp;gt;n&amp;lt;/math&amp;gt;, принимая все целочисленные значения.&lt;br /&gt;
&lt;br /&gt;
Граф вычисления каждого из элементов приведен на рисунке 1, где значениям &amp;lt;math&amp;gt;g_{ij}&amp;lt;/math&amp;gt; соответствуют обозначения &amp;lt;math&amp;gt;x_{ij}&amp;lt;/math&amp;gt;, а элементам &amp;lt;math&amp;gt;g^T_{ij}&amp;lt;/math&amp;gt; обозначения &amp;lt;math&amp;gt;z_{ij}&amp;lt;/math&amp;gt;. Значение &amp;lt;math&amp;gt;s_{ij}&amp;lt;/math&amp;gt; является значением результирующего элемента.&lt;br /&gt;
&lt;br /&gt;
(Б)Вторая группа вершин расположена в двумерной области, соответствующая ей операция – вычисление &amp;lt;math&amp;gt;c&amp;lt;/math&amp;gt; и &amp;lt;math&amp;gt;s&amp;lt;/math&amp;gt;.&lt;br /&gt;
&lt;br /&gt;
Информационный граф с входными и выходными данными вычисления пункта (Б) представлен на рисунке 2.&lt;br /&gt;
&lt;br /&gt;
(В)Третья группа вершин расположена в двумерной области, соответствующая ей операция вычисление значений элементов &amp;lt;math&amp;gt;g_{jm}^{(i+1)} = g_{mj}^{(i+1)}&amp;lt;/math&amp;gt; и &amp;lt;math&amp;gt;g_{km}^{(i+1)} = g_{mk}^{(i+1)}&amp;lt;/math&amp;gt;, &amp;lt;math&amp;gt;m \ne j,k&amp;lt;/math&amp;gt;.&lt;br /&gt;
&lt;br /&gt;
(Г)Четвертая группа вершин расположена в двумерной области, соответствующая ей операция вычисление значений элементов &amp;lt;math&amp;gt;g_{jj}^{(i+1)} &amp;lt;/math&amp;gt; и &amp;lt;math&amp;gt;g_{kk}^{(i+1)} &amp;lt;/math&amp;gt;.&lt;br /&gt;
&lt;br /&gt;
Элементы групп (В) и (Г) вычисляются аналогично вычислению элементов матрицы произведения, т.к. фактически представляют собой перемножение матриц &amp;lt;math&amp;gt;G&amp;lt;/math&amp;gt; и &amp;lt;math&amp;gt;R&amp;lt;/math&amp;gt;&lt;br /&gt;
&lt;br /&gt;
[[File:Jacobi_2.jpg|none|thumb|1000px|Рисунок 1. Информационный граф с входными и выходными параметрами вычисления каждого элемента матрицы произведения.]]&lt;br /&gt;
&lt;br /&gt;
[[File:Jacobi_1.jpg|none|thumb|1000px|Рисунок 2. Информационный граф с входными и выходными параметрами вычисления значений &amp;lt;math&amp;gt;c&amp;lt;/math&amp;gt; и &amp;lt;math&amp;gt;s&amp;lt;/math&amp;gt;.]]&lt;br /&gt;
&lt;br /&gt;
Обобщенный граф метода Якоби представлен на рисунке 3, где буквами А, Б, В и Г обозначено вычисление групп вершин (А), (Б), (В) и (Г).&lt;br /&gt;
&lt;br /&gt;
[[File:Graf21.png|none|thumb|2000px|Рисунок 3. Обобщенный граф алгоритма вычисления сингулярных чисел и векторов методом Якоби.]]&lt;br /&gt;
&lt;br /&gt;
=== Ресурс параллелизма алгоритма ===&lt;br /&gt;
Для выполнения одной итерации метода Якоби требуется последовательно выполнить несколько ярусов:&lt;br /&gt;
# вычислить &amp;lt;math&amp;gt;\tau&amp;lt;/math&amp;gt; &lt;br /&gt;
# вычислить &amp;lt;math&amp;gt;t&amp;lt;/math&amp;gt; &lt;br /&gt;
# вычислить &amp;lt;math&amp;gt;c&amp;lt;/math&amp;gt; &lt;br /&gt;
# выполнить поворот матрицы &amp;lt;math&amp;gt;G&amp;lt;/math&amp;gt; с параллельным выполнением &amp;lt;math&amp;gt;2(n-2)&amp;lt;/math&amp;gt; операций вычисления элементов матрицы &amp;lt;math&amp;gt;g_{jm}^{(i+1)} = g_{mj}^{(i+1)}&amp;lt;/math&amp;gt; и &amp;lt;math&amp;gt;g_{km}^{(i+1)} = g_{mk}^{(i+1)}&amp;lt;/math&amp;gt;, &amp;lt;math&amp;gt;m \ne j,k&amp;lt;/math&amp;gt;, а также вычисления элементов &amp;lt;math&amp;gt;g_{jj}^{(i+1)} &amp;lt;/math&amp;gt; и &amp;lt;math&amp;gt;g_{kk}^{(i+1)} &amp;lt;/math&amp;gt;. &lt;br /&gt;
&lt;br /&gt;
Суммарное количество итераций равно &amp;lt;math&amp;gt;\frac{n(n-1)}{2}&amp;lt;/math&amp;gt; (Различные варианты выбора &amp;lt;math&amp;gt;j&amp;lt;/math&amp;gt; и &amp;lt;math&amp;gt;k&amp;lt;/math&amp;gt;). &lt;br /&gt;
&lt;br /&gt;
Асимптотически метод сходится квадратично. &lt;br /&gt;
&lt;br /&gt;
Таким образом, при классификации по высоте ЯПФ метод Якоби относится к алгоритмам со сложностью &amp;lt;math&amp;gt;O(n^2)&amp;lt;/math&amp;gt;&amp;amp;nbsp;, а при классификации по ширине ЯПФ — к алгоритмам со сложностью &amp;lt;math&amp;gt;O(n)&amp;lt;/math&amp;gt;.&lt;br /&gt;
&lt;br /&gt;
=== Входные и выходные данные алгоритма ===&lt;br /&gt;
&#039;&#039;&#039;Входные данные&#039;&#039;&#039;: плотная матрица &amp;lt;math&amp;gt;G&amp;lt;/math&amp;gt; размера &amp;lt;math&amp;gt;n&amp;lt;/math&amp;gt;х&amp;lt;math&amp;gt;n&amp;lt;/math&amp;gt;, где &amp;lt;math&amp;gt;A= G^TG&amp;lt;/math&amp;gt; – симметрическая матрица.&lt;br /&gt;
&lt;br /&gt;
&#039;&#039;&#039;Объём входных данных&#039;&#039;&#039;: &amp;lt;math&amp;gt;n^2&amp;lt;/math&amp;gt; (т.к. для хранения матрицы &amp;lt;math&amp;gt;G&amp;lt;/math&amp;gt; используем двумерный массив размера &amp;lt;math&amp;gt;n&amp;lt;/math&amp;gt;х&amp;lt;math&amp;gt;n&amp;lt;/math&amp;gt;)&lt;br /&gt;
&lt;br /&gt;
&#039;&#039;&#039;Выходные данные&#039;&#039;&#039;: &amp;lt;math&amp;gt;\sigma_{i}&amp;lt;/math&amp;gt;  - сингулярные числа, матрица &amp;lt;math&amp;gt;U&amp;lt;/math&amp;gt; левых сингулярных векторов и матрица &amp;lt;math&amp;gt;V&amp;lt;/math&amp;gt; правых сингулярных векторов.&lt;br /&gt;
&lt;br /&gt;
&#039;&#039;&#039;Объём выходных данных&#039;&#039;&#039;: &amp;lt;math&amp;gt;2n^2 + n&amp;lt;/math&amp;gt; (т.к. необходимо хранить вектор сингулярных чисел длины &amp;lt;math&amp;gt;n&amp;lt;/math&amp;gt;, а также две матрицы &amp;lt;math&amp;gt;U, V&amp;lt;/math&amp;gt; левых и правых сингулярных векторов размера &amp;lt;math&amp;gt;n&amp;lt;/math&amp;gt;х&amp;lt;math&amp;gt;n&amp;lt;/math&amp;gt;).&lt;br /&gt;
&lt;br /&gt;
=== Свойства алгоритма ===&lt;br /&gt;
Метод Якоби является самым медленным из имеющихся алгоритмов вычисления сингулярных чисел и сингулярных векторов матрицы. Тем не менее, для  матриц &amp;lt;math&amp;gt;G&amp;lt;/math&amp;gt;, которые могут быть представлены в виде &amp;lt;math&amp;gt;G=DX&amp;lt;/math&amp;gt;, где &amp;lt;math&amp;gt;D&amp;lt;/math&amp;gt; - диагональная, а &amp;lt;math&amp;gt;X&amp;lt;/math&amp;gt; - хорошо обусловлена, он способен вычислять сингулярные числа и вектора намного точнее, чем другие методы&amp;lt;ref&amp;gt;Дж. Деммель «Вычислительная линейная алгебра» (стр. 261-264)&amp;lt;/ref&amp;gt;. &lt;br /&gt;
&lt;br /&gt;
Вычислительная мощность алгоритма, как отношение числа операций к суммарному объему входных и выходных данных является линейной.&lt;br /&gt;
&lt;br /&gt;
Метод Якоби не детерминирован, так как является итерационным алгоритмом с выходом по точности (число итераций зависит от входных данных и порогового значения).&lt;br /&gt;
&lt;br /&gt;
== Программная реализация алгоритма ==&lt;br /&gt;
&lt;br /&gt;
=== Особенности реализации последовательного алгоритма ===&lt;br /&gt;
&lt;br /&gt;
=== Локальность данных и вычислений ===&lt;br /&gt;
&lt;br /&gt;
=== Возможные способы и особенности параллельной реализации алгоритма ===&lt;br /&gt;
&lt;br /&gt;
=== Масштабируемость алгоритма и его реализации ===&lt;br /&gt;
&lt;br /&gt;
=== Динамические характеристики и эффективность реализации алгоритма ===&lt;br /&gt;
&lt;br /&gt;
=== Выводы для классов архитектур ===&lt;br /&gt;
&lt;br /&gt;
=== Существующие реализации алгоритма ===&lt;br /&gt;
Метод Якоби нахождения сингулярных значений и векторов реализован в таких пакетах, как LAPACK, LINPACK/EISPACK, Intel MKL &amp;lt;ref&amp;gt;https://software.intel.com/ru-ru/node/521153#CAF8CA08-1C69-48F8-B0C3-B2B27AFA92FA&amp;lt;/ref&amp;gt;.&lt;br /&gt;
&lt;br /&gt;
Так же функция Якоби реализована в пакете Matlab.&lt;br /&gt;
&lt;br /&gt;
Т. к. алгоритм считается медленным, он не включен во многие известные пакеты.&lt;br /&gt;
&lt;br /&gt;
== Литература ==&lt;br /&gt;
1. Дж. Деммель Вычислительная линейная алгебра. Изд. Мир, 2001.&lt;/div&gt;</summary>
		<author><name>Davletshuna Alexandra</name></author>
	</entry>
	<entry>
		<id>https://xn--80aecvaldz.xn--80ahdrnmvk.xn--p1ai/w/ru/index.php?title=%D0%A3%D1%87%D0%B0%D1%81%D1%82%D0%BD%D0%B8%D0%BA:Davletshuna_Alexandra/%D0%9C%D0%B5%D1%82%D0%BE%D0%B4_%D0%AF%D0%BA%D0%BE%D0%B1%D0%B8_%D0%B2%D1%8B%D1%87%D0%B8%D1%81%D0%BB%D0%B5%D0%BD%D0%B8%D1%8F_%D1%81%D0%B8%D0%BD%D0%B3%D1%83%D0%BB%D1%8F%D1%80%D0%BD%D1%8B%D1%85_%D1%87%D0%B8%D1%81%D0%B5%D0%BB_%D0%B8_%D0%B2%D0%B5%D0%BA%D1%82%D0%BE%D1%80%D0%BE%D0%B2&amp;diff=15897</id>
		<title>Участник:Davletshuna Alexandra/Метод Якоби вычисления сингулярных чисел и векторов</title>
		<link rel="alternate" type="text/html" href="https://xn--80aecvaldz.xn--80ahdrnmvk.xn--p1ai/w/ru/index.php?title=%D0%A3%D1%87%D0%B0%D1%81%D1%82%D0%BD%D0%B8%D0%BA:Davletshuna_Alexandra/%D0%9C%D0%B5%D1%82%D0%BE%D0%B4_%D0%AF%D0%BA%D0%BE%D0%B1%D0%B8_%D0%B2%D1%8B%D1%87%D0%B8%D1%81%D0%BB%D0%B5%D0%BD%D0%B8%D1%8F_%D1%81%D0%B8%D0%BD%D0%B3%D1%83%D0%BB%D1%8F%D1%80%D0%BD%D1%8B%D1%85_%D1%87%D0%B8%D1%81%D0%B5%D0%BB_%D0%B8_%D0%B2%D0%B5%D0%BA%D1%82%D0%BE%D1%80%D0%BE%D0%B2&amp;diff=15897"/>
		<updated>2016-11-03T13:31:04Z</updated>

		<summary type="html">&lt;p&gt;Davletshuna Alexandra: &lt;/p&gt;
&lt;hr /&gt;
&lt;div&gt;{{Assignment}} &lt;br /&gt;
&lt;br /&gt;
{{algorithm&lt;br /&gt;
| name              = Метод Якоби вычисления сингулярных чисел и векторов&lt;br /&gt;
| serial_complexity = &amp;lt;math&amp;gt;O(n^3)&amp;lt;/math&amp;gt;&lt;br /&gt;
| pf_height         = &amp;lt;math&amp;gt;O(n^2)&amp;lt;/math&amp;gt;&lt;br /&gt;
| pf_width          = &amp;lt;math&amp;gt;O(n)&amp;lt;/math&amp;gt;&lt;br /&gt;
| input_data        = &amp;lt;math&amp;gt;n^2&amp;lt;/math&amp;gt;&lt;br /&gt;
| output_data       = &amp;lt;math&amp;gt;2n^2 + n&amp;lt;/math&amp;gt;&lt;br /&gt;
}}&lt;br /&gt;
&lt;br /&gt;
Авторы статьи: [[Участница:Davletshuna Alexandra|Давлетшина Александра]] (группа 619) пункты 1.1-1.4, 1.6, 2.7; [[Участница:Alek sandra|Зайцева Александра]] (группа 601) пункты 1.5, 1.7-1.10, 2.7.&lt;br /&gt;
&lt;br /&gt;
== Свойства и структура алгоритма ==&lt;br /&gt;
&lt;br /&gt;
=== Общее описание алгоритма ===&lt;br /&gt;
&#039;&#039;&#039;Сингулярным разложением&#039;&#039;&#039; называется разложение прямоугольной вещественной или комплексной матрицы, имеющее широкое применение, в силу своей наглядной геометрической интерпретации, при решении многих прикладных задач. Сингулярное разложение матрицы А позволяет вычислять сингулярные числа данной матрицы, а также, левые и правые сингулярные векторы матрицы А:&lt;br /&gt;
&lt;br /&gt;
•	левые сингулярные векторы матрицы А — это собственные векторы матрицы &amp;lt;math&amp;gt;AA^*&amp;lt;/math&amp;gt;;&lt;br /&gt;
&lt;br /&gt;
•	правые сингулярные векторы матрицы A — это собственные векторы матрицы &amp;lt;math&amp;gt;A^*A&amp;lt;/math&amp;gt;.&lt;br /&gt;
&lt;br /&gt;
Геометрическая интерпретация сингулярного разложения заключается в следующем факте из геометрии: &#039;&#039;Образом любого линейного преобразования, заданного с помощью матрицы &amp;lt;math&amp;gt;m&amp;lt;/math&amp;gt;x&amp;lt;math&amp;gt;n&amp;lt;/math&amp;gt;, примененного к единичной сфере является гиперэллипсоид&#039;&#039;.&lt;br /&gt;
&lt;br /&gt;
Из многочисленных разложений матриц, наиболее удобным является сингулярное разложение матрицы в виде: &amp;lt;math&amp;gt;A=U\Sigma V^*&amp;lt;/math&amp;gt;, где &amp;lt;math&amp;gt;U, V&amp;lt;/math&amp;gt; – унитарные матрицы, а &amp;lt;math&amp;gt;\Sigma&amp;lt;/math&amp;gt; – диагональная матрица с вещественными положительными числами на диагонали &amp;lt;ref&amp;gt;http://algorithms.parallel.ru/&amp;lt;/ref&amp;gt;.&lt;br /&gt;
&lt;br /&gt;
Диагональные элементы матрицы &amp;lt;math&amp;gt;\Sigma&amp;lt;/math&amp;gt; называются сингулярными числами матрицы &amp;lt;math&amp;gt;A&amp;lt;/math&amp;gt;, а столбцы матриц &amp;lt;math&amp;gt;U,V&amp;lt;/math&amp;gt; левыми и правыми сингулярными векторами соответственно.&lt;br /&gt;
&lt;br /&gt;
Алгоритм Якоби сингулярного разложения матрицы был предложен одним из первых в 1846 году. Он приводит прямоугольную матрицу к диагональной матрице с помощью последовательности элементарных вращений. Метод может найти все сингулярные значения с очень высокой точностью. Однако его производительность является довольно низкой, в сравнении с конкурирующими методами.&lt;br /&gt;
&lt;br /&gt;
&#039;&#039;Неявный&#039;&#039;&amp;lt;ref&amp;gt;Дж. Деммель «Вычислительная линейная алгебра» (стр. 261-264)&amp;lt;/ref&amp;gt; метод Якоби математически эквивалентен применению метода Якоби вычисления собственных значений к матрице &amp;lt;math&amp;gt;A = G^TG&amp;lt;/math&amp;gt;.&lt;br /&gt;
Это значит, что на каждом шаге вычисляется вращение Якоби &amp;lt;math&amp;gt;J&amp;lt;/math&amp;gt;, с помощью которого матрица &amp;lt;math&amp;gt;G^TG&amp;lt;/math&amp;gt; неявно пересчитывется в &amp;lt;math&amp;gt;J^TG^TGJ&amp;lt;/math&amp;gt;; вращение выбрано так, чтобы пара внедиагональных элементов из &amp;lt;math&amp;gt;G^TG&amp;lt;/math&amp;gt; обратилась в нули в матрице &amp;lt;math&amp;gt;J^TG^TGJ&amp;lt;/math&amp;gt;. При этом ни &amp;lt;math&amp;gt;G^TG&amp;lt;/math&amp;gt;, ни &amp;lt;math&amp;gt;J^TG^TGJ&amp;lt;/math&amp;gt; не вычисляются в явном виде; вместо них вычисляется матрица &amp;lt;math&amp;gt;GJ&amp;lt;/math&amp;gt;. Поэтому алгоритм называется &#039;&#039;методом односторонних вращений&#039;&#039;.&lt;br /&gt;
&lt;br /&gt;
=== Математическое описание алгоритма ===&lt;br /&gt;
Исходные данные: матрица &amp;lt;math&amp;gt;G&amp;lt;/math&amp;gt; (элементы &amp;lt;math&amp;gt;g_{ij}, i, j = 1, \ldots, n&amp;lt;/math&amp;gt;).&lt;br /&gt;
&lt;br /&gt;
Вычисляемые данные: матрица &amp;lt;math&amp;gt;\Sigma = diag(\sigma_{i})&amp;lt;/math&amp;gt;, где &amp;lt;math&amp;gt;\sigma_{i}&amp;lt;/math&amp;gt; - сингулярные числа, &amp;lt;math&amp;gt;U&amp;lt;/math&amp;gt; - матрица левых сингулярных векторов, &amp;lt;math&amp;gt;V&amp;lt;/math&amp;gt; - матрица правых сингулярных векторов.&lt;br /&gt;
&lt;br /&gt;
симметричную матрицу &amp;lt;math&amp;gt;A = (G^TG)&amp;lt;/math&amp;gt; можно привести к диагональному виду:&lt;br /&gt;
&amp;lt;math&amp;gt;RG^TGR^T&amp;lt;/math&amp;gt;, где&lt;br /&gt;
&lt;br /&gt;
&amp;lt;math&amp;gt;&lt;br /&gt;
R(j,k,\theta) = &lt;br /&gt;
\begin{matrix}&lt;br /&gt;
  \\&lt;br /&gt;
  \\&lt;br /&gt;
  \\&lt;br /&gt;
j \\&lt;br /&gt;
  \\&lt;br /&gt;
k \\&lt;br /&gt;
  \\&lt;br /&gt;
  \\&lt;br /&gt;
  \\&lt;br /&gt;
\end{matrix}&lt;br /&gt;
&amp;lt;/math&amp;gt;  &lt;br /&gt;
&amp;lt;math&amp;gt;&lt;br /&gt;
\begin{bmatrix}&lt;br /&gt;
  &amp;amp; 1 &amp;amp;   &amp;amp;        &amp;amp;              &amp;amp;        &amp;amp;               &amp;amp;         &amp;amp;    &amp;amp;   \\&lt;br /&gt;
  &amp;amp;   &amp;amp; 1 &amp;amp;        &amp;amp;              &amp;amp;        &amp;amp;               &amp;amp;         &amp;amp;    &amp;amp;   \\&lt;br /&gt;
  &amp;amp;   &amp;amp;   &amp;amp; \ddots &amp;amp;              &amp;amp;        &amp;amp;               &amp;amp;         &amp;amp;    &amp;amp;   \\&lt;br /&gt;
  &amp;amp;   &amp;amp;   &amp;amp;        &amp;amp; \cos(\theta) &amp;amp;        &amp;amp; -\sin(\theta) &amp;amp;         &amp;amp;    &amp;amp;   \\&lt;br /&gt;
  &amp;amp;   &amp;amp;   &amp;amp;        &amp;amp;              &amp;amp; \ddots &amp;amp;               &amp;amp;         &amp;amp;    &amp;amp;   \\&lt;br /&gt;
  &amp;amp;   &amp;amp;   &amp;amp;        &amp;amp; \sin(\theta) &amp;amp;        &amp;amp; \cos(\theta)  &amp;amp;         &amp;amp;    &amp;amp;   \\&lt;br /&gt;
  &amp;amp;   &amp;amp;   &amp;amp;        &amp;amp;              &amp;amp;        &amp;amp;               &amp;amp; \ddots  &amp;amp;    &amp;amp;   \\&lt;br /&gt;
  &amp;amp;   &amp;amp;   &amp;amp;        &amp;amp;              &amp;amp;        &amp;amp;               &amp;amp;         &amp;amp; 1  &amp;amp;   \\&lt;br /&gt;
  &amp;amp;   &amp;amp;   &amp;amp;        &amp;amp;              &amp;amp;        &amp;amp;               &amp;amp;         &amp;amp;    &amp;amp; 1 \\&lt;br /&gt;
\end{bmatrix}&lt;br /&gt;
&amp;lt;/math&amp;gt;&lt;br /&gt;
&lt;br /&gt;
Обозначим &amp;lt;math&amp;gt;s = \sin \theta&amp;lt;/math&amp;gt; и &amp;lt;math&amp;gt;c = \cos \theta&amp;lt;/math&amp;gt;.&lt;br /&gt;
&lt;br /&gt;
Перемножив матрицы &amp;lt;math&amp;gt;RG^TGR^T&amp;lt;/math&amp;gt;, получим следующие выражения&amp;lt;ref&amp;gt;http://www.astro.tsu.ru/OsChMet/5_2.html&amp;lt;/ref&amp;gt;:&lt;br /&gt;
&lt;br /&gt;
&amp;lt;math&amp;gt;\begin{align}&lt;br /&gt;
 a_{jj}^{(i+1)} &amp;amp;= c^2\, a_{jj}^{(i)}  -  2\, s c \,a_{jk}^{(i)}  +  s^2\, a_{kk}^{(i)} \\&lt;br /&gt;
 a_{kk}^{(i+1)} &amp;amp;= s^2 \,a_{jj}^{(i)}  +  2 s c\, a_{jk}^{(i)}  +  c^2 \, a_{kk}^{(i)} \\&lt;br /&gt;
 a_{jk}^{(i+1)} &amp;amp;= a_{kj}^{(i+1)} = (c^2 - s^2 ) \, a_{jk}^{(i)}  +  s c \, (a_{kk}^{(i)} - a_{jj}^{(i)} ) \\&lt;br /&gt;
 a_{jm}^{(i+1)} &amp;amp;= a_{mj}^{(i+1)} = c \, a_{jm}^{(i)}  -  s \, a_{km}^{(i)} &amp;amp; m \ne j,k \\&lt;br /&gt;
 a_{km}^{(i+1)} &amp;amp;= a_{mk}^{(i+1)} = s \, a_{jm}^{(i)}  + c \, a_{km}^{(i)} &amp;amp; m \ne j,k \\&lt;br /&gt;
 a_{ml}^{(i+1)} &amp;amp;= a_{ml}^{(i)} &amp;amp;m,l \ne j,k&lt;br /&gt;
\end{align}&amp;lt;/math&amp;gt;&lt;br /&gt;
&lt;br /&gt;
Т.к внедиагональные элементы должны быть равны 0, то выбираем &amp;lt;math&amp;gt;\theta&amp;lt;/math&amp;gt; так, чтобы &amp;lt;math&amp;gt;a_{jk}^{(i+1)} = 0&amp;lt;/math&amp;gt; и &amp;lt;math&amp;gt;a_{kj}^{(i+1)} = 0&amp;lt;/math&amp;gt;.&lt;br /&gt;
&lt;br /&gt;
Тогда решая уравнение получаем, что&lt;br /&gt;
&lt;br /&gt;
&amp;lt;math&amp;gt;&lt;br /&gt;
         \begin{align}&lt;br /&gt;
         \tau &amp;amp;= {a_{jj} - a_{kk}}/{2a_{jk}} \\&lt;br /&gt;
         t &amp;amp;= {sign(\tau)}/(|\tau| + \sqrt{1 + \tau^2}) \\&lt;br /&gt;
         c &amp;amp;= 1/(\sqrt{1 + t^2}) \\&lt;br /&gt;
         s &amp;amp;= ct \\&lt;br /&gt;
         \end{align}&amp;lt;/math&amp;gt;&lt;br /&gt;
&lt;br /&gt;
Остановка вычислений алгоритма наступает, когда внедиагональные элементы становятся меньше некоторого наперед заданного числа &amp;lt;math&amp;gt;\varepsilon&amp;lt;/math&amp;gt;.&lt;br /&gt;
&lt;br /&gt;
=== Вычислительное ядро алгоритма ===&lt;br /&gt;
Вычислительное ядро алгоритма составляет непосредственно вычисление одностороннего вращения Якоби, т.е. вычисление элементов матрицы &amp;lt;math&amp;gt;g_{jm}^{(i+1)} = g_{mj}^{(i+1)}&amp;lt;/math&amp;gt; и &amp;lt;math&amp;gt;g_{km}^{(i+1)} = g_{mk}^{(i+1)}&amp;lt;/math&amp;gt;, &amp;lt;math&amp;gt;m \ne j,k&amp;lt;/math&amp;gt;, а также вычисления элементов &amp;lt;math&amp;gt;g_{jj}^{(i+1)} &amp;lt;/math&amp;gt; и &amp;lt;math&amp;gt;g_{kk}^{(i+1)} &amp;lt;/math&amp;gt;, получившихся после умножения промежуточной матрицы на матрицу вращений Якоби:&lt;br /&gt;
&lt;br /&gt;
&amp;lt;math&amp;gt;\begin{align}&lt;br /&gt;
 g_{jj}^{(i+1)} &amp;amp;= c^2\, g_{jj}^{(i)}  -  2\, s c \,g_{jk}^{(i)}  +  s^2\, g_{kk}^{(i)} \\&lt;br /&gt;
 g_{kk}^{(i+1)} &amp;amp;= s^2 \,g_{jj}^{(i)}  +  2 s c\, g_{jk}^{(i)}  +  c^2 \, g_{kk}^{(i)} \\&lt;br /&gt;
 g_{jk}^{(i+1)} &amp;amp;= g_{kj}^{(i+1)} = (c^2 - s^2 ) \, g_{jk}^{(i)}  +  s c \, (g_{kk}^{(i)} - g_{jj}^{(i)} ) \\&lt;br /&gt;
 g_{jm}^{(i+1)} &amp;amp;= g_{mj}^{(i+1)} = c \, g_{jm}^{(i)}  -  s \, g_{km}^{(i)} &amp;amp; m \ne j,k \\&lt;br /&gt;
 g_{km}^{(i+1)} &amp;amp;= g_{mk}^{(i+1)} = s \, g_{jm}^{(i)}  + c \, g_{km}^{(i)} &amp;amp; m \ne j,k \\&lt;br /&gt;
 g_{ml}^{(i+1)} &amp;amp;= g_{ml}^{(i)} &amp;amp;m,l \ne j,k&lt;br /&gt;
\end{align}&amp;lt;/math&amp;gt;&lt;br /&gt;
&lt;br /&gt;
=== Макроструктура алгоритма ===&lt;br /&gt;
Основную часть метода составляет процедура односторонних вращений матрицы, которая в свою очередь состоит из:&lt;br /&gt;
&lt;br /&gt;
#Вычисление &amp;lt;math&amp;gt;\tau, c, s, t&amp;lt;/math&amp;gt;.&lt;br /&gt;
#Одностороннее вращение матрицы. &lt;br /&gt;
&lt;br /&gt;
Что требует &amp;lt;math&amp;gt;O(n)&amp;lt;/math&amp;gt; операций.&lt;br /&gt;
&lt;br /&gt;
После этого необходимо:&lt;br /&gt;
&lt;br /&gt;
#Вычислить сингулярные числа &amp;lt;math&amp;gt;\sigma_i&amp;lt;/math&amp;gt;.  Что требует &amp;lt;math&amp;gt;O(n)&amp;lt;/math&amp;gt; операций.&lt;br /&gt;
#Вычислить &amp;lt;math&amp;gt;U&amp;lt;/math&amp;gt; и &amp;lt;math&amp;gt;V&amp;lt;/math&amp;gt;. Что требует &amp;lt;math&amp;gt;O(n^2)&amp;lt;/math&amp;gt; операций.&lt;br /&gt;
&lt;br /&gt;
=== Схема реализации последовательного алгоритма ===&lt;br /&gt;
Применение метода Якоби к матрице &amp;lt;math&amp;gt;A = (G^TG)&amp;lt;/math&amp;gt; можно описать следующим образом&amp;lt;ref&amp;gt;Дж. Деммель «Вычислительная линейная алгебра» (стр. 261-263)&amp;lt;/ref&amp;gt;:&lt;br /&gt;
&lt;br /&gt;
Если &amp;lt;math&amp;gt;G = U\Sigma V^T&amp;lt;/math&amp;gt; и &amp;lt;math&amp;gt;\Sigma = diag(\sigma_{i})&amp;lt;/math&amp;gt;, то алгоритм вычисляет сингулярные числа &amp;lt;math&amp;gt;\sigma_{i}&amp;lt;/math&amp;gt;, матрицу &amp;lt;math&amp;gt;U&amp;lt;/math&amp;gt; левых сингулярных векторов и матрицу &amp;lt;math&amp;gt;V&amp;lt;/math&amp;gt; правых сингулярных векторов по следующей схеме:&lt;br /&gt;
&lt;br /&gt;
 repeat&lt;br /&gt;
     for &amp;lt;math&amp;gt;j=1&amp;lt;/math&amp;gt; to &amp;lt;math&amp;gt;n-1&amp;lt;/math&amp;gt;&lt;br /&gt;
         for &amp;lt;math&amp;gt;k=j+1&amp;lt;/math&amp;gt; to &amp;lt;math&amp;gt;n&amp;lt;/math&amp;gt;&lt;br /&gt;
             обратиться к процедуре &#039;&#039;&#039;&#039;&#039;One-Sided-Jacobi-Rotation&amp;lt;math&amp;gt;(G,j,k)&amp;lt;/math&amp;gt;&#039;&#039;&#039;&#039;&#039;&lt;br /&gt;
         end for&lt;br /&gt;
     end for&lt;br /&gt;
 пока &amp;lt;math&amp;gt;G^TG&amp;lt;/math&amp;gt; не станет достаточно близка к диагональной матрице&lt;br /&gt;
 Положить &amp;lt;math&amp;gt;\sigma_{i} = ||G(:,i)||_2 &amp;lt;/math&amp;gt; (норма &amp;lt;math&amp;gt;i&amp;lt;/math&amp;gt;-го столбца в &amp;lt;math&amp;gt;G&amp;lt;/math&amp;gt;)&lt;br /&gt;
 Положить &amp;lt;math&amp;gt;U = [u_{1},\dots, u_{n}]&amp;lt;/math&amp;gt;, где &amp;lt;math&amp;gt;u_{i} = G(:,i)/\sigma_{i}&amp;lt;/math&amp;gt;&lt;br /&gt;
 Положить &amp;lt;math&amp;gt;V = J&amp;lt;/math&amp;gt;, где &amp;lt;math&amp;gt;J&amp;lt;/math&amp;gt; - накопленное произведение вращений Якоби.&lt;br /&gt;
&lt;br /&gt;
Где процедура &#039;&#039;&#039;&#039;&#039;One-Sided-Jacobi-Rotation&#039;&#039;&#039;&#039;&#039; является метод односторонних вращений Якоби:&lt;br /&gt;
&lt;br /&gt;
 proc &#039;&#039;&#039;&#039;&#039;One-Sided-Jacobi-Rotation&amp;lt;math&amp;gt;(G,j,k)&amp;lt;/math&amp;gt;&#039;&#039;&#039;&#039;&#039;&lt;br /&gt;
     вычислить &amp;lt;math&amp;gt;a_{jj} = (G^TG)_{jj}, a_{jk} = (G^TG)_{jk}&amp;lt;/math&amp;gt; и &amp;lt;math&amp;gt;a_{kk} = (G^TG)_{kk}&amp;lt;/math&amp;gt;&lt;br /&gt;
     if &amp;lt;math&amp;gt;|a_{jk}|&amp;lt;/math&amp;gt; не слишком мал&lt;br /&gt;
         &amp;lt;math&amp;gt;&lt;br /&gt;
         \begin{align}&lt;br /&gt;
         \tau &amp;amp;= {a_{jj} - a_{kk}}/{2a_{jk}} \\&lt;br /&gt;
         t &amp;amp;= {sign(\tau)}/(|\tau| + \sqrt{1 + \tau^2}) \\&lt;br /&gt;
         c &amp;amp;= 1/(\sqrt{1 + t^2}) \\&lt;br /&gt;
         s &amp;amp;= ct \\&lt;br /&gt;
         G &amp;amp;= GR(j,k,\theta) \  \dots c=cos\theta, s=sin\theta \end{align}&amp;lt;/math&amp;gt;&lt;br /&gt;
         if нужны правые сингулярные векторы &lt;br /&gt;
             &amp;lt;math&amp;gt;J = JR(j,k,\theta)&amp;lt;/math&amp;gt;&lt;br /&gt;
         end if&lt;br /&gt;
     end if&lt;br /&gt;
&lt;br /&gt;
=== Последовательная сложность алгоритма ===&lt;br /&gt;
Для одного вращения Якоби необходимо выполнить &amp;lt;math&amp;gt;O(n)&amp;lt;/math&amp;gt; операций умножения и сложения. &lt;br /&gt;
&lt;br /&gt;
Всего вариантов выбора &amp;lt;math&amp;gt;j&amp;lt;/math&amp;gt; и &amp;lt;math&amp;gt;k&amp;lt;/math&amp;gt; существует &amp;lt;math&amp;gt;\frac{n(n-1)}{2}&amp;lt;/math&amp;gt;.&lt;br /&gt;
&lt;br /&gt;
Таким образом последовательный алгоритм Якоби вычисления сингулярных чисел и векторов является алгоритмом с кубической сложностью.&lt;br /&gt;
&lt;br /&gt;
=== Информационный граф ===&lt;br /&gt;
Граф алгоритма состоит из четырех групп вершин&lt;br /&gt;
&lt;br /&gt;
(А)Первая группа вершин расположена в двумерной области, соответствующая ей операция - вычисление элементов &amp;lt;math&amp;gt;a_{jj},a_{jk},a_{kk}&amp;lt;/math&amp;gt; матрицы произведения &amp;lt;math&amp;gt;A = (G^TG)&amp;lt;/math&amp;gt;. Где &amp;lt;math&amp;gt;j&amp;lt;/math&amp;gt; изменяется от &amp;lt;math&amp;gt;1&amp;lt;/math&amp;gt; до &amp;lt;math&amp;gt;n-1&amp;lt;/math&amp;gt;, принимая все целочисленные значения, &amp;lt;math&amp;gt;k&amp;lt;/math&amp;gt;  изменяется от &amp;lt;math&amp;gt;j+1&amp;lt;/math&amp;gt; до &amp;lt;math&amp;gt;n&amp;lt;/math&amp;gt;, принимая все целочисленные значения.&lt;br /&gt;
&lt;br /&gt;
Граф вычисления каждого из элементов приведен на рисунке 1, где значениям &amp;lt;math&amp;gt;g_{ij}&amp;lt;/math&amp;gt; соответствуют обозначения &amp;lt;math&amp;gt;x_{ij}&amp;lt;/math&amp;gt;, а элементам &amp;lt;math&amp;gt;g^T_{ij}&amp;lt;/math&amp;gt; обозначения &amp;lt;math&amp;gt;z_{ij}&amp;lt;/math&amp;gt;. Значение &amp;lt;math&amp;gt;s_{ij}&amp;lt;/math&amp;gt; является значением результирующего элемента.&lt;br /&gt;
&lt;br /&gt;
(Б)Вторая группа вершин расположена в двумерной области, соответствующая ей операция – вычисление &amp;lt;math&amp;gt;c&amp;lt;/math&amp;gt; и &amp;lt;math&amp;gt;s&amp;lt;/math&amp;gt;.&lt;br /&gt;
&lt;br /&gt;
Информационный граф с входными и выходными данными вычисления пункта (Б) представлен на рисунке 2.&lt;br /&gt;
&lt;br /&gt;
(В)Третья группа вершин расположена в двумерной области, соответствующая ей операция вычисление значений элементов &amp;lt;math&amp;gt;g_{jm}^{(i+1)} = g_{mj}^{(i+1)}&amp;lt;/math&amp;gt; и &amp;lt;math&amp;gt;g_{km}^{(i+1)} = g_{mk}^{(i+1)}&amp;lt;/math&amp;gt;, &amp;lt;math&amp;gt;m \ne j,k&amp;lt;/math&amp;gt;.&lt;br /&gt;
&lt;br /&gt;
(Г)Четвертая группа вершин расположена в двумерной области, соответствующая ей операция вычисление значений элементов &amp;lt;math&amp;gt;g_{jj}^{(i+1)} &amp;lt;/math&amp;gt; и &amp;lt;math&amp;gt;g_{kk}^{(i+1)} &amp;lt;/math&amp;gt;.&lt;br /&gt;
&lt;br /&gt;
Элементы групп (В) и (Г) вычисляются аналогично вычислению элементов матрицы произведения, т.к. фактически представляют собой перемножение матриц &amp;lt;math&amp;gt;G&amp;lt;/math&amp;gt; и &amp;lt;math&amp;gt;R&amp;lt;/math&amp;gt;&lt;br /&gt;
&lt;br /&gt;
[[File:Jacobi_2.jpg|none|thumb|1000px|Рисунок 1. Информационный граф с входными и выходными параметрами вычисления каждого элемента матрицы произведения.]]&lt;br /&gt;
&lt;br /&gt;
[[File:Jacobi_1.jpg|none|thumb|1000px|Рисунок 2. Информационный граф с входными и выходными параметрами вычисления значений &amp;lt;math&amp;gt;c&amp;lt;/math&amp;gt; и &amp;lt;math&amp;gt;s&amp;lt;/math&amp;gt;.]]&lt;br /&gt;
&lt;br /&gt;
Обобщенный граф метода Якоби представлен на рисунке 3, где буквами А, Б, В и Г обозначено вычисление групп вершин (А), (Б), (В) и (Г).&lt;br /&gt;
&lt;br /&gt;
[[File:Graf21.png|none|thumb|2000px|Рисунок 3. Обобщенный граф алгоритма вычисления сингулярных чисел и векторов методом Якоби.]]&lt;br /&gt;
&lt;br /&gt;
=== Ресурс параллелизма алгоритма ===&lt;br /&gt;
Для выполнения одной итерации метода Якоби требуется последовательно выполнить несколько ярусов:&lt;br /&gt;
# вычислить &amp;lt;math&amp;gt;\tau&amp;lt;/math&amp;gt; &lt;br /&gt;
# вычислить &amp;lt;math&amp;gt;t&amp;lt;/math&amp;gt; &lt;br /&gt;
# вычислить &amp;lt;math&amp;gt;c&amp;lt;/math&amp;gt; &lt;br /&gt;
# выполнить поворот матрицы &amp;lt;math&amp;gt;G&amp;lt;/math&amp;gt; с параллельным выполнением &amp;lt;math&amp;gt;2(n-2)&amp;lt;/math&amp;gt; операций вычисления элементов матрицы &amp;lt;math&amp;gt;g_{jm}^{(i+1)} = g_{mj}^{(i+1)}&amp;lt;/math&amp;gt; и &amp;lt;math&amp;gt;g_{km}^{(i+1)} = g_{mk}^{(i+1)}&amp;lt;/math&amp;gt;, &amp;lt;math&amp;gt;m \ne j,k&amp;lt;/math&amp;gt;, а также вычисления элементов &amp;lt;math&amp;gt;g_{jj}^{(i+1)} &amp;lt;/math&amp;gt; и &amp;lt;math&amp;gt;g_{kk}^{(i+1)} &amp;lt;/math&amp;gt;. &lt;br /&gt;
&lt;br /&gt;
Суммарное количество итераций равно &amp;lt;math&amp;gt;\frac{n(n-1)}{2}&amp;lt;/math&amp;gt; (Различные варианты выбора &amp;lt;math&amp;gt;j&amp;lt;/math&amp;gt; и &amp;lt;math&amp;gt;k&amp;lt;/math&amp;gt;). &lt;br /&gt;
&lt;br /&gt;
Асимптотически метод сходится квадратично. &lt;br /&gt;
&lt;br /&gt;
Таким образом, при классификации по высоте ЯПФ метод Якоби относится к алгоритмам со сложностью &amp;lt;math&amp;gt;O(n^2)&amp;lt;/math&amp;gt;&amp;amp;nbsp;, а при классификации по ширине ЯПФ — к алгоритмам со сложностью &amp;lt;math&amp;gt;O(n)&amp;lt;/math&amp;gt;.&lt;br /&gt;
&lt;br /&gt;
=== Входные и выходные данные алгоритма ===&lt;br /&gt;
&#039;&#039;&#039;Входные данные&#039;&#039;&#039;: плотная матрица &amp;lt;math&amp;gt;G&amp;lt;/math&amp;gt; размера &amp;lt;math&amp;gt;n&amp;lt;/math&amp;gt;х&amp;lt;math&amp;gt;n&amp;lt;/math&amp;gt;, где &amp;lt;math&amp;gt;A= G^TG&amp;lt;/math&amp;gt; – симметрическая матрица.&lt;br /&gt;
&lt;br /&gt;
&#039;&#039;&#039;Объём входных данных&#039;&#039;&#039;: &amp;lt;math&amp;gt;n^2&amp;lt;/math&amp;gt; (т.к. для хранения матрицы &amp;lt;math&amp;gt;G&amp;lt;/math&amp;gt; используем двумерный массив размера &amp;lt;math&amp;gt;n&amp;lt;/math&amp;gt;х&amp;lt;math&amp;gt;n&amp;lt;/math&amp;gt;)&lt;br /&gt;
&lt;br /&gt;
&#039;&#039;&#039;Выходные данные&#039;&#039;&#039;: &amp;lt;math&amp;gt;\sigma_{i}&amp;lt;/math&amp;gt;  - сингулярные числа, матрица &amp;lt;math&amp;gt;U&amp;lt;/math&amp;gt; левых сингулярных векторов и матрица &amp;lt;math&amp;gt;V&amp;lt;/math&amp;gt; правых сингулярных векторов.&lt;br /&gt;
&lt;br /&gt;
&#039;&#039;&#039;Объём выходных данных&#039;&#039;&#039;: &amp;lt;math&amp;gt;2n^2 + n&amp;lt;/math&amp;gt; (т.к. необходимо хранить вектор сингулярных чисел длины &amp;lt;math&amp;gt;n&amp;lt;/math&amp;gt;, а также две матрицы &amp;lt;math&amp;gt;U, V&amp;lt;/math&amp;gt; левых и правых сингулярных векторов размера &amp;lt;math&amp;gt;n&amp;lt;/math&amp;gt;х&amp;lt;math&amp;gt;n&amp;lt;/math&amp;gt;).&lt;br /&gt;
&lt;br /&gt;
=== Свойства алгоритма ===&lt;br /&gt;
Метод Якоби является самым медленным из имеющихся алгоритмов вычисления сингулярных чисел и сингулярных векторов матрицы. Тем не менее, для  матриц &amp;lt;math&amp;gt;G&amp;lt;/math&amp;gt;, которые могут быть представлены в виде &amp;lt;math&amp;gt;G=DX&amp;lt;/math&amp;gt;, где &amp;lt;math&amp;gt;D&amp;lt;/math&amp;gt; - диагональная, а &amp;lt;math&amp;gt;X&amp;lt;/math&amp;gt; - хорошо обусловлена, он способен вычислять сингулярные числа и вектора намного точнее, чем другие методы&amp;lt;ref&amp;gt;Дж. Деммель «Вычислительная линейная алгебра» (стр. 261-264)&amp;lt;/ref&amp;gt;. &lt;br /&gt;
&lt;br /&gt;
Вычислительная мощность алгоритма, как отношение числа операций к суммарному объему входных и выходных данных является линейной.&lt;br /&gt;
&lt;br /&gt;
Метод Якоби не детерминирован, так как является итерационным алгоритмом с выходом по точности (число итераций зависит от входных данных и порогового значения).&lt;br /&gt;
&lt;br /&gt;
== Программная реализация алгоритма ==&lt;br /&gt;
&lt;br /&gt;
=== Особенности реализации последовательного алгоритма ===&lt;br /&gt;
&lt;br /&gt;
=== Локальность данных и вычислений ===&lt;br /&gt;
&lt;br /&gt;
=== Возможные способы и особенности параллельной реализации алгоритма ===&lt;br /&gt;
&lt;br /&gt;
=== Масштабируемость алгоритма и его реализации ===&lt;br /&gt;
&lt;br /&gt;
=== Динамические характеристики и эффективность реализации алгоритма ===&lt;br /&gt;
&lt;br /&gt;
=== Выводы для классов архитектур ===&lt;br /&gt;
&lt;br /&gt;
=== Существующие реализации алгоритма ===&lt;br /&gt;
Метод Якоби нахождения сингулярных значений и векторов реализован в таких пакетах, как LAPACK, LINPACK/EISPACK, Intel MKL &amp;lt;ref&amp;gt;http://www.alglib.net/matrixops/general/svd.php&amp;lt;/ref&amp;gt;.&lt;br /&gt;
&lt;br /&gt;
Так же функция Якоби реализована в пакете Matlab.&lt;br /&gt;
&lt;br /&gt;
Т. к. алгоритм считается медленным, он не включен во многие известные пакеты.&lt;br /&gt;
&lt;br /&gt;
== Литература ==&lt;br /&gt;
1. Дж. Деммель Вычислительная линейная алгебра. Изд. Мир, 2001.&lt;/div&gt;</summary>
		<author><name>Davletshuna Alexandra</name></author>
	</entry>
	<entry>
		<id>https://xn--80aecvaldz.xn--80ahdrnmvk.xn--p1ai/w/ru/index.php?title=%D0%A3%D1%87%D0%B0%D1%81%D1%82%D0%BD%D0%B8%D0%BA:Davletshuna_Alexandra/%D0%9C%D0%B5%D1%82%D0%BE%D0%B4_%D0%AF%D0%BA%D0%BE%D0%B1%D0%B8_%D0%B2%D1%8B%D1%87%D0%B8%D1%81%D0%BB%D0%B5%D0%BD%D0%B8%D1%8F_%D1%81%D0%B8%D0%BD%D0%B3%D1%83%D0%BB%D1%8F%D1%80%D0%BD%D1%8B%D1%85_%D1%87%D0%B8%D1%81%D0%B5%D0%BB_%D0%B8_%D0%B2%D0%B5%D0%BA%D1%82%D0%BE%D1%80%D0%BE%D0%B2&amp;diff=15895</id>
		<title>Участник:Davletshuna Alexandra/Метод Якоби вычисления сингулярных чисел и векторов</title>
		<link rel="alternate" type="text/html" href="https://xn--80aecvaldz.xn--80ahdrnmvk.xn--p1ai/w/ru/index.php?title=%D0%A3%D1%87%D0%B0%D1%81%D1%82%D0%BD%D0%B8%D0%BA:Davletshuna_Alexandra/%D0%9C%D0%B5%D1%82%D0%BE%D0%B4_%D0%AF%D0%BA%D0%BE%D0%B1%D0%B8_%D0%B2%D1%8B%D1%87%D0%B8%D1%81%D0%BB%D0%B5%D0%BD%D0%B8%D1%8F_%D1%81%D0%B8%D0%BD%D0%B3%D1%83%D0%BB%D1%8F%D1%80%D0%BD%D1%8B%D1%85_%D1%87%D0%B8%D1%81%D0%B5%D0%BB_%D0%B8_%D0%B2%D0%B5%D0%BA%D1%82%D0%BE%D1%80%D0%BE%D0%B2&amp;diff=15895"/>
		<updated>2016-11-03T13:30:29Z</updated>

		<summary type="html">&lt;p&gt;Davletshuna Alexandra: /* Информационный граф */&lt;/p&gt;
&lt;hr /&gt;
&lt;div&gt;{{algorithm&lt;br /&gt;
| name              = Метод Якоби вычисления сингулярных чисел и векторов&lt;br /&gt;
| serial_complexity = &amp;lt;math&amp;gt;O(n^3)&amp;lt;/math&amp;gt;&lt;br /&gt;
| pf_height         = &amp;lt;math&amp;gt;O(n^2)&amp;lt;/math&amp;gt;&lt;br /&gt;
| pf_width          = &amp;lt;math&amp;gt;O(n)&amp;lt;/math&amp;gt;&lt;br /&gt;
| input_data        = &amp;lt;math&amp;gt;n^2&amp;lt;/math&amp;gt;&lt;br /&gt;
| output_data       = &amp;lt;math&amp;gt;2n^2 + n&amp;lt;/math&amp;gt;&lt;br /&gt;
}}&lt;br /&gt;
&lt;br /&gt;
Авторы статьи: [[Участница:Davletshuna Alexandra|Давлетшина Александра]] (группа 619) пункты 1.1-1.4, 1.6, 2.7; [[Участница:Alek sandra|Зайцева Александра]] (группа 601) пункты 1.5, 1.7-1.10, 2.7.&lt;br /&gt;
&lt;br /&gt;
== Свойства и структура алгоритма ==&lt;br /&gt;
&lt;br /&gt;
=== Общее описание алгоритма ===&lt;br /&gt;
&#039;&#039;&#039;Сингулярным разложением&#039;&#039;&#039; называется разложение прямоугольной вещественной или комплексной матрицы, имеющее широкое применение, в силу своей наглядной геометрической интерпретации, при решении многих прикладных задач. Сингулярное разложение матрицы А позволяет вычислять сингулярные числа данной матрицы, а также, левые и правые сингулярные векторы матрицы А:&lt;br /&gt;
&lt;br /&gt;
•	левые сингулярные векторы матрицы А — это собственные векторы матрицы &amp;lt;math&amp;gt;AA^*&amp;lt;/math&amp;gt;;&lt;br /&gt;
&lt;br /&gt;
•	правые сингулярные векторы матрицы A — это собственные векторы матрицы &amp;lt;math&amp;gt;A^*A&amp;lt;/math&amp;gt;.&lt;br /&gt;
&lt;br /&gt;
Геометрическая интерпретация сингулярного разложения заключается в следующем факте из геометрии: &#039;&#039;Образом любого линейного преобразования, заданного с помощью матрицы &amp;lt;math&amp;gt;m&amp;lt;/math&amp;gt;x&amp;lt;math&amp;gt;n&amp;lt;/math&amp;gt;, примененного к единичной сфере является гиперэллипсоид&#039;&#039;.&lt;br /&gt;
&lt;br /&gt;
Из многочисленных разложений матриц, наиболее удобным является сингулярное разложение матрицы в виде: &amp;lt;math&amp;gt;A=U\Sigma V^*&amp;lt;/math&amp;gt;, где &amp;lt;math&amp;gt;U, V&amp;lt;/math&amp;gt; – унитарные матрицы, а &amp;lt;math&amp;gt;\Sigma&amp;lt;/math&amp;gt; – диагональная матрица с вещественными положительными числами на диагонали &amp;lt;ref&amp;gt;http://algorithms.parallel.ru/&amp;lt;/ref&amp;gt;.&lt;br /&gt;
&lt;br /&gt;
Диагональные элементы матрицы &amp;lt;math&amp;gt;\Sigma&amp;lt;/math&amp;gt; называются сингулярными числами матрицы &amp;lt;math&amp;gt;A&amp;lt;/math&amp;gt;, а столбцы матриц &amp;lt;math&amp;gt;U,V&amp;lt;/math&amp;gt; левыми и правыми сингулярными векторами соответственно.&lt;br /&gt;
&lt;br /&gt;
Алгоритм Якоби сингулярного разложения матрицы был предложен одним из первых в 1846 году. Он приводит прямоугольную матрицу к диагональной матрице с помощью последовательности элементарных вращений. Метод может найти все сингулярные значения с очень высокой точностью. Однако его производительность является довольно низкой, в сравнении с конкурирующими методами.&lt;br /&gt;
&lt;br /&gt;
&#039;&#039;Неявный&#039;&#039;&amp;lt;ref&amp;gt;Дж. Деммель «Вычислительная линейная алгебра» (стр. 261-264)&amp;lt;/ref&amp;gt; метод Якоби математически эквивалентен применению метода Якоби вычисления собственных значений к матрице &amp;lt;math&amp;gt;A = G^TG&amp;lt;/math&amp;gt;.&lt;br /&gt;
Это значит, что на каждом шаге вычисляется вращение Якоби &amp;lt;math&amp;gt;J&amp;lt;/math&amp;gt;, с помощью которого матрица &amp;lt;math&amp;gt;G^TG&amp;lt;/math&amp;gt; неявно пересчитывется в &amp;lt;math&amp;gt;J^TG^TGJ&amp;lt;/math&amp;gt;; вращение выбрано так, чтобы пара внедиагональных элементов из &amp;lt;math&amp;gt;G^TG&amp;lt;/math&amp;gt; обратилась в нули в матрице &amp;lt;math&amp;gt;J^TG^TGJ&amp;lt;/math&amp;gt;. При этом ни &amp;lt;math&amp;gt;G^TG&amp;lt;/math&amp;gt;, ни &amp;lt;math&amp;gt;J^TG^TGJ&amp;lt;/math&amp;gt; не вычисляются в явном виде; вместо них вычисляется матрица &amp;lt;math&amp;gt;GJ&amp;lt;/math&amp;gt;. Поэтому алгоритм называется &#039;&#039;методом односторонних вращений&#039;&#039;.&lt;br /&gt;
&lt;br /&gt;
=== Математическое описание алгоритма ===&lt;br /&gt;
Исходные данные: матрица &amp;lt;math&amp;gt;G&amp;lt;/math&amp;gt; (элементы &amp;lt;math&amp;gt;g_{ij}, i, j = 1, \ldots, n&amp;lt;/math&amp;gt;).&lt;br /&gt;
&lt;br /&gt;
Вычисляемые данные: матрица &amp;lt;math&amp;gt;\Sigma = diag(\sigma_{i})&amp;lt;/math&amp;gt;, где &amp;lt;math&amp;gt;\sigma_{i}&amp;lt;/math&amp;gt; - сингулярные числа, &amp;lt;math&amp;gt;U&amp;lt;/math&amp;gt; - матрица левых сингулярных векторов, &amp;lt;math&amp;gt;V&amp;lt;/math&amp;gt; - матрица правых сингулярных векторов.&lt;br /&gt;
&lt;br /&gt;
симметричную матрицу &amp;lt;math&amp;gt;A = (G^TG)&amp;lt;/math&amp;gt; можно привести к диагональному виду:&lt;br /&gt;
&amp;lt;math&amp;gt;RG^TGR^T&amp;lt;/math&amp;gt;, где&lt;br /&gt;
&lt;br /&gt;
&amp;lt;math&amp;gt;&lt;br /&gt;
R(j,k,\theta) = &lt;br /&gt;
\begin{matrix}&lt;br /&gt;
  \\&lt;br /&gt;
  \\&lt;br /&gt;
  \\&lt;br /&gt;
j \\&lt;br /&gt;
  \\&lt;br /&gt;
k \\&lt;br /&gt;
  \\&lt;br /&gt;
  \\&lt;br /&gt;
  \\&lt;br /&gt;
\end{matrix}&lt;br /&gt;
&amp;lt;/math&amp;gt;  &lt;br /&gt;
&amp;lt;math&amp;gt;&lt;br /&gt;
\begin{bmatrix}&lt;br /&gt;
  &amp;amp; 1 &amp;amp;   &amp;amp;        &amp;amp;              &amp;amp;        &amp;amp;               &amp;amp;         &amp;amp;    &amp;amp;   \\&lt;br /&gt;
  &amp;amp;   &amp;amp; 1 &amp;amp;        &amp;amp;              &amp;amp;        &amp;amp;               &amp;amp;         &amp;amp;    &amp;amp;   \\&lt;br /&gt;
  &amp;amp;   &amp;amp;   &amp;amp; \ddots &amp;amp;              &amp;amp;        &amp;amp;               &amp;amp;         &amp;amp;    &amp;amp;   \\&lt;br /&gt;
  &amp;amp;   &amp;amp;   &amp;amp;        &amp;amp; \cos(\theta) &amp;amp;        &amp;amp; -\sin(\theta) &amp;amp;         &amp;amp;    &amp;amp;   \\&lt;br /&gt;
  &amp;amp;   &amp;amp;   &amp;amp;        &amp;amp;              &amp;amp; \ddots &amp;amp;               &amp;amp;         &amp;amp;    &amp;amp;   \\&lt;br /&gt;
  &amp;amp;   &amp;amp;   &amp;amp;        &amp;amp; \sin(\theta) &amp;amp;        &amp;amp; \cos(\theta)  &amp;amp;         &amp;amp;    &amp;amp;   \\&lt;br /&gt;
  &amp;amp;   &amp;amp;   &amp;amp;        &amp;amp;              &amp;amp;        &amp;amp;               &amp;amp; \ddots  &amp;amp;    &amp;amp;   \\&lt;br /&gt;
  &amp;amp;   &amp;amp;   &amp;amp;        &amp;amp;              &amp;amp;        &amp;amp;               &amp;amp;         &amp;amp; 1  &amp;amp;   \\&lt;br /&gt;
  &amp;amp;   &amp;amp;   &amp;amp;        &amp;amp;              &amp;amp;        &amp;amp;               &amp;amp;         &amp;amp;    &amp;amp; 1 \\&lt;br /&gt;
\end{bmatrix}&lt;br /&gt;
&amp;lt;/math&amp;gt;&lt;br /&gt;
&lt;br /&gt;
Обозначим &amp;lt;math&amp;gt;s = \sin \theta&amp;lt;/math&amp;gt; и &amp;lt;math&amp;gt;c = \cos \theta&amp;lt;/math&amp;gt;.&lt;br /&gt;
&lt;br /&gt;
Перемножив матрицы &amp;lt;math&amp;gt;RG^TGR^T&amp;lt;/math&amp;gt;, получим следующие выражения&amp;lt;ref&amp;gt;http://www.astro.tsu.ru/OsChMet/5_2.html&amp;lt;/ref&amp;gt;:&lt;br /&gt;
&lt;br /&gt;
&amp;lt;math&amp;gt;\begin{align}&lt;br /&gt;
 a_{jj}^{(i+1)} &amp;amp;= c^2\, a_{jj}^{(i)}  -  2\, s c \,a_{jk}^{(i)}  +  s^2\, a_{kk}^{(i)} \\&lt;br /&gt;
 a_{kk}^{(i+1)} &amp;amp;= s^2 \,a_{jj}^{(i)}  +  2 s c\, a_{jk}^{(i)}  +  c^2 \, a_{kk}^{(i)} \\&lt;br /&gt;
 a_{jk}^{(i+1)} &amp;amp;= a_{kj}^{(i+1)} = (c^2 - s^2 ) \, a_{jk}^{(i)}  +  s c \, (a_{kk}^{(i)} - a_{jj}^{(i)} ) \\&lt;br /&gt;
 a_{jm}^{(i+1)} &amp;amp;= a_{mj}^{(i+1)} = c \, a_{jm}^{(i)}  -  s \, a_{km}^{(i)} &amp;amp; m \ne j,k \\&lt;br /&gt;
 a_{km}^{(i+1)} &amp;amp;= a_{mk}^{(i+1)} = s \, a_{jm}^{(i)}  + c \, a_{km}^{(i)} &amp;amp; m \ne j,k \\&lt;br /&gt;
 a_{ml}^{(i+1)} &amp;amp;= a_{ml}^{(i)} &amp;amp;m,l \ne j,k&lt;br /&gt;
\end{align}&amp;lt;/math&amp;gt;&lt;br /&gt;
&lt;br /&gt;
Т.к внедиагональные элементы должны быть равны 0, то выбираем &amp;lt;math&amp;gt;\theta&amp;lt;/math&amp;gt; так, чтобы &amp;lt;math&amp;gt;a_{jk}^{(i+1)} = 0&amp;lt;/math&amp;gt; и &amp;lt;math&amp;gt;a_{kj}^{(i+1)} = 0&amp;lt;/math&amp;gt;.&lt;br /&gt;
&lt;br /&gt;
Тогда решая уравнение получаем, что&lt;br /&gt;
&lt;br /&gt;
&amp;lt;math&amp;gt;&lt;br /&gt;
         \begin{align}&lt;br /&gt;
         \tau &amp;amp;= {a_{jj} - a_{kk}}/{2a_{jk}} \\&lt;br /&gt;
         t &amp;amp;= {sign(\tau)}/(|\tau| + \sqrt{1 + \tau^2}) \\&lt;br /&gt;
         c &amp;amp;= 1/(\sqrt{1 + t^2}) \\&lt;br /&gt;
         s &amp;amp;= ct \\&lt;br /&gt;
         \end{align}&amp;lt;/math&amp;gt;&lt;br /&gt;
&lt;br /&gt;
Остановка вычислений алгоритма наступает, когда внедиагональные элементы становятся меньше некоторого наперед заданного числа &amp;lt;math&amp;gt;\varepsilon&amp;lt;/math&amp;gt;.&lt;br /&gt;
&lt;br /&gt;
=== Вычислительное ядро алгоритма ===&lt;br /&gt;
Вычислительное ядро алгоритма составляет непосредственно вычисление одностороннего вращения Якоби, т.е. вычисление элементов матрицы &amp;lt;math&amp;gt;g_{jm}^{(i+1)} = g_{mj}^{(i+1)}&amp;lt;/math&amp;gt; и &amp;lt;math&amp;gt;g_{km}^{(i+1)} = g_{mk}^{(i+1)}&amp;lt;/math&amp;gt;, &amp;lt;math&amp;gt;m \ne j,k&amp;lt;/math&amp;gt;, а также вычисления элементов &amp;lt;math&amp;gt;g_{jj}^{(i+1)} &amp;lt;/math&amp;gt; и &amp;lt;math&amp;gt;g_{kk}^{(i+1)} &amp;lt;/math&amp;gt;, получившихся после умножения промежуточной матрицы на матрицу вращений Якоби:&lt;br /&gt;
&lt;br /&gt;
&amp;lt;math&amp;gt;\begin{align}&lt;br /&gt;
 g_{jj}^{(i+1)} &amp;amp;= c^2\, g_{jj}^{(i)}  -  2\, s c \,g_{jk}^{(i)}  +  s^2\, g_{kk}^{(i)} \\&lt;br /&gt;
 g_{kk}^{(i+1)} &amp;amp;= s^2 \,g_{jj}^{(i)}  +  2 s c\, g_{jk}^{(i)}  +  c^2 \, g_{kk}^{(i)} \\&lt;br /&gt;
 g_{jk}^{(i+1)} &amp;amp;= g_{kj}^{(i+1)} = (c^2 - s^2 ) \, g_{jk}^{(i)}  +  s c \, (g_{kk}^{(i)} - g_{jj}^{(i)} ) \\&lt;br /&gt;
 g_{jm}^{(i+1)} &amp;amp;= g_{mj}^{(i+1)} = c \, g_{jm}^{(i)}  -  s \, g_{km}^{(i)} &amp;amp; m \ne j,k \\&lt;br /&gt;
 g_{km}^{(i+1)} &amp;amp;= g_{mk}^{(i+1)} = s \, g_{jm}^{(i)}  + c \, g_{km}^{(i)} &amp;amp; m \ne j,k \\&lt;br /&gt;
 g_{ml}^{(i+1)} &amp;amp;= g_{ml}^{(i)} &amp;amp;m,l \ne j,k&lt;br /&gt;
\end{align}&amp;lt;/math&amp;gt;&lt;br /&gt;
&lt;br /&gt;
=== Макроструктура алгоритма ===&lt;br /&gt;
Основную часть метода составляет процедура односторонних вращений матрицы, которая в свою очередь состоит из:&lt;br /&gt;
&lt;br /&gt;
#Вычисление &amp;lt;math&amp;gt;\tau, c, s, t&amp;lt;/math&amp;gt;.&lt;br /&gt;
#Одностороннее вращение матрицы. &lt;br /&gt;
&lt;br /&gt;
Что требует &amp;lt;math&amp;gt;O(n)&amp;lt;/math&amp;gt; операций.&lt;br /&gt;
&lt;br /&gt;
После этого необходимо:&lt;br /&gt;
&lt;br /&gt;
#Вычислить сингулярные числа &amp;lt;math&amp;gt;\sigma_i&amp;lt;/math&amp;gt;.  Что требует &amp;lt;math&amp;gt;O(n)&amp;lt;/math&amp;gt; операций.&lt;br /&gt;
#Вычислить &amp;lt;math&amp;gt;U&amp;lt;/math&amp;gt; и &amp;lt;math&amp;gt;V&amp;lt;/math&amp;gt;. Что требует &amp;lt;math&amp;gt;O(n^2)&amp;lt;/math&amp;gt; операций.&lt;br /&gt;
&lt;br /&gt;
=== Схема реализации последовательного алгоритма ===&lt;br /&gt;
Применение метода Якоби к матрице &amp;lt;math&amp;gt;A = (G^TG)&amp;lt;/math&amp;gt; можно описать следующим образом&amp;lt;ref&amp;gt;Дж. Деммель «Вычислительная линейная алгебра» (стр. 261-263)&amp;lt;/ref&amp;gt;:&lt;br /&gt;
&lt;br /&gt;
Если &amp;lt;math&amp;gt;G = U\Sigma V^T&amp;lt;/math&amp;gt; и &amp;lt;math&amp;gt;\Sigma = diag(\sigma_{i})&amp;lt;/math&amp;gt;, то алгоритм вычисляет сингулярные числа &amp;lt;math&amp;gt;\sigma_{i}&amp;lt;/math&amp;gt;, матрицу &amp;lt;math&amp;gt;U&amp;lt;/math&amp;gt; левых сингулярных векторов и матрицу &amp;lt;math&amp;gt;V&amp;lt;/math&amp;gt; правых сингулярных векторов по следующей схеме:&lt;br /&gt;
&lt;br /&gt;
 repeat&lt;br /&gt;
     for &amp;lt;math&amp;gt;j=1&amp;lt;/math&amp;gt; to &amp;lt;math&amp;gt;n-1&amp;lt;/math&amp;gt;&lt;br /&gt;
         for &amp;lt;math&amp;gt;k=j+1&amp;lt;/math&amp;gt; to &amp;lt;math&amp;gt;n&amp;lt;/math&amp;gt;&lt;br /&gt;
             обратиться к процедуре &#039;&#039;&#039;&#039;&#039;One-Sided-Jacobi-Rotation&amp;lt;math&amp;gt;(G,j,k)&amp;lt;/math&amp;gt;&#039;&#039;&#039;&#039;&#039;&lt;br /&gt;
         end for&lt;br /&gt;
     end for&lt;br /&gt;
 пока &amp;lt;math&amp;gt;G^TG&amp;lt;/math&amp;gt; не станет достаточно близка к диагональной матрице&lt;br /&gt;
 Положить &amp;lt;math&amp;gt;\sigma_{i} = ||G(:,i)||_2 &amp;lt;/math&amp;gt; (норма &amp;lt;math&amp;gt;i&amp;lt;/math&amp;gt;-го столбца в &amp;lt;math&amp;gt;G&amp;lt;/math&amp;gt;)&lt;br /&gt;
 Положить &amp;lt;math&amp;gt;U = [u_{1},\dots, u_{n}]&amp;lt;/math&amp;gt;, где &amp;lt;math&amp;gt;u_{i} = G(:,i)/\sigma_{i}&amp;lt;/math&amp;gt;&lt;br /&gt;
 Положить &amp;lt;math&amp;gt;V = J&amp;lt;/math&amp;gt;, где &amp;lt;math&amp;gt;J&amp;lt;/math&amp;gt; - накопленное произведение вращений Якоби.&lt;br /&gt;
&lt;br /&gt;
Где процедура &#039;&#039;&#039;&#039;&#039;One-Sided-Jacobi-Rotation&#039;&#039;&#039;&#039;&#039; является метод односторонних вращений Якоби:&lt;br /&gt;
&lt;br /&gt;
 proc &#039;&#039;&#039;&#039;&#039;One-Sided-Jacobi-Rotation&amp;lt;math&amp;gt;(G,j,k)&amp;lt;/math&amp;gt;&#039;&#039;&#039;&#039;&#039;&lt;br /&gt;
     вычислить &amp;lt;math&amp;gt;a_{jj} = (G^TG)_{jj}, a_{jk} = (G^TG)_{jk}&amp;lt;/math&amp;gt; и &amp;lt;math&amp;gt;a_{kk} = (G^TG)_{kk}&amp;lt;/math&amp;gt;&lt;br /&gt;
     if &amp;lt;math&amp;gt;|a_{jk}|&amp;lt;/math&amp;gt; не слишком мал&lt;br /&gt;
         &amp;lt;math&amp;gt;&lt;br /&gt;
         \begin{align}&lt;br /&gt;
         \tau &amp;amp;= {a_{jj} - a_{kk}}/{2a_{jk}} \\&lt;br /&gt;
         t &amp;amp;= {sign(\tau)}/(|\tau| + \sqrt{1 + \tau^2}) \\&lt;br /&gt;
         c &amp;amp;= 1/(\sqrt{1 + t^2}) \\&lt;br /&gt;
         s &amp;amp;= ct \\&lt;br /&gt;
         G &amp;amp;= GR(j,k,\theta) \  \dots c=cos\theta, s=sin\theta \end{align}&amp;lt;/math&amp;gt;&lt;br /&gt;
         if нужны правые сингулярные векторы &lt;br /&gt;
             &amp;lt;math&amp;gt;J = JR(j,k,\theta)&amp;lt;/math&amp;gt;&lt;br /&gt;
         end if&lt;br /&gt;
     end if&lt;br /&gt;
&lt;br /&gt;
=== Последовательная сложность алгоритма ===&lt;br /&gt;
Для одного вращения Якоби необходимо выполнить &amp;lt;math&amp;gt;O(n)&amp;lt;/math&amp;gt; операций умножения и сложения. &lt;br /&gt;
&lt;br /&gt;
Всего вариантов выбора &amp;lt;math&amp;gt;j&amp;lt;/math&amp;gt; и &amp;lt;math&amp;gt;k&amp;lt;/math&amp;gt; существует &amp;lt;math&amp;gt;\frac{n(n-1)}{2}&amp;lt;/math&amp;gt;.&lt;br /&gt;
&lt;br /&gt;
Таким образом последовательный алгоритм Якоби вычисления сингулярных чисел и векторов является алгоритмом с кубической сложностью.&lt;br /&gt;
&lt;br /&gt;
=== Информационный граф ===&lt;br /&gt;
Граф алгоритма состоит из четырех групп вершин&lt;br /&gt;
&lt;br /&gt;
(А)Первая группа вершин расположена в двумерной области, соответствующая ей операция - вычисление элементов &amp;lt;math&amp;gt;a_{jj},a_{jk},a_{kk}&amp;lt;/math&amp;gt; матрицы произведения &amp;lt;math&amp;gt;A = (G^TG)&amp;lt;/math&amp;gt;. Где &amp;lt;math&amp;gt;j&amp;lt;/math&amp;gt; изменяется от &amp;lt;math&amp;gt;1&amp;lt;/math&amp;gt; до &amp;lt;math&amp;gt;n-1&amp;lt;/math&amp;gt;, принимая все целочисленные значения, &amp;lt;math&amp;gt;k&amp;lt;/math&amp;gt;  изменяется от &amp;lt;math&amp;gt;j+1&amp;lt;/math&amp;gt; до &amp;lt;math&amp;gt;n&amp;lt;/math&amp;gt;, принимая все целочисленные значения.&lt;br /&gt;
&lt;br /&gt;
Граф вычисления каждого из элементов приведен на рисунке 1, где значениям &amp;lt;math&amp;gt;g_{ij}&amp;lt;/math&amp;gt; соответствуют обозначения &amp;lt;math&amp;gt;x_{ij}&amp;lt;/math&amp;gt;, а элементам &amp;lt;math&amp;gt;g^T_{ij}&amp;lt;/math&amp;gt; обозначения &amp;lt;math&amp;gt;z_{ij}&amp;lt;/math&amp;gt;. Значение &amp;lt;math&amp;gt;s_{ij}&amp;lt;/math&amp;gt; является значением результирующего элемента.&lt;br /&gt;
&lt;br /&gt;
(Б)Вторая группа вершин расположена в двумерной области, соответствующая ей операция – вычисление &amp;lt;math&amp;gt;c&amp;lt;/math&amp;gt; и &amp;lt;math&amp;gt;s&amp;lt;/math&amp;gt;.&lt;br /&gt;
&lt;br /&gt;
Информационный граф с входными и выходными данными вычисления пункта (Б) представлен на рисунке 2.&lt;br /&gt;
&lt;br /&gt;
(В)Третья группа вершин расположена в двумерной области, соответствующая ей операция вычисление значений элементов &amp;lt;math&amp;gt;g_{jm}^{(i+1)} = g_{mj}^{(i+1)}&amp;lt;/math&amp;gt; и &amp;lt;math&amp;gt;g_{km}^{(i+1)} = g_{mk}^{(i+1)}&amp;lt;/math&amp;gt;, &amp;lt;math&amp;gt;m \ne j,k&amp;lt;/math&amp;gt;.&lt;br /&gt;
&lt;br /&gt;
(Г)Четвертая группа вершин расположена в двумерной области, соответствующая ей операция вычисление значений элементов &amp;lt;math&amp;gt;g_{jj}^{(i+1)} &amp;lt;/math&amp;gt; и &amp;lt;math&amp;gt;g_{kk}^{(i+1)} &amp;lt;/math&amp;gt;.&lt;br /&gt;
&lt;br /&gt;
Элементы групп (В) и (Г) вычисляются аналогично вычислению элементов матрицы произведения, т.к. фактически представляют собой перемножение матриц &amp;lt;math&amp;gt;G&amp;lt;/math&amp;gt; и &amp;lt;math&amp;gt;R&amp;lt;/math&amp;gt;&lt;br /&gt;
&lt;br /&gt;
[[File:Jacobi_2.jpg|none|thumb|1000px|Рисунок 1. Информационный граф с входными и выходными параметрами вычисления каждого элемента матрицы произведения.]]&lt;br /&gt;
&lt;br /&gt;
[[File:Jacobi_1.jpg|none|thumb|1000px|Рисунок 2. Информационный граф с входными и выходными параметрами вычисления значений &amp;lt;math&amp;gt;c&amp;lt;/math&amp;gt; и &amp;lt;math&amp;gt;s&amp;lt;/math&amp;gt;.]]&lt;br /&gt;
&lt;br /&gt;
Обобщенный граф метода Якоби представлен на рисунке 3, где буквами А, Б, В и Г обозначено вычисление групп вершин (А), (Б), (В) и (Г).&lt;br /&gt;
&lt;br /&gt;
[[File:Graf21.png|none|thumb|2000px|Рисунок 3. Обобщенный граф алгоритма вычисления сингулярных чисел и векторов методом Якоби.]]&lt;br /&gt;
&lt;br /&gt;
=== Ресурс параллелизма алгоритма ===&lt;br /&gt;
Для выполнения одной итерации метода Якоби требуется последовательно выполнить несколько ярусов:&lt;br /&gt;
# вычислить &amp;lt;math&amp;gt;\tau&amp;lt;/math&amp;gt; &lt;br /&gt;
# вычислить &amp;lt;math&amp;gt;t&amp;lt;/math&amp;gt; &lt;br /&gt;
# вычислить &amp;lt;math&amp;gt;c&amp;lt;/math&amp;gt; &lt;br /&gt;
# выполнить поворот матрицы &amp;lt;math&amp;gt;G&amp;lt;/math&amp;gt; с параллельным выполнением &amp;lt;math&amp;gt;2(n-2)&amp;lt;/math&amp;gt; операций вычисления элементов матрицы &amp;lt;math&amp;gt;g_{jm}^{(i+1)} = g_{mj}^{(i+1)}&amp;lt;/math&amp;gt; и &amp;lt;math&amp;gt;g_{km}^{(i+1)} = g_{mk}^{(i+1)}&amp;lt;/math&amp;gt;, &amp;lt;math&amp;gt;m \ne j,k&amp;lt;/math&amp;gt;, а также вычисления элементов &amp;lt;math&amp;gt;g_{jj}^{(i+1)} &amp;lt;/math&amp;gt; и &amp;lt;math&amp;gt;g_{kk}^{(i+1)} &amp;lt;/math&amp;gt;. &lt;br /&gt;
&lt;br /&gt;
Суммарное количество итераций равно &amp;lt;math&amp;gt;\frac{n(n-1)}{2}&amp;lt;/math&amp;gt; (Различные варианты выбора &amp;lt;math&amp;gt;j&amp;lt;/math&amp;gt; и &amp;lt;math&amp;gt;k&amp;lt;/math&amp;gt;). &lt;br /&gt;
&lt;br /&gt;
Асимптотически метод сходится квадратично. &lt;br /&gt;
&lt;br /&gt;
Таким образом, при классификации по высоте ЯПФ метод Якоби относится к алгоритмам со сложностью &amp;lt;math&amp;gt;O(n^2)&amp;lt;/math&amp;gt;&amp;amp;nbsp;, а при классификации по ширине ЯПФ — к алгоритмам со сложностью &amp;lt;math&amp;gt;O(n)&amp;lt;/math&amp;gt;.&lt;br /&gt;
&lt;br /&gt;
=== Входные и выходные данные алгоритма ===&lt;br /&gt;
&#039;&#039;&#039;Входные данные&#039;&#039;&#039;: плотная матрица &amp;lt;math&amp;gt;G&amp;lt;/math&amp;gt; размера &amp;lt;math&amp;gt;n&amp;lt;/math&amp;gt;х&amp;lt;math&amp;gt;n&amp;lt;/math&amp;gt;, где &amp;lt;math&amp;gt;A= G^TG&amp;lt;/math&amp;gt; – симметрическая матрица.&lt;br /&gt;
&lt;br /&gt;
&#039;&#039;&#039;Объём входных данных&#039;&#039;&#039;: &amp;lt;math&amp;gt;n^2&amp;lt;/math&amp;gt; (т.к. для хранения матрицы &amp;lt;math&amp;gt;G&amp;lt;/math&amp;gt; используем двумерный массив размера &amp;lt;math&amp;gt;n&amp;lt;/math&amp;gt;х&amp;lt;math&amp;gt;n&amp;lt;/math&amp;gt;)&lt;br /&gt;
&lt;br /&gt;
&#039;&#039;&#039;Выходные данные&#039;&#039;&#039;: &amp;lt;math&amp;gt;\sigma_{i}&amp;lt;/math&amp;gt;  - сингулярные числа, матрица &amp;lt;math&amp;gt;U&amp;lt;/math&amp;gt; левых сингулярных векторов и матрица &amp;lt;math&amp;gt;V&amp;lt;/math&amp;gt; правых сингулярных векторов.&lt;br /&gt;
&lt;br /&gt;
&#039;&#039;&#039;Объём выходных данных&#039;&#039;&#039;: &amp;lt;math&amp;gt;2n^2 + n&amp;lt;/math&amp;gt; (т.к. необходимо хранить вектор сингулярных чисел длины &amp;lt;math&amp;gt;n&amp;lt;/math&amp;gt;, а также две матрицы &amp;lt;math&amp;gt;U, V&amp;lt;/math&amp;gt; левых и правых сингулярных векторов размера &amp;lt;math&amp;gt;n&amp;lt;/math&amp;gt;х&amp;lt;math&amp;gt;n&amp;lt;/math&amp;gt;).&lt;br /&gt;
&lt;br /&gt;
=== Свойства алгоритма ===&lt;br /&gt;
Метод Якоби является самым медленным из имеющихся алгоритмов вычисления сингулярных чисел и сингулярных векторов матрицы. Тем не менее, для  матриц &amp;lt;math&amp;gt;G&amp;lt;/math&amp;gt;, которые могут быть представлены в виде &amp;lt;math&amp;gt;G=DX&amp;lt;/math&amp;gt;, где &amp;lt;math&amp;gt;D&amp;lt;/math&amp;gt; - диагональная, а &amp;lt;math&amp;gt;X&amp;lt;/math&amp;gt; - хорошо обусловлена, он способен вычислять сингулярные числа и вектора намного точнее, чем другие методы&amp;lt;ref&amp;gt;Дж. Деммель «Вычислительная линейная алгебра» (стр. 261-264)&amp;lt;/ref&amp;gt;. &lt;br /&gt;
&lt;br /&gt;
Вычислительная мощность алгоритма, как отношение числа операций к суммарному объему входных и выходных данных является линейной.&lt;br /&gt;
&lt;br /&gt;
Метод Якоби не детерминирован, так как является итерационным алгоритмом с выходом по точности (число итераций зависит от входных данных и порогового значения).&lt;br /&gt;
&lt;br /&gt;
== Программная реализация алгоритма ==&lt;br /&gt;
&lt;br /&gt;
=== Особенности реализации последовательного алгоритма ===&lt;br /&gt;
&lt;br /&gt;
=== Локальность данных и вычислений ===&lt;br /&gt;
&lt;br /&gt;
=== Возможные способы и особенности параллельной реализации алгоритма ===&lt;br /&gt;
&lt;br /&gt;
=== Масштабируемость алгоритма и его реализации ===&lt;br /&gt;
&lt;br /&gt;
=== Динамические характеристики и эффективность реализации алгоритма ===&lt;br /&gt;
&lt;br /&gt;
=== Выводы для классов архитектур ===&lt;br /&gt;
&lt;br /&gt;
=== Существующие реализации алгоритма ===&lt;br /&gt;
Метод Якоби нахождения сингулярных значений и векторов реализован в таких пакетах, как LAPACK, LINPACK/EISPACK, Intel MKL &amp;lt;ref&amp;gt;http://www.alglib.net/matrixops/general/svd.php&amp;lt;/ref&amp;gt;.&lt;br /&gt;
&lt;br /&gt;
Так же функция Якоби реализована в пакете Matlab.&lt;br /&gt;
&lt;br /&gt;
Т. к. алгоритм считается медленным, он не включен во многие известные пакеты.&lt;br /&gt;
&lt;br /&gt;
== Литература ==&lt;br /&gt;
1. Дж. Деммель Вычислительная линейная алгебра. Изд. Мир, 2001.&lt;/div&gt;</summary>
		<author><name>Davletshuna Alexandra</name></author>
	</entry>
	<entry>
		<id>https://xn--80aecvaldz.xn--80ahdrnmvk.xn--p1ai/w/ru/index.php?title=%D0%A3%D1%87%D0%B0%D1%81%D1%82%D0%BD%D0%B8%D0%BA:Davletshuna_Alexandra/%D0%9C%D0%B5%D1%82%D0%BE%D0%B4_%D0%AF%D0%BA%D0%BE%D0%B1%D0%B8_%D0%B2%D1%8B%D1%87%D0%B8%D1%81%D0%BB%D0%B5%D0%BD%D0%B8%D1%8F_%D1%81%D0%B8%D0%BD%D0%B3%D1%83%D0%BB%D1%8F%D1%80%D0%BD%D1%8B%D1%85_%D1%87%D0%B8%D1%81%D0%B5%D0%BB_%D0%B8_%D0%B2%D0%B5%D0%BA%D1%82%D0%BE%D1%80%D0%BE%D0%B2&amp;diff=15873</id>
		<title>Участник:Davletshuna Alexandra/Метод Якоби вычисления сингулярных чисел и векторов</title>
		<link rel="alternate" type="text/html" href="https://xn--80aecvaldz.xn--80ahdrnmvk.xn--p1ai/w/ru/index.php?title=%D0%A3%D1%87%D0%B0%D1%81%D1%82%D0%BD%D0%B8%D0%BA:Davletshuna_Alexandra/%D0%9C%D0%B5%D1%82%D0%BE%D0%B4_%D0%AF%D0%BA%D0%BE%D0%B1%D0%B8_%D0%B2%D1%8B%D1%87%D0%B8%D1%81%D0%BB%D0%B5%D0%BD%D0%B8%D1%8F_%D1%81%D0%B8%D0%BD%D0%B3%D1%83%D0%BB%D1%8F%D1%80%D0%BD%D1%8B%D1%85_%D1%87%D0%B8%D1%81%D0%B5%D0%BB_%D0%B8_%D0%B2%D0%B5%D0%BA%D1%82%D0%BE%D1%80%D0%BE%D0%B2&amp;diff=15873"/>
		<updated>2016-11-03T10:13:39Z</updated>

		<summary type="html">&lt;p&gt;Davletshuna Alexandra: &lt;/p&gt;
&lt;hr /&gt;
&lt;div&gt;{{algorithm&lt;br /&gt;
| name              = Метод Якоби вычисления сингулярных чисел и векторов&lt;br /&gt;
| serial_complexity = &amp;lt;math&amp;gt;O(n^3)&amp;lt;/math&amp;gt;&lt;br /&gt;
| pf_height         = &amp;lt;math&amp;gt;O(n^2)&amp;lt;/math&amp;gt;&lt;br /&gt;
| pf_width          = &amp;lt;math&amp;gt;O(n)&amp;lt;/math&amp;gt;&lt;br /&gt;
| input_data        = &amp;lt;math&amp;gt;n^2&amp;lt;/math&amp;gt;&lt;br /&gt;
| output_data       = &amp;lt;math&amp;gt;2n^2 + n&amp;lt;/math&amp;gt;&lt;br /&gt;
}}&lt;br /&gt;
&lt;br /&gt;
Авторы статьи: [[Участница:Davletshuna Alexandra|Давлетшина Александра]] (группа 619) пункты 1.1-1.4, 1.6, 2.7; [[Участница:Alek sandra|Зайцева Александра]] (группа 601) пункты 1.5, 1.7-1.10, 2.7.&lt;br /&gt;
&lt;br /&gt;
== Свойства и структура алгоритма ==&lt;br /&gt;
&lt;br /&gt;
=== Общее описание алгоритма ===&lt;br /&gt;
&#039;&#039;&#039;Сингулярным разложением&#039;&#039;&#039; называется разложение прямоугольной вещественной или комплексной матрицы, имеющее широкое применение, в силу своей наглядной геометрической интерпретации, при решении многих прикладных задач. Сингулярное разложение матрицы А позволяет вычислять сингулярные числа данной матрицы, а также, левые и правые сингулярные векторы матрицы А:&lt;br /&gt;
&lt;br /&gt;
•	левые сингулярные векторы матрицы А — это собственные векторы матрицы &amp;lt;math&amp;gt;AA^*&amp;lt;/math&amp;gt;;&lt;br /&gt;
&lt;br /&gt;
•	правые сингулярные векторы матрицы A — это собственные векторы матрицы &amp;lt;math&amp;gt;A^*A&amp;lt;/math&amp;gt;.&lt;br /&gt;
&lt;br /&gt;
Геометрическая интерпретация сингулярного разложения заключается в следующем факте из геометрии: &#039;&#039;Образом любого линейного преобразования, заданного с помощью матрицы &amp;lt;math&amp;gt;m&amp;lt;/math&amp;gt;x&amp;lt;math&amp;gt;n&amp;lt;/math&amp;gt;, примененного к единичной сфере является гиперэллипсоид&#039;&#039;.&lt;br /&gt;
&lt;br /&gt;
Из многочисленных разложений матриц, наиболее удобным является сингулярное разложение матрицы в виде: &amp;lt;math&amp;gt;A=U\Sigma V^*&amp;lt;/math&amp;gt;, где &amp;lt;math&amp;gt;U, V&amp;lt;/math&amp;gt; – унитарные матрицы, а &amp;lt;math&amp;gt;\Sigma&amp;lt;/math&amp;gt; – диагональная матрица с вещественными положительными числами на диагонали &amp;lt;ref&amp;gt;http://algorithms.parallel.ru/&amp;lt;/ref&amp;gt;.&lt;br /&gt;
&lt;br /&gt;
Диагональные элементы матрицы &amp;lt;math&amp;gt;\Sigma&amp;lt;/math&amp;gt; называются сингулярными числами матрицы &amp;lt;math&amp;gt;A&amp;lt;/math&amp;gt;, а столбцы матриц &amp;lt;math&amp;gt;U,V&amp;lt;/math&amp;gt; левыми и правыми сингулярными векторами соответственно.&lt;br /&gt;
&lt;br /&gt;
Алгоритм Якоби сингулярного разложения матрицы был предложен одним из первых в 1846 году. Он приводит прямоугольную матрицу к диагональной матрице с помощью последовательности элементарных вращений. Метод может найти все сингулярные значения с очень высокой точностью. Однако его производительность является довольно низкой, в сравнении с конкурирующими методами.&lt;br /&gt;
&lt;br /&gt;
&#039;&#039;Неявный&#039;&#039;&amp;lt;ref&amp;gt;Дж. Деммель «Вычислительная линейная алгебра» (стр. 261-264)&amp;lt;/ref&amp;gt; метод Якоби математически эквивалентен применению метода Якоби вычисления собственных значений к матрице &amp;lt;math&amp;gt;A = G^TG&amp;lt;/math&amp;gt;.&lt;br /&gt;
Это значит, что на каждом шаге вычисляется вращение Якоби &amp;lt;math&amp;gt;J&amp;lt;/math&amp;gt;, с помощью которого матрица &amp;lt;math&amp;gt;G^TG&amp;lt;/math&amp;gt; неявно пересчитывется в &amp;lt;math&amp;gt;J^TG^TGJ&amp;lt;/math&amp;gt;; вращение выбрано так, чтобы пара внедиагональных элементов из &amp;lt;math&amp;gt;G^TG&amp;lt;/math&amp;gt; обратилась в нули в матрице &amp;lt;math&amp;gt;J^TG^TGJ&amp;lt;/math&amp;gt;. При этом ни &amp;lt;math&amp;gt;G^TG&amp;lt;/math&amp;gt;, ни &amp;lt;math&amp;gt;J^TG^TGJ&amp;lt;/math&amp;gt; не вычисляются в явном виде; вместо них вычисляется матрица &amp;lt;math&amp;gt;GJ&amp;lt;/math&amp;gt;. Поэтому алгоритм называется &#039;&#039;методом односторонних вращений&#039;&#039;.&lt;br /&gt;
&lt;br /&gt;
=== Математическое описание алгоритма ===&lt;br /&gt;
Исходные данные: матрица &amp;lt;math&amp;gt;G&amp;lt;/math&amp;gt; (элементы &amp;lt;math&amp;gt;g_{ij}, i, j = 1, \ldots, n&amp;lt;/math&amp;gt;).&lt;br /&gt;
&lt;br /&gt;
Вычисляемые данные: матрица &amp;lt;math&amp;gt;\Sigma = diag(\sigma_{i})&amp;lt;/math&amp;gt;, где &amp;lt;math&amp;gt;\sigma_{i}&amp;lt;/math&amp;gt; - сингулярные числа, &amp;lt;math&amp;gt;U&amp;lt;/math&amp;gt; - матрица левых сингулярных векторов, &amp;lt;math&amp;gt;V&amp;lt;/math&amp;gt; - матрица правых сингулярных векторов.&lt;br /&gt;
&lt;br /&gt;
симметричную матрицу &amp;lt;math&amp;gt;A = (G^TG)&amp;lt;/math&amp;gt; можно привести к диагональному виду:&lt;br /&gt;
&amp;lt;math&amp;gt;RG^TGR^T&amp;lt;/math&amp;gt;, где&lt;br /&gt;
&lt;br /&gt;
&amp;lt;math&amp;gt;&lt;br /&gt;
R(j,k,\theta) = &lt;br /&gt;
\begin{matrix}&lt;br /&gt;
  \\&lt;br /&gt;
  \\&lt;br /&gt;
  \\&lt;br /&gt;
j \\&lt;br /&gt;
  \\&lt;br /&gt;
k \\&lt;br /&gt;
  \\&lt;br /&gt;
  \\&lt;br /&gt;
  \\&lt;br /&gt;
\end{matrix}&lt;br /&gt;
&amp;lt;/math&amp;gt;  &lt;br /&gt;
&amp;lt;math&amp;gt;&lt;br /&gt;
\begin{bmatrix}&lt;br /&gt;
  &amp;amp; 1 &amp;amp;   &amp;amp;        &amp;amp;              &amp;amp;        &amp;amp;               &amp;amp;         &amp;amp;    &amp;amp;   \\&lt;br /&gt;
  &amp;amp;   &amp;amp; 1 &amp;amp;        &amp;amp;              &amp;amp;        &amp;amp;               &amp;amp;         &amp;amp;    &amp;amp;   \\&lt;br /&gt;
  &amp;amp;   &amp;amp;   &amp;amp; \ddots &amp;amp;              &amp;amp;        &amp;amp;               &amp;amp;         &amp;amp;    &amp;amp;   \\&lt;br /&gt;
  &amp;amp;   &amp;amp;   &amp;amp;        &amp;amp; \cos(\theta) &amp;amp;        &amp;amp; -\sin(\theta) &amp;amp;         &amp;amp;    &amp;amp;   \\&lt;br /&gt;
  &amp;amp;   &amp;amp;   &amp;amp;        &amp;amp;              &amp;amp; \ddots &amp;amp;               &amp;amp;         &amp;amp;    &amp;amp;   \\&lt;br /&gt;
  &amp;amp;   &amp;amp;   &amp;amp;        &amp;amp; \sin(\theta) &amp;amp;        &amp;amp; \cos(\theta)  &amp;amp;         &amp;amp;    &amp;amp;   \\&lt;br /&gt;
  &amp;amp;   &amp;amp;   &amp;amp;        &amp;amp;              &amp;amp;        &amp;amp;               &amp;amp; \ddots  &amp;amp;    &amp;amp;   \\&lt;br /&gt;
  &amp;amp;   &amp;amp;   &amp;amp;        &amp;amp;              &amp;amp;        &amp;amp;               &amp;amp;         &amp;amp; 1  &amp;amp;   \\&lt;br /&gt;
  &amp;amp;   &amp;amp;   &amp;amp;        &amp;amp;              &amp;amp;        &amp;amp;               &amp;amp;         &amp;amp;    &amp;amp; 1 \\&lt;br /&gt;
\end{bmatrix}&lt;br /&gt;
&amp;lt;/math&amp;gt;&lt;br /&gt;
&lt;br /&gt;
Обозначим &amp;lt;math&amp;gt;s = \sin \theta&amp;lt;/math&amp;gt; и &amp;lt;math&amp;gt;c = \cos \theta&amp;lt;/math&amp;gt;.&lt;br /&gt;
&lt;br /&gt;
Перемножив матрицы &amp;lt;math&amp;gt;RG^TGR^T&amp;lt;/math&amp;gt;, получим следующие выражения&amp;lt;ref&amp;gt;http://www.astro.tsu.ru/OsChMet/5_2.html&amp;lt;/ref&amp;gt;:&lt;br /&gt;
&lt;br /&gt;
&amp;lt;math&amp;gt;\begin{align}&lt;br /&gt;
 a_{jj}^{(i+1)} &amp;amp;= c^2\, a_{jj}^{(i)}  -  2\, s c \,a_{jk}^{(i)}  +  s^2\, a_{kk}^{(i)} \\&lt;br /&gt;
 a_{kk}^{(i+1)} &amp;amp;= s^2 \,a_{jj}^{(i)}  +  2 s c\, a_{jk}^{(i)}  +  c^2 \, a_{kk}^{(i)} \\&lt;br /&gt;
 a_{jk}^{(i+1)} &amp;amp;= a_{kj}^{(i+1)} = (c^2 - s^2 ) \, a_{jk}^{(i)}  +  s c \, (a_{kk}^{(i)} - a_{jj}^{(i)} ) \\&lt;br /&gt;
 a_{jm}^{(i+1)} &amp;amp;= a_{mj}^{(i+1)} = c \, a_{jm}^{(i)}  -  s \, a_{km}^{(i)} &amp;amp; m \ne j,k \\&lt;br /&gt;
 a_{km}^{(i+1)} &amp;amp;= a_{mk}^{(i+1)} = s \, a_{jm}^{(i)}  + c \, a_{km}^{(i)} &amp;amp; m \ne j,k \\&lt;br /&gt;
 a_{ml}^{(i+1)} &amp;amp;= a_{ml}^{(i)} &amp;amp;m,l \ne j,k&lt;br /&gt;
\end{align}&amp;lt;/math&amp;gt;&lt;br /&gt;
&lt;br /&gt;
Т.к внедиагональные элементы должны быть равны 0, то выбираем &amp;lt;math&amp;gt;\theta&amp;lt;/math&amp;gt; так, чтобы &amp;lt;math&amp;gt;a_{jk}^{(i+1)} = 0&amp;lt;/math&amp;gt; и &amp;lt;math&amp;gt;a_{kj}^{(i+1)} = 0&amp;lt;/math&amp;gt;.&lt;br /&gt;
&lt;br /&gt;
Тогда решая уравнение получаем, что&lt;br /&gt;
&lt;br /&gt;
&amp;lt;math&amp;gt;&lt;br /&gt;
         \begin{align}&lt;br /&gt;
         \tau &amp;amp;= {a_{jj} - a_{kk}}/{2a_{jk}} \\&lt;br /&gt;
         t &amp;amp;= {sign(\tau)}/(|\tau| + \sqrt{1 + \tau^2}) \\&lt;br /&gt;
         c &amp;amp;= 1/(\sqrt{1 + t^2}) \\&lt;br /&gt;
         s &amp;amp;= ct \\&lt;br /&gt;
         \end{align}&amp;lt;/math&amp;gt;&lt;br /&gt;
&lt;br /&gt;
Остановка вычислений алгоритма наступает, когда внедиагональные элементы становятся меньше некоторого наперед заданного числа &amp;lt;math&amp;gt;\varepsilon&amp;lt;/math&amp;gt;.&lt;br /&gt;
&lt;br /&gt;
=== Вычислительное ядро алгоритма ===&lt;br /&gt;
Вычислительное ядро алгоритма составляет непосредственно вычисление одностороннего вращения Якоби, т.е. вычисление элементов матрицы &amp;lt;math&amp;gt;g_{jm}^{(i+1)} = g_{mj}^{(i+1)}&amp;lt;/math&amp;gt; и &amp;lt;math&amp;gt;g_{km}^{(i+1)} = g_{mk}^{(i+1)}&amp;lt;/math&amp;gt;, &amp;lt;math&amp;gt;m \ne j,k&amp;lt;/math&amp;gt;, а также вычисления элементов &amp;lt;math&amp;gt;g_{jj}^{(i+1)} &amp;lt;/math&amp;gt; и &amp;lt;math&amp;gt;g_{kk}^{(i+1)} &amp;lt;/math&amp;gt;, получившихся после умножения промежуточной матрицы на матрицу вращений Якоби:&lt;br /&gt;
&lt;br /&gt;
&amp;lt;math&amp;gt;\begin{align}&lt;br /&gt;
 g_{jj}^{(i+1)} &amp;amp;= c^2\, g_{jj}^{(i)}  -  2\, s c \,g_{jk}^{(i)}  +  s^2\, g_{kk}^{(i)} \\&lt;br /&gt;
 g_{kk}^{(i+1)} &amp;amp;= s^2 \,g_{jj}^{(i)}  +  2 s c\, g_{jk}^{(i)}  +  c^2 \, g_{kk}^{(i)} \\&lt;br /&gt;
 g_{jk}^{(i+1)} &amp;amp;= g_{kj}^{(i+1)} = (c^2 - s^2 ) \, g_{jk}^{(i)}  +  s c \, (g_{kk}^{(i)} - g_{jj}^{(i)} ) \\&lt;br /&gt;
 g_{jm}^{(i+1)} &amp;amp;= g_{mj}^{(i+1)} = c \, g_{jm}^{(i)}  -  s \, g_{km}^{(i)} &amp;amp; m \ne j,k \\&lt;br /&gt;
 g_{km}^{(i+1)} &amp;amp;= g_{mk}^{(i+1)} = s \, g_{jm}^{(i)}  + c \, g_{km}^{(i)} &amp;amp; m \ne j,k \\&lt;br /&gt;
 g_{ml}^{(i+1)} &amp;amp;= g_{ml}^{(i)} &amp;amp;m,l \ne j,k&lt;br /&gt;
\end{align}&amp;lt;/math&amp;gt;&lt;br /&gt;
&lt;br /&gt;
=== Макроструктура алгоритма ===&lt;br /&gt;
Основную часть метода составляет процедура односторонних вращений матрицы, которая в свою очередь состоит из:&lt;br /&gt;
&lt;br /&gt;
#Вычисление &amp;lt;math&amp;gt;\tau, c, s, t&amp;lt;/math&amp;gt;.&lt;br /&gt;
#Одностороннее вращение матрицы. &lt;br /&gt;
&lt;br /&gt;
Что требует &amp;lt;math&amp;gt;O(n)&amp;lt;/math&amp;gt; операций.&lt;br /&gt;
&lt;br /&gt;
После этого необходимо:&lt;br /&gt;
&lt;br /&gt;
#Вычислить сингулярные числа &amp;lt;math&amp;gt;\sigma_i&amp;lt;/math&amp;gt;.  Что требует &amp;lt;math&amp;gt;O(n)&amp;lt;/math&amp;gt; операций.&lt;br /&gt;
#Вычислить &amp;lt;math&amp;gt;U&amp;lt;/math&amp;gt; и &amp;lt;math&amp;gt;V&amp;lt;/math&amp;gt;. Что требует &amp;lt;math&amp;gt;O(n^2)&amp;lt;/math&amp;gt; операций.&lt;br /&gt;
&lt;br /&gt;
=== Схема реализации последовательного алгоритма ===&lt;br /&gt;
Применение метода Якоби к матрице &amp;lt;math&amp;gt;A = (G^TG)&amp;lt;/math&amp;gt; можно описать следующим образом&amp;lt;ref&amp;gt;Дж. Деммель «Вычислительная линейная алгебра» (стр. 261-263)&amp;lt;/ref&amp;gt;:&lt;br /&gt;
&lt;br /&gt;
Если &amp;lt;math&amp;gt;G = U\Sigma V^T&amp;lt;/math&amp;gt; и &amp;lt;math&amp;gt;\Sigma = diag(\sigma_{i})&amp;lt;/math&amp;gt;, то алгоритм вычисляет сингулярные числа &amp;lt;math&amp;gt;\sigma_{i}&amp;lt;/math&amp;gt;, матрицу &amp;lt;math&amp;gt;U&amp;lt;/math&amp;gt; левых сингулярных векторов и матрицу &amp;lt;math&amp;gt;V&amp;lt;/math&amp;gt; правых сингулярных векторов по следующей схеме:&lt;br /&gt;
&lt;br /&gt;
 repeat&lt;br /&gt;
     for &amp;lt;math&amp;gt;j=1&amp;lt;/math&amp;gt; to &amp;lt;math&amp;gt;n-1&amp;lt;/math&amp;gt;&lt;br /&gt;
         for &amp;lt;math&amp;gt;k=j+1&amp;lt;/math&amp;gt; to &amp;lt;math&amp;gt;n&amp;lt;/math&amp;gt;&lt;br /&gt;
             обратиться к процедуре &#039;&#039;&#039;&#039;&#039;One-Sided-Jacobi-Rotation&amp;lt;math&amp;gt;(G,j,k)&amp;lt;/math&amp;gt;&#039;&#039;&#039;&#039;&#039;&lt;br /&gt;
         end for&lt;br /&gt;
     end for&lt;br /&gt;
 пока &amp;lt;math&amp;gt;G^TG&amp;lt;/math&amp;gt; не станет достаточно близка к диагональной матрице&lt;br /&gt;
 Положить &amp;lt;math&amp;gt;\sigma_{i} = ||G(:,i)||_2 &amp;lt;/math&amp;gt; (норма &amp;lt;math&amp;gt;i&amp;lt;/math&amp;gt;-го столбца в &amp;lt;math&amp;gt;G&amp;lt;/math&amp;gt;)&lt;br /&gt;
 Положить &amp;lt;math&amp;gt;U = [u_{1},\dots, u_{n}]&amp;lt;/math&amp;gt;, где &amp;lt;math&amp;gt;u_{i} = G(:,i)/\sigma_{i}&amp;lt;/math&amp;gt;&lt;br /&gt;
 Положить &amp;lt;math&amp;gt;V = J&amp;lt;/math&amp;gt;, где &amp;lt;math&amp;gt;J&amp;lt;/math&amp;gt; - накопленное произведение вращений Якоби.&lt;br /&gt;
&lt;br /&gt;
Где процедура &#039;&#039;&#039;&#039;&#039;One-Sided-Jacobi-Rotation&#039;&#039;&#039;&#039;&#039; является метод односторонних вращений Якоби:&lt;br /&gt;
&lt;br /&gt;
 proc &#039;&#039;&#039;&#039;&#039;One-Sided-Jacobi-Rotation&amp;lt;math&amp;gt;(G,j,k)&amp;lt;/math&amp;gt;&#039;&#039;&#039;&#039;&#039;&lt;br /&gt;
     вычислить &amp;lt;math&amp;gt;a_{jj} = (G^TG)_{jj}, a_{jk} = (G^TG)_{jk}&amp;lt;/math&amp;gt; и &amp;lt;math&amp;gt;a_{kk} = (G^TG)_{kk}&amp;lt;/math&amp;gt;&lt;br /&gt;
     if &amp;lt;math&amp;gt;|a_{jk}|&amp;lt;/math&amp;gt; не слишком мал&lt;br /&gt;
         &amp;lt;math&amp;gt;&lt;br /&gt;
         \begin{align}&lt;br /&gt;
         \tau &amp;amp;= {a_{jj} - a_{kk}}/{2a_{jk}} \\&lt;br /&gt;
         t &amp;amp;= {sign(\tau)}/(|\tau| + \sqrt{1 + \tau^2}) \\&lt;br /&gt;
         c &amp;amp;= 1/(\sqrt{1 + t^2}) \\&lt;br /&gt;
         s &amp;amp;= ct \\&lt;br /&gt;
         G &amp;amp;= GR(j,k,\theta) \  \dots c=cos\theta, s=sin\theta \end{align}&amp;lt;/math&amp;gt;&lt;br /&gt;
         if нужны правые сингулярные векторы &lt;br /&gt;
             &amp;lt;math&amp;gt;J = JR(j,k,\theta)&amp;lt;/math&amp;gt;&lt;br /&gt;
         end if&lt;br /&gt;
     end if&lt;br /&gt;
&lt;br /&gt;
=== Последовательная сложность алгоритма ===&lt;br /&gt;
Для одного вращения Якоби необходимо выполнить &amp;lt;math&amp;gt;O(n)&amp;lt;/math&amp;gt; операций умножения и сложения. &lt;br /&gt;
&lt;br /&gt;
Всего вариантов выбора &amp;lt;math&amp;gt;j&amp;lt;/math&amp;gt; и &amp;lt;math&amp;gt;k&amp;lt;/math&amp;gt; существует &amp;lt;math&amp;gt;\frac{n(n-1)}{2}&amp;lt;/math&amp;gt;.&lt;br /&gt;
&lt;br /&gt;
Таким образом последовательный алгоритм Якоби вычисления сингулярных чисел и векторов является алгоритмом с кубической сложностью.&lt;br /&gt;
&lt;br /&gt;
=== Информационный граф ===&lt;br /&gt;
Граф алгоритма состоит из четырех групп вершин&lt;br /&gt;
&lt;br /&gt;
(А)Первая группа вершин расположена в двумерной области, соответствующая ей операция - вычисление элементов &amp;lt;math&amp;gt;a_{jj},a_{jk},a_{kk}&amp;lt;/math&amp;gt; матрицы произведения &amp;lt;math&amp;gt;A = (G^TG)&amp;lt;/math&amp;gt;. Где &amp;lt;math&amp;gt;j&amp;lt;/math&amp;gt; изменяется от &amp;lt;math&amp;gt;1&amp;lt;/math&amp;gt; до &amp;lt;math&amp;gt;n-1&amp;lt;/math&amp;gt;, принимая все целочисленные значения, &amp;lt;math&amp;gt;k&amp;lt;/math&amp;gt;  изменяется от &amp;lt;math&amp;gt;j+1&amp;lt;/math&amp;gt; до &amp;lt;math&amp;gt;n&amp;lt;/math&amp;gt;, принимая все целочисленные значения.&lt;br /&gt;
&lt;br /&gt;
Граф вычисления каждого из элементов приведен на рисунке 1, где значениям &amp;lt;math&amp;gt;g_{ij}&amp;lt;/math&amp;gt; соответствуют обозначения &amp;lt;math&amp;gt;x_{ij}&amp;lt;/math&amp;gt;, а элементам &amp;lt;math&amp;gt;g^T_{ij}&amp;lt;/math&amp;gt; обозначения &amp;lt;math&amp;gt;z_{ij}&amp;lt;/math&amp;gt;. Значение &amp;lt;math&amp;gt;s_{ij}&amp;lt;/math&amp;gt; является значением результирующего элемента.&lt;br /&gt;
&lt;br /&gt;
(Б)Вторая группа вершин расположена в двумерной области, соответствующая ей операция – вычисление &amp;lt;math&amp;gt;c&amp;lt;/math&amp;gt; и &amp;lt;math&amp;gt;s&amp;lt;/math&amp;gt;.&lt;br /&gt;
&lt;br /&gt;
Информационный граф с входными и выходными данными вычисления пункта (Б) представлен на рисунке 2.&lt;br /&gt;
&lt;br /&gt;
(В)Третья группа вершин расположена в двумерной области, соответствующая ей операция вычисление значений элементов &amp;lt;math&amp;gt;g_{jm}^{(i+1)} = g_{mj}^{(i+1)}&amp;lt;/math&amp;gt; и &amp;lt;math&amp;gt;g_{km}^{(i+1)} = g_{mk}^{(i+1)}&amp;lt;/math&amp;gt;, &amp;lt;math&amp;gt;m \ne j,k&amp;lt;/math&amp;gt;.&lt;br /&gt;
&lt;br /&gt;
(Г)Четвертая группа вершин расположена в двумерной области, соответствующая ей операция вычисление значений элементов &amp;lt;math&amp;gt;g_{jj}^{(i+1)} &amp;lt;/math&amp;gt; и &amp;lt;math&amp;gt;g_{kk}^{(i+1)} &amp;lt;/math&amp;gt;.&lt;br /&gt;
&lt;br /&gt;
Элементы групп (В) и (Г) вычисляются аналогично вычислению элементов матрицы произведения, т.к. фактически представляют собой перемножение матриц &amp;lt;math&amp;gt;G&amp;lt;/math&amp;gt; и &amp;lt;math&amp;gt;R&amp;lt;/math&amp;gt;&lt;br /&gt;
&lt;br /&gt;
[[File:Jacobi_2.jpg|none|thumb|1000px|Рисунок 1. Информационный граф с входными и выходными параметрами вычисления каждого элемента матрицы произведения.]]&lt;br /&gt;
&lt;br /&gt;
[[File:Jacobi_1.jpg|none|thumb|1000px|Рисунок 2. Информационный граф с входными и выходными параметрами вычисления значений &amp;lt;math&amp;gt;c&amp;lt;/math&amp;gt; и &amp;lt;math&amp;gt;s&amp;lt;/math&amp;gt;.]]&lt;br /&gt;
&lt;br /&gt;
Обобщенный граф метода Якоби представлен на рисунке 3, где буквами А, Б, В и Г обозначено вычисление групп вершин (А), (Б), (В) и (Г).&lt;br /&gt;
&lt;br /&gt;
[[File:Graf2.png|none|thumb|2000px|Рисунок 3. Обобщенный граф алгоритма вычисления сингулярных чисел и векторов методом Якоби.]]&lt;br /&gt;
&lt;br /&gt;
=== Ресурс параллелизма алгоритма ===&lt;br /&gt;
Для выполнения одной итерации метода Якоби требуется последовательно выполнить несколько ярусов:&lt;br /&gt;
# вычислить &amp;lt;math&amp;gt;\tau&amp;lt;/math&amp;gt; &lt;br /&gt;
# вычислить &amp;lt;math&amp;gt;t&amp;lt;/math&amp;gt; &lt;br /&gt;
# вычислить &amp;lt;math&amp;gt;c&amp;lt;/math&amp;gt; &lt;br /&gt;
# выполнить поворот матрицы &amp;lt;math&amp;gt;G&amp;lt;/math&amp;gt; с параллельным выполнением &amp;lt;math&amp;gt;2(n-2)&amp;lt;/math&amp;gt; операций вычисления элементов матрицы &amp;lt;math&amp;gt;g_{jm}^{(i+1)} = g_{mj}^{(i+1)}&amp;lt;/math&amp;gt; и &amp;lt;math&amp;gt;g_{km}^{(i+1)} = g_{mk}^{(i+1)}&amp;lt;/math&amp;gt;, &amp;lt;math&amp;gt;m \ne j,k&amp;lt;/math&amp;gt;, а также вычисления элементов &amp;lt;math&amp;gt;g_{jj}^{(i+1)} &amp;lt;/math&amp;gt; и &amp;lt;math&amp;gt;g_{kk}^{(i+1)} &amp;lt;/math&amp;gt;. &lt;br /&gt;
&lt;br /&gt;
Суммарное количество итераций равно &amp;lt;math&amp;gt;\frac{n(n-1)}{2}&amp;lt;/math&amp;gt; (Различные варианты выбора &amp;lt;math&amp;gt;j&amp;lt;/math&amp;gt; и &amp;lt;math&amp;gt;k&amp;lt;/math&amp;gt;). &lt;br /&gt;
&lt;br /&gt;
Асимптотически метод сходится квадратично. &lt;br /&gt;
&lt;br /&gt;
Таким образом, при классификации по высоте ЯПФ метод Якоби относится к алгоритмам со сложностью &amp;lt;math&amp;gt;O(n^2)&amp;lt;/math&amp;gt;&amp;amp;nbsp;, а при классификации по ширине ЯПФ — к алгоритмам со сложностью &amp;lt;math&amp;gt;O(n)&amp;lt;/math&amp;gt;.&lt;br /&gt;
&lt;br /&gt;
=== Входные и выходные данные алгоритма ===&lt;br /&gt;
&#039;&#039;&#039;Входные данные&#039;&#039;&#039;: плотная матрица &amp;lt;math&amp;gt;G&amp;lt;/math&amp;gt; размера &amp;lt;math&amp;gt;n&amp;lt;/math&amp;gt;х&amp;lt;math&amp;gt;n&amp;lt;/math&amp;gt;, где &amp;lt;math&amp;gt;A= G^TG&amp;lt;/math&amp;gt; – симметрическая матрица.&lt;br /&gt;
&lt;br /&gt;
&#039;&#039;&#039;Объём входных данных&#039;&#039;&#039;: &amp;lt;math&amp;gt;n^2&amp;lt;/math&amp;gt; (т.к. для хранения матрицы &amp;lt;math&amp;gt;G&amp;lt;/math&amp;gt; используем двумерный массив размера &amp;lt;math&amp;gt;n&amp;lt;/math&amp;gt;х&amp;lt;math&amp;gt;n&amp;lt;/math&amp;gt;)&lt;br /&gt;
&lt;br /&gt;
&#039;&#039;&#039;Выходные данные&#039;&#039;&#039;: &amp;lt;math&amp;gt;\sigma_{i}&amp;lt;/math&amp;gt;  - сингулярные числа, матрица &amp;lt;math&amp;gt;U&amp;lt;/math&amp;gt; левых сингулярных векторов и матрица &amp;lt;math&amp;gt;V&amp;lt;/math&amp;gt; правых сингулярных векторов.&lt;br /&gt;
&lt;br /&gt;
&#039;&#039;&#039;Объём выходных данных&#039;&#039;&#039;: &amp;lt;math&amp;gt;2n^2 + n&amp;lt;/math&amp;gt; (т.к. необходимо хранить вектор сингулярных чисел длины &amp;lt;math&amp;gt;n&amp;lt;/math&amp;gt;, а также две матрицы &amp;lt;math&amp;gt;U, V&amp;lt;/math&amp;gt; левых и правых сингулярных векторов размера &amp;lt;math&amp;gt;n&amp;lt;/math&amp;gt;х&amp;lt;math&amp;gt;n&amp;lt;/math&amp;gt;).&lt;br /&gt;
&lt;br /&gt;
=== Свойства алгоритма ===&lt;br /&gt;
Метод Якоби является самым медленным из имеющихся алгоритмов вычисления сингулярных чисел и сингулярных векторов матрицы. Тем не менее, для  матриц &amp;lt;math&amp;gt;G&amp;lt;/math&amp;gt;, которые могут быть представлены в виде &amp;lt;math&amp;gt;G=DX&amp;lt;/math&amp;gt;, где &amp;lt;math&amp;gt;D&amp;lt;/math&amp;gt; - диагональная, а &amp;lt;math&amp;gt;X&amp;lt;/math&amp;gt; - хорошо обусловлена, он способен вычислять сингулярные числа и вектора намного точнее, чем другие методы&amp;lt;ref&amp;gt;Дж. Деммель «Вычислительная линейная алгебра» (стр. 261-264)&amp;lt;/ref&amp;gt;. &lt;br /&gt;
&lt;br /&gt;
Вычислительная мощность алгоритма, как отношение числа операций к суммарному объему входных и выходных данных является линейной.&lt;br /&gt;
&lt;br /&gt;
Метод Якоби не детерминирован, так как является итерационным алгоритмом с выходом по точности (число итераций зависит от входных данных и порогового значения).&lt;br /&gt;
&lt;br /&gt;
== Программная реализация алгоритма ==&lt;br /&gt;
&lt;br /&gt;
=== Особенности реализации последовательного алгоритма ===&lt;br /&gt;
&lt;br /&gt;
=== Локальность данных и вычислений ===&lt;br /&gt;
&lt;br /&gt;
=== Возможные способы и особенности параллельной реализации алгоритма ===&lt;br /&gt;
&lt;br /&gt;
=== Масштабируемость алгоритма и его реализации ===&lt;br /&gt;
&lt;br /&gt;
=== Динамические характеристики и эффективность реализации алгоритма ===&lt;br /&gt;
&lt;br /&gt;
=== Выводы для классов архитектур ===&lt;br /&gt;
&lt;br /&gt;
=== Существующие реализации алгоритма ===&lt;br /&gt;
Метод Якоби нахождения сингулярных значений и векторов реализован в таких пакетах, как LAPACK, LINPACK/EISPACK, Intel MKL &amp;lt;ref&amp;gt;http://www.alglib.net/matrixops/general/svd.php&amp;lt;/ref&amp;gt;.&lt;br /&gt;
&lt;br /&gt;
Так же функция Якоби реализована в пакете Matlab.&lt;br /&gt;
&lt;br /&gt;
Т. к. алгоритм считается медленным, он не включен во многие известные пакеты.&lt;br /&gt;
&lt;br /&gt;
== Литература ==&lt;br /&gt;
1. Дж. Деммель Вычислительная линейная алгебра. Изд. Мир, 2001.&lt;/div&gt;</summary>
		<author><name>Davletshuna Alexandra</name></author>
	</entry>
	<entry>
		<id>https://xn--80aecvaldz.xn--80ahdrnmvk.xn--p1ai/w/ru/index.php?title=%D0%A3%D1%87%D0%B0%D1%81%D1%82%D0%BD%D0%B8%D0%BA:Davletshuna_Alexandra/%D0%9C%D0%B5%D1%82%D0%BE%D0%B4_%D0%AF%D0%BA%D0%BE%D0%B1%D0%B8_%D0%B2%D1%8B%D1%87%D0%B8%D1%81%D0%BB%D0%B5%D0%BD%D0%B8%D1%8F_%D1%81%D0%B8%D0%BD%D0%B3%D1%83%D0%BB%D1%8F%D1%80%D0%BD%D1%8B%D1%85_%D1%87%D0%B8%D1%81%D0%B5%D0%BB_%D0%B8_%D0%B2%D0%B5%D0%BA%D1%82%D0%BE%D1%80%D0%BE%D0%B2&amp;diff=15658</id>
		<title>Участник:Davletshuna Alexandra/Метод Якоби вычисления сингулярных чисел и векторов</title>
		<link rel="alternate" type="text/html" href="https://xn--80aecvaldz.xn--80ahdrnmvk.xn--p1ai/w/ru/index.php?title=%D0%A3%D1%87%D0%B0%D1%81%D1%82%D0%BD%D0%B8%D0%BA:Davletshuna_Alexandra/%D0%9C%D0%B5%D1%82%D0%BE%D0%B4_%D0%AF%D0%BA%D0%BE%D0%B1%D0%B8_%D0%B2%D1%8B%D1%87%D0%B8%D1%81%D0%BB%D0%B5%D0%BD%D0%B8%D1%8F_%D1%81%D0%B8%D0%BD%D0%B3%D1%83%D0%BB%D1%8F%D1%80%D0%BD%D1%8B%D1%85_%D1%87%D0%B8%D1%81%D0%B5%D0%BB_%D0%B8_%D0%B2%D0%B5%D0%BA%D1%82%D0%BE%D1%80%D0%BE%D0%B2&amp;diff=15658"/>
		<updated>2016-11-01T20:43:31Z</updated>

		<summary type="html">&lt;p&gt;Davletshuna Alexandra: /* Информационный граф */&lt;/p&gt;
&lt;hr /&gt;
&lt;div&gt;{{Assignment}}&lt;br /&gt;
&lt;br /&gt;
{{algorithm&lt;br /&gt;
| name              = Метод Якоби вычисления сингулярных чисел и векторов&lt;br /&gt;
| serial_complexity = &amp;lt;math&amp;gt;O(n^3)&amp;lt;/math&amp;gt;&lt;br /&gt;
| pf_height         = &amp;lt;math&amp;gt;O(n^2)&amp;lt;/math&amp;gt;&lt;br /&gt;
| pf_width          = &amp;lt;math&amp;gt;O(n)&amp;lt;/math&amp;gt;&lt;br /&gt;
| input_data        = &amp;lt;math&amp;gt;n^2&amp;lt;/math&amp;gt;&lt;br /&gt;
| output_data       = &amp;lt;math&amp;gt;2n^2 + n&amp;lt;/math&amp;gt;&lt;br /&gt;
}}&lt;br /&gt;
&lt;br /&gt;
Авторы статьи: [[Участница:Davletshuna Alexandra|Давлетшина Александра]] (группа 619), [[Участница:Alek sandra|Зайцева Александра]] (группа 601)&lt;br /&gt;
&lt;br /&gt;
== Свойства и структура алгоритма ==&lt;br /&gt;
&lt;br /&gt;
=== Общее описание алгоритма ===&lt;br /&gt;
&#039;&#039;&#039;Сингулярным разложением&#039;&#039;&#039; называется разложение прямоугольной вещественной или комплексной матрицы, имеющее широкое применение, в силу своей наглядной геометрической интерпретации, при решении многих прикладных задач. Сингулярное разложение матрицы А позволяет вычислять сингулярные числа данной матрицы, а также, левые и правые сингулярные векторы матрицы А:&lt;br /&gt;
&lt;br /&gt;
•	левые сингулярные векторы матрицы А — это собственные векторы матрицы &amp;lt;math&amp;gt;AA^*&amp;lt;/math&amp;gt;;&lt;br /&gt;
&lt;br /&gt;
•	правые сингулярные векторы матрицы A — это собственные векторы матрицы &amp;lt;math&amp;gt;A^*A&amp;lt;/math&amp;gt;.&lt;br /&gt;
&lt;br /&gt;
Геометрическая интерпретация сингулярного разложения заключается в следующем факте из геометрии: &#039;&#039;Образом любого линейного преобразования, заданного с помощью матрицы &amp;lt;math&amp;gt;m&amp;lt;/math&amp;gt;x&amp;lt;math&amp;gt;n&amp;lt;/math&amp;gt;, примененного к единичной сфере является гиперэллипсоид&#039;&#039;.&lt;br /&gt;
&lt;br /&gt;
Из многочисленных разложений матриц, наиболее удобным является сингулярное разложение матрицы в виде: &amp;lt;math&amp;gt;A=U\Sigma V^*&amp;lt;/math&amp;gt;, где &amp;lt;math&amp;gt;U, V&amp;lt;/math&amp;gt; – унитарные матрицы, а &amp;lt;math&amp;gt;\Sigma&amp;lt;/math&amp;gt; – диагональная матрица с вещественными положительными числами на диагонали &amp;lt;ref&amp;gt;http://algorithms.parallel.ru/&amp;lt;/ref&amp;gt;.&lt;br /&gt;
&lt;br /&gt;
Диагональные элементы матрицы &amp;lt;math&amp;gt;\Sigma&amp;lt;/math&amp;gt; называются сингулярными числами матрицы &amp;lt;math&amp;gt;A&amp;lt;/math&amp;gt;, а столбцы матриц &amp;lt;math&amp;gt;U,V&amp;lt;/math&amp;gt; левыми и правыми сингулярными векторами соответственно.&lt;br /&gt;
&lt;br /&gt;
Алгоритм Якоби сингулярного разложения матрицы был предложен одним из первых в 1846 году. Он приводит прямоугольную матрицу к диагональной матрице с помощью последовательности элементарных вращений. Метод может найти все сингулярные значения с очень высокой точностью. Однако его производительность является довольно низкой, в сравнении с конкурирующими методами.&lt;br /&gt;
&lt;br /&gt;
&#039;&#039;Неявный&#039;&#039;&amp;lt;ref&amp;gt;Дж. Деммель «Вычислительная линейная алгебра» (стр. 261-264)&amp;lt;/ref&amp;gt; метод Якоби математически эквивалентен применению метода Якоби вычисления собственных значений к матрице &amp;lt;math&amp;gt;A = G^TG&amp;lt;/math&amp;gt;.&lt;br /&gt;
Это значит, что на каждом шаге вычисляется вращение Якоби &amp;lt;math&amp;gt;J&amp;lt;/math&amp;gt;, с помощью которого матрица &amp;lt;math&amp;gt;G^TG&amp;lt;/math&amp;gt; неявно пересчитывется в &amp;lt;math&amp;gt;J^TG^TGJ&amp;lt;/math&amp;gt;; вращение выбрано так, чтобы пара внедиагональных элементов из &amp;lt;math&amp;gt;G^TG&amp;lt;/math&amp;gt; обратилась в нули в матрице &amp;lt;math&amp;gt;J^TG^TGJ&amp;lt;/math&amp;gt;. При этом ни &amp;lt;math&amp;gt;G^TG&amp;lt;/math&amp;gt;, ни &amp;lt;math&amp;gt;J^TG^TGJ&amp;lt;/math&amp;gt; не вычисляются в явном виде; вместо них вычисляется матрица &amp;lt;math&amp;gt;GJ&amp;lt;/math&amp;gt;. Поэтому алгоритм называется &#039;&#039;методом односторонних вращений&#039;&#039;.&lt;br /&gt;
&lt;br /&gt;
=== Математическое описание алгоритма ===&lt;br /&gt;
Исходные данные: матрица &amp;lt;math&amp;gt;G&amp;lt;/math&amp;gt; (элементы &amp;lt;math&amp;gt;g_{ij}, i, j = 1, \ldots, n&amp;lt;/math&amp;gt;).&lt;br /&gt;
&lt;br /&gt;
Вычисляемые данные: матрица &amp;lt;math&amp;gt;\Sigma = diag(\sigma_{i})&amp;lt;/math&amp;gt;, где &amp;lt;math&amp;gt;\sigma_{i}&amp;lt;/math&amp;gt; - сингулярные числа, &amp;lt;math&amp;gt;U&amp;lt;/math&amp;gt; - матрица левых сингулярных векторов, &amp;lt;math&amp;gt;V&amp;lt;/math&amp;gt; - матрица правых сингулярных векторов.&lt;br /&gt;
&lt;br /&gt;
симметричную матрицу &amp;lt;math&amp;gt;A = (G^TG)&amp;lt;/math&amp;gt; можно привести к диагональному виду:&lt;br /&gt;
&amp;lt;math&amp;gt;RG^TGR^T&amp;lt;/math&amp;gt;, где&lt;br /&gt;
&lt;br /&gt;
&amp;lt;math&amp;gt;&lt;br /&gt;
R(j,k,\theta) = &lt;br /&gt;
\begin{matrix}&lt;br /&gt;
  \\&lt;br /&gt;
  \\&lt;br /&gt;
  \\&lt;br /&gt;
j \\&lt;br /&gt;
  \\&lt;br /&gt;
k \\&lt;br /&gt;
  \\&lt;br /&gt;
  \\&lt;br /&gt;
  \\&lt;br /&gt;
\end{matrix}&lt;br /&gt;
&amp;lt;/math&amp;gt;  &lt;br /&gt;
&amp;lt;math&amp;gt;&lt;br /&gt;
\begin{bmatrix}&lt;br /&gt;
  &amp;amp; 1 &amp;amp;   &amp;amp;        &amp;amp;              &amp;amp;        &amp;amp;               &amp;amp;         &amp;amp;    &amp;amp;   \\&lt;br /&gt;
  &amp;amp;   &amp;amp; 1 &amp;amp;        &amp;amp;              &amp;amp;        &amp;amp;               &amp;amp;         &amp;amp;    &amp;amp;   \\&lt;br /&gt;
  &amp;amp;   &amp;amp;   &amp;amp; \ddots &amp;amp;              &amp;amp;        &amp;amp;               &amp;amp;         &amp;amp;    &amp;amp;   \\&lt;br /&gt;
  &amp;amp;   &amp;amp;   &amp;amp;        &amp;amp; \cos(\theta) &amp;amp;        &amp;amp; -\sin(\theta) &amp;amp;         &amp;amp;    &amp;amp;   \\&lt;br /&gt;
  &amp;amp;   &amp;amp;   &amp;amp;        &amp;amp;              &amp;amp; \ddots &amp;amp;               &amp;amp;         &amp;amp;    &amp;amp;   \\&lt;br /&gt;
  &amp;amp;   &amp;amp;   &amp;amp;        &amp;amp; \sin(\theta) &amp;amp;        &amp;amp; \cos(\theta)  &amp;amp;         &amp;amp;    &amp;amp;   \\&lt;br /&gt;
  &amp;amp;   &amp;amp;   &amp;amp;        &amp;amp;              &amp;amp;        &amp;amp;               &amp;amp; \ddots  &amp;amp;    &amp;amp;   \\&lt;br /&gt;
  &amp;amp;   &amp;amp;   &amp;amp;        &amp;amp;              &amp;amp;        &amp;amp;               &amp;amp;         &amp;amp; 1  &amp;amp;   \\&lt;br /&gt;
  &amp;amp;   &amp;amp;   &amp;amp;        &amp;amp;              &amp;amp;        &amp;amp;               &amp;amp;         &amp;amp;    &amp;amp; 1 \\&lt;br /&gt;
\end{bmatrix}&lt;br /&gt;
&amp;lt;/math&amp;gt;&lt;br /&gt;
&lt;br /&gt;
Обозначим &amp;lt;math&amp;gt;s = \sin \theta&amp;lt;/math&amp;gt; и &amp;lt;math&amp;gt;c = \cos \theta&amp;lt;/math&amp;gt;.&lt;br /&gt;
&lt;br /&gt;
Перемножив матрицы &amp;lt;math&amp;gt;RG^TGR^T&amp;lt;/math&amp;gt;, получим следующие выражения&amp;lt;ref&amp;gt;http://www.astro.tsu.ru/OsChMet/5_2.html&amp;lt;/ref&amp;gt;:&lt;br /&gt;
&lt;br /&gt;
&amp;lt;math&amp;gt;\begin{align}&lt;br /&gt;
 a_{jj}^{(i+1)} &amp;amp;= c^2\, a_{jj}^{(i)}  -  2\, s c \,a_{jk}^{(i)}  +  s^2\, a_{kk}^{(i)} \\&lt;br /&gt;
 a_{kk}^{(i+1)} &amp;amp;= s^2 \,a_{jj}^{(i)}  +  2 s c\, a_{jk}^{(i)}  +  c^2 \, a_{kk}^{(i)} \\&lt;br /&gt;
 a_{jk}^{(i+1)} &amp;amp;= a_{kj}^{(i+1)} = (c^2 - s^2 ) \, a_{jk}^{(i)}  +  s c \, (a_{kk}^{(i)} - a_{jj}^{(i)} ) \\&lt;br /&gt;
 a_{jm}^{(i+1)} &amp;amp;= a_{mj}^{(i+1)} = c \, a_{jm}^{(i)}  -  s \, a_{km}^{(i)} &amp;amp; m \ne j,k \\&lt;br /&gt;
 a_{km}^{(i+1)} &amp;amp;= a_{mk}^{(i+1)} = s \, a_{jm}^{(i)}  + c \, a_{km}^{(i)} &amp;amp; m \ne j,k \\&lt;br /&gt;
 a_{ml}^{(i+1)} &amp;amp;= a_{ml}^{(i)} &amp;amp;m,l \ne j,k&lt;br /&gt;
\end{align}&amp;lt;/math&amp;gt;&lt;br /&gt;
&lt;br /&gt;
Т.к внедиагональные элементы должны быть равны 0, то выбираем &amp;lt;math&amp;gt;\theta&amp;lt;/math&amp;gt; так, чтобы &amp;lt;math&amp;gt;a_{jk}^{(i+1)} = 0&amp;lt;/math&amp;gt; и &amp;lt;math&amp;gt;a_{kj}^{(i+1)} = 0&amp;lt;/math&amp;gt;.&lt;br /&gt;
&lt;br /&gt;
Тогда решая уравнение получаем, что&lt;br /&gt;
&lt;br /&gt;
&amp;lt;math&amp;gt;&lt;br /&gt;
         \begin{align}&lt;br /&gt;
         \tau &amp;amp;= {a_{jj} - a_{kk}}/{2a_{jk}} \\&lt;br /&gt;
         t &amp;amp;= {sign(\tau)}/(|\tau| + \sqrt{1 + \tau^2}) \\&lt;br /&gt;
         c &amp;amp;= 1/(\sqrt{1 + t^2}) \\&lt;br /&gt;
         s &amp;amp;= ct \\&lt;br /&gt;
         \end{align}&amp;lt;/math&amp;gt;&lt;br /&gt;
&lt;br /&gt;
Остановка вычислений алгоритма наступает, когда внедиагональные элементы становятся меньше некоторого наперед заданного числа &amp;lt;math&amp;gt;\varepsilon&amp;lt;/math&amp;gt;.&lt;br /&gt;
&lt;br /&gt;
=== Вычислительное ядро алгоритма ===&lt;br /&gt;
Вычислительное ядро алгоритма составляет непосредственно вычисление одностороннего вращения Якоби, т.е. вычисление элементов матрицы &amp;lt;math&amp;gt;g_{jm}^{(i+1)} = g_{mj}^{(i+1)}&amp;lt;/math&amp;gt; и &amp;lt;math&amp;gt;g_{km}^{(i+1)} = g_{mk}^{(i+1)}&amp;lt;/math&amp;gt;, &amp;lt;math&amp;gt;m \ne j,k&amp;lt;/math&amp;gt;, а также вычисления элементов &amp;lt;math&amp;gt;g_{jj}^{(i+1)} &amp;lt;/math&amp;gt; и &amp;lt;math&amp;gt;g_{kk}^{(i+1)} &amp;lt;/math&amp;gt;, получившихся после умножения промежуточной матрицы на матрицу вращений Якоби:&lt;br /&gt;
&lt;br /&gt;
&amp;lt;math&amp;gt;\begin{align}&lt;br /&gt;
 g_{jj}^{(i+1)} &amp;amp;= c^2\, g_{jj}^{(i)}  -  2\, s c \,g_{jk}^{(i)}  +  s^2\, g_{kk}^{(i)} \\&lt;br /&gt;
 g_{kk}^{(i+1)} &amp;amp;= s^2 \,g_{jj}^{(i)}  +  2 s c\, g_{jk}^{(i)}  +  c^2 \, g_{kk}^{(i)} \\&lt;br /&gt;
 g_{jk}^{(i+1)} &amp;amp;= g_{kj}^{(i+1)} = (c^2 - s^2 ) \, g_{jk}^{(i)}  +  s c \, (g_{kk}^{(i)} - g_{jj}^{(i)} ) \\&lt;br /&gt;
 g_{jm}^{(i+1)} &amp;amp;= g_{mj}^{(i+1)} = c \, g_{jm}^{(i)}  -  s \, g_{km}^{(i)} &amp;amp; m \ne j,k \\&lt;br /&gt;
 g_{km}^{(i+1)} &amp;amp;= g_{mk}^{(i+1)} = s \, g_{jm}^{(i)}  + c \, g_{km}^{(i)} &amp;amp; m \ne j,k \\&lt;br /&gt;
 g_{ml}^{(i+1)} &amp;amp;= g_{ml}^{(i)} &amp;amp;m,l \ne j,k&lt;br /&gt;
\end{align}&amp;lt;/math&amp;gt;&lt;br /&gt;
&lt;br /&gt;
=== Макроструктура алгоритма ===&lt;br /&gt;
Основную часть метода составляет процедура односторонних вращений матрицы, которая в свою очередь состоит из:&lt;br /&gt;
&lt;br /&gt;
#Вычисление &amp;lt;math&amp;gt;\tau, c, s, t&amp;lt;/math&amp;gt;.&lt;br /&gt;
#Одностороннее вращение матрицы. &lt;br /&gt;
&lt;br /&gt;
Что требует &amp;lt;math&amp;gt;O(n)&amp;lt;/math&amp;gt; операций.&lt;br /&gt;
&lt;br /&gt;
После этого необходимо:&lt;br /&gt;
&lt;br /&gt;
#Вычислить сингулярные числа &amp;lt;math&amp;gt;\sigma_i&amp;lt;/math&amp;gt;.  Что требует &amp;lt;math&amp;gt;O(n)&amp;lt;/math&amp;gt; операций.&lt;br /&gt;
#Вычислить &amp;lt;math&amp;gt;U&amp;lt;/math&amp;gt; и &amp;lt;math&amp;gt;V&amp;lt;/math&amp;gt;. Что требует &amp;lt;math&amp;gt;O(n^2)&amp;lt;/math&amp;gt; операций.&lt;br /&gt;
&lt;br /&gt;
=== Схема реализации последовательного алгоритма ===&lt;br /&gt;
Применение метода Якоби к матрице &amp;lt;math&amp;gt;A = (G^TG)&amp;lt;/math&amp;gt; можно описать следующим образом&amp;lt;ref&amp;gt;Дж. Деммель «Вычислительная линейная алгебра» (стр. 261-263)&amp;lt;/ref&amp;gt;:&lt;br /&gt;
&lt;br /&gt;
Если &amp;lt;math&amp;gt;G = U\Sigma V^T&amp;lt;/math&amp;gt; и &amp;lt;math&amp;gt;\Sigma = diag(\sigma_{i})&amp;lt;/math&amp;gt;, то алгоритм вычисляет сингулярные числа &amp;lt;math&amp;gt;\sigma_{i}&amp;lt;/math&amp;gt;, матрицу &amp;lt;math&amp;gt;U&amp;lt;/math&amp;gt; левых сингулярных векторов и матрицу &amp;lt;math&amp;gt;V&amp;lt;/math&amp;gt; правых сингулярных векторов по следующей схеме:&lt;br /&gt;
&lt;br /&gt;
 repeat&lt;br /&gt;
     for &amp;lt;math&amp;gt;j=1&amp;lt;/math&amp;gt; to &amp;lt;math&amp;gt;n-1&amp;lt;/math&amp;gt;&lt;br /&gt;
         for &amp;lt;math&amp;gt;k=j+1&amp;lt;/math&amp;gt; to &amp;lt;math&amp;gt;n&amp;lt;/math&amp;gt;&lt;br /&gt;
             обратиться к процедуре &#039;&#039;&#039;&#039;&#039;One-Sided-Jacobi-Rotation&amp;lt;math&amp;gt;(G,j,k)&amp;lt;/math&amp;gt;&#039;&#039;&#039;&#039;&#039;&lt;br /&gt;
         end for&lt;br /&gt;
     end for&lt;br /&gt;
 пока &amp;lt;math&amp;gt;G^TG&amp;lt;/math&amp;gt; не станет достаточно близка к диагональной матрице&lt;br /&gt;
 Положить &amp;lt;math&amp;gt;\sigma_{i} = ||G(:,i)||_2 &amp;lt;/math&amp;gt; (норма &amp;lt;math&amp;gt;i&amp;lt;/math&amp;gt;-го столбца в &amp;lt;math&amp;gt;G&amp;lt;/math&amp;gt;)&lt;br /&gt;
 Положить &amp;lt;math&amp;gt;U = [u_{1},\dots, u_{n}]&amp;lt;/math&amp;gt;, где &amp;lt;math&amp;gt;u_{i} = G(:,i)/\sigma_{i}&amp;lt;/math&amp;gt;&lt;br /&gt;
 Положить &amp;lt;math&amp;gt;V = J&amp;lt;/math&amp;gt;, где &amp;lt;math&amp;gt;J&amp;lt;/math&amp;gt; - накопленное произведение вращений Якоби.&lt;br /&gt;
&lt;br /&gt;
Где процедура &#039;&#039;&#039;&#039;&#039;One-Sided-Jacobi-Rotation&#039;&#039;&#039;&#039;&#039; является метод односторонних вращений Якоби:&lt;br /&gt;
&lt;br /&gt;
 proc &#039;&#039;&#039;&#039;&#039;One-Sided-Jacobi-Rotation&amp;lt;math&amp;gt;(G,j,k)&amp;lt;/math&amp;gt;&#039;&#039;&#039;&#039;&#039;&lt;br /&gt;
     вычислить &amp;lt;math&amp;gt;a_{jj} = (G^TG)_{jj}, a_{jk} = (G^TG)_{jk}&amp;lt;/math&amp;gt; и &amp;lt;math&amp;gt;a_{kk} = (G^TG)_{kk}&amp;lt;/math&amp;gt;&lt;br /&gt;
     if &amp;lt;math&amp;gt;|a_{jk}|&amp;lt;/math&amp;gt; не слишком мал&lt;br /&gt;
         &amp;lt;math&amp;gt;&lt;br /&gt;
         \begin{align}&lt;br /&gt;
         \tau &amp;amp;= {a_{jj} - a_{kk}}/{2a_{jk}} \\&lt;br /&gt;
         t &amp;amp;= {sign(\tau)}/(|\tau| + \sqrt{1 + \tau^2}) \\&lt;br /&gt;
         c &amp;amp;= 1/(\sqrt{1 + t^2}) \\&lt;br /&gt;
         s &amp;amp;= ct \\&lt;br /&gt;
         G &amp;amp;= GR(j,k,\theta) \  \dots c=cos\theta, s=sin\theta \end{align}&amp;lt;/math&amp;gt;&lt;br /&gt;
         if нужны правые сингулярные векторы &lt;br /&gt;
             &amp;lt;math&amp;gt;J = JR(j,k,\theta)&amp;lt;/math&amp;gt;&lt;br /&gt;
         end if&lt;br /&gt;
     end if&lt;br /&gt;
&lt;br /&gt;
=== Последовательная сложность алгоритма ===&lt;br /&gt;
Для одного вращения Якоби необходимо выполнить &amp;lt;math&amp;gt;O(n)&amp;lt;/math&amp;gt; операций умножения и сложения. &lt;br /&gt;
&lt;br /&gt;
Всего вариантов выбора &amp;lt;math&amp;gt;j&amp;lt;/math&amp;gt; и &amp;lt;math&amp;gt;k&amp;lt;/math&amp;gt; существует &amp;lt;math&amp;gt;\frac{n(n-1)}{2}&amp;lt;/math&amp;gt;.&lt;br /&gt;
&lt;br /&gt;
Таким образом последовательный алгоритм Якоби вычисления сингулярных чисел и векторов является алгоритмом с кубической сложностью.&lt;br /&gt;
&lt;br /&gt;
=== Информационный граф ===&lt;br /&gt;
Граф алгоритма состоит из четырех групп вершин&lt;br /&gt;
&lt;br /&gt;
(А)Первая группа вершин расположена в двумерной области, соответствующая ей операция - вычисление элементов &amp;lt;math&amp;gt;a_{jj},a_{jk},a_{kk}&amp;lt;/math&amp;gt; матрицы произведения &amp;lt;math&amp;gt;A = (G^TG)&amp;lt;/math&amp;gt;. Где &amp;lt;math&amp;gt;j&amp;lt;/math&amp;gt; изменяется от &amp;lt;math&amp;gt;1&amp;lt;/math&amp;gt; до &amp;lt;math&amp;gt;n-1&amp;lt;/math&amp;gt;, принимая все целочисленные значения, &amp;lt;math&amp;gt;k&amp;lt;/math&amp;gt;  изменяется от &amp;lt;math&amp;gt;j+1&amp;lt;/math&amp;gt; до &amp;lt;math&amp;gt;n&amp;lt;/math&amp;gt;, принимая все целочисленные значения.&lt;br /&gt;
&lt;br /&gt;
Граф вычисления каждого из элементов приведен на рисунке 1, где значениям &amp;lt;math&amp;gt;g_{ij}&amp;lt;/math&amp;gt; соответствуют обозначения &amp;lt;math&amp;gt;x_{ij}&amp;lt;/math&amp;gt;, а элементам &amp;lt;math&amp;gt;g^T_{ij}&amp;lt;/math&amp;gt; обозначения &amp;lt;math&amp;gt;z_{ij}&amp;lt;/math&amp;gt;. Значение &amp;lt;math&amp;gt;s_{ij}&amp;lt;/math&amp;gt; является значением результирующего элемента.&lt;br /&gt;
&lt;br /&gt;
(Б)Вторая группа вершин расположена в двумерной области, соответствующая ей операция – вычисление &amp;lt;math&amp;gt;c&amp;lt;/math&amp;gt; и &amp;lt;math&amp;gt;s&amp;lt;/math&amp;gt;.&lt;br /&gt;
&lt;br /&gt;
Информационный граф с входными и выходными данными вычисления пункта (Б) представлен на рисунке 2.&lt;br /&gt;
&lt;br /&gt;
(В)Третья группа вершин расположена в двумерной области, соответствующая ей операция вычисление значений элементов &amp;lt;math&amp;gt;g_{jm}^{(i+1)} = g_{mj}^{(i+1)}&amp;lt;/math&amp;gt; и &amp;lt;math&amp;gt;g_{km}^{(i+1)} = g_{mk}^{(i+1)}&amp;lt;/math&amp;gt;, &amp;lt;math&amp;gt;m \ne j,k&amp;lt;/math&amp;gt;.&lt;br /&gt;
&lt;br /&gt;
(Г)Четвертая группа вершин расположена в двумерной области, соответствующая ей операция вычисление значений элементов &amp;lt;math&amp;gt;g_{jj}^{(i+1)} &amp;lt;/math&amp;gt; и &amp;lt;math&amp;gt;g_{kk}^{(i+1)} &amp;lt;/math&amp;gt;.&lt;br /&gt;
&lt;br /&gt;
Элементы групп (В) и (Г) вычисляются аналогично вычислению элементов матрицы произведения, т.к. фактически представляют собой перемножение матриц &amp;lt;math&amp;gt;G&amp;lt;/math&amp;gt; и &amp;lt;math&amp;gt;R&amp;lt;/math&amp;gt;&lt;br /&gt;
&lt;br /&gt;
[[File:Jacobi_2.jpg|none|thumb|1000px|Рисунок 1. Информационный граф с входными и выходными параметрами вычисления каждого элемента матрицы произведения.]]&lt;br /&gt;
&lt;br /&gt;
[[File:Jacobi_1.jpg|none|thumb|1000px|Рисунок 2. Информационный граф с входными и выходными параметрами вычисления значений &amp;lt;math&amp;gt;c&amp;lt;/math&amp;gt; и &amp;lt;math&amp;gt;s&amp;lt;/math&amp;gt;.]]&lt;br /&gt;
&lt;br /&gt;
Обобщенный граф метода Якоби представлен на рисунке 3, где буквами А, Б, В и Г обозначено вычисление групп вершин (А), (Б), (В) и (Г).&lt;br /&gt;
&lt;br /&gt;
[[File:Graf2.png|none|thumb|2000px|Рисунок 3. Обобщенный граф алгоритма вычисления сингулярных чисел и векторов методом Якоби.]]&lt;br /&gt;
&lt;br /&gt;
=== Ресурс параллелизма алгоритма ===&lt;br /&gt;
Для выполнения одной итерации метода Якоби требуется последовательно выполнить несколько ярусов:&lt;br /&gt;
# вычислить &amp;lt;math&amp;gt;\tau&amp;lt;/math&amp;gt; &lt;br /&gt;
# вычислить &amp;lt;math&amp;gt;t&amp;lt;/math&amp;gt; &lt;br /&gt;
# вычислить &amp;lt;math&amp;gt;c&amp;lt;/math&amp;gt; &lt;br /&gt;
# выполнить поворот матрицы &amp;lt;math&amp;gt;G&amp;lt;/math&amp;gt; с параллельным выполнением &amp;lt;math&amp;gt;2(n-2)&amp;lt;/math&amp;gt; операций вычисления элементов матрицы &amp;lt;math&amp;gt;g_{jm}^{(i+1)} = g_{mj}^{(i+1)}&amp;lt;/math&amp;gt; и &amp;lt;math&amp;gt;g_{km}^{(i+1)} = g_{mk}^{(i+1)}&amp;lt;/math&amp;gt;, &amp;lt;math&amp;gt;m \ne j,k&amp;lt;/math&amp;gt;, а также вычисления элементов &amp;lt;math&amp;gt;g_{jj}^{(i+1)} &amp;lt;/math&amp;gt; и &amp;lt;math&amp;gt;g_{kk}^{(i+1)} &amp;lt;/math&amp;gt;. &lt;br /&gt;
&lt;br /&gt;
Суммарное количество итераций равно &amp;lt;math&amp;gt;\frac{n(n-1)}{2}&amp;lt;/math&amp;gt; (Различные варианты выбора &amp;lt;math&amp;gt;j&amp;lt;/math&amp;gt; и &amp;lt;math&amp;gt;k&amp;lt;/math&amp;gt;). &lt;br /&gt;
&lt;br /&gt;
Асимптотически метод сходится квадратично. &lt;br /&gt;
&lt;br /&gt;
Таким образом, при классификации по высоте ЯПФ метод Якоби относится к алгоритмам со сложностью &amp;lt;math&amp;gt;O(n^2)&amp;lt;/math&amp;gt;&amp;amp;nbsp;, а при классификации по ширине ЯПФ — к алгоритмам со сложностью &amp;lt;math&amp;gt;O(n)&amp;lt;/math&amp;gt;.&lt;br /&gt;
&lt;br /&gt;
=== Входные и выходные данные алгоритма ===&lt;br /&gt;
&#039;&#039;&#039;Входные данные&#039;&#039;&#039;: плотная матрица &amp;lt;math&amp;gt;G&amp;lt;/math&amp;gt; размера &amp;lt;math&amp;gt;n&amp;lt;/math&amp;gt;х&amp;lt;math&amp;gt;n&amp;lt;/math&amp;gt;, где &amp;lt;math&amp;gt;A= G^TG&amp;lt;/math&amp;gt; – симметрическая матрица.&lt;br /&gt;
&lt;br /&gt;
&#039;&#039;&#039;Объём входных данных&#039;&#039;&#039;: &amp;lt;math&amp;gt;n^2&amp;lt;/math&amp;gt; (т.к. для хранения матрицы &amp;lt;math&amp;gt;G&amp;lt;/math&amp;gt; используем двумерный массив размера &amp;lt;math&amp;gt;n&amp;lt;/math&amp;gt;х&amp;lt;math&amp;gt;n&amp;lt;/math&amp;gt;)&lt;br /&gt;
&lt;br /&gt;
&#039;&#039;&#039;Выходные данные&#039;&#039;&#039;: &amp;lt;math&amp;gt;\sigma_{i}&amp;lt;/math&amp;gt;  - сингулярные числа, матрица &amp;lt;math&amp;gt;U&amp;lt;/math&amp;gt; левых сингулярных векторов и матрица &amp;lt;math&amp;gt;V&amp;lt;/math&amp;gt; правых сингулярных векторов.&lt;br /&gt;
&lt;br /&gt;
&#039;&#039;&#039;Объём выходных данных&#039;&#039;&#039;: &amp;lt;math&amp;gt;2n^2 + n&amp;lt;/math&amp;gt; (т.к. необходимо хранить вектор сингулярных чисел длины &amp;lt;math&amp;gt;n&amp;lt;/math&amp;gt;, а также две матрицы &amp;lt;math&amp;gt;U, V&amp;lt;/math&amp;gt; левых и правых сингулярных векторов размера &amp;lt;math&amp;gt;n&amp;lt;/math&amp;gt;х&amp;lt;math&amp;gt;n&amp;lt;/math&amp;gt;).&lt;br /&gt;
&lt;br /&gt;
=== Свойства алгоритма ===&lt;br /&gt;
Метод Якоби является самым медленным из имеющихся алгоритмов вычисления сингулярных чисел и сингулярных векторов матрицы. Тем не менее, для  матриц &amp;lt;math&amp;gt;G&amp;lt;/math&amp;gt;, которые могут быть представлены в виде &amp;lt;math&amp;gt;G=DX&amp;lt;/math&amp;gt;, где &amp;lt;math&amp;gt;D&amp;lt;/math&amp;gt; - диагональная, а &amp;lt;math&amp;gt;X&amp;lt;/math&amp;gt; - хорошо обусловлена, он способен вычислять сингулярные числа и вектора намного точнее, чем другие методы&amp;lt;ref&amp;gt;Дж. Деммель «Вычислительная линейная алгебра» (стр. 261-264)&amp;lt;/ref&amp;gt;. &lt;br /&gt;
&lt;br /&gt;
Вычислительная мощность алгоритма, как отношение числа операций к суммарному объему входных и выходных данных является линейной.&lt;br /&gt;
&lt;br /&gt;
Метод Якоби не детерминирован, так как является итерационным алгоритмом с выходом по точности (число итераций зависит от входных данных и порогового значения).&lt;br /&gt;
&lt;br /&gt;
== Программная реализация алгоритма ==&lt;br /&gt;
&lt;br /&gt;
=== Особенности реализации последовательного алгоритма ===&lt;br /&gt;
&lt;br /&gt;
=== Локальность данных и вычислений ===&lt;br /&gt;
&lt;br /&gt;
=== Возможные способы и особенности параллельной реализации алгоритма ===&lt;br /&gt;
&lt;br /&gt;
=== Масштабируемость алгоритма и его реализации ===&lt;br /&gt;
&lt;br /&gt;
=== Динамические характеристики и эффективность реализации алгоритма ===&lt;br /&gt;
&lt;br /&gt;
=== Выводы для классов архитектур ===&lt;br /&gt;
&lt;br /&gt;
=== Существующие реализации алгоритма ===&lt;br /&gt;
Метод Якоби нахождения сингулярных значений и векторов реализован в таких пакетах, как LAPACK, LINPACK/EISPACK, Intel MKL &amp;lt;ref&amp;gt;http://www.alglib.net/matrixops/general/svd.php&amp;lt;/ref&amp;gt;.&lt;br /&gt;
&lt;br /&gt;
Так же функция Якоби реализована в пакете Matlab.&lt;br /&gt;
&lt;br /&gt;
Т. к. алгоритм считается медленным, он не включен во многие известные пакеты.&lt;br /&gt;
&lt;br /&gt;
== Литература ==&lt;br /&gt;
1. Дж. Деммель Вычислительная линейная алгебра. Изд. Мир, 2001.&lt;/div&gt;</summary>
		<author><name>Davletshuna Alexandra</name></author>
	</entry>
	<entry>
		<id>https://xn--80aecvaldz.xn--80ahdrnmvk.xn--p1ai/w/ru/index.php?title=%D0%A3%D1%87%D0%B0%D1%81%D1%82%D0%BD%D0%B8%D0%BA:Davletshuna_Alexandra/%D0%9C%D0%B5%D1%82%D0%BE%D0%B4_%D0%AF%D0%BA%D0%BE%D0%B1%D0%B8_%D0%B2%D1%8B%D1%87%D0%B8%D1%81%D0%BB%D0%B5%D0%BD%D0%B8%D1%8F_%D1%81%D0%B8%D0%BD%D0%B3%D1%83%D0%BB%D1%8F%D1%80%D0%BD%D1%8B%D1%85_%D1%87%D0%B8%D1%81%D0%B5%D0%BB_%D0%B8_%D0%B2%D0%B5%D0%BA%D1%82%D0%BE%D1%80%D0%BE%D0%B2&amp;diff=15652</id>
		<title>Участник:Davletshuna Alexandra/Метод Якоби вычисления сингулярных чисел и векторов</title>
		<link rel="alternate" type="text/html" href="https://xn--80aecvaldz.xn--80ahdrnmvk.xn--p1ai/w/ru/index.php?title=%D0%A3%D1%87%D0%B0%D1%81%D1%82%D0%BD%D0%B8%D0%BA:Davletshuna_Alexandra/%D0%9C%D0%B5%D1%82%D0%BE%D0%B4_%D0%AF%D0%BA%D0%BE%D0%B1%D0%B8_%D0%B2%D1%8B%D1%87%D0%B8%D1%81%D0%BB%D0%B5%D0%BD%D0%B8%D1%8F_%D1%81%D0%B8%D0%BD%D0%B3%D1%83%D0%BB%D1%8F%D1%80%D0%BD%D1%8B%D1%85_%D1%87%D0%B8%D1%81%D0%B5%D0%BB_%D0%B8_%D0%B2%D0%B5%D0%BA%D1%82%D0%BE%D1%80%D0%BE%D0%B2&amp;diff=15652"/>
		<updated>2016-11-01T20:31:27Z</updated>

		<summary type="html">&lt;p&gt;Davletshuna Alexandra: /* Информационный граф */&lt;/p&gt;
&lt;hr /&gt;
&lt;div&gt;{{Assignment}}&lt;br /&gt;
&lt;br /&gt;
{{algorithm&lt;br /&gt;
| name              = Метод Якоби вычисления сингулярных чисел и векторов&lt;br /&gt;
| serial_complexity = &amp;lt;math&amp;gt;O(n^3)&amp;lt;/math&amp;gt;&lt;br /&gt;
| pf_height         = &amp;lt;math&amp;gt;O(n^2)&amp;lt;/math&amp;gt;&lt;br /&gt;
| pf_width          = &amp;lt;math&amp;gt;O(n)&amp;lt;/math&amp;gt;&lt;br /&gt;
| input_data        = &amp;lt;math&amp;gt;n^2&amp;lt;/math&amp;gt;&lt;br /&gt;
| output_data       = &amp;lt;math&amp;gt;2n^2 + n&amp;lt;/math&amp;gt;&lt;br /&gt;
}}&lt;br /&gt;
&lt;br /&gt;
Авторы статьи: [[Участница:Davletshuna Alexandra|Давлетшина Александра]] (группа 619), [[Участница:Alek sandra|Зайцева Александра]] (группа 601)&lt;br /&gt;
&lt;br /&gt;
== Свойства и структура алгоритма ==&lt;br /&gt;
&lt;br /&gt;
=== Общее описание алгоритма ===&lt;br /&gt;
&#039;&#039;&#039;Сингулярным разложением&#039;&#039;&#039; называется разложение прямоугольной вещественной или комплексной матрицы, имеющее широкое применение, в силу своей наглядной геометрической интерпретации, при решении многих прикладных задач. Сингулярное разложение матрицы А позволяет вычислять сингулярные числа данной матрицы, а также, левые и правые сингулярные векторы матрицы А:&lt;br /&gt;
&lt;br /&gt;
•	левые сингулярные векторы матрицы А — это собственные векторы матрицы &amp;lt;math&amp;gt;AA^*&amp;lt;/math&amp;gt;;&lt;br /&gt;
&lt;br /&gt;
•	правые сингулярные векторы матрицы A — это собственные векторы матрицы &amp;lt;math&amp;gt;A^*A&amp;lt;/math&amp;gt;.&lt;br /&gt;
&lt;br /&gt;
Геометрическая интерпретация сингулярного разложения заключается в следующем факте из геометрии: &#039;&#039;Образом любого линейного преобразования, заданного с помощью матрицы &amp;lt;math&amp;gt;m&amp;lt;/math&amp;gt;x&amp;lt;math&amp;gt;n&amp;lt;/math&amp;gt;, примененного к единичной сфере является гиперэллипсоид&#039;&#039;.&lt;br /&gt;
&lt;br /&gt;
Из многочисленных разложений матриц, наиболее удобным является сингулярное разложение матрицы в виде: &amp;lt;math&amp;gt;A=U\Sigma V^*&amp;lt;/math&amp;gt;, где &amp;lt;math&amp;gt;U, V&amp;lt;/math&amp;gt; – унитарные матрицы, а &amp;lt;math&amp;gt;\Sigma&amp;lt;/math&amp;gt; – диагональная матрица с вещественными положительными числами на диагонали &amp;lt;ref&amp;gt;http://algorithms.parallel.ru/&amp;lt;/ref&amp;gt;.&lt;br /&gt;
&lt;br /&gt;
Диагональные элементы матрицы &amp;lt;math&amp;gt;\Sigma&amp;lt;/math&amp;gt; называются сингулярными числами матрицы &amp;lt;math&amp;gt;A&amp;lt;/math&amp;gt;, а столбцы матриц &amp;lt;math&amp;gt;U,V&amp;lt;/math&amp;gt; левыми и правыми сингулярными векторами соответственно.&lt;br /&gt;
&lt;br /&gt;
Алгоритм Якоби сингулярного разложения матрицы был предложен одним из первых в 1846 году. Он приводит прямоугольную матрицу к диагональной матрице с помощью последовательности элементарных вращений. Метод может найти все сингулярные значения с очень высокой точностью. Однако его производительность является довольно низкой, в сравнении с конкурирующими методами.&lt;br /&gt;
&lt;br /&gt;
&#039;&#039;Неявный&#039;&#039;&amp;lt;ref&amp;gt;Дж. Деммель «Вычислительная линейная алгебра» (стр. 261-264)&amp;lt;/ref&amp;gt; метод Якоби математически эквивалентен применению метода Якоби вычисления собственных значений к матрице &amp;lt;math&amp;gt;A = G^TG&amp;lt;/math&amp;gt;.&lt;br /&gt;
Это значит, что на каждом шаге вычисляется вращение Якоби &amp;lt;math&amp;gt;J&amp;lt;/math&amp;gt;, с помощью которого матрица &amp;lt;math&amp;gt;G^TG&amp;lt;/math&amp;gt; неявно пересчитывется в &amp;lt;math&amp;gt;J^TG^TGJ&amp;lt;/math&amp;gt;; вращение выбрано так, чтобы пара внедиагональных элементов из &amp;lt;math&amp;gt;G^TG&amp;lt;/math&amp;gt; обратилась в нули в матрице &amp;lt;math&amp;gt;J^TG^TGJ&amp;lt;/math&amp;gt;. При этом ни &amp;lt;math&amp;gt;G^TG&amp;lt;/math&amp;gt;, ни &amp;lt;math&amp;gt;J^TG^TGJ&amp;lt;/math&amp;gt; не вычисляются в явном виде; вместо них вычисляется матрица &amp;lt;math&amp;gt;GJ&amp;lt;/math&amp;gt;. Поэтому алгоритм называется &#039;&#039;методом односторонних вращений&#039;&#039;.&lt;br /&gt;
&lt;br /&gt;
=== Математическое описание алгоритма ===&lt;br /&gt;
Исходные данные: матрица &amp;lt;math&amp;gt;G&amp;lt;/math&amp;gt; (элементы &amp;lt;math&amp;gt;g_{ij}, i, j = 1, \ldots, n&amp;lt;/math&amp;gt;).&lt;br /&gt;
&lt;br /&gt;
Вычисляемые данные: матрица &amp;lt;math&amp;gt;\Sigma = diag(\sigma_{i})&amp;lt;/math&amp;gt;, где &amp;lt;math&amp;gt;\sigma_{i}&amp;lt;/math&amp;gt; - сингулярные числа, &amp;lt;math&amp;gt;U&amp;lt;/math&amp;gt; - матрица левых сингулярных векторов, &amp;lt;math&amp;gt;V&amp;lt;/math&amp;gt; - матрица правых сингулярных векторов.&lt;br /&gt;
&lt;br /&gt;
симметричную матрицу &amp;lt;math&amp;gt;A = (G^TG)&amp;lt;/math&amp;gt; можно привести к диагональному виду:&lt;br /&gt;
&amp;lt;math&amp;gt;RG^TGR^T&amp;lt;/math&amp;gt;, где&lt;br /&gt;
&lt;br /&gt;
&amp;lt;math&amp;gt;&lt;br /&gt;
R(j,k,\theta) = &lt;br /&gt;
\begin{matrix}&lt;br /&gt;
  \\&lt;br /&gt;
  \\&lt;br /&gt;
  \\&lt;br /&gt;
j \\&lt;br /&gt;
  \\&lt;br /&gt;
k \\&lt;br /&gt;
  \\&lt;br /&gt;
  \\&lt;br /&gt;
  \\&lt;br /&gt;
\end{matrix}&lt;br /&gt;
&amp;lt;/math&amp;gt;  &lt;br /&gt;
&amp;lt;math&amp;gt;&lt;br /&gt;
\begin{bmatrix}&lt;br /&gt;
  &amp;amp; 1 &amp;amp;   &amp;amp;        &amp;amp;              &amp;amp;        &amp;amp;               &amp;amp;         &amp;amp;    &amp;amp;   \\&lt;br /&gt;
  &amp;amp;   &amp;amp; 1 &amp;amp;        &amp;amp;              &amp;amp;        &amp;amp;               &amp;amp;         &amp;amp;    &amp;amp;   \\&lt;br /&gt;
  &amp;amp;   &amp;amp;   &amp;amp; \ddots &amp;amp;              &amp;amp;        &amp;amp;               &amp;amp;         &amp;amp;    &amp;amp;   \\&lt;br /&gt;
  &amp;amp;   &amp;amp;   &amp;amp;        &amp;amp; \cos(\theta) &amp;amp;        &amp;amp; -\sin(\theta) &amp;amp;         &amp;amp;    &amp;amp;   \\&lt;br /&gt;
  &amp;amp;   &amp;amp;   &amp;amp;        &amp;amp;              &amp;amp; \ddots &amp;amp;               &amp;amp;         &amp;amp;    &amp;amp;   \\&lt;br /&gt;
  &amp;amp;   &amp;amp;   &amp;amp;        &amp;amp; \sin(\theta) &amp;amp;        &amp;amp; \cos(\theta)  &amp;amp;         &amp;amp;    &amp;amp;   \\&lt;br /&gt;
  &amp;amp;   &amp;amp;   &amp;amp;        &amp;amp;              &amp;amp;        &amp;amp;               &amp;amp; \ddots  &amp;amp;    &amp;amp;   \\&lt;br /&gt;
  &amp;amp;   &amp;amp;   &amp;amp;        &amp;amp;              &amp;amp;        &amp;amp;               &amp;amp;         &amp;amp; 1  &amp;amp;   \\&lt;br /&gt;
  &amp;amp;   &amp;amp;   &amp;amp;        &amp;amp;              &amp;amp;        &amp;amp;               &amp;amp;         &amp;amp;    &amp;amp; 1 \\&lt;br /&gt;
\end{bmatrix}&lt;br /&gt;
&amp;lt;/math&amp;gt;&lt;br /&gt;
&lt;br /&gt;
Обозначим &amp;lt;math&amp;gt;s = \sin \theta&amp;lt;/math&amp;gt; и &amp;lt;math&amp;gt;c = \cos \theta&amp;lt;/math&amp;gt;.&lt;br /&gt;
&lt;br /&gt;
Перемножив матрицы &amp;lt;math&amp;gt;RG^TGR^T&amp;lt;/math&amp;gt;, получим следующие выражения&amp;lt;ref&amp;gt;http://www.astro.tsu.ru/OsChMet/5_2.html&amp;lt;/ref&amp;gt;:&lt;br /&gt;
&lt;br /&gt;
&amp;lt;math&amp;gt;\begin{align}&lt;br /&gt;
 a_{jj}^{(i+1)} &amp;amp;= c^2\, a_{jj}^{(i)}  -  2\, s c \,a_{jk}^{(i)}  +  s^2\, a_{kk}^{(i)} \\&lt;br /&gt;
 a_{kk}^{(i+1)} &amp;amp;= s^2 \,a_{jj}^{(i)}  +  2 s c\, a_{jk}^{(i)}  +  c^2 \, a_{kk}^{(i)} \\&lt;br /&gt;
 a_{jk}^{(i+1)} &amp;amp;= a_{kj}^{(i+1)} = (c^2 - s^2 ) \, a_{jk}^{(i)}  +  s c \, (a_{kk}^{(i)} - a_{jj}^{(i)} ) \\&lt;br /&gt;
 a_{jm}^{(i+1)} &amp;amp;= a_{mj}^{(i+1)} = c \, a_{jm}^{(i)}  -  s \, a_{km}^{(i)} &amp;amp; m \ne j,k \\&lt;br /&gt;
 a_{km}^{(i+1)} &amp;amp;= a_{mk}^{(i+1)} = s \, a_{jm}^{(i)}  + c \, a_{km}^{(i)} &amp;amp; m \ne j,k \\&lt;br /&gt;
 a_{ml}^{(i+1)} &amp;amp;= a_{ml}^{(i)} &amp;amp;m,l \ne j,k&lt;br /&gt;
\end{align}&amp;lt;/math&amp;gt;&lt;br /&gt;
&lt;br /&gt;
Т.к внедиагональные элементы должны быть равны 0, то выбираем &amp;lt;math&amp;gt;\theta&amp;lt;/math&amp;gt; так, чтобы &amp;lt;math&amp;gt;a_{jk}^{(i+1)} = 0&amp;lt;/math&amp;gt; и &amp;lt;math&amp;gt;a_{kj}^{(i+1)} = 0&amp;lt;/math&amp;gt;.&lt;br /&gt;
&lt;br /&gt;
Тогда решая уравнение получаем, что&lt;br /&gt;
&lt;br /&gt;
&amp;lt;math&amp;gt;&lt;br /&gt;
         \begin{align}&lt;br /&gt;
         \tau &amp;amp;= {a_{jj} - a_{kk}}/{2a_{jk}} \\&lt;br /&gt;
         t &amp;amp;= {sign(\tau)}/(|\tau| + \sqrt{1 + \tau^2}) \\&lt;br /&gt;
         c &amp;amp;= 1/(\sqrt{1 + t^2}) \\&lt;br /&gt;
         s &amp;amp;= ct \\&lt;br /&gt;
         \end{align}&amp;lt;/math&amp;gt;&lt;br /&gt;
&lt;br /&gt;
Остановка вычислений алгоритма наступает, когда внедиагональные элементы становятся меньше некоторого наперед заданного числа &amp;lt;math&amp;gt;\varepsilon&amp;lt;/math&amp;gt;.&lt;br /&gt;
&lt;br /&gt;
=== Вычислительное ядро алгоритма ===&lt;br /&gt;
Вычислительное ядро алгоритма составляет непосредственно вычисление одностороннего вращения Якоби, т.е. вычисление элементов матрицы &amp;lt;math&amp;gt;g_{jm}^{(i+1)} = g_{mj}^{(i+1)}&amp;lt;/math&amp;gt; и &amp;lt;math&amp;gt;g_{km}^{(i+1)} = g_{mk}^{(i+1)}&amp;lt;/math&amp;gt;, &amp;lt;math&amp;gt;m \ne j,k&amp;lt;/math&amp;gt;, а также вычисления элементов &amp;lt;math&amp;gt;g_{jj}^{(i+1)} &amp;lt;/math&amp;gt; и &amp;lt;math&amp;gt;g_{kk}^{(i+1)} &amp;lt;/math&amp;gt;, получившихся после умножения промежуточной матрицы на матрицу вращений Якоби:&lt;br /&gt;
&lt;br /&gt;
&amp;lt;math&amp;gt;\begin{align}&lt;br /&gt;
 g_{jj}^{(i+1)} &amp;amp;= c^2\, g_{jj}^{(i)}  -  2\, s c \,g_{jk}^{(i)}  +  s^2\, g_{kk}^{(i)} \\&lt;br /&gt;
 g_{kk}^{(i+1)} &amp;amp;= s^2 \,g_{jj}^{(i)}  +  2 s c\, g_{jk}^{(i)}  +  c^2 \, g_{kk}^{(i)} \\&lt;br /&gt;
 g_{jk}^{(i+1)} &amp;amp;= g_{kj}^{(i+1)} = (c^2 - s^2 ) \, g_{jk}^{(i)}  +  s c \, (g_{kk}^{(i)} - g_{jj}^{(i)} ) \\&lt;br /&gt;
 g_{jm}^{(i+1)} &amp;amp;= g_{mj}^{(i+1)} = c \, g_{jm}^{(i)}  -  s \, g_{km}^{(i)} &amp;amp; m \ne j,k \\&lt;br /&gt;
 g_{km}^{(i+1)} &amp;amp;= g_{mk}^{(i+1)} = s \, g_{jm}^{(i)}  + c \, g_{km}^{(i)} &amp;amp; m \ne j,k \\&lt;br /&gt;
 g_{ml}^{(i+1)} &amp;amp;= g_{ml}^{(i)} &amp;amp;m,l \ne j,k&lt;br /&gt;
\end{align}&amp;lt;/math&amp;gt;&lt;br /&gt;
&lt;br /&gt;
=== Макроструктура алгоритма ===&lt;br /&gt;
Основную часть метода составляет процедура односторонних вращений матрицы, которая в свою очередь состоит из:&lt;br /&gt;
&lt;br /&gt;
#Вычисление &amp;lt;math&amp;gt;\tau, c, s, t&amp;lt;/math&amp;gt;.&lt;br /&gt;
#Одностороннее вращение матрицы. &lt;br /&gt;
&lt;br /&gt;
Что требует &amp;lt;math&amp;gt;O(n)&amp;lt;/math&amp;gt; операций.&lt;br /&gt;
&lt;br /&gt;
После этого необходимо:&lt;br /&gt;
&lt;br /&gt;
#Вычислить сингулярные числа &amp;lt;math&amp;gt;\sigma_i&amp;lt;/math&amp;gt;.  Что требует &amp;lt;math&amp;gt;O(n)&amp;lt;/math&amp;gt; операций.&lt;br /&gt;
#Вычислить &amp;lt;math&amp;gt;U&amp;lt;/math&amp;gt; и &amp;lt;math&amp;gt;V&amp;lt;/math&amp;gt;. Что требует &amp;lt;math&amp;gt;O(n^2)&amp;lt;/math&amp;gt; операций.&lt;br /&gt;
&lt;br /&gt;
=== Схема реализации последовательного алгоритма ===&lt;br /&gt;
Применение метода Якоби к матрице &amp;lt;math&amp;gt;A = (G^TG)&amp;lt;/math&amp;gt; можно описать следующим образом&amp;lt;ref&amp;gt;Дж. Деммель «Вычислительная линейная алгебра» (стр. 261-263)&amp;lt;/ref&amp;gt;:&lt;br /&gt;
&lt;br /&gt;
Если &amp;lt;math&amp;gt;G = U\Sigma V^T&amp;lt;/math&amp;gt; и &amp;lt;math&amp;gt;\Sigma = diag(\sigma_{i})&amp;lt;/math&amp;gt;, то алгоритм вычисляет сингулярные числа &amp;lt;math&amp;gt;\sigma_{i}&amp;lt;/math&amp;gt;, матрицу &amp;lt;math&amp;gt;U&amp;lt;/math&amp;gt; левых сингулярных векторов и матрицу &amp;lt;math&amp;gt;V&amp;lt;/math&amp;gt; правых сингулярных векторов по следующей схеме:&lt;br /&gt;
&lt;br /&gt;
 repeat&lt;br /&gt;
     for &amp;lt;math&amp;gt;j=1&amp;lt;/math&amp;gt; to &amp;lt;math&amp;gt;n-1&amp;lt;/math&amp;gt;&lt;br /&gt;
         for &amp;lt;math&amp;gt;k=j+1&amp;lt;/math&amp;gt; to &amp;lt;math&amp;gt;n&amp;lt;/math&amp;gt;&lt;br /&gt;
             обратиться к процедуре &#039;&#039;&#039;&#039;&#039;One-Sided-Jacobi-Rotation&amp;lt;math&amp;gt;(G,j,k)&amp;lt;/math&amp;gt;&#039;&#039;&#039;&#039;&#039;&lt;br /&gt;
         end for&lt;br /&gt;
     end for&lt;br /&gt;
 пока &amp;lt;math&amp;gt;G^TG&amp;lt;/math&amp;gt; не станет достаточно близка к диагональной матрице&lt;br /&gt;
 Положить &amp;lt;math&amp;gt;\sigma_{i} = ||G(:,i)||_2 &amp;lt;/math&amp;gt; (норма &amp;lt;math&amp;gt;i&amp;lt;/math&amp;gt;-го столбца в &amp;lt;math&amp;gt;G&amp;lt;/math&amp;gt;)&lt;br /&gt;
 Положить &amp;lt;math&amp;gt;U = [u_{1},\dots, u_{n}]&amp;lt;/math&amp;gt;, где &amp;lt;math&amp;gt;u_{i} = G(:,i)/\sigma_{i}&amp;lt;/math&amp;gt;&lt;br /&gt;
 Положить &amp;lt;math&amp;gt;V = J&amp;lt;/math&amp;gt;, где &amp;lt;math&amp;gt;J&amp;lt;/math&amp;gt; - накопленное произведение вращений Якоби.&lt;br /&gt;
&lt;br /&gt;
Где процедура &#039;&#039;&#039;&#039;&#039;One-Sided-Jacobi-Rotation&#039;&#039;&#039;&#039;&#039; является метод односторонних вращений Якоби:&lt;br /&gt;
&lt;br /&gt;
 proc &#039;&#039;&#039;&#039;&#039;One-Sided-Jacobi-Rotation&amp;lt;math&amp;gt;(G,j,k)&amp;lt;/math&amp;gt;&#039;&#039;&#039;&#039;&#039;&lt;br /&gt;
     вычислить &amp;lt;math&amp;gt;a_{jj} = (G^TG)_{jj}, a_{jk} = (G^TG)_{jk}&amp;lt;/math&amp;gt; и &amp;lt;math&amp;gt;a_{kk} = (G^TG)_{kk}&amp;lt;/math&amp;gt;&lt;br /&gt;
     if &amp;lt;math&amp;gt;|a_{jk}|&amp;lt;/math&amp;gt; не слишком мал&lt;br /&gt;
         &amp;lt;math&amp;gt;&lt;br /&gt;
         \begin{align}&lt;br /&gt;
         \tau &amp;amp;= {a_{jj} - a_{kk}}/{2a_{jk}} \\&lt;br /&gt;
         t &amp;amp;= {sign(\tau)}/(|\tau| + \sqrt{1 + \tau^2}) \\&lt;br /&gt;
         c &amp;amp;= 1/(\sqrt{1 + t^2}) \\&lt;br /&gt;
         s &amp;amp;= ct \\&lt;br /&gt;
         G &amp;amp;= GR(j,k,\theta) \  \dots c=cos\theta, s=sin\theta \end{align}&amp;lt;/math&amp;gt;&lt;br /&gt;
         if нужны правые сингулярные векторы &lt;br /&gt;
             &amp;lt;math&amp;gt;J = JR(j,k,\theta)&amp;lt;/math&amp;gt;&lt;br /&gt;
         end if&lt;br /&gt;
     end if&lt;br /&gt;
&lt;br /&gt;
=== Последовательная сложность алгоритма ===&lt;br /&gt;
Для одного вращения Якоби необходимо выполнить &amp;lt;math&amp;gt;O(n)&amp;lt;/math&amp;gt; операций умножения и сложения. &lt;br /&gt;
&lt;br /&gt;
Всего вариантов выбора &amp;lt;math&amp;gt;j&amp;lt;/math&amp;gt; и &amp;lt;math&amp;gt;k&amp;lt;/math&amp;gt; существует &amp;lt;math&amp;gt;\frac{n(n-1)}{2}&amp;lt;/math&amp;gt;.&lt;br /&gt;
&lt;br /&gt;
Таким образом последовательный алгоритм Якоби вычисления сингулярных чисел и векторов является алгоритмом с кубической сложностью.&lt;br /&gt;
&lt;br /&gt;
=== Информационный граф ===&lt;br /&gt;
Граф алгоритма состоит из четырех групп вершин&lt;br /&gt;
&lt;br /&gt;
(А)Первая группа вершин расположена в двумерной области, соответствующая ей операция - вычисление элементов &amp;lt;math&amp;gt;a_{jj},a_{jk},a_{kk}&amp;lt;/math&amp;gt; матрицы произведения &amp;lt;math&amp;gt;A = (G^TG)&amp;lt;/math&amp;gt;. Где &amp;lt;math&amp;gt;j&amp;lt;/math&amp;gt; изменяется от &amp;lt;math&amp;gt;1&amp;lt;/math&amp;gt; до &amp;lt;math&amp;gt;n-1&amp;lt;/math&amp;gt;, принимая все целочисленные значения, &amp;lt;math&amp;gt;k&amp;lt;/math&amp;gt;  изменяется от &amp;lt;math&amp;gt;j+1&amp;lt;/math&amp;gt; до &amp;lt;math&amp;gt;n&amp;lt;/math&amp;gt;, принимая все целочисленные значения.&lt;br /&gt;
&lt;br /&gt;
Граф вычисления каждого из элементов приведен на рисунке 1, где значениям &amp;lt;math&amp;gt;a_{ij}&amp;lt;/math&amp;gt; соответствуют обозначения &amp;lt;math&amp;gt;x_{ij}&amp;lt;/math&amp;gt;, а элементам &amp;lt;math&amp;gt;r_{ij}&amp;lt;/math&amp;gt; обозначения &amp;lt;math&amp;gt;z_{ij}&amp;lt;/math&amp;gt;. Значение &amp;lt;math&amp;gt;s_{ij}&amp;lt;/math&amp;gt; является значением результирующего элемента.&lt;br /&gt;
&lt;br /&gt;
(Б)Вторая группа вершин расположена в двумерной области, соответствующая ей операция – вычисление &amp;lt;math&amp;gt;c&amp;lt;/math&amp;gt; и &amp;lt;math&amp;gt;s&amp;lt;/math&amp;gt;.&lt;br /&gt;
&lt;br /&gt;
Информационный граф с входными и выходными данными вычисления пункта (Б) представлен на рисунке 2.&lt;br /&gt;
&lt;br /&gt;
(В)Третья группа вершин расположена в двумерной области, соответствующая ей операция вычисление значений элементов &amp;lt;math&amp;gt;g_{jm}^{(i+1)} = g_{mj}^{(i+1)}&amp;lt;/math&amp;gt; и &amp;lt;math&amp;gt;g_{km}^{(i+1)} = g_{mk}^{(i+1)}&amp;lt;/math&amp;gt;, &amp;lt;math&amp;gt;m \ne j,k&amp;lt;/math&amp;gt;.&lt;br /&gt;
&lt;br /&gt;
(Г)Четвертая группа вершин расположена в двумерной области, соответствующая ей операция вычисление значений элементов &amp;lt;math&amp;gt;g_{jj}^{(i+1)} &amp;lt;/math&amp;gt; и &amp;lt;math&amp;gt;g_{kk}^{(i+1)} &amp;lt;/math&amp;gt;.&lt;br /&gt;
&lt;br /&gt;
Элементы групп (В) и (Г) вычисляются аналогично вычислению элементов матрицы произведения, т.к. фактически представляют собой перемножение матриц &amp;lt;math&amp;gt;G&amp;lt;/math&amp;gt; и &amp;lt;math&amp;gt;R&amp;lt;/math&amp;gt;&lt;br /&gt;
&lt;br /&gt;
[[File:Jacobi_2.jpg|none|thumb|1000px|Рисунок 1. Информационный граф с входными и выходными параметрами вычисления каждого элемента матрицы произведения.]]&lt;br /&gt;
&lt;br /&gt;
[[File:Jacobi_1.jpg|none|thumb|1000px|Рисунок 2. Информационный граф с входными и выходными параметрами вычисления значений &amp;lt;math&amp;gt;c&amp;lt;/math&amp;gt; и &amp;lt;math&amp;gt;s&amp;lt;/math&amp;gt;.]]&lt;br /&gt;
&lt;br /&gt;
Обобщенный граф метода Якоби представлен на рисунке 3, где буквами А, Б, В и Г обозначено вычисление групп вершин (А), (Б), (В) и (Г).&lt;br /&gt;
&lt;br /&gt;
[[File:Graf2.png|none|thumb|2000px|Рисунок 3. Обобщенный граф алгоритма вычисления сингулярных чисел и векторов методом Якоби.]]&lt;br /&gt;
&lt;br /&gt;
=== Ресурс параллелизма алгоритма ===&lt;br /&gt;
Для выполнения одной итерации метода Якоби требуется последовательно выполнить несколько ярусов:&lt;br /&gt;
# вычислить &amp;lt;math&amp;gt;\tau&amp;lt;/math&amp;gt; &lt;br /&gt;
# вычислить &amp;lt;math&amp;gt;t&amp;lt;/math&amp;gt; &lt;br /&gt;
# вычислить &amp;lt;math&amp;gt;c&amp;lt;/math&amp;gt; &lt;br /&gt;
# выполнить поворот матрицы &amp;lt;math&amp;gt;G&amp;lt;/math&amp;gt; с параллельным выполнением &amp;lt;math&amp;gt;2(n-2)&amp;lt;/math&amp;gt; операций вычисления элементов матрицы &amp;lt;math&amp;gt;g_{jm}^{(i+1)} = g_{mj}^{(i+1)}&amp;lt;/math&amp;gt; и &amp;lt;math&amp;gt;g_{km}^{(i+1)} = g_{mk}^{(i+1)}&amp;lt;/math&amp;gt;, &amp;lt;math&amp;gt;m \ne j,k&amp;lt;/math&amp;gt;, а также вычисления элементов &amp;lt;math&amp;gt;g_{jj}^{(i+1)} &amp;lt;/math&amp;gt; и &amp;lt;math&amp;gt;g_{kk}^{(i+1)} &amp;lt;/math&amp;gt;. &lt;br /&gt;
&lt;br /&gt;
Суммарное количество итераций равно &amp;lt;math&amp;gt;\frac{n(n-1)}{2}&amp;lt;/math&amp;gt; (Различные варианты выбора &amp;lt;math&amp;gt;j&amp;lt;/math&amp;gt; и &amp;lt;math&amp;gt;k&amp;lt;/math&amp;gt;). &lt;br /&gt;
&lt;br /&gt;
Асимптотически метод сходится квадратично. &lt;br /&gt;
&lt;br /&gt;
Таким образом, при классификации по высоте ЯПФ метод Якоби относится к алгоритмам со сложностью &amp;lt;math&amp;gt;O(n^2)&amp;lt;/math&amp;gt;&amp;amp;nbsp;, а при классификации по ширине ЯПФ — к алгоритмам со сложностью &amp;lt;math&amp;gt;O(n)&amp;lt;/math&amp;gt;.&lt;br /&gt;
&lt;br /&gt;
=== Входные и выходные данные алгоритма ===&lt;br /&gt;
&#039;&#039;&#039;Входные данные&#039;&#039;&#039;: плотная матрица &amp;lt;math&amp;gt;G&amp;lt;/math&amp;gt; размера &amp;lt;math&amp;gt;n&amp;lt;/math&amp;gt;х&amp;lt;math&amp;gt;n&amp;lt;/math&amp;gt;, где &amp;lt;math&amp;gt;A= G^TG&amp;lt;/math&amp;gt; – симметрическая матрица.&lt;br /&gt;
&lt;br /&gt;
&#039;&#039;&#039;Объём входных данных&#039;&#039;&#039;: &amp;lt;math&amp;gt;n^2&amp;lt;/math&amp;gt; (т.к. для хранения матрицы &amp;lt;math&amp;gt;G&amp;lt;/math&amp;gt; используем двумерный массив размера &amp;lt;math&amp;gt;n&amp;lt;/math&amp;gt;х&amp;lt;math&amp;gt;n&amp;lt;/math&amp;gt;)&lt;br /&gt;
&lt;br /&gt;
&#039;&#039;&#039;Выходные данные&#039;&#039;&#039;: &amp;lt;math&amp;gt;\sigma_{i}&amp;lt;/math&amp;gt;  - сингулярные числа, матрица &amp;lt;math&amp;gt;U&amp;lt;/math&amp;gt; левых сингулярных векторов и матрица &amp;lt;math&amp;gt;V&amp;lt;/math&amp;gt; правых сингулярных векторов.&lt;br /&gt;
&lt;br /&gt;
&#039;&#039;&#039;Объём выходных данных&#039;&#039;&#039;: &amp;lt;math&amp;gt;2n^2 + n&amp;lt;/math&amp;gt; (т.к. необходимо хранить вектор сингулярных чисел длины &amp;lt;math&amp;gt;n&amp;lt;/math&amp;gt;, а также две матрицы &amp;lt;math&amp;gt;U, V&amp;lt;/math&amp;gt; левых и правых сингулярных векторов размера &amp;lt;math&amp;gt;n&amp;lt;/math&amp;gt;х&amp;lt;math&amp;gt;n&amp;lt;/math&amp;gt;).&lt;br /&gt;
&lt;br /&gt;
=== Свойства алгоритма ===&lt;br /&gt;
Метод Якоби является самым медленным из имеющихся алгоритмов вычисления сингулярных чисел и сингулярных векторов матрицы. Тем не менее, для  матриц &amp;lt;math&amp;gt;G&amp;lt;/math&amp;gt;, которые могут быть представлены в виде &amp;lt;math&amp;gt;G=DX&amp;lt;/math&amp;gt;, где &amp;lt;math&amp;gt;D&amp;lt;/math&amp;gt; - диагональная, а &amp;lt;math&amp;gt;X&amp;lt;/math&amp;gt; - хорошо обусловлена, он способен вычислять сингулярные числа и вектора намного точнее, чем другие методы&amp;lt;ref&amp;gt;Дж. Деммель «Вычислительная линейная алгебра» (стр. 261-264)&amp;lt;/ref&amp;gt;. &lt;br /&gt;
&lt;br /&gt;
Вычислительная мощность алгоритма, как отношение числа операций к суммарному объему входных и выходных данных является линейной.&lt;br /&gt;
&lt;br /&gt;
Метод Якоби не детерминирован, так как является итерационным алгоритмом с выходом по точности (число итераций зависит от входных данных и порогового значения).&lt;br /&gt;
&lt;br /&gt;
== Программная реализация алгоритма ==&lt;br /&gt;
&lt;br /&gt;
=== Особенности реализации последовательного алгоритма ===&lt;br /&gt;
&lt;br /&gt;
=== Локальность данных и вычислений ===&lt;br /&gt;
&lt;br /&gt;
=== Возможные способы и особенности параллельной реализации алгоритма ===&lt;br /&gt;
&lt;br /&gt;
=== Масштабируемость алгоритма и его реализации ===&lt;br /&gt;
&lt;br /&gt;
=== Динамические характеристики и эффективность реализации алгоритма ===&lt;br /&gt;
&lt;br /&gt;
=== Выводы для классов архитектур ===&lt;br /&gt;
&lt;br /&gt;
=== Существующие реализации алгоритма ===&lt;br /&gt;
Метод Якоби нахождения сингулярных значений и векторов реализован в таких пакетах, как LAPACK, LINPACK/EISPACK, Intel MKL &amp;lt;ref&amp;gt;http://www.alglib.net/matrixops/general/svd.php&amp;lt;/ref&amp;gt;.&lt;br /&gt;
&lt;br /&gt;
Так же функция Якоби реализована в пакете Matlab.&lt;br /&gt;
&lt;br /&gt;
Т. к. алгоритм считается медленным, он не включен во многие известные пакеты.&lt;br /&gt;
&lt;br /&gt;
== Литература ==&lt;br /&gt;
1. Дж. Деммель Вычислительная линейная алгебра. Изд. Мир, 2001.&lt;/div&gt;</summary>
		<author><name>Davletshuna Alexandra</name></author>
	</entry>
	<entry>
		<id>https://xn--80aecvaldz.xn--80ahdrnmvk.xn--p1ai/w/ru/index.php?title=%D0%A3%D1%87%D0%B0%D1%81%D1%82%D0%BD%D0%B8%D0%BA:Davletshuna_Alexandra/%D0%9C%D0%B5%D1%82%D0%BE%D0%B4_%D0%AF%D0%BA%D0%BE%D0%B1%D0%B8_%D0%B2%D1%8B%D1%87%D0%B8%D1%81%D0%BB%D0%B5%D0%BD%D0%B8%D1%8F_%D1%81%D0%B8%D0%BD%D0%B3%D1%83%D0%BB%D1%8F%D1%80%D0%BD%D1%8B%D1%85_%D1%87%D0%B8%D1%81%D0%B5%D0%BB_%D0%B8_%D0%B2%D0%B5%D0%BA%D1%82%D0%BE%D1%80%D0%BE%D0%B2&amp;diff=15647</id>
		<title>Участник:Davletshuna Alexandra/Метод Якоби вычисления сингулярных чисел и векторов</title>
		<link rel="alternate" type="text/html" href="https://xn--80aecvaldz.xn--80ahdrnmvk.xn--p1ai/w/ru/index.php?title=%D0%A3%D1%87%D0%B0%D1%81%D1%82%D0%BD%D0%B8%D0%BA:Davletshuna_Alexandra/%D0%9C%D0%B5%D1%82%D0%BE%D0%B4_%D0%AF%D0%BA%D0%BE%D0%B1%D0%B8_%D0%B2%D1%8B%D1%87%D0%B8%D1%81%D0%BB%D0%B5%D0%BD%D0%B8%D1%8F_%D1%81%D0%B8%D0%BD%D0%B3%D1%83%D0%BB%D1%8F%D1%80%D0%BD%D1%8B%D1%85_%D1%87%D0%B8%D1%81%D0%B5%D0%BB_%D0%B8_%D0%B2%D0%B5%D0%BA%D1%82%D0%BE%D1%80%D0%BE%D0%B2&amp;diff=15647"/>
		<updated>2016-11-01T20:26:44Z</updated>

		<summary type="html">&lt;p&gt;Davletshuna Alexandra: /* Информационный граф */&lt;/p&gt;
&lt;hr /&gt;
&lt;div&gt;{{Assignment}}&lt;br /&gt;
&lt;br /&gt;
{{algorithm&lt;br /&gt;
| name              = Метод Якоби вычисления сингулярных чисел и векторов&lt;br /&gt;
| serial_complexity = &amp;lt;math&amp;gt;O(n^3)&amp;lt;/math&amp;gt;&lt;br /&gt;
| pf_height         = &amp;lt;math&amp;gt;O(n^2)&amp;lt;/math&amp;gt;&lt;br /&gt;
| pf_width          = &amp;lt;math&amp;gt;O(n)&amp;lt;/math&amp;gt;&lt;br /&gt;
| input_data        = &amp;lt;math&amp;gt;n^2&amp;lt;/math&amp;gt;&lt;br /&gt;
| output_data       = &amp;lt;math&amp;gt;2n^2 + n&amp;lt;/math&amp;gt;&lt;br /&gt;
}}&lt;br /&gt;
&lt;br /&gt;
Авторы статьи: [[Участница:Davletshuna Alexandra|Давлетшина Александра]] (группа 619), [[Участница:Alek sandra|Зайцева Александра]] (группа 601)&lt;br /&gt;
&lt;br /&gt;
== Свойства и структура алгоритма ==&lt;br /&gt;
&lt;br /&gt;
=== Общее описание алгоритма ===&lt;br /&gt;
&#039;&#039;&#039;Сингулярным разложением&#039;&#039;&#039; называется разложение прямоугольной вещественной или комплексной матрицы, имеющее широкое применение, в силу своей наглядной геометрической интерпретации, при решении многих прикладных задач. Сингулярное разложение матрицы А позволяет вычислять сингулярные числа данной матрицы, а также, левые и правые сингулярные векторы матрицы А:&lt;br /&gt;
&lt;br /&gt;
•	левые сингулярные векторы матрицы А — это собственные векторы матрицы &amp;lt;math&amp;gt;AA^*&amp;lt;/math&amp;gt;;&lt;br /&gt;
&lt;br /&gt;
•	правые сингулярные векторы матрицы A — это собственные векторы матрицы &amp;lt;math&amp;gt;A^*A&amp;lt;/math&amp;gt;.&lt;br /&gt;
&lt;br /&gt;
Геометрическая интерпретация сингулярного разложения заключается в следующем факте из геометрии: &#039;&#039;Образом любого линейного преобразования, заданного с помощью матрицы &amp;lt;math&amp;gt;m&amp;lt;/math&amp;gt;x&amp;lt;math&amp;gt;n&amp;lt;/math&amp;gt;, примененного к единичной сфере является гиперэллипсоид&#039;&#039;.&lt;br /&gt;
&lt;br /&gt;
Из многочисленных разложений матриц, наиболее удобным является сингулярное разложение матрицы в виде: &amp;lt;math&amp;gt;A=U\Sigma V^*&amp;lt;/math&amp;gt;, где &amp;lt;math&amp;gt;U, V&amp;lt;/math&amp;gt; – унитарные матрицы, а &amp;lt;math&amp;gt;\Sigma&amp;lt;/math&amp;gt; – диагональная матрица с вещественными положительными числами на диагонали &amp;lt;ref&amp;gt;http://algorithms.parallel.ru/&amp;lt;/ref&amp;gt;.&lt;br /&gt;
&lt;br /&gt;
Диагональные элементы матрицы &amp;lt;math&amp;gt;\Sigma&amp;lt;/math&amp;gt; называются сингулярными числами матрицы &amp;lt;math&amp;gt;A&amp;lt;/math&amp;gt;, а столбцы матриц &amp;lt;math&amp;gt;U,V&amp;lt;/math&amp;gt; левыми и правыми сингулярными векторами соответственно.&lt;br /&gt;
&lt;br /&gt;
Алгоритм Якоби сингулярного разложения матрицы был предложен одним из первых в 1846 году. Он приводит прямоугольную матрицу к диагональной матрице с помощью последовательности элементарных вращений. Метод может найти все сингулярные значения с очень высокой точностью. Однако его производительность является довольно низкой, в сравнении с конкурирующими методами.&lt;br /&gt;
&lt;br /&gt;
&#039;&#039;Неявный&#039;&#039;&amp;lt;ref&amp;gt;Дж. Деммель «Вычислительная линейная алгебра» (стр. 261-264)&amp;lt;/ref&amp;gt; метод Якоби математически эквивалентен применению метода Якоби вычисления собственных значений к матрице &amp;lt;math&amp;gt;A = G^TG&amp;lt;/math&amp;gt;.&lt;br /&gt;
Это значит, что на каждом шаге вычисляется вращение Якоби &amp;lt;math&amp;gt;J&amp;lt;/math&amp;gt;, с помощью которого матрица &amp;lt;math&amp;gt;G^TG&amp;lt;/math&amp;gt; неявно пересчитывется в &amp;lt;math&amp;gt;J^TG^TGJ&amp;lt;/math&amp;gt;; вращение выбрано так, чтобы пара внедиагональных элементов из &amp;lt;math&amp;gt;G^TG&amp;lt;/math&amp;gt; обратилась в нули в матрице &amp;lt;math&amp;gt;J^TG^TGJ&amp;lt;/math&amp;gt;. При этом ни &amp;lt;math&amp;gt;G^TG&amp;lt;/math&amp;gt;, ни &amp;lt;math&amp;gt;J^TG^TGJ&amp;lt;/math&amp;gt; не вычисляются в явном виде; вместо них вычисляется матрица &amp;lt;math&amp;gt;GJ&amp;lt;/math&amp;gt;. Поэтому алгоритм называется &#039;&#039;методом односторонних вращений&#039;&#039;.&lt;br /&gt;
&lt;br /&gt;
=== Математическое описание алгоритма ===&lt;br /&gt;
Исходные данные: матрица &amp;lt;math&amp;gt;G&amp;lt;/math&amp;gt; (элементы &amp;lt;math&amp;gt;g_{ij}, i, j = 1, \ldots, n&amp;lt;/math&amp;gt;).&lt;br /&gt;
&lt;br /&gt;
Вычисляемые данные: матрица &amp;lt;math&amp;gt;\Sigma = diag(\sigma_{i})&amp;lt;/math&amp;gt;, где &amp;lt;math&amp;gt;\sigma_{i}&amp;lt;/math&amp;gt; - сингулярные числа, &amp;lt;math&amp;gt;U&amp;lt;/math&amp;gt; - матрица левых сингулярных векторов, &amp;lt;math&amp;gt;V&amp;lt;/math&amp;gt; - матрица правых сингулярных векторов.&lt;br /&gt;
&lt;br /&gt;
симметричную матрицу &amp;lt;math&amp;gt;A = (G^TG)&amp;lt;/math&amp;gt; можно привести к диагональному виду:&lt;br /&gt;
&amp;lt;math&amp;gt;RG^TGR^T&amp;lt;/math&amp;gt;, где&lt;br /&gt;
&lt;br /&gt;
&amp;lt;math&amp;gt;&lt;br /&gt;
R(j,k,\theta) = &lt;br /&gt;
\begin{matrix}&lt;br /&gt;
  \\&lt;br /&gt;
  \\&lt;br /&gt;
  \\&lt;br /&gt;
j \\&lt;br /&gt;
  \\&lt;br /&gt;
k \\&lt;br /&gt;
  \\&lt;br /&gt;
  \\&lt;br /&gt;
  \\&lt;br /&gt;
\end{matrix}&lt;br /&gt;
&amp;lt;/math&amp;gt;  &lt;br /&gt;
&amp;lt;math&amp;gt;&lt;br /&gt;
\begin{bmatrix}&lt;br /&gt;
  &amp;amp; 1 &amp;amp;   &amp;amp;        &amp;amp;              &amp;amp;        &amp;amp;               &amp;amp;         &amp;amp;    &amp;amp;   \\&lt;br /&gt;
  &amp;amp;   &amp;amp; 1 &amp;amp;        &amp;amp;              &amp;amp;        &amp;amp;               &amp;amp;         &amp;amp;    &amp;amp;   \\&lt;br /&gt;
  &amp;amp;   &amp;amp;   &amp;amp; \ddots &amp;amp;              &amp;amp;        &amp;amp;               &amp;amp;         &amp;amp;    &amp;amp;   \\&lt;br /&gt;
  &amp;amp;   &amp;amp;   &amp;amp;        &amp;amp; \cos(\theta) &amp;amp;        &amp;amp; -\sin(\theta) &amp;amp;         &amp;amp;    &amp;amp;   \\&lt;br /&gt;
  &amp;amp;   &amp;amp;   &amp;amp;        &amp;amp;              &amp;amp; \ddots &amp;amp;               &amp;amp;         &amp;amp;    &amp;amp;   \\&lt;br /&gt;
  &amp;amp;   &amp;amp;   &amp;amp;        &amp;amp; \sin(\theta) &amp;amp;        &amp;amp; \cos(\theta)  &amp;amp;         &amp;amp;    &amp;amp;   \\&lt;br /&gt;
  &amp;amp;   &amp;amp;   &amp;amp;        &amp;amp;              &amp;amp;        &amp;amp;               &amp;amp; \ddots  &amp;amp;    &amp;amp;   \\&lt;br /&gt;
  &amp;amp;   &amp;amp;   &amp;amp;        &amp;amp;              &amp;amp;        &amp;amp;               &amp;amp;         &amp;amp; 1  &amp;amp;   \\&lt;br /&gt;
  &amp;amp;   &amp;amp;   &amp;amp;        &amp;amp;              &amp;amp;        &amp;amp;               &amp;amp;         &amp;amp;    &amp;amp; 1 \\&lt;br /&gt;
\end{bmatrix}&lt;br /&gt;
&amp;lt;/math&amp;gt;&lt;br /&gt;
&lt;br /&gt;
Обозначим &amp;lt;math&amp;gt;s = \sin \theta&amp;lt;/math&amp;gt; и &amp;lt;math&amp;gt;c = \cos \theta&amp;lt;/math&amp;gt;.&lt;br /&gt;
&lt;br /&gt;
Перемножив матрицы &amp;lt;math&amp;gt;RG^TGR^T&amp;lt;/math&amp;gt;, получим следующие выражения&amp;lt;ref&amp;gt;http://www.astro.tsu.ru/OsChMet/5_2.html&amp;lt;/ref&amp;gt;:&lt;br /&gt;
&lt;br /&gt;
&amp;lt;math&amp;gt;\begin{align}&lt;br /&gt;
 a_{jj}^{(i+1)} &amp;amp;= c^2\, a_{jj}^{(i)}  -  2\, s c \,a_{jk}^{(i)}  +  s^2\, a_{kk}^{(i)} \\&lt;br /&gt;
 a_{kk}^{(i+1)} &amp;amp;= s^2 \,a_{jj}^{(i)}  +  2 s c\, a_{jk}^{(i)}  +  c^2 \, a_{kk}^{(i)} \\&lt;br /&gt;
 a_{jk}^{(i+1)} &amp;amp;= a_{kj}^{(i+1)} = (c^2 - s^2 ) \, a_{jk}^{(i)}  +  s c \, (a_{kk}^{(i)} - a_{jj}^{(i)} ) \\&lt;br /&gt;
 a_{jm}^{(i+1)} &amp;amp;= a_{mj}^{(i+1)} = c \, a_{jm}^{(i)}  -  s \, a_{km}^{(i)} &amp;amp; m \ne j,k \\&lt;br /&gt;
 a_{km}^{(i+1)} &amp;amp;= a_{mk}^{(i+1)} = s \, a_{jm}^{(i)}  + c \, a_{km}^{(i)} &amp;amp; m \ne j,k \\&lt;br /&gt;
 a_{ml}^{(i+1)} &amp;amp;= a_{ml}^{(i)} &amp;amp;m,l \ne j,k&lt;br /&gt;
\end{align}&amp;lt;/math&amp;gt;&lt;br /&gt;
&lt;br /&gt;
Т.к внедиагональные элементы должны быть равны 0, то выбираем &amp;lt;math&amp;gt;\theta&amp;lt;/math&amp;gt; так, чтобы &amp;lt;math&amp;gt;a_{jk}^{(i+1)} = 0&amp;lt;/math&amp;gt; и &amp;lt;math&amp;gt;a_{kj}^{(i+1)} = 0&amp;lt;/math&amp;gt;.&lt;br /&gt;
&lt;br /&gt;
Тогда решая уравнение получаем, что&lt;br /&gt;
&lt;br /&gt;
&amp;lt;math&amp;gt;&lt;br /&gt;
         \begin{align}&lt;br /&gt;
         \tau &amp;amp;= {a_{jj} - a_{kk}}/{2a_{jk}} \\&lt;br /&gt;
         t &amp;amp;= {sign(\tau)}/(|\tau| + \sqrt{1 + \tau^2}) \\&lt;br /&gt;
         c &amp;amp;= 1/(\sqrt{1 + t^2}) \\&lt;br /&gt;
         s &amp;amp;= ct \\&lt;br /&gt;
         \end{align}&amp;lt;/math&amp;gt;&lt;br /&gt;
&lt;br /&gt;
Остановка вычислений алгоритма наступает, когда внедиагональные элементы становятся меньше некоторого наперед заданного числа &amp;lt;math&amp;gt;\varepsilon&amp;lt;/math&amp;gt;.&lt;br /&gt;
&lt;br /&gt;
=== Вычислительное ядро алгоритма ===&lt;br /&gt;
Вычислительное ядро алгоритма составляет непосредственно вычисление одностороннего вращения Якоби, т.е. вычисление элементов матрицы &amp;lt;math&amp;gt;g_{jm}^{(i+1)} = g_{mj}^{(i+1)}&amp;lt;/math&amp;gt; и &amp;lt;math&amp;gt;g_{km}^{(i+1)} = g_{mk}^{(i+1)}&amp;lt;/math&amp;gt;, &amp;lt;math&amp;gt;m \ne j,k&amp;lt;/math&amp;gt;, а также вычисления элементов &amp;lt;math&amp;gt;g_{jj}^{(i+1)} &amp;lt;/math&amp;gt; и &amp;lt;math&amp;gt;g_{kk}^{(i+1)} &amp;lt;/math&amp;gt;, получившихся после умножения промежуточной матрицы на матрицу вращений Якоби:&lt;br /&gt;
&lt;br /&gt;
&amp;lt;math&amp;gt;\begin{align}&lt;br /&gt;
 g_{jj}^{(i+1)} &amp;amp;= c^2\, g_{jj}^{(i)}  -  2\, s c \,g_{jk}^{(i)}  +  s^2\, g_{kk}^{(i)} \\&lt;br /&gt;
 g_{kk}^{(i+1)} &amp;amp;= s^2 \,g_{jj}^{(i)}  +  2 s c\, g_{jk}^{(i)}  +  c^2 \, g_{kk}^{(i)} \\&lt;br /&gt;
 g_{jk}^{(i+1)} &amp;amp;= g_{kj}^{(i+1)} = (c^2 - s^2 ) \, g_{jk}^{(i)}  +  s c \, (g_{kk}^{(i)} - g_{jj}^{(i)} ) \\&lt;br /&gt;
 g_{jm}^{(i+1)} &amp;amp;= g_{mj}^{(i+1)} = c \, g_{jm}^{(i)}  -  s \, g_{km}^{(i)} &amp;amp; m \ne j,k \\&lt;br /&gt;
 g_{km}^{(i+1)} &amp;amp;= g_{mk}^{(i+1)} = s \, g_{jm}^{(i)}  + c \, g_{km}^{(i)} &amp;amp; m \ne j,k \\&lt;br /&gt;
 g_{ml}^{(i+1)} &amp;amp;= g_{ml}^{(i)} &amp;amp;m,l \ne j,k&lt;br /&gt;
\end{align}&amp;lt;/math&amp;gt;&lt;br /&gt;
&lt;br /&gt;
=== Макроструктура алгоритма ===&lt;br /&gt;
Основную часть метода составляет процедура односторонних вращений матрицы, которая в свою очередь состоит из:&lt;br /&gt;
&lt;br /&gt;
#Вычисление &amp;lt;math&amp;gt;\tau, c, s, t&amp;lt;/math&amp;gt;.&lt;br /&gt;
#Одностороннее вращение матрицы. &lt;br /&gt;
&lt;br /&gt;
Что требует &amp;lt;math&amp;gt;O(n)&amp;lt;/math&amp;gt; операций.&lt;br /&gt;
&lt;br /&gt;
После этого необходимо:&lt;br /&gt;
&lt;br /&gt;
#Вычислить сингулярные числа &amp;lt;math&amp;gt;\sigma_i&amp;lt;/math&amp;gt;.  Что требует &amp;lt;math&amp;gt;O(n)&amp;lt;/math&amp;gt; операций.&lt;br /&gt;
#Вычислить &amp;lt;math&amp;gt;U&amp;lt;/math&amp;gt; и &amp;lt;math&amp;gt;V&amp;lt;/math&amp;gt;. Что требует &amp;lt;math&amp;gt;O(n^2)&amp;lt;/math&amp;gt; операций.&lt;br /&gt;
&lt;br /&gt;
=== Схема реализации последовательного алгоритма ===&lt;br /&gt;
Применение метода Якоби к матрице &amp;lt;math&amp;gt;A = (G^TG)&amp;lt;/math&amp;gt; можно описать следующим образом&amp;lt;ref&amp;gt;Дж. Деммель «Вычислительная линейная алгебра» (стр. 261-263)&amp;lt;/ref&amp;gt;:&lt;br /&gt;
&lt;br /&gt;
Если &amp;lt;math&amp;gt;G = U\Sigma V^T&amp;lt;/math&amp;gt; и &amp;lt;math&amp;gt;\Sigma = diag(\sigma_{i})&amp;lt;/math&amp;gt;, то алгоритм вычисляет сингулярные числа &amp;lt;math&amp;gt;\sigma_{i}&amp;lt;/math&amp;gt;, матрицу &amp;lt;math&amp;gt;U&amp;lt;/math&amp;gt; левых сингулярных векторов и матрицу &amp;lt;math&amp;gt;V&amp;lt;/math&amp;gt; правых сингулярных векторов по следующей схеме:&lt;br /&gt;
&lt;br /&gt;
 repeat&lt;br /&gt;
     for &amp;lt;math&amp;gt;j=1&amp;lt;/math&amp;gt; to &amp;lt;math&amp;gt;n-1&amp;lt;/math&amp;gt;&lt;br /&gt;
         for &amp;lt;math&amp;gt;k=j+1&amp;lt;/math&amp;gt; to &amp;lt;math&amp;gt;n&amp;lt;/math&amp;gt;&lt;br /&gt;
             обратиться к процедуре &#039;&#039;&#039;&#039;&#039;One-Sided-Jacobi-Rotation&amp;lt;math&amp;gt;(G,j,k)&amp;lt;/math&amp;gt;&#039;&#039;&#039;&#039;&#039;&lt;br /&gt;
         end for&lt;br /&gt;
     end for&lt;br /&gt;
 пока &amp;lt;math&amp;gt;G^TG&amp;lt;/math&amp;gt; не станет достаточно близка к диагональной матрице&lt;br /&gt;
 Положить &amp;lt;math&amp;gt;\sigma_{i} = ||G(:,i)||_2 &amp;lt;/math&amp;gt; (норма &amp;lt;math&amp;gt;i&amp;lt;/math&amp;gt;-го столбца в &amp;lt;math&amp;gt;G&amp;lt;/math&amp;gt;)&lt;br /&gt;
 Положить &amp;lt;math&amp;gt;U = [u_{1},\dots, u_{n}]&amp;lt;/math&amp;gt;, где &amp;lt;math&amp;gt;u_{i} = G(:,i)/\sigma_{i}&amp;lt;/math&amp;gt;&lt;br /&gt;
 Положить &amp;lt;math&amp;gt;V = J&amp;lt;/math&amp;gt;, где &amp;lt;math&amp;gt;J&amp;lt;/math&amp;gt; - накопленное произведение вращений Якоби.&lt;br /&gt;
&lt;br /&gt;
Где процедура &#039;&#039;&#039;&#039;&#039;One-Sided-Jacobi-Rotation&#039;&#039;&#039;&#039;&#039; является метод односторонних вращений Якоби:&lt;br /&gt;
&lt;br /&gt;
 proc &#039;&#039;&#039;&#039;&#039;One-Sided-Jacobi-Rotation&amp;lt;math&amp;gt;(G,j,k)&amp;lt;/math&amp;gt;&#039;&#039;&#039;&#039;&#039;&lt;br /&gt;
     вычислить &amp;lt;math&amp;gt;a_{jj} = (G^TG)_{jj}, a_{jk} = (G^TG)_{jk}&amp;lt;/math&amp;gt; и &amp;lt;math&amp;gt;a_{kk} = (G^TG)_{kk}&amp;lt;/math&amp;gt;&lt;br /&gt;
     if &amp;lt;math&amp;gt;|a_{jk}|&amp;lt;/math&amp;gt; не слишком мал&lt;br /&gt;
         &amp;lt;math&amp;gt;&lt;br /&gt;
         \begin{align}&lt;br /&gt;
         \tau &amp;amp;= {a_{jj} - a_{kk}}/{2a_{jk}} \\&lt;br /&gt;
         t &amp;amp;= {sign(\tau)}/(|\tau| + \sqrt{1 + \tau^2}) \\&lt;br /&gt;
         c &amp;amp;= 1/(\sqrt{1 + t^2}) \\&lt;br /&gt;
         s &amp;amp;= ct \\&lt;br /&gt;
         G &amp;amp;= GR(j,k,\theta) \  \dots c=cos\theta, s=sin\theta \end{align}&amp;lt;/math&amp;gt;&lt;br /&gt;
         if нужны правые сингулярные векторы &lt;br /&gt;
             &amp;lt;math&amp;gt;J = JR(j,k,\theta)&amp;lt;/math&amp;gt;&lt;br /&gt;
         end if&lt;br /&gt;
     end if&lt;br /&gt;
&lt;br /&gt;
=== Последовательная сложность алгоритма ===&lt;br /&gt;
Для одного вращения Якоби необходимо выполнить &amp;lt;math&amp;gt;O(n)&amp;lt;/math&amp;gt; операций умножения и сложения. &lt;br /&gt;
&lt;br /&gt;
Всего вариантов выбора &amp;lt;math&amp;gt;j&amp;lt;/math&amp;gt; и &amp;lt;math&amp;gt;k&amp;lt;/math&amp;gt; существует &amp;lt;math&amp;gt;\frac{n(n-1)}{2}&amp;lt;/math&amp;gt;.&lt;br /&gt;
&lt;br /&gt;
Таким образом последовательный алгоритм Якоби вычисления сингулярных чисел и векторов является алгоритмом с кубической сложностью.&lt;br /&gt;
&lt;br /&gt;
=== Информационный граф ===&lt;br /&gt;
Граф алгоритма состоит из четырех групп вершин&lt;br /&gt;
&lt;br /&gt;
(А)Первая группа вершин расположена в двумерной области, соответствующая ей операция - вычисление элементов матрицы произведения &amp;lt;math&amp;gt;a_{jj},a_{jk},a_{kk}&amp;lt;/math&amp;gt; . Где &amp;lt;math&amp;gt;j&amp;lt;/math&amp;gt; изменяется от &amp;lt;math&amp;gt;1&amp;lt;/math&amp;gt; до &amp;lt;math&amp;gt;n-1&amp;lt;/math&amp;gt;, принимая все целочисленные значения, &amp;lt;math&amp;gt;k&amp;lt;/math&amp;gt;  изменяется от &amp;lt;math&amp;gt;j+1&amp;lt;/math&amp;gt; до &amp;lt;math&amp;gt;n&amp;lt;/math&amp;gt;, принимая все целочисленные значения.&lt;br /&gt;
&lt;br /&gt;
Граф вычисления каждого из элементов приведен на рисунке 1, где значениям &amp;lt;math&amp;gt;a_{ij}&amp;lt;/math&amp;gt; соответствуют обозначения &amp;lt;math&amp;gt;x_{ij}&amp;lt;/math&amp;gt;, а элементам &amp;lt;math&amp;gt;r_{ij}&amp;lt;/math&amp;gt; обозначения &amp;lt;math&amp;gt;z_{ij}&amp;lt;/math&amp;gt;. Значение &amp;lt;math&amp;gt;s_{ij}&amp;lt;/math&amp;gt; является значением результирующего элемента.&lt;br /&gt;
&lt;br /&gt;
(Б)Вторая группа вершин расположена в двумерной области, соответствующая ей операция – вычисление &amp;lt;math&amp;gt;c&amp;lt;/math&amp;gt; и &amp;lt;math&amp;gt;s&amp;lt;/math&amp;gt;.&lt;br /&gt;
&lt;br /&gt;
Информационный граф с входными и выходными данными вычисления пункта (Б) представлен на рисунке 2.&lt;br /&gt;
&lt;br /&gt;
(В)Третья группа вершин расположена в двумерной области, соответствующая ей операция вычисление значений элементов &amp;lt;math&amp;gt;g_{jm}^{(i+1)} = g_{mj}^{(i+1)}&amp;lt;/math&amp;gt; и &amp;lt;math&amp;gt;g_{km}^{(i+1)} = g_{mk}^{(i+1)}&amp;lt;/math&amp;gt;, &amp;lt;math&amp;gt;m \ne j,k&amp;lt;/math&amp;gt;.&lt;br /&gt;
&lt;br /&gt;
(Г)Четвертая группа вершин расположена в двумерной области, соответствующая ей операция вычисление значений элементов &amp;lt;math&amp;gt;g_{jj}^{(i+1)} &amp;lt;/math&amp;gt; и &amp;lt;math&amp;gt;g_{kk}^{(i+1)} &amp;lt;/math&amp;gt;.&lt;br /&gt;
&lt;br /&gt;
Элементы групп (В) и (Г) вычисляются аналогично вычислению элементов матрицы произведения, т.к. фактически представляют собой перемножение матриц &amp;lt;math&amp;gt;G&amp;lt;/math&amp;gt; и &amp;lt;math&amp;gt;R&amp;lt;/math&amp;gt;&lt;br /&gt;
&lt;br /&gt;
[[File:Jacobi_2.jpg|none|thumb|1000px|Рисунок 1. Информационный граф с входными и выходными параметрами вычисления каждого элемента матрицы произведения.]]&lt;br /&gt;
&lt;br /&gt;
[[File:Jacobi_1.jpg|none|thumb|1000px|Рисунок 2. Информационный граф с входными и выходными параметрами вычисления значений &amp;lt;math&amp;gt;c&amp;lt;/math&amp;gt; и &amp;lt;math&amp;gt;s&amp;lt;/math&amp;gt;.]]&lt;br /&gt;
&lt;br /&gt;
Обобщенный граф метода Якоби представлен на рисунке 3, где буквами А, Б, В и Г обозначено вычисление групп вершин (А), (Б), (В) и (Г).&lt;br /&gt;
&lt;br /&gt;
[[File:Graf2.png|none|thumb|2000px|Рисунок 3. Обобщенный граф алгоритма вычисления сингулярных чисел и векторов методом Якоби.]]&lt;br /&gt;
&lt;br /&gt;
=== Ресурс параллелизма алгоритма ===&lt;br /&gt;
Для выполнения одной итерации метода Якоби требуется последовательно выполнить несколько ярусов:&lt;br /&gt;
# вычислить &amp;lt;math&amp;gt;\tau&amp;lt;/math&amp;gt; &lt;br /&gt;
# вычислить &amp;lt;math&amp;gt;t&amp;lt;/math&amp;gt; &lt;br /&gt;
# вычислить &amp;lt;math&amp;gt;c&amp;lt;/math&amp;gt; &lt;br /&gt;
# выполнить поворот матрицы &amp;lt;math&amp;gt;G&amp;lt;/math&amp;gt; с параллельным выполнением &amp;lt;math&amp;gt;2(n-2)&amp;lt;/math&amp;gt; операций вычисления элементов матрицы &amp;lt;math&amp;gt;g_{jm}^{(i+1)} = g_{mj}^{(i+1)}&amp;lt;/math&amp;gt; и &amp;lt;math&amp;gt;g_{km}^{(i+1)} = g_{mk}^{(i+1)}&amp;lt;/math&amp;gt;, &amp;lt;math&amp;gt;m \ne j,k&amp;lt;/math&amp;gt;, а также вычисления элементов &amp;lt;math&amp;gt;g_{jj}^{(i+1)} &amp;lt;/math&amp;gt; и &amp;lt;math&amp;gt;g_{kk}^{(i+1)} &amp;lt;/math&amp;gt;. &lt;br /&gt;
&lt;br /&gt;
Суммарное количество итераций равно &amp;lt;math&amp;gt;\frac{n(n-1)}{2}&amp;lt;/math&amp;gt; (Различные варианты выбора &amp;lt;math&amp;gt;j&amp;lt;/math&amp;gt; и &amp;lt;math&amp;gt;k&amp;lt;/math&amp;gt;). &lt;br /&gt;
&lt;br /&gt;
Асимптотически метод сходится квадратично. &lt;br /&gt;
&lt;br /&gt;
Таким образом, при классификации по высоте ЯПФ метод Якоби относится к алгоритмам со сложностью &amp;lt;math&amp;gt;O(n^2)&amp;lt;/math&amp;gt;&amp;amp;nbsp;, а при классификации по ширине ЯПФ — к алгоритмам со сложностью &amp;lt;math&amp;gt;O(n)&amp;lt;/math&amp;gt;.&lt;br /&gt;
&lt;br /&gt;
=== Входные и выходные данные алгоритма ===&lt;br /&gt;
&#039;&#039;&#039;Входные данные&#039;&#039;&#039;: плотная матрица &amp;lt;math&amp;gt;G&amp;lt;/math&amp;gt; размера &amp;lt;math&amp;gt;n&amp;lt;/math&amp;gt;х&amp;lt;math&amp;gt;n&amp;lt;/math&amp;gt;, где &amp;lt;math&amp;gt;A= G^TG&amp;lt;/math&amp;gt; – симметрическая матрица.&lt;br /&gt;
&lt;br /&gt;
&#039;&#039;&#039;Объём входных данных&#039;&#039;&#039;: &amp;lt;math&amp;gt;n^2&amp;lt;/math&amp;gt; (т.к. для хранения матрицы &amp;lt;math&amp;gt;G&amp;lt;/math&amp;gt; используем двумерный массив размера &amp;lt;math&amp;gt;n&amp;lt;/math&amp;gt;х&amp;lt;math&amp;gt;n&amp;lt;/math&amp;gt;)&lt;br /&gt;
&lt;br /&gt;
&#039;&#039;&#039;Выходные данные&#039;&#039;&#039;: &amp;lt;math&amp;gt;\sigma_{i}&amp;lt;/math&amp;gt;  - сингулярные числа, матрица &amp;lt;math&amp;gt;U&amp;lt;/math&amp;gt; левых сингулярных векторов и матрица &amp;lt;math&amp;gt;V&amp;lt;/math&amp;gt; правых сингулярных векторов.&lt;br /&gt;
&lt;br /&gt;
&#039;&#039;&#039;Объём выходных данных&#039;&#039;&#039;: &amp;lt;math&amp;gt;2n^2 + n&amp;lt;/math&amp;gt; (т.к. необходимо хранить вектор сингулярных чисел длины &amp;lt;math&amp;gt;n&amp;lt;/math&amp;gt;, а также две матрицы &amp;lt;math&amp;gt;U, V&amp;lt;/math&amp;gt; левых и правых сингулярных векторов размера &amp;lt;math&amp;gt;n&amp;lt;/math&amp;gt;х&amp;lt;math&amp;gt;n&amp;lt;/math&amp;gt;).&lt;br /&gt;
&lt;br /&gt;
=== Свойства алгоритма ===&lt;br /&gt;
Метод Якоби является самым медленным из имеющихся алгоритмов вычисления сингулярных чисел и сингулярных векторов матрицы. Тем не менее, для  матриц &amp;lt;math&amp;gt;G&amp;lt;/math&amp;gt;, которые могут быть представлены в виде &amp;lt;math&amp;gt;G=DX&amp;lt;/math&amp;gt;, где &amp;lt;math&amp;gt;D&amp;lt;/math&amp;gt; - диагональная, а &amp;lt;math&amp;gt;X&amp;lt;/math&amp;gt; - хорошо обусловлена, он способен вычислять сингулярные числа и вектора намного точнее, чем другие методы&amp;lt;ref&amp;gt;Дж. Деммель «Вычислительная линейная алгебра» (стр. 261-264)&amp;lt;/ref&amp;gt;. &lt;br /&gt;
&lt;br /&gt;
Вычислительная мощность алгоритма, как отношение числа операций к суммарному объему входных и выходных данных является линейной.&lt;br /&gt;
&lt;br /&gt;
Метод Якоби не детерминирован, так как является итерационным алгоритмом с выходом по точности (число итераций зависит от входных данных и порогового значения).&lt;br /&gt;
&lt;br /&gt;
== Программная реализация алгоритма ==&lt;br /&gt;
&lt;br /&gt;
=== Особенности реализации последовательного алгоритма ===&lt;br /&gt;
&lt;br /&gt;
=== Локальность данных и вычислений ===&lt;br /&gt;
&lt;br /&gt;
=== Возможные способы и особенности параллельной реализации алгоритма ===&lt;br /&gt;
&lt;br /&gt;
=== Масштабируемость алгоритма и его реализации ===&lt;br /&gt;
&lt;br /&gt;
=== Динамические характеристики и эффективность реализации алгоритма ===&lt;br /&gt;
&lt;br /&gt;
=== Выводы для классов архитектур ===&lt;br /&gt;
&lt;br /&gt;
=== Существующие реализации алгоритма ===&lt;br /&gt;
Метод Якоби нахождения сингулярных значений и векторов реализован в таких пакетах, как LAPACK, LINPACK/EISPACK, Intel MKL &amp;lt;ref&amp;gt;http://www.alglib.net/matrixops/general/svd.php&amp;lt;/ref&amp;gt;.&lt;br /&gt;
&lt;br /&gt;
Так же функция Якоби реализована в пакете Matlab.&lt;br /&gt;
&lt;br /&gt;
Т. к. алгоритм считается медленным, он не включен во многие известные пакеты.&lt;br /&gt;
&lt;br /&gt;
== Литература ==&lt;br /&gt;
1. Дж. Деммель Вычислительная линейная алгебра. Изд. Мир, 2001.&lt;/div&gt;</summary>
		<author><name>Davletshuna Alexandra</name></author>
	</entry>
	<entry>
		<id>https://xn--80aecvaldz.xn--80ahdrnmvk.xn--p1ai/w/ru/index.php?title=%D0%A3%D1%87%D0%B0%D1%81%D1%82%D0%BD%D0%B8%D0%BA:Davletshuna_Alexandra/%D0%9C%D0%B5%D1%82%D0%BE%D0%B4_%D0%AF%D0%BA%D0%BE%D0%B1%D0%B8_%D0%B2%D1%8B%D1%87%D0%B8%D1%81%D0%BB%D0%B5%D0%BD%D0%B8%D1%8F_%D1%81%D0%B8%D0%BD%D0%B3%D1%83%D0%BB%D1%8F%D1%80%D0%BD%D1%8B%D1%85_%D1%87%D0%B8%D1%81%D0%B5%D0%BB_%D0%B8_%D0%B2%D0%B5%D0%BA%D1%82%D0%BE%D1%80%D0%BE%D0%B2&amp;diff=15645</id>
		<title>Участник:Davletshuna Alexandra/Метод Якоби вычисления сингулярных чисел и векторов</title>
		<link rel="alternate" type="text/html" href="https://xn--80aecvaldz.xn--80ahdrnmvk.xn--p1ai/w/ru/index.php?title=%D0%A3%D1%87%D0%B0%D1%81%D1%82%D0%BD%D0%B8%D0%BA:Davletshuna_Alexandra/%D0%9C%D0%B5%D1%82%D0%BE%D0%B4_%D0%AF%D0%BA%D0%BE%D0%B1%D0%B8_%D0%B2%D1%8B%D1%87%D0%B8%D1%81%D0%BB%D0%B5%D0%BD%D0%B8%D1%8F_%D1%81%D0%B8%D0%BD%D0%B3%D1%83%D0%BB%D1%8F%D1%80%D0%BD%D1%8B%D1%85_%D1%87%D0%B8%D1%81%D0%B5%D0%BB_%D0%B8_%D0%B2%D0%B5%D0%BA%D1%82%D0%BE%D1%80%D0%BE%D0%B2&amp;diff=15645"/>
		<updated>2016-11-01T20:25:05Z</updated>

		<summary type="html">&lt;p&gt;Davletshuna Alexandra: /* Информационный граф */&lt;/p&gt;
&lt;hr /&gt;
&lt;div&gt;{{Assignment}}&lt;br /&gt;
&lt;br /&gt;
{{algorithm&lt;br /&gt;
| name              = Метод Якоби вычисления сингулярных чисел и векторов&lt;br /&gt;
| serial_complexity = &amp;lt;math&amp;gt;O(n^3)&amp;lt;/math&amp;gt;&lt;br /&gt;
| pf_height         = &amp;lt;math&amp;gt;O(n^2)&amp;lt;/math&amp;gt;&lt;br /&gt;
| pf_width          = &amp;lt;math&amp;gt;O(n)&amp;lt;/math&amp;gt;&lt;br /&gt;
| input_data        = &amp;lt;math&amp;gt;n^2&amp;lt;/math&amp;gt;&lt;br /&gt;
| output_data       = &amp;lt;math&amp;gt;2n^2 + n&amp;lt;/math&amp;gt;&lt;br /&gt;
}}&lt;br /&gt;
&lt;br /&gt;
Авторы статьи: [[Участница:Davletshuna Alexandra|Давлетшина Александра]] (группа 619), [[Участница:Alek sandra|Зайцева Александра]] (группа 601)&lt;br /&gt;
&lt;br /&gt;
== Свойства и структура алгоритма ==&lt;br /&gt;
&lt;br /&gt;
=== Общее описание алгоритма ===&lt;br /&gt;
&#039;&#039;&#039;Сингулярным разложением&#039;&#039;&#039; называется разложение прямоугольной вещественной или комплексной матрицы, имеющее широкое применение, в силу своей наглядной геометрической интерпретации, при решении многих прикладных задач. Сингулярное разложение матрицы А позволяет вычислять сингулярные числа данной матрицы, а также, левые и правые сингулярные векторы матрицы А:&lt;br /&gt;
&lt;br /&gt;
•	левые сингулярные векторы матрицы А — это собственные векторы матрицы &amp;lt;math&amp;gt;AA^*&amp;lt;/math&amp;gt;;&lt;br /&gt;
&lt;br /&gt;
•	правые сингулярные векторы матрицы A — это собственные векторы матрицы &amp;lt;math&amp;gt;A^*A&amp;lt;/math&amp;gt;.&lt;br /&gt;
&lt;br /&gt;
Геометрическая интерпретация сингулярного разложения заключается в следующем факте из геометрии: &#039;&#039;Образом любого линейного преобразования, заданного с помощью матрицы &amp;lt;math&amp;gt;m&amp;lt;/math&amp;gt;x&amp;lt;math&amp;gt;n&amp;lt;/math&amp;gt;, примененного к единичной сфере является гиперэллипсоид&#039;&#039;.&lt;br /&gt;
&lt;br /&gt;
Из многочисленных разложений матриц, наиболее удобным является сингулярное разложение матрицы в виде: &amp;lt;math&amp;gt;A=U\Sigma V^*&amp;lt;/math&amp;gt;, где &amp;lt;math&amp;gt;U, V&amp;lt;/math&amp;gt; – унитарные матрицы, а &amp;lt;math&amp;gt;\Sigma&amp;lt;/math&amp;gt; – диагональная матрица с вещественными положительными числами на диагонали &amp;lt;ref&amp;gt;http://algorithms.parallel.ru/&amp;lt;/ref&amp;gt;.&lt;br /&gt;
&lt;br /&gt;
Диагональные элементы матрицы &amp;lt;math&amp;gt;\Sigma&amp;lt;/math&amp;gt; называются сингулярными числами матрицы &amp;lt;math&amp;gt;A&amp;lt;/math&amp;gt;, а столбцы матриц &amp;lt;math&amp;gt;U,V&amp;lt;/math&amp;gt; левыми и правыми сингулярными векторами соответственно.&lt;br /&gt;
&lt;br /&gt;
Алгоритм Якоби сингулярного разложения матрицы был предложен одним из первых в 1846 году. Он приводит прямоугольную матрицу к диагональной матрице с помощью последовательности элементарных вращений. Метод может найти все сингулярные значения с очень высокой точностью. Однако его производительность является довольно низкой, в сравнении с конкурирующими методами.&lt;br /&gt;
&lt;br /&gt;
&#039;&#039;Неявный&#039;&#039;&amp;lt;ref&amp;gt;Дж. Деммель «Вычислительная линейная алгебра» (стр. 261-264)&amp;lt;/ref&amp;gt; метод Якоби математически эквивалентен применению метода Якоби вычисления собственных значений к матрице &amp;lt;math&amp;gt;A = G^TG&amp;lt;/math&amp;gt;.&lt;br /&gt;
Это значит, что на каждом шаге вычисляется вращение Якоби &amp;lt;math&amp;gt;J&amp;lt;/math&amp;gt;, с помощью которого матрица &amp;lt;math&amp;gt;G^TG&amp;lt;/math&amp;gt; неявно пересчитывется в &amp;lt;math&amp;gt;J^TG^TGJ&amp;lt;/math&amp;gt;; вращение выбрано так, чтобы пара внедиагональных элементов из &amp;lt;math&amp;gt;G^TG&amp;lt;/math&amp;gt; обратилась в нули в матрице &amp;lt;math&amp;gt;J^TG^TGJ&amp;lt;/math&amp;gt;. При этом ни &amp;lt;math&amp;gt;G^TG&amp;lt;/math&amp;gt;, ни &amp;lt;math&amp;gt;J^TG^TGJ&amp;lt;/math&amp;gt; не вычисляются в явном виде; вместо них вычисляется матрица &amp;lt;math&amp;gt;GJ&amp;lt;/math&amp;gt;. Поэтому алгоритм называется &#039;&#039;методом односторонних вращений&#039;&#039;.&lt;br /&gt;
&lt;br /&gt;
=== Математическое описание алгоритма ===&lt;br /&gt;
Исходные данные: матрица &amp;lt;math&amp;gt;G&amp;lt;/math&amp;gt; (элементы &amp;lt;math&amp;gt;g_{ij}, i, j = 1, \ldots, n&amp;lt;/math&amp;gt;).&lt;br /&gt;
&lt;br /&gt;
Вычисляемые данные: матрица &amp;lt;math&amp;gt;\Sigma = diag(\sigma_{i})&amp;lt;/math&amp;gt;, где &amp;lt;math&amp;gt;\sigma_{i}&amp;lt;/math&amp;gt; - сингулярные числа, &amp;lt;math&amp;gt;U&amp;lt;/math&amp;gt; - матрица левых сингулярных векторов, &amp;lt;math&amp;gt;V&amp;lt;/math&amp;gt; - матрица правых сингулярных векторов.&lt;br /&gt;
&lt;br /&gt;
симметричную матрицу &amp;lt;math&amp;gt;A = (G^TG)&amp;lt;/math&amp;gt; можно привести к диагональному виду:&lt;br /&gt;
&amp;lt;math&amp;gt;RG^TGR^T&amp;lt;/math&amp;gt;, где&lt;br /&gt;
&lt;br /&gt;
&amp;lt;math&amp;gt;&lt;br /&gt;
R(j,k,\theta) = &lt;br /&gt;
\begin{matrix}&lt;br /&gt;
  \\&lt;br /&gt;
  \\&lt;br /&gt;
  \\&lt;br /&gt;
j \\&lt;br /&gt;
  \\&lt;br /&gt;
k \\&lt;br /&gt;
  \\&lt;br /&gt;
  \\&lt;br /&gt;
  \\&lt;br /&gt;
\end{matrix}&lt;br /&gt;
&amp;lt;/math&amp;gt;  &lt;br /&gt;
&amp;lt;math&amp;gt;&lt;br /&gt;
\begin{bmatrix}&lt;br /&gt;
  &amp;amp; 1 &amp;amp;   &amp;amp;        &amp;amp;              &amp;amp;        &amp;amp;               &amp;amp;         &amp;amp;    &amp;amp;   \\&lt;br /&gt;
  &amp;amp;   &amp;amp; 1 &amp;amp;        &amp;amp;              &amp;amp;        &amp;amp;               &amp;amp;         &amp;amp;    &amp;amp;   \\&lt;br /&gt;
  &amp;amp;   &amp;amp;   &amp;amp; \ddots &amp;amp;              &amp;amp;        &amp;amp;               &amp;amp;         &amp;amp;    &amp;amp;   \\&lt;br /&gt;
  &amp;amp;   &amp;amp;   &amp;amp;        &amp;amp; \cos(\theta) &amp;amp;        &amp;amp; -\sin(\theta) &amp;amp;         &amp;amp;    &amp;amp;   \\&lt;br /&gt;
  &amp;amp;   &amp;amp;   &amp;amp;        &amp;amp;              &amp;amp; \ddots &amp;amp;               &amp;amp;         &amp;amp;    &amp;amp;   \\&lt;br /&gt;
  &amp;amp;   &amp;amp;   &amp;amp;        &amp;amp; \sin(\theta) &amp;amp;        &amp;amp; \cos(\theta)  &amp;amp;         &amp;amp;    &amp;amp;   \\&lt;br /&gt;
  &amp;amp;   &amp;amp;   &amp;amp;        &amp;amp;              &amp;amp;        &amp;amp;               &amp;amp; \ddots  &amp;amp;    &amp;amp;   \\&lt;br /&gt;
  &amp;amp;   &amp;amp;   &amp;amp;        &amp;amp;              &amp;amp;        &amp;amp;               &amp;amp;         &amp;amp; 1  &amp;amp;   \\&lt;br /&gt;
  &amp;amp;   &amp;amp;   &amp;amp;        &amp;amp;              &amp;amp;        &amp;amp;               &amp;amp;         &amp;amp;    &amp;amp; 1 \\&lt;br /&gt;
\end{bmatrix}&lt;br /&gt;
&amp;lt;/math&amp;gt;&lt;br /&gt;
&lt;br /&gt;
Обозначим &amp;lt;math&amp;gt;s = \sin \theta&amp;lt;/math&amp;gt; и &amp;lt;math&amp;gt;c = \cos \theta&amp;lt;/math&amp;gt;.&lt;br /&gt;
&lt;br /&gt;
Перемножив матрицы &amp;lt;math&amp;gt;RG^TGR^T&amp;lt;/math&amp;gt;, получим следующие выражения&amp;lt;ref&amp;gt;http://www.astro.tsu.ru/OsChMet/5_2.html&amp;lt;/ref&amp;gt;:&lt;br /&gt;
&lt;br /&gt;
&amp;lt;math&amp;gt;\begin{align}&lt;br /&gt;
 a_{jj}^{(i+1)} &amp;amp;= c^2\, a_{jj}^{(i)}  -  2\, s c \,a_{jk}^{(i)}  +  s^2\, a_{kk}^{(i)} \\&lt;br /&gt;
 a_{kk}^{(i+1)} &amp;amp;= s^2 \,a_{jj}^{(i)}  +  2 s c\, a_{jk}^{(i)}  +  c^2 \, a_{kk}^{(i)} \\&lt;br /&gt;
 a_{jk}^{(i+1)} &amp;amp;= a_{kj}^{(i+1)} = (c^2 - s^2 ) \, a_{jk}^{(i)}  +  s c \, (a_{kk}^{(i)} - a_{jj}^{(i)} ) \\&lt;br /&gt;
 a_{jm}^{(i+1)} &amp;amp;= a_{mj}^{(i+1)} = c \, a_{jm}^{(i)}  -  s \, a_{km}^{(i)} &amp;amp; m \ne j,k \\&lt;br /&gt;
 a_{km}^{(i+1)} &amp;amp;= a_{mk}^{(i+1)} = s \, a_{jm}^{(i)}  + c \, a_{km}^{(i)} &amp;amp; m \ne j,k \\&lt;br /&gt;
 a_{ml}^{(i+1)} &amp;amp;= a_{ml}^{(i)} &amp;amp;m,l \ne j,k&lt;br /&gt;
\end{align}&amp;lt;/math&amp;gt;&lt;br /&gt;
&lt;br /&gt;
Т.к внедиагональные элементы должны быть равны 0, то выбираем &amp;lt;math&amp;gt;\theta&amp;lt;/math&amp;gt; так, чтобы &amp;lt;math&amp;gt;a_{jk}^{(i+1)} = 0&amp;lt;/math&amp;gt; и &amp;lt;math&amp;gt;a_{kj}^{(i+1)} = 0&amp;lt;/math&amp;gt;.&lt;br /&gt;
&lt;br /&gt;
Тогда решая уравнение получаем, что&lt;br /&gt;
&lt;br /&gt;
&amp;lt;math&amp;gt;&lt;br /&gt;
         \begin{align}&lt;br /&gt;
         \tau &amp;amp;= {a_{jj} - a_{kk}}/{2a_{jk}} \\&lt;br /&gt;
         t &amp;amp;= {sign(\tau)}/(|\tau| + \sqrt{1 + \tau^2}) \\&lt;br /&gt;
         c &amp;amp;= 1/(\sqrt{1 + t^2}) \\&lt;br /&gt;
         s &amp;amp;= ct \\&lt;br /&gt;
         \end{align}&amp;lt;/math&amp;gt;&lt;br /&gt;
&lt;br /&gt;
Остановка вычислений алгоритма наступает, когда внедиагональные элементы становятся меньше некоторого наперед заданного числа &amp;lt;math&amp;gt;\varepsilon&amp;lt;/math&amp;gt;.&lt;br /&gt;
&lt;br /&gt;
=== Вычислительное ядро алгоритма ===&lt;br /&gt;
Вычислительное ядро алгоритма составляет непосредственно вычисление одностороннего вращения Якоби, т.е. вычисление элементов матрицы &amp;lt;math&amp;gt;g_{jm}^{(i+1)} = g_{mj}^{(i+1)}&amp;lt;/math&amp;gt; и &amp;lt;math&amp;gt;g_{km}^{(i+1)} = g_{mk}^{(i+1)}&amp;lt;/math&amp;gt;, &amp;lt;math&amp;gt;m \ne j,k&amp;lt;/math&amp;gt;, а также вычисления элементов &amp;lt;math&amp;gt;g_{jj}^{(i+1)} &amp;lt;/math&amp;gt; и &amp;lt;math&amp;gt;g_{kk}^{(i+1)} &amp;lt;/math&amp;gt;, получившихся после умножения промежуточной матрицы на матрицу вращений Якоби:&lt;br /&gt;
&lt;br /&gt;
&amp;lt;math&amp;gt;\begin{align}&lt;br /&gt;
 g_{jj}^{(i+1)} &amp;amp;= c^2\, g_{jj}^{(i)}  -  2\, s c \,g_{jk}^{(i)}  +  s^2\, g_{kk}^{(i)} \\&lt;br /&gt;
 g_{kk}^{(i+1)} &amp;amp;= s^2 \,g_{jj}^{(i)}  +  2 s c\, g_{jk}^{(i)}  +  c^2 \, g_{kk}^{(i)} \\&lt;br /&gt;
 g_{jk}^{(i+1)} &amp;amp;= g_{kj}^{(i+1)} = (c^2 - s^2 ) \, g_{jk}^{(i)}  +  s c \, (g_{kk}^{(i)} - g_{jj}^{(i)} ) \\&lt;br /&gt;
 g_{jm}^{(i+1)} &amp;amp;= g_{mj}^{(i+1)} = c \, g_{jm}^{(i)}  -  s \, g_{km}^{(i)} &amp;amp; m \ne j,k \\&lt;br /&gt;
 g_{km}^{(i+1)} &amp;amp;= g_{mk}^{(i+1)} = s \, g_{jm}^{(i)}  + c \, g_{km}^{(i)} &amp;amp; m \ne j,k \\&lt;br /&gt;
 g_{ml}^{(i+1)} &amp;amp;= g_{ml}^{(i)} &amp;amp;m,l \ne j,k&lt;br /&gt;
\end{align}&amp;lt;/math&amp;gt;&lt;br /&gt;
&lt;br /&gt;
=== Макроструктура алгоритма ===&lt;br /&gt;
Основную часть метода составляет процедура односторонних вращений матрицы, которая в свою очередь состоит из:&lt;br /&gt;
&lt;br /&gt;
#Вычисление &amp;lt;math&amp;gt;\tau, c, s, t&amp;lt;/math&amp;gt;.&lt;br /&gt;
#Одностороннее вращение матрицы. &lt;br /&gt;
&lt;br /&gt;
Что требует &amp;lt;math&amp;gt;O(n)&amp;lt;/math&amp;gt; операций.&lt;br /&gt;
&lt;br /&gt;
После этого необходимо:&lt;br /&gt;
&lt;br /&gt;
#Вычислить сингулярные числа &amp;lt;math&amp;gt;\sigma_i&amp;lt;/math&amp;gt;.  Что требует &amp;lt;math&amp;gt;O(n)&amp;lt;/math&amp;gt; операций.&lt;br /&gt;
#Вычислить &amp;lt;math&amp;gt;U&amp;lt;/math&amp;gt; и &amp;lt;math&amp;gt;V&amp;lt;/math&amp;gt;. Что требует &amp;lt;math&amp;gt;O(n^2)&amp;lt;/math&amp;gt; операций.&lt;br /&gt;
&lt;br /&gt;
=== Схема реализации последовательного алгоритма ===&lt;br /&gt;
Применение метода Якоби к матрице &amp;lt;math&amp;gt;A = (G^TG)&amp;lt;/math&amp;gt; можно описать следующим образом&amp;lt;ref&amp;gt;Дж. Деммель «Вычислительная линейная алгебра» (стр. 261-263)&amp;lt;/ref&amp;gt;:&lt;br /&gt;
&lt;br /&gt;
Если &amp;lt;math&amp;gt;G = U\Sigma V^T&amp;lt;/math&amp;gt; и &amp;lt;math&amp;gt;\Sigma = diag(\sigma_{i})&amp;lt;/math&amp;gt;, то алгоритм вычисляет сингулярные числа &amp;lt;math&amp;gt;\sigma_{i}&amp;lt;/math&amp;gt;, матрицу &amp;lt;math&amp;gt;U&amp;lt;/math&amp;gt; левых сингулярных векторов и матрицу &amp;lt;math&amp;gt;V&amp;lt;/math&amp;gt; правых сингулярных векторов по следующей схеме:&lt;br /&gt;
&lt;br /&gt;
 repeat&lt;br /&gt;
     for &amp;lt;math&amp;gt;j=1&amp;lt;/math&amp;gt; to &amp;lt;math&amp;gt;n-1&amp;lt;/math&amp;gt;&lt;br /&gt;
         for &amp;lt;math&amp;gt;k=j+1&amp;lt;/math&amp;gt; to &amp;lt;math&amp;gt;n&amp;lt;/math&amp;gt;&lt;br /&gt;
             обратиться к процедуре &#039;&#039;&#039;&#039;&#039;One-Sided-Jacobi-Rotation&amp;lt;math&amp;gt;(G,j,k)&amp;lt;/math&amp;gt;&#039;&#039;&#039;&#039;&#039;&lt;br /&gt;
         end for&lt;br /&gt;
     end for&lt;br /&gt;
 пока &amp;lt;math&amp;gt;G^TG&amp;lt;/math&amp;gt; не станет достаточно близка к диагональной матрице&lt;br /&gt;
 Положить &amp;lt;math&amp;gt;\sigma_{i} = ||G(:,i)||_2 &amp;lt;/math&amp;gt; (норма &amp;lt;math&amp;gt;i&amp;lt;/math&amp;gt;-го столбца в &amp;lt;math&amp;gt;G&amp;lt;/math&amp;gt;)&lt;br /&gt;
 Положить &amp;lt;math&amp;gt;U = [u_{1},\dots, u_{n}]&amp;lt;/math&amp;gt;, где &amp;lt;math&amp;gt;u_{i} = G(:,i)/\sigma_{i}&amp;lt;/math&amp;gt;&lt;br /&gt;
 Положить &amp;lt;math&amp;gt;V = J&amp;lt;/math&amp;gt;, где &amp;lt;math&amp;gt;J&amp;lt;/math&amp;gt; - накопленное произведение вращений Якоби.&lt;br /&gt;
&lt;br /&gt;
Где процедура &#039;&#039;&#039;&#039;&#039;One-Sided-Jacobi-Rotation&#039;&#039;&#039;&#039;&#039; является метод односторонних вращений Якоби:&lt;br /&gt;
&lt;br /&gt;
 proc &#039;&#039;&#039;&#039;&#039;One-Sided-Jacobi-Rotation&amp;lt;math&amp;gt;(G,j,k)&amp;lt;/math&amp;gt;&#039;&#039;&#039;&#039;&#039;&lt;br /&gt;
     вычислить &amp;lt;math&amp;gt;a_{jj} = (G^TG)_{jj}, a_{jk} = (G^TG)_{jk}&amp;lt;/math&amp;gt; и &amp;lt;math&amp;gt;a_{kk} = (G^TG)_{kk}&amp;lt;/math&amp;gt;&lt;br /&gt;
     if &amp;lt;math&amp;gt;|a_{jk}|&amp;lt;/math&amp;gt; не слишком мал&lt;br /&gt;
         &amp;lt;math&amp;gt;&lt;br /&gt;
         \begin{align}&lt;br /&gt;
         \tau &amp;amp;= {a_{jj} - a_{kk}}/{2a_{jk}} \\&lt;br /&gt;
         t &amp;amp;= {sign(\tau)}/(|\tau| + \sqrt{1 + \tau^2}) \\&lt;br /&gt;
         c &amp;amp;= 1/(\sqrt{1 + t^2}) \\&lt;br /&gt;
         s &amp;amp;= ct \\&lt;br /&gt;
         G &amp;amp;= GR(j,k,\theta) \  \dots c=cos\theta, s=sin\theta \end{align}&amp;lt;/math&amp;gt;&lt;br /&gt;
         if нужны правые сингулярные векторы &lt;br /&gt;
             &amp;lt;math&amp;gt;J = JR(j,k,\theta)&amp;lt;/math&amp;gt;&lt;br /&gt;
         end if&lt;br /&gt;
     end if&lt;br /&gt;
&lt;br /&gt;
=== Последовательная сложность алгоритма ===&lt;br /&gt;
Для одного вращения Якоби необходимо выполнить &amp;lt;math&amp;gt;O(n)&amp;lt;/math&amp;gt; операций умножения и сложения. &lt;br /&gt;
&lt;br /&gt;
Всего вариантов выбора &amp;lt;math&amp;gt;j&amp;lt;/math&amp;gt; и &amp;lt;math&amp;gt;k&amp;lt;/math&amp;gt; существует &amp;lt;math&amp;gt;\frac{n(n-1)}{2}&amp;lt;/math&amp;gt;.&lt;br /&gt;
&lt;br /&gt;
Таким образом последовательный алгоритм Якоби вычисления сингулярных чисел и векторов является алгоритмом с кубической сложностью.&lt;br /&gt;
&lt;br /&gt;
=== Информационный граф ===&lt;br /&gt;
Граф алгоритма состоит из четырех групп вершин&lt;br /&gt;
&lt;br /&gt;
(А)Первая группа вершин расположена в двумерной области, соответствующая ей операция - вычисление элементов матрицы произведения &amp;lt;math&amp;gt;a_{jj},a_{jk},a_{kk}&amp;lt;/math&amp;gt; . Где &amp;lt;math&amp;gt;j&amp;lt;/math&amp;gt; изменяется от &amp;lt;math&amp;gt;1&amp;lt;/math&amp;gt; до &amp;lt;math&amp;gt;n-1&amp;lt;/math&amp;gt;, принимая все целочисленные значения, &amp;lt;math&amp;gt;k&amp;lt;/math&amp;gt;  изменяется от &amp;lt;math&amp;gt;j+1&amp;lt;/math&amp;gt; до &amp;lt;math&amp;gt;n&amp;lt;/math&amp;gt;, принимая все целочисленные значения.&lt;br /&gt;
&lt;br /&gt;
Граф вычисления каждого из элементов приведен на рисунке 1, где значениям &amp;lt;math&amp;gt;a_{ij}&amp;lt;/math&amp;gt; соответствуют обозначения &amp;lt;math&amp;gt;x_{ij}&amp;lt;/math&amp;gt;, а элементам &amp;lt;math&amp;gt;r_{ij}&amp;lt;/math&amp;gt; обозначения &amp;lt;math&amp;gt;z_{ij}&amp;lt;/math&amp;gt;. Значение &amp;lt;math&amp;gt;s_{ij}&amp;lt;/math&amp;gt; является значением результирующего элемента.&lt;br /&gt;
&lt;br /&gt;
(Б)Вторая группа вершин расположена в двумерной области, соответствующая ей операция – вычисление &amp;lt;math&amp;gt;c&amp;lt;/math&amp;gt; и &amp;lt;math&amp;gt;s&amp;lt;/math&amp;gt;.&lt;br /&gt;
&lt;br /&gt;
Информационный граф с входными и выходными данными вычисления пункта (Б) представлен на рисунке 2.&lt;br /&gt;
&lt;br /&gt;
(В)Третья группа вершин расположена в двумерной области, соответствующая ей операция вычисление значений элементов &amp;lt;math&amp;gt;g_{jm}^{(i+1)} = g_{mj}^{(i+1)}&amp;lt;/math&amp;gt; и &amp;lt;math&amp;gt;g_{km}^{(i+1)} = g_{mk}^{(i+1)}&amp;lt;/math&amp;gt;, &amp;lt;math&amp;gt;m \ne j,k&amp;lt;/math&amp;gt;.&lt;br /&gt;
&lt;br /&gt;
(Г)Четвертая группа вершин расположена в двумерной области, соответствующая ей операция вычисление значений элементов &amp;lt;math&amp;gt;g_{jj}^{(i+1)} &amp;lt;/math&amp;gt; и &amp;lt;math&amp;gt;g_{kk}^{(i+1)} &amp;lt;/math&amp;gt;.&lt;br /&gt;
&lt;br /&gt;
Элементы групп (В) и (Г) вычисляются аналогично вычислению элементов матрицы произведения, т.к. фактически представляют собой перемножение матриц &amp;lt;math&amp;gt;G&amp;lt;/math&amp;gt; и &amp;lt;math&amp;gt;R&amp;lt;/math&amp;gt;&lt;br /&gt;
&lt;br /&gt;
[[File:Jacobi_2.jpg|none|thumb|1000px|Рисунок 1. Информационный граф с входными и выходными параметрами вычисления каждого элемента матрицы произведения.]]&lt;br /&gt;
&lt;br /&gt;
[[File:Jacobi_1.jpg|none|thumb|1000px|Рисунок 2. ]]&lt;br /&gt;
&lt;br /&gt;
Обобщенный граф метода Якоби представлен на рисунке 3, где буквами А, Б, В и Г обозначено вычисление групп вершин (А), (Б), (В) и (Г).&lt;br /&gt;
&lt;br /&gt;
[[File:Graf2.png|none|thumb|2000px|Рисунок 3. Обобщенный граф алгоритма вычисления сингулярных чисел и векторов методом Якоби.]]&lt;br /&gt;
&lt;br /&gt;
=== Ресурс параллелизма алгоритма ===&lt;br /&gt;
Для выполнения одной итерации метода Якоби требуется последовательно выполнить несколько ярусов:&lt;br /&gt;
# вычислить &amp;lt;math&amp;gt;\tau&amp;lt;/math&amp;gt; &lt;br /&gt;
# вычислить &amp;lt;math&amp;gt;t&amp;lt;/math&amp;gt; &lt;br /&gt;
# вычислить &amp;lt;math&amp;gt;c&amp;lt;/math&amp;gt; &lt;br /&gt;
# выполнить поворот матрицы &amp;lt;math&amp;gt;G&amp;lt;/math&amp;gt; с параллельным выполнением &amp;lt;math&amp;gt;2(n-2)&amp;lt;/math&amp;gt; операций вычисления элементов матрицы &amp;lt;math&amp;gt;g_{jm}^{(i+1)} = g_{mj}^{(i+1)}&amp;lt;/math&amp;gt; и &amp;lt;math&amp;gt;g_{km}^{(i+1)} = g_{mk}^{(i+1)}&amp;lt;/math&amp;gt;, &amp;lt;math&amp;gt;m \ne j,k&amp;lt;/math&amp;gt;, а также вычисления элементов &amp;lt;math&amp;gt;g_{jj}^{(i+1)} &amp;lt;/math&amp;gt; и &amp;lt;math&amp;gt;g_{kk}^{(i+1)} &amp;lt;/math&amp;gt;. &lt;br /&gt;
&lt;br /&gt;
Суммарное количество итераций равно &amp;lt;math&amp;gt;\frac{n(n-1)}{2}&amp;lt;/math&amp;gt; (Различные варианты выбора &amp;lt;math&amp;gt;j&amp;lt;/math&amp;gt; и &amp;lt;math&amp;gt;k&amp;lt;/math&amp;gt;). &lt;br /&gt;
&lt;br /&gt;
Асимптотически метод сходится квадратично. &lt;br /&gt;
&lt;br /&gt;
Таким образом, при классификации по высоте ЯПФ метод Якоби относится к алгоритмам со сложностью &amp;lt;math&amp;gt;O(n^2)&amp;lt;/math&amp;gt;&amp;amp;nbsp;, а при классификации по ширине ЯПФ — к алгоритмам со сложностью &amp;lt;math&amp;gt;O(n)&amp;lt;/math&amp;gt;.&lt;br /&gt;
&lt;br /&gt;
=== Входные и выходные данные алгоритма ===&lt;br /&gt;
&#039;&#039;&#039;Входные данные&#039;&#039;&#039;: плотная матрица &amp;lt;math&amp;gt;G&amp;lt;/math&amp;gt; размера &amp;lt;math&amp;gt;n&amp;lt;/math&amp;gt;х&amp;lt;math&amp;gt;n&amp;lt;/math&amp;gt;, где &amp;lt;math&amp;gt;A= G^TG&amp;lt;/math&amp;gt; – симметрическая матрица.&lt;br /&gt;
&lt;br /&gt;
&#039;&#039;&#039;Объём входных данных&#039;&#039;&#039;: &amp;lt;math&amp;gt;n^2&amp;lt;/math&amp;gt; (т.к. для хранения матрицы &amp;lt;math&amp;gt;G&amp;lt;/math&amp;gt; используем двумерный массив размера &amp;lt;math&amp;gt;n&amp;lt;/math&amp;gt;х&amp;lt;math&amp;gt;n&amp;lt;/math&amp;gt;)&lt;br /&gt;
&lt;br /&gt;
&#039;&#039;&#039;Выходные данные&#039;&#039;&#039;: &amp;lt;math&amp;gt;\sigma_{i}&amp;lt;/math&amp;gt;  - сингулярные числа, матрица &amp;lt;math&amp;gt;U&amp;lt;/math&amp;gt; левых сингулярных векторов и матрица &amp;lt;math&amp;gt;V&amp;lt;/math&amp;gt; правых сингулярных векторов.&lt;br /&gt;
&lt;br /&gt;
&#039;&#039;&#039;Объём выходных данных&#039;&#039;&#039;: &amp;lt;math&amp;gt;2n^2 + n&amp;lt;/math&amp;gt; (т.к. необходимо хранить вектор сингулярных чисел длины &amp;lt;math&amp;gt;n&amp;lt;/math&amp;gt;, а также две матрицы &amp;lt;math&amp;gt;U, V&amp;lt;/math&amp;gt; левых и правых сингулярных векторов размера &amp;lt;math&amp;gt;n&amp;lt;/math&amp;gt;х&amp;lt;math&amp;gt;n&amp;lt;/math&amp;gt;).&lt;br /&gt;
&lt;br /&gt;
=== Свойства алгоритма ===&lt;br /&gt;
Метод Якоби является самым медленным из имеющихся алгоритмов вычисления сингулярных чисел и сингулярных векторов матрицы. Тем не менее, для  матриц &amp;lt;math&amp;gt;G&amp;lt;/math&amp;gt;, которые могут быть представлены в виде &amp;lt;math&amp;gt;G=DX&amp;lt;/math&amp;gt;, где &amp;lt;math&amp;gt;D&amp;lt;/math&amp;gt; - диагональная, а &amp;lt;math&amp;gt;X&amp;lt;/math&amp;gt; - хорошо обусловлена, он способен вычислять сингулярные числа и вектора намного точнее, чем другие методы&amp;lt;ref&amp;gt;Дж. Деммель «Вычислительная линейная алгебра» (стр. 261-264)&amp;lt;/ref&amp;gt;. &lt;br /&gt;
&lt;br /&gt;
Вычислительная мощность алгоритма, как отношение числа операций к суммарному объему входных и выходных данных является линейной.&lt;br /&gt;
&lt;br /&gt;
Метод Якоби не детерминирован, так как является итерационным алгоритмом с выходом по точности (число итераций зависит от входных данных и порогового значения).&lt;br /&gt;
&lt;br /&gt;
== Программная реализация алгоритма ==&lt;br /&gt;
&lt;br /&gt;
=== Особенности реализации последовательного алгоритма ===&lt;br /&gt;
&lt;br /&gt;
=== Локальность данных и вычислений ===&lt;br /&gt;
&lt;br /&gt;
=== Возможные способы и особенности параллельной реализации алгоритма ===&lt;br /&gt;
&lt;br /&gt;
=== Масштабируемость алгоритма и его реализации ===&lt;br /&gt;
&lt;br /&gt;
=== Динамические характеристики и эффективность реализации алгоритма ===&lt;br /&gt;
&lt;br /&gt;
=== Выводы для классов архитектур ===&lt;br /&gt;
&lt;br /&gt;
=== Существующие реализации алгоритма ===&lt;br /&gt;
Метод Якоби нахождения сингулярных значений и векторов реализован в таких пакетах, как LAPACK, LINPACK/EISPACK, Intel MKL &amp;lt;ref&amp;gt;http://www.alglib.net/matrixops/general/svd.php&amp;lt;/ref&amp;gt;.&lt;br /&gt;
&lt;br /&gt;
Так же функция Якоби реализована в пакете Matlab.&lt;br /&gt;
&lt;br /&gt;
Т. к. алгоритм считается медленным, он не включен во многие известные пакеты.&lt;br /&gt;
&lt;br /&gt;
== Литература ==&lt;br /&gt;
1. Дж. Деммель Вычислительная линейная алгебра. Изд. Мир, 2001.&lt;/div&gt;</summary>
		<author><name>Davletshuna Alexandra</name></author>
	</entry>
	<entry>
		<id>https://xn--80aecvaldz.xn--80ahdrnmvk.xn--p1ai/w/ru/index.php?title=%D0%A3%D1%87%D0%B0%D1%81%D1%82%D0%BD%D0%B8%D0%BA:Davletshuna_Alexandra/%D0%9C%D0%B5%D1%82%D0%BE%D0%B4_%D0%AF%D0%BA%D0%BE%D0%B1%D0%B8_%D0%B2%D1%8B%D1%87%D0%B8%D1%81%D0%BB%D0%B5%D0%BD%D0%B8%D1%8F_%D1%81%D0%B8%D0%BD%D0%B3%D1%83%D0%BB%D1%8F%D1%80%D0%BD%D1%8B%D1%85_%D1%87%D0%B8%D1%81%D0%B5%D0%BB_%D0%B8_%D0%B2%D0%B5%D0%BA%D1%82%D0%BE%D1%80%D0%BE%D0%B2&amp;diff=15643</id>
		<title>Участник:Davletshuna Alexandra/Метод Якоби вычисления сингулярных чисел и векторов</title>
		<link rel="alternate" type="text/html" href="https://xn--80aecvaldz.xn--80ahdrnmvk.xn--p1ai/w/ru/index.php?title=%D0%A3%D1%87%D0%B0%D1%81%D1%82%D0%BD%D0%B8%D0%BA:Davletshuna_Alexandra/%D0%9C%D0%B5%D1%82%D0%BE%D0%B4_%D0%AF%D0%BA%D0%BE%D0%B1%D0%B8_%D0%B2%D1%8B%D1%87%D0%B8%D1%81%D0%BB%D0%B5%D0%BD%D0%B8%D1%8F_%D1%81%D0%B8%D0%BD%D0%B3%D1%83%D0%BB%D1%8F%D1%80%D0%BD%D1%8B%D1%85_%D1%87%D0%B8%D1%81%D0%B5%D0%BB_%D0%B8_%D0%B2%D0%B5%D0%BA%D1%82%D0%BE%D1%80%D0%BE%D0%B2&amp;diff=15643"/>
		<updated>2016-11-01T20:22:41Z</updated>

		<summary type="html">&lt;p&gt;Davletshuna Alexandra: &lt;/p&gt;
&lt;hr /&gt;
&lt;div&gt;{{Assignment}}&lt;br /&gt;
&lt;br /&gt;
{{algorithm&lt;br /&gt;
| name              = Метод Якоби вычисления сингулярных чисел и векторов&lt;br /&gt;
| serial_complexity = &amp;lt;math&amp;gt;O(n^3)&amp;lt;/math&amp;gt;&lt;br /&gt;
| pf_height         = &amp;lt;math&amp;gt;O(n^2)&amp;lt;/math&amp;gt;&lt;br /&gt;
| pf_width          = &amp;lt;math&amp;gt;O(n)&amp;lt;/math&amp;gt;&lt;br /&gt;
| input_data        = &amp;lt;math&amp;gt;n^2&amp;lt;/math&amp;gt;&lt;br /&gt;
| output_data       = &amp;lt;math&amp;gt;2n^2 + n&amp;lt;/math&amp;gt;&lt;br /&gt;
}}&lt;br /&gt;
&lt;br /&gt;
Авторы статьи: [[Участница:Davletshuna Alexandra|Давлетшина Александра]] (группа 619), [[Участница:Alek sandra|Зайцева Александра]] (группа 601)&lt;br /&gt;
&lt;br /&gt;
== Свойства и структура алгоритма ==&lt;br /&gt;
&lt;br /&gt;
=== Общее описание алгоритма ===&lt;br /&gt;
&#039;&#039;&#039;Сингулярным разложением&#039;&#039;&#039; называется разложение прямоугольной вещественной или комплексной матрицы, имеющее широкое применение, в силу своей наглядной геометрической интерпретации, при решении многих прикладных задач. Сингулярное разложение матрицы А позволяет вычислять сингулярные числа данной матрицы, а также, левые и правые сингулярные векторы матрицы А:&lt;br /&gt;
&lt;br /&gt;
•	левые сингулярные векторы матрицы А — это собственные векторы матрицы &amp;lt;math&amp;gt;AA^*&amp;lt;/math&amp;gt;;&lt;br /&gt;
&lt;br /&gt;
•	правые сингулярные векторы матрицы A — это собственные векторы матрицы &amp;lt;math&amp;gt;A^*A&amp;lt;/math&amp;gt;.&lt;br /&gt;
&lt;br /&gt;
Геометрическая интерпретация сингулярного разложения заключается в следующем факте из геометрии: &#039;&#039;Образом любого линейного преобразования, заданного с помощью матрицы &amp;lt;math&amp;gt;m&amp;lt;/math&amp;gt;x&amp;lt;math&amp;gt;n&amp;lt;/math&amp;gt;, примененного к единичной сфере является гиперэллипсоид&#039;&#039;.&lt;br /&gt;
&lt;br /&gt;
Из многочисленных разложений матриц, наиболее удобным является сингулярное разложение матрицы в виде: &amp;lt;math&amp;gt;A=U\Sigma V^*&amp;lt;/math&amp;gt;, где &amp;lt;math&amp;gt;U, V&amp;lt;/math&amp;gt; – унитарные матрицы, а &amp;lt;math&amp;gt;\Sigma&amp;lt;/math&amp;gt; – диагональная матрица с вещественными положительными числами на диагонали &amp;lt;ref&amp;gt;http://algorithms.parallel.ru/&amp;lt;/ref&amp;gt;.&lt;br /&gt;
&lt;br /&gt;
Диагональные элементы матрицы &amp;lt;math&amp;gt;\Sigma&amp;lt;/math&amp;gt; называются сингулярными числами матрицы &amp;lt;math&amp;gt;A&amp;lt;/math&amp;gt;, а столбцы матриц &amp;lt;math&amp;gt;U,V&amp;lt;/math&amp;gt; левыми и правыми сингулярными векторами соответственно.&lt;br /&gt;
&lt;br /&gt;
Алгоритм Якоби сингулярного разложения матрицы был предложен одним из первых в 1846 году. Он приводит прямоугольную матрицу к диагональной матрице с помощью последовательности элементарных вращений. Метод может найти все сингулярные значения с очень высокой точностью. Однако его производительность является довольно низкой, в сравнении с конкурирующими методами.&lt;br /&gt;
&lt;br /&gt;
&#039;&#039;Неявный&#039;&#039;&amp;lt;ref&amp;gt;Дж. Деммель «Вычислительная линейная алгебра» (стр. 261-264)&amp;lt;/ref&amp;gt; метод Якоби математически эквивалентен применению метода Якоби вычисления собственных значений к матрице &amp;lt;math&amp;gt;A = G^TG&amp;lt;/math&amp;gt;.&lt;br /&gt;
Это значит, что на каждом шаге вычисляется вращение Якоби &amp;lt;math&amp;gt;J&amp;lt;/math&amp;gt;, с помощью которого матрица &amp;lt;math&amp;gt;G^TG&amp;lt;/math&amp;gt; неявно пересчитывется в &amp;lt;math&amp;gt;J^TG^TGJ&amp;lt;/math&amp;gt;; вращение выбрано так, чтобы пара внедиагональных элементов из &amp;lt;math&amp;gt;G^TG&amp;lt;/math&amp;gt; обратилась в нули в матрице &amp;lt;math&amp;gt;J^TG^TGJ&amp;lt;/math&amp;gt;. При этом ни &amp;lt;math&amp;gt;G^TG&amp;lt;/math&amp;gt;, ни &amp;lt;math&amp;gt;J^TG^TGJ&amp;lt;/math&amp;gt; не вычисляются в явном виде; вместо них вычисляется матрица &amp;lt;math&amp;gt;GJ&amp;lt;/math&amp;gt;. Поэтому алгоритм называется &#039;&#039;методом односторонних вращений&#039;&#039;.&lt;br /&gt;
&lt;br /&gt;
=== Математическое описание алгоритма ===&lt;br /&gt;
Исходные данные: матрица &amp;lt;math&amp;gt;G&amp;lt;/math&amp;gt; (элементы &amp;lt;math&amp;gt;g_{ij}, i, j = 1, \ldots, n&amp;lt;/math&amp;gt;).&lt;br /&gt;
&lt;br /&gt;
Вычисляемые данные: матрица &amp;lt;math&amp;gt;\Sigma = diag(\sigma_{i})&amp;lt;/math&amp;gt;, где &amp;lt;math&amp;gt;\sigma_{i}&amp;lt;/math&amp;gt; - сингулярные числа, &amp;lt;math&amp;gt;U&amp;lt;/math&amp;gt; - матрица левых сингулярных векторов, &amp;lt;math&amp;gt;V&amp;lt;/math&amp;gt; - матрица правых сингулярных векторов.&lt;br /&gt;
&lt;br /&gt;
симметричную матрицу &amp;lt;math&amp;gt;A = (G^TG)&amp;lt;/math&amp;gt; можно привести к диагональному виду:&lt;br /&gt;
&amp;lt;math&amp;gt;RG^TGR^T&amp;lt;/math&amp;gt;, где&lt;br /&gt;
&lt;br /&gt;
&amp;lt;math&amp;gt;&lt;br /&gt;
R(j,k,\theta) = &lt;br /&gt;
\begin{matrix}&lt;br /&gt;
  \\&lt;br /&gt;
  \\&lt;br /&gt;
  \\&lt;br /&gt;
j \\&lt;br /&gt;
  \\&lt;br /&gt;
k \\&lt;br /&gt;
  \\&lt;br /&gt;
  \\&lt;br /&gt;
  \\&lt;br /&gt;
\end{matrix}&lt;br /&gt;
&amp;lt;/math&amp;gt;  &lt;br /&gt;
&amp;lt;math&amp;gt;&lt;br /&gt;
\begin{bmatrix}&lt;br /&gt;
  &amp;amp; 1 &amp;amp;   &amp;amp;        &amp;amp;              &amp;amp;        &amp;amp;               &amp;amp;         &amp;amp;    &amp;amp;   \\&lt;br /&gt;
  &amp;amp;   &amp;amp; 1 &amp;amp;        &amp;amp;              &amp;amp;        &amp;amp;               &amp;amp;         &amp;amp;    &amp;amp;   \\&lt;br /&gt;
  &amp;amp;   &amp;amp;   &amp;amp; \ddots &amp;amp;              &amp;amp;        &amp;amp;               &amp;amp;         &amp;amp;    &amp;amp;   \\&lt;br /&gt;
  &amp;amp;   &amp;amp;   &amp;amp;        &amp;amp; \cos(\theta) &amp;amp;        &amp;amp; -\sin(\theta) &amp;amp;         &amp;amp;    &amp;amp;   \\&lt;br /&gt;
  &amp;amp;   &amp;amp;   &amp;amp;        &amp;amp;              &amp;amp; \ddots &amp;amp;               &amp;amp;         &amp;amp;    &amp;amp;   \\&lt;br /&gt;
  &amp;amp;   &amp;amp;   &amp;amp;        &amp;amp; \sin(\theta) &amp;amp;        &amp;amp; \cos(\theta)  &amp;amp;         &amp;amp;    &amp;amp;   \\&lt;br /&gt;
  &amp;amp;   &amp;amp;   &amp;amp;        &amp;amp;              &amp;amp;        &amp;amp;               &amp;amp; \ddots  &amp;amp;    &amp;amp;   \\&lt;br /&gt;
  &amp;amp;   &amp;amp;   &amp;amp;        &amp;amp;              &amp;amp;        &amp;amp;               &amp;amp;         &amp;amp; 1  &amp;amp;   \\&lt;br /&gt;
  &amp;amp;   &amp;amp;   &amp;amp;        &amp;amp;              &amp;amp;        &amp;amp;               &amp;amp;         &amp;amp;    &amp;amp; 1 \\&lt;br /&gt;
\end{bmatrix}&lt;br /&gt;
&amp;lt;/math&amp;gt;&lt;br /&gt;
&lt;br /&gt;
Обозначим &amp;lt;math&amp;gt;s = \sin \theta&amp;lt;/math&amp;gt; и &amp;lt;math&amp;gt;c = \cos \theta&amp;lt;/math&amp;gt;.&lt;br /&gt;
&lt;br /&gt;
Перемножив матрицы &amp;lt;math&amp;gt;RG^TGR^T&amp;lt;/math&amp;gt;, получим следующие выражения&amp;lt;ref&amp;gt;http://www.astro.tsu.ru/OsChMet/5_2.html&amp;lt;/ref&amp;gt;:&lt;br /&gt;
&lt;br /&gt;
&amp;lt;math&amp;gt;\begin{align}&lt;br /&gt;
 a_{jj}^{(i+1)} &amp;amp;= c^2\, a_{jj}^{(i)}  -  2\, s c \,a_{jk}^{(i)}  +  s^2\, a_{kk}^{(i)} \\&lt;br /&gt;
 a_{kk}^{(i+1)} &amp;amp;= s^2 \,a_{jj}^{(i)}  +  2 s c\, a_{jk}^{(i)}  +  c^2 \, a_{kk}^{(i)} \\&lt;br /&gt;
 a_{jk}^{(i+1)} &amp;amp;= a_{kj}^{(i+1)} = (c^2 - s^2 ) \, a_{jk}^{(i)}  +  s c \, (a_{kk}^{(i)} - a_{jj}^{(i)} ) \\&lt;br /&gt;
 a_{jm}^{(i+1)} &amp;amp;= a_{mj}^{(i+1)} = c \, a_{jm}^{(i)}  -  s \, a_{km}^{(i)} &amp;amp; m \ne j,k \\&lt;br /&gt;
 a_{km}^{(i+1)} &amp;amp;= a_{mk}^{(i+1)} = s \, a_{jm}^{(i)}  + c \, a_{km}^{(i)} &amp;amp; m \ne j,k \\&lt;br /&gt;
 a_{ml}^{(i+1)} &amp;amp;= a_{ml}^{(i)} &amp;amp;m,l \ne j,k&lt;br /&gt;
\end{align}&amp;lt;/math&amp;gt;&lt;br /&gt;
&lt;br /&gt;
Т.к внедиагональные элементы должны быть равны 0, то выбираем &amp;lt;math&amp;gt;\theta&amp;lt;/math&amp;gt; так, чтобы &amp;lt;math&amp;gt;a_{jk}^{(i+1)} = 0&amp;lt;/math&amp;gt; и &amp;lt;math&amp;gt;a_{kj}^{(i+1)} = 0&amp;lt;/math&amp;gt;.&lt;br /&gt;
&lt;br /&gt;
Тогда решая уравнение получаем, что&lt;br /&gt;
&lt;br /&gt;
&amp;lt;math&amp;gt;&lt;br /&gt;
         \begin{align}&lt;br /&gt;
         \tau &amp;amp;= {a_{jj} - a_{kk}}/{2a_{jk}} \\&lt;br /&gt;
         t &amp;amp;= {sign(\tau)}/(|\tau| + \sqrt{1 + \tau^2}) \\&lt;br /&gt;
         c &amp;amp;= 1/(\sqrt{1 + t^2}) \\&lt;br /&gt;
         s &amp;amp;= ct \\&lt;br /&gt;
         \end{align}&amp;lt;/math&amp;gt;&lt;br /&gt;
&lt;br /&gt;
Остановка вычислений алгоритма наступает, когда внедиагональные элементы становятся меньше некоторого наперед заданного числа &amp;lt;math&amp;gt;\varepsilon&amp;lt;/math&amp;gt;.&lt;br /&gt;
&lt;br /&gt;
=== Вычислительное ядро алгоритма ===&lt;br /&gt;
Вычислительное ядро алгоритма составляет непосредственно вычисление одностороннего вращения Якоби, т.е. вычисление элементов матрицы &amp;lt;math&amp;gt;g_{jm}^{(i+1)} = g_{mj}^{(i+1)}&amp;lt;/math&amp;gt; и &amp;lt;math&amp;gt;g_{km}^{(i+1)} = g_{mk}^{(i+1)}&amp;lt;/math&amp;gt;, &amp;lt;math&amp;gt;m \ne j,k&amp;lt;/math&amp;gt;, а также вычисления элементов &amp;lt;math&amp;gt;g_{jj}^{(i+1)} &amp;lt;/math&amp;gt; и &amp;lt;math&amp;gt;g_{kk}^{(i+1)} &amp;lt;/math&amp;gt;, получившихся после умножения промежуточной матрицы на матрицу вращений Якоби:&lt;br /&gt;
&lt;br /&gt;
&amp;lt;math&amp;gt;\begin{align}&lt;br /&gt;
 g_{jj}^{(i+1)} &amp;amp;= c^2\, g_{jj}^{(i)}  -  2\, s c \,g_{jk}^{(i)}  +  s^2\, g_{kk}^{(i)} \\&lt;br /&gt;
 g_{kk}^{(i+1)} &amp;amp;= s^2 \,g_{jj}^{(i)}  +  2 s c\, g_{jk}^{(i)}  +  c^2 \, g_{kk}^{(i)} \\&lt;br /&gt;
 g_{jk}^{(i+1)} &amp;amp;= g_{kj}^{(i+1)} = (c^2 - s^2 ) \, g_{jk}^{(i)}  +  s c \, (g_{kk}^{(i)} - g_{jj}^{(i)} ) \\&lt;br /&gt;
 g_{jm}^{(i+1)} &amp;amp;= g_{mj}^{(i+1)} = c \, g_{jm}^{(i)}  -  s \, g_{km}^{(i)} &amp;amp; m \ne j,k \\&lt;br /&gt;
 g_{km}^{(i+1)} &amp;amp;= g_{mk}^{(i+1)} = s \, g_{jm}^{(i)}  + c \, g_{km}^{(i)} &amp;amp; m \ne j,k \\&lt;br /&gt;
 g_{ml}^{(i+1)} &amp;amp;= g_{ml}^{(i)} &amp;amp;m,l \ne j,k&lt;br /&gt;
\end{align}&amp;lt;/math&amp;gt;&lt;br /&gt;
&lt;br /&gt;
=== Макроструктура алгоритма ===&lt;br /&gt;
Основную часть метода составляет процедура односторонних вращений матрицы, которая в свою очередь состоит из:&lt;br /&gt;
&lt;br /&gt;
#Вычисление &amp;lt;math&amp;gt;\tau, c, s, t&amp;lt;/math&amp;gt;.&lt;br /&gt;
#Одностороннее вращение матрицы. &lt;br /&gt;
&lt;br /&gt;
Что требует &amp;lt;math&amp;gt;O(n)&amp;lt;/math&amp;gt; операций.&lt;br /&gt;
&lt;br /&gt;
После этого необходимо:&lt;br /&gt;
&lt;br /&gt;
#Вычислить сингулярные числа &amp;lt;math&amp;gt;\sigma_i&amp;lt;/math&amp;gt;.  Что требует &amp;lt;math&amp;gt;O(n)&amp;lt;/math&amp;gt; операций.&lt;br /&gt;
#Вычислить &amp;lt;math&amp;gt;U&amp;lt;/math&amp;gt; и &amp;lt;math&amp;gt;V&amp;lt;/math&amp;gt;. Что требует &amp;lt;math&amp;gt;O(n^2)&amp;lt;/math&amp;gt; операций.&lt;br /&gt;
&lt;br /&gt;
=== Схема реализации последовательного алгоритма ===&lt;br /&gt;
Применение метода Якоби к матрице &amp;lt;math&amp;gt;A = (G^TG)&amp;lt;/math&amp;gt; можно описать следующим образом&amp;lt;ref&amp;gt;Дж. Деммель «Вычислительная линейная алгебра» (стр. 261-263)&amp;lt;/ref&amp;gt;:&lt;br /&gt;
&lt;br /&gt;
Если &amp;lt;math&amp;gt;G = U\Sigma V^T&amp;lt;/math&amp;gt; и &amp;lt;math&amp;gt;\Sigma = diag(\sigma_{i})&amp;lt;/math&amp;gt;, то алгоритм вычисляет сингулярные числа &amp;lt;math&amp;gt;\sigma_{i}&amp;lt;/math&amp;gt;, матрицу &amp;lt;math&amp;gt;U&amp;lt;/math&amp;gt; левых сингулярных векторов и матрицу &amp;lt;math&amp;gt;V&amp;lt;/math&amp;gt; правых сингулярных векторов по следующей схеме:&lt;br /&gt;
&lt;br /&gt;
 repeat&lt;br /&gt;
     for &amp;lt;math&amp;gt;j=1&amp;lt;/math&amp;gt; to &amp;lt;math&amp;gt;n-1&amp;lt;/math&amp;gt;&lt;br /&gt;
         for &amp;lt;math&amp;gt;k=j+1&amp;lt;/math&amp;gt; to &amp;lt;math&amp;gt;n&amp;lt;/math&amp;gt;&lt;br /&gt;
             обратиться к процедуре &#039;&#039;&#039;&#039;&#039;One-Sided-Jacobi-Rotation&amp;lt;math&amp;gt;(G,j,k)&amp;lt;/math&amp;gt;&#039;&#039;&#039;&#039;&#039;&lt;br /&gt;
         end for&lt;br /&gt;
     end for&lt;br /&gt;
 пока &amp;lt;math&amp;gt;G^TG&amp;lt;/math&amp;gt; не станет достаточно близка к диагональной матрице&lt;br /&gt;
 Положить &amp;lt;math&amp;gt;\sigma_{i} = ||G(:,i)||_2 &amp;lt;/math&amp;gt; (норма &amp;lt;math&amp;gt;i&amp;lt;/math&amp;gt;-го столбца в &amp;lt;math&amp;gt;G&amp;lt;/math&amp;gt;)&lt;br /&gt;
 Положить &amp;lt;math&amp;gt;U = [u_{1},\dots, u_{n}]&amp;lt;/math&amp;gt;, где &amp;lt;math&amp;gt;u_{i} = G(:,i)/\sigma_{i}&amp;lt;/math&amp;gt;&lt;br /&gt;
 Положить &amp;lt;math&amp;gt;V = J&amp;lt;/math&amp;gt;, где &amp;lt;math&amp;gt;J&amp;lt;/math&amp;gt; - накопленное произведение вращений Якоби.&lt;br /&gt;
&lt;br /&gt;
Где процедура &#039;&#039;&#039;&#039;&#039;One-Sided-Jacobi-Rotation&#039;&#039;&#039;&#039;&#039; является метод односторонних вращений Якоби:&lt;br /&gt;
&lt;br /&gt;
 proc &#039;&#039;&#039;&#039;&#039;One-Sided-Jacobi-Rotation&amp;lt;math&amp;gt;(G,j,k)&amp;lt;/math&amp;gt;&#039;&#039;&#039;&#039;&#039;&lt;br /&gt;
     вычислить &amp;lt;math&amp;gt;a_{jj} = (G^TG)_{jj}, a_{jk} = (G^TG)_{jk}&amp;lt;/math&amp;gt; и &amp;lt;math&amp;gt;a_{kk} = (G^TG)_{kk}&amp;lt;/math&amp;gt;&lt;br /&gt;
     if &amp;lt;math&amp;gt;|a_{jk}|&amp;lt;/math&amp;gt; не слишком мал&lt;br /&gt;
         &amp;lt;math&amp;gt;&lt;br /&gt;
         \begin{align}&lt;br /&gt;
         \tau &amp;amp;= {a_{jj} - a_{kk}}/{2a_{jk}} \\&lt;br /&gt;
         t &amp;amp;= {sign(\tau)}/(|\tau| + \sqrt{1 + \tau^2}) \\&lt;br /&gt;
         c &amp;amp;= 1/(\sqrt{1 + t^2}) \\&lt;br /&gt;
         s &amp;amp;= ct \\&lt;br /&gt;
         G &amp;amp;= GR(j,k,\theta) \  \dots c=cos\theta, s=sin\theta \end{align}&amp;lt;/math&amp;gt;&lt;br /&gt;
         if нужны правые сингулярные векторы &lt;br /&gt;
             &amp;lt;math&amp;gt;J = JR(j,k,\theta)&amp;lt;/math&amp;gt;&lt;br /&gt;
         end if&lt;br /&gt;
     end if&lt;br /&gt;
&lt;br /&gt;
=== Последовательная сложность алгоритма ===&lt;br /&gt;
Для одного вращения Якоби необходимо выполнить &amp;lt;math&amp;gt;O(n)&amp;lt;/math&amp;gt; операций умножения и сложения. &lt;br /&gt;
&lt;br /&gt;
Всего вариантов выбора &amp;lt;math&amp;gt;j&amp;lt;/math&amp;gt; и &amp;lt;math&amp;gt;k&amp;lt;/math&amp;gt; существует &amp;lt;math&amp;gt;\frac{n(n-1)}{2}&amp;lt;/math&amp;gt;.&lt;br /&gt;
&lt;br /&gt;
Таким образом последовательный алгоритм Якоби вычисления сингулярных чисел и векторов является алгоритмом с кубической сложностью.&lt;br /&gt;
&lt;br /&gt;
=== Информационный граф ===&lt;br /&gt;
Граф алгоритма состоит из четырех групп вершин&lt;br /&gt;
&lt;br /&gt;
(А)Первая группа вершин расположена в двумерной области, соответствующая ей операция - вычисление элементов матрицы произведения &amp;lt;math&amp;gt;a_{jj},a_{jk},a_{kk}&amp;lt;/math&amp;gt; . Где &amp;lt;math&amp;gt;j&amp;lt;/math&amp;gt; изменяется от &amp;lt;math&amp;gt;1&amp;lt;/math&amp;gt; до &amp;lt;math&amp;gt;n-1&amp;lt;/math&amp;gt;, принимая все целочисленные значения, &amp;lt;math&amp;gt;k&amp;lt;/math&amp;gt;  изменяется от &amp;lt;math&amp;gt;j+1&amp;lt;/math&amp;gt; до &amp;lt;math&amp;gt;n&amp;lt;/math&amp;gt;, принимая все целочисленные значения.&lt;br /&gt;
&lt;br /&gt;
Граф вычисления каждого из элементов приведен на рисунке 1, где значениям &amp;lt;math&amp;gt;a_{ij}&amp;lt;/math&amp;gt; соответствуют обозначения &amp;lt;math&amp;gt;x_{ij}&amp;lt;/math&amp;gt;, а элементам &amp;lt;math&amp;gt;r_{ij}&amp;lt;/math&amp;gt; элементы &amp;lt;math&amp;gt;z_{ij}&amp;lt;/math&amp;gt;. Значение &amp;lt;math&amp;gt;s_{ij}&amp;lt;/math&amp;gt; является значением результирующего элемента.&lt;br /&gt;
&lt;br /&gt;
(Б)Вторая группа вершин расположена в двумерной области, соответствующая ей операция – вычисление &amp;lt;math&amp;gt;c&amp;lt;/math&amp;gt; и &amp;lt;math&amp;gt;s&amp;lt;/math&amp;gt;.&lt;br /&gt;
&lt;br /&gt;
Информационный граф с входными и выходными данными вычисления пункта (Б) представлен на рисунке 2.&lt;br /&gt;
&lt;br /&gt;
(В)Третья группа вершин расположена в двумерной области, соответствующая ей операция вычисление значений элементов &amp;lt;math&amp;gt;g_{jm}^{(i+1)} = g_{mj}^{(i+1)}&amp;lt;/math&amp;gt; и &amp;lt;math&amp;gt;g_{km}^{(i+1)} = g_{mk}^{(i+1)}&amp;lt;/math&amp;gt;, &amp;lt;math&amp;gt;m \ne j,k&amp;lt;/math&amp;gt;.&lt;br /&gt;
&lt;br /&gt;
(Г)Четвертая группа вершин расположена в двумерной области, соответствующая ей операция вычисление значений элементов &amp;lt;math&amp;gt;g_{jj}^{(i+1)} &amp;lt;/math&amp;gt; и &amp;lt;math&amp;gt;g_{kk}^{(i+1)} &amp;lt;/math&amp;gt;.&lt;br /&gt;
&lt;br /&gt;
Элементы групп (В) и (Г) вычисляются аналогично вычислению элементов матрицы произведения, т.к. фактически представляют собой перемножение матриц &amp;lt;math&amp;gt;G&amp;lt;/math&amp;gt; и &amp;lt;math&amp;gt;R&amp;lt;/math&amp;gt;&lt;br /&gt;
&lt;br /&gt;
[[File:Jacobi_2.jpg|none|thumb|1000px|Рисунок 1. Информационный граф с входными и выходными параметрами вычисления каждого элемента матрицы произведения.]]&lt;br /&gt;
&lt;br /&gt;
[[File:Jacobi_1.jpg|none|thumb|1000px|Рисунок 2. ]]&lt;br /&gt;
&lt;br /&gt;
Обобщенный граф метода Якоби представлен на рисунке 3, где буквами А, Б, В и Г обозначено вычисление групп вершин (А), (Б), (В) и (Г).&lt;br /&gt;
&lt;br /&gt;
[[File:Graf2.png|none|thumb|2000px|Рисунок 3. Обобщенный граф алгоритма вычисления сингулярных чисел и векторов методом Якоби.]]&lt;br /&gt;
&lt;br /&gt;
=== Ресурс параллелизма алгоритма ===&lt;br /&gt;
Для выполнения одной итерации метода Якоби требуется последовательно выполнить несколько ярусов:&lt;br /&gt;
# вычислить &amp;lt;math&amp;gt;\tau&amp;lt;/math&amp;gt; &lt;br /&gt;
# вычислить &amp;lt;math&amp;gt;t&amp;lt;/math&amp;gt; &lt;br /&gt;
# вычислить &amp;lt;math&amp;gt;c&amp;lt;/math&amp;gt; &lt;br /&gt;
# выполнить поворот матрицы &amp;lt;math&amp;gt;G&amp;lt;/math&amp;gt; с параллельным выполнением &amp;lt;math&amp;gt;2(n-2)&amp;lt;/math&amp;gt; операций вычисления элементов матрицы &amp;lt;math&amp;gt;g_{jm}^{(i+1)} = g_{mj}^{(i+1)}&amp;lt;/math&amp;gt; и &amp;lt;math&amp;gt;g_{km}^{(i+1)} = g_{mk}^{(i+1)}&amp;lt;/math&amp;gt;, &amp;lt;math&amp;gt;m \ne j,k&amp;lt;/math&amp;gt;, а также вычисления элементов &amp;lt;math&amp;gt;g_{jj}^{(i+1)} &amp;lt;/math&amp;gt; и &amp;lt;math&amp;gt;g_{kk}^{(i+1)} &amp;lt;/math&amp;gt;. &lt;br /&gt;
&lt;br /&gt;
Суммарное количество итераций равно &amp;lt;math&amp;gt;\frac{n(n-1)}{2}&amp;lt;/math&amp;gt; (Различные варианты выбора &amp;lt;math&amp;gt;j&amp;lt;/math&amp;gt; и &amp;lt;math&amp;gt;k&amp;lt;/math&amp;gt;). &lt;br /&gt;
&lt;br /&gt;
Асимптотически метод сходится квадратично. &lt;br /&gt;
&lt;br /&gt;
Таким образом, при классификации по высоте ЯПФ метод Якоби относится к алгоритмам со сложностью &amp;lt;math&amp;gt;O(n^2)&amp;lt;/math&amp;gt;&amp;amp;nbsp;, а при классификации по ширине ЯПФ — к алгоритмам со сложностью &amp;lt;math&amp;gt;O(n)&amp;lt;/math&amp;gt;.&lt;br /&gt;
&lt;br /&gt;
=== Входные и выходные данные алгоритма ===&lt;br /&gt;
&#039;&#039;&#039;Входные данные&#039;&#039;&#039;: плотная матрица &amp;lt;math&amp;gt;G&amp;lt;/math&amp;gt; размера &amp;lt;math&amp;gt;n&amp;lt;/math&amp;gt;х&amp;lt;math&amp;gt;n&amp;lt;/math&amp;gt;, где &amp;lt;math&amp;gt;A= G^TG&amp;lt;/math&amp;gt; – симметрическая матрица.&lt;br /&gt;
&lt;br /&gt;
&#039;&#039;&#039;Объём входных данных&#039;&#039;&#039;: &amp;lt;math&amp;gt;n^2&amp;lt;/math&amp;gt; (т.к. для хранения матрицы &amp;lt;math&amp;gt;G&amp;lt;/math&amp;gt; используем двумерный массив размера &amp;lt;math&amp;gt;n&amp;lt;/math&amp;gt;х&amp;lt;math&amp;gt;n&amp;lt;/math&amp;gt;)&lt;br /&gt;
&lt;br /&gt;
&#039;&#039;&#039;Выходные данные&#039;&#039;&#039;: &amp;lt;math&amp;gt;\sigma_{i}&amp;lt;/math&amp;gt;  - сингулярные числа, матрица &amp;lt;math&amp;gt;U&amp;lt;/math&amp;gt; левых сингулярных векторов и матрица &amp;lt;math&amp;gt;V&amp;lt;/math&amp;gt; правых сингулярных векторов.&lt;br /&gt;
&lt;br /&gt;
&#039;&#039;&#039;Объём выходных данных&#039;&#039;&#039;: &amp;lt;math&amp;gt;2n^2 + n&amp;lt;/math&amp;gt; (т.к. необходимо хранить вектор сингулярных чисел длины &amp;lt;math&amp;gt;n&amp;lt;/math&amp;gt;, а также две матрицы &amp;lt;math&amp;gt;U, V&amp;lt;/math&amp;gt; левых и правых сингулярных векторов размера &amp;lt;math&amp;gt;n&amp;lt;/math&amp;gt;х&amp;lt;math&amp;gt;n&amp;lt;/math&amp;gt;).&lt;br /&gt;
&lt;br /&gt;
=== Свойства алгоритма ===&lt;br /&gt;
Метод Якоби является самым медленным из имеющихся алгоритмов вычисления сингулярных чисел и сингулярных векторов матрицы. Тем не менее, для  матриц &amp;lt;math&amp;gt;G&amp;lt;/math&amp;gt;, которые могут быть представлены в виде &amp;lt;math&amp;gt;G=DX&amp;lt;/math&amp;gt;, где &amp;lt;math&amp;gt;D&amp;lt;/math&amp;gt; - диагональная, а &amp;lt;math&amp;gt;X&amp;lt;/math&amp;gt; - хорошо обусловлена, он способен вычислять сингулярные числа и вектора намного точнее, чем другие методы&amp;lt;ref&amp;gt;Дж. Деммель «Вычислительная линейная алгебра» (стр. 261-264)&amp;lt;/ref&amp;gt;. &lt;br /&gt;
&lt;br /&gt;
Вычислительная мощность алгоритма, как отношение числа операций к суммарному объему входных и выходных данных является линейной.&lt;br /&gt;
&lt;br /&gt;
Метод Якоби не детерминирован, так как является итерационным алгоритмом с выходом по точности (число итераций зависит от входных данных и порогового значения).&lt;br /&gt;
&lt;br /&gt;
== Программная реализация алгоритма ==&lt;br /&gt;
&lt;br /&gt;
=== Особенности реализации последовательного алгоритма ===&lt;br /&gt;
&lt;br /&gt;
=== Локальность данных и вычислений ===&lt;br /&gt;
&lt;br /&gt;
=== Возможные способы и особенности параллельной реализации алгоритма ===&lt;br /&gt;
&lt;br /&gt;
=== Масштабируемость алгоритма и его реализации ===&lt;br /&gt;
&lt;br /&gt;
=== Динамические характеристики и эффективность реализации алгоритма ===&lt;br /&gt;
&lt;br /&gt;
=== Выводы для классов архитектур ===&lt;br /&gt;
&lt;br /&gt;
=== Существующие реализации алгоритма ===&lt;br /&gt;
Метод Якоби нахождения сингулярных значений и векторов реализован в таких пакетах, как LAPACK, LINPACK/EISPACK, Intel MKL &amp;lt;ref&amp;gt;http://www.alglib.net/matrixops/general/svd.php&amp;lt;/ref&amp;gt;.&lt;br /&gt;
&lt;br /&gt;
Так же функция Якоби реализована в пакете Matlab.&lt;br /&gt;
&lt;br /&gt;
Т. к. алгоритм считается медленным, он не включен во многие известные пакеты.&lt;br /&gt;
&lt;br /&gt;
== Литература ==&lt;br /&gt;
1. Дж. Деммель Вычислительная линейная алгебра. Изд. Мир, 2001.&lt;/div&gt;</summary>
		<author><name>Davletshuna Alexandra</name></author>
	</entry>
	<entry>
		<id>https://xn--80aecvaldz.xn--80ahdrnmvk.xn--p1ai/w/ru/index.php?title=%D0%A3%D1%87%D0%B0%D1%81%D1%82%D0%BD%D0%B8%D0%BA:Davletshuna_Alexandra/%D0%9C%D0%B5%D1%82%D0%BE%D0%B4_%D0%AF%D0%BA%D0%BE%D0%B1%D0%B8_%D0%B2%D1%8B%D1%87%D0%B8%D1%81%D0%BB%D0%B5%D0%BD%D0%B8%D1%8F_%D1%81%D0%B8%D0%BD%D0%B3%D1%83%D0%BB%D1%8F%D1%80%D0%BD%D1%8B%D1%85_%D1%87%D0%B8%D1%81%D0%B5%D0%BB_%D0%B8_%D0%B2%D0%B5%D0%BA%D1%82%D0%BE%D1%80%D0%BE%D0%B2&amp;diff=15642</id>
		<title>Участник:Davletshuna Alexandra/Метод Якоби вычисления сингулярных чисел и векторов</title>
		<link rel="alternate" type="text/html" href="https://xn--80aecvaldz.xn--80ahdrnmvk.xn--p1ai/w/ru/index.php?title=%D0%A3%D1%87%D0%B0%D1%81%D1%82%D0%BD%D0%B8%D0%BA:Davletshuna_Alexandra/%D0%9C%D0%B5%D1%82%D0%BE%D0%B4_%D0%AF%D0%BA%D0%BE%D0%B1%D0%B8_%D0%B2%D1%8B%D1%87%D0%B8%D1%81%D0%BB%D0%B5%D0%BD%D0%B8%D1%8F_%D1%81%D0%B8%D0%BD%D0%B3%D1%83%D0%BB%D1%8F%D1%80%D0%BD%D1%8B%D1%85_%D1%87%D0%B8%D1%81%D0%B5%D0%BB_%D0%B8_%D0%B2%D0%B5%D0%BA%D1%82%D0%BE%D1%80%D0%BE%D0%B2&amp;diff=15642"/>
		<updated>2016-11-01T20:21:22Z</updated>

		<summary type="html">&lt;p&gt;Davletshuna Alexandra: /* Информационный граф */&lt;/p&gt;
&lt;hr /&gt;
&lt;div&gt;{{algorithm&lt;br /&gt;
| name              = Метод Якоби вычисления сингулярных чисел и векторов&lt;br /&gt;
| serial_complexity = &amp;lt;math&amp;gt;O(n^3)&amp;lt;/math&amp;gt;&lt;br /&gt;
| pf_height         = &amp;lt;math&amp;gt;O(n^2)&amp;lt;/math&amp;gt;&lt;br /&gt;
| pf_width          = &amp;lt;math&amp;gt;O(n)&amp;lt;/math&amp;gt;&lt;br /&gt;
| input_data        = &amp;lt;math&amp;gt;n^2&amp;lt;/math&amp;gt;&lt;br /&gt;
| output_data       = &amp;lt;math&amp;gt;2n^2 + n&amp;lt;/math&amp;gt;&lt;br /&gt;
}}&lt;br /&gt;
&lt;br /&gt;
Авторы статьи: [[Участница:Davletshuna Alexandra|Давлетшина Александра]] (группа 619), [[Участница:Alek sandra|Зайцева Александра]] (группа 601)&lt;br /&gt;
&lt;br /&gt;
== Свойства и структура алгоритма ==&lt;br /&gt;
&lt;br /&gt;
=== Общее описание алгоритма ===&lt;br /&gt;
&#039;&#039;&#039;Сингулярным разложением&#039;&#039;&#039; называется разложение прямоугольной вещественной или комплексной матрицы, имеющее широкое применение, в силу своей наглядной геометрической интерпретации, при решении многих прикладных задач. Сингулярное разложение матрицы А позволяет вычислять сингулярные числа данной матрицы, а также, левые и правые сингулярные векторы матрицы А:&lt;br /&gt;
&lt;br /&gt;
•	левые сингулярные векторы матрицы А — это собственные векторы матрицы &amp;lt;math&amp;gt;AA^*&amp;lt;/math&amp;gt;;&lt;br /&gt;
&lt;br /&gt;
•	правые сингулярные векторы матрицы A — это собственные векторы матрицы &amp;lt;math&amp;gt;A^*A&amp;lt;/math&amp;gt;.&lt;br /&gt;
&lt;br /&gt;
Геометрическая интерпретация сингулярного разложения заключается в следующем факте из геометрии: &#039;&#039;Образом любого линейного преобразования, заданного с помощью матрицы &amp;lt;math&amp;gt;m&amp;lt;/math&amp;gt;x&amp;lt;math&amp;gt;n&amp;lt;/math&amp;gt;, примененного к единичной сфере является гиперэллипсоид&#039;&#039;.&lt;br /&gt;
&lt;br /&gt;
Из многочисленных разложений матриц, наиболее удобным является сингулярное разложение матрицы в виде: &amp;lt;math&amp;gt;A=U\Sigma V^*&amp;lt;/math&amp;gt;, где &amp;lt;math&amp;gt;U, V&amp;lt;/math&amp;gt; – унитарные матрицы, а &amp;lt;math&amp;gt;\Sigma&amp;lt;/math&amp;gt; – диагональная матрица с вещественными положительными числами на диагонали &amp;lt;ref&amp;gt;http://algorithms.parallel.ru/&amp;lt;/ref&amp;gt;.&lt;br /&gt;
&lt;br /&gt;
Диагональные элементы матрицы &amp;lt;math&amp;gt;\Sigma&amp;lt;/math&amp;gt; называются сингулярными числами матрицы &amp;lt;math&amp;gt;A&amp;lt;/math&amp;gt;, а столбцы матриц &amp;lt;math&amp;gt;U,V&amp;lt;/math&amp;gt; левыми и правыми сингулярными векторами соответственно.&lt;br /&gt;
&lt;br /&gt;
Алгоритм Якоби сингулярного разложения матрицы был предложен одним из первых в 1846 году. Он приводит прямоугольную матрицу к диагональной матрице с помощью последовательности элементарных вращений. Метод может найти все сингулярные значения с очень высокой точностью. Однако его производительность является довольно низкой, в сравнении с конкурирующими методами.&lt;br /&gt;
&lt;br /&gt;
&#039;&#039;Неявный&#039;&#039;&amp;lt;ref&amp;gt;Дж. Деммель «Вычислительная линейная алгебра» (стр. 261-264)&amp;lt;/ref&amp;gt; метод Якоби математически эквивалентен применению метода Якоби вычисления собственных значений к матрице &amp;lt;math&amp;gt;A = G^TG&amp;lt;/math&amp;gt;.&lt;br /&gt;
Это значит, что на каждом шаге вычисляется вращение Якоби &amp;lt;math&amp;gt;J&amp;lt;/math&amp;gt;, с помощью которого матрица &amp;lt;math&amp;gt;G^TG&amp;lt;/math&amp;gt; неявно пересчитывется в &amp;lt;math&amp;gt;J^TG^TGJ&amp;lt;/math&amp;gt;; вращение выбрано так, чтобы пара внедиагональных элементов из &amp;lt;math&amp;gt;G^TG&amp;lt;/math&amp;gt; обратилась в нули в матрице &amp;lt;math&amp;gt;J^TG^TGJ&amp;lt;/math&amp;gt;. При этом ни &amp;lt;math&amp;gt;G^TG&amp;lt;/math&amp;gt;, ни &amp;lt;math&amp;gt;J^TG^TGJ&amp;lt;/math&amp;gt; не вычисляются в явном виде; вместо них вычисляется матрица &amp;lt;math&amp;gt;GJ&amp;lt;/math&amp;gt;. Поэтому алгоритм называется &#039;&#039;методом односторонних вращений&#039;&#039;.&lt;br /&gt;
&lt;br /&gt;
=== Математическое описание алгоритма ===&lt;br /&gt;
Исходные данные: матрица &amp;lt;math&amp;gt;G&amp;lt;/math&amp;gt; (элементы &amp;lt;math&amp;gt;g_{ij}, i, j = 1, \ldots, n&amp;lt;/math&amp;gt;).&lt;br /&gt;
&lt;br /&gt;
Вычисляемые данные: матрица &amp;lt;math&amp;gt;\Sigma = diag(\sigma_{i})&amp;lt;/math&amp;gt;, где &amp;lt;math&amp;gt;\sigma_{i}&amp;lt;/math&amp;gt; - сингулярные числа, &amp;lt;math&amp;gt;U&amp;lt;/math&amp;gt; - матрица левых сингулярных векторов, &amp;lt;math&amp;gt;V&amp;lt;/math&amp;gt; - матрица правых сингулярных векторов.&lt;br /&gt;
&lt;br /&gt;
симметричную матрицу &amp;lt;math&amp;gt;A = (G^TG)&amp;lt;/math&amp;gt; можно привести к диагональному виду:&lt;br /&gt;
&amp;lt;math&amp;gt;RG^TGR^T&amp;lt;/math&amp;gt;, где&lt;br /&gt;
&lt;br /&gt;
&amp;lt;math&amp;gt;&lt;br /&gt;
R(j,k,\theta) = &lt;br /&gt;
\begin{matrix}&lt;br /&gt;
  \\&lt;br /&gt;
  \\&lt;br /&gt;
  \\&lt;br /&gt;
j \\&lt;br /&gt;
  \\&lt;br /&gt;
k \\&lt;br /&gt;
  \\&lt;br /&gt;
  \\&lt;br /&gt;
  \\&lt;br /&gt;
\end{matrix}&lt;br /&gt;
&amp;lt;/math&amp;gt;  &lt;br /&gt;
&amp;lt;math&amp;gt;&lt;br /&gt;
\begin{bmatrix}&lt;br /&gt;
  &amp;amp; 1 &amp;amp;   &amp;amp;        &amp;amp;              &amp;amp;        &amp;amp;               &amp;amp;         &amp;amp;    &amp;amp;   \\&lt;br /&gt;
  &amp;amp;   &amp;amp; 1 &amp;amp;        &amp;amp;              &amp;amp;        &amp;amp;               &amp;amp;         &amp;amp;    &amp;amp;   \\&lt;br /&gt;
  &amp;amp;   &amp;amp;   &amp;amp; \ddots &amp;amp;              &amp;amp;        &amp;amp;               &amp;amp;         &amp;amp;    &amp;amp;   \\&lt;br /&gt;
  &amp;amp;   &amp;amp;   &amp;amp;        &amp;amp; \cos(\theta) &amp;amp;        &amp;amp; -\sin(\theta) &amp;amp;         &amp;amp;    &amp;amp;   \\&lt;br /&gt;
  &amp;amp;   &amp;amp;   &amp;amp;        &amp;amp;              &amp;amp; \ddots &amp;amp;               &amp;amp;         &amp;amp;    &amp;amp;   \\&lt;br /&gt;
  &amp;amp;   &amp;amp;   &amp;amp;        &amp;amp; \sin(\theta) &amp;amp;        &amp;amp; \cos(\theta)  &amp;amp;         &amp;amp;    &amp;amp;   \\&lt;br /&gt;
  &amp;amp;   &amp;amp;   &amp;amp;        &amp;amp;              &amp;amp;        &amp;amp;               &amp;amp; \ddots  &amp;amp;    &amp;amp;   \\&lt;br /&gt;
  &amp;amp;   &amp;amp;   &amp;amp;        &amp;amp;              &amp;amp;        &amp;amp;               &amp;amp;         &amp;amp; 1  &amp;amp;   \\&lt;br /&gt;
  &amp;amp;   &amp;amp;   &amp;amp;        &amp;amp;              &amp;amp;        &amp;amp;               &amp;amp;         &amp;amp;    &amp;amp; 1 \\&lt;br /&gt;
\end{bmatrix}&lt;br /&gt;
&amp;lt;/math&amp;gt;&lt;br /&gt;
&lt;br /&gt;
Обозначим &amp;lt;math&amp;gt;s = \sin \theta&amp;lt;/math&amp;gt; и &amp;lt;math&amp;gt;c = \cos \theta&amp;lt;/math&amp;gt;.&lt;br /&gt;
&lt;br /&gt;
Перемножив матрицы &amp;lt;math&amp;gt;RG^TGR^T&amp;lt;/math&amp;gt;, получим следующие выражения&amp;lt;ref&amp;gt;http://www.astro.tsu.ru/OsChMet/5_2.html&amp;lt;/ref&amp;gt;:&lt;br /&gt;
&lt;br /&gt;
&amp;lt;math&amp;gt;\begin{align}&lt;br /&gt;
 a_{jj}^{(i+1)} &amp;amp;= c^2\, a_{jj}^{(i)}  -  2\, s c \,a_{jk}^{(i)}  +  s^2\, a_{kk}^{(i)} \\&lt;br /&gt;
 a_{kk}^{(i+1)} &amp;amp;= s^2 \,a_{jj}^{(i)}  +  2 s c\, a_{jk}^{(i)}  +  c^2 \, a_{kk}^{(i)} \\&lt;br /&gt;
 a_{jk}^{(i+1)} &amp;amp;= a_{kj}^{(i+1)} = (c^2 - s^2 ) \, a_{jk}^{(i)}  +  s c \, (a_{kk}^{(i)} - a_{jj}^{(i)} ) \\&lt;br /&gt;
 a_{jm}^{(i+1)} &amp;amp;= a_{mj}^{(i+1)} = c \, a_{jm}^{(i)}  -  s \, a_{km}^{(i)} &amp;amp; m \ne j,k \\&lt;br /&gt;
 a_{km}^{(i+1)} &amp;amp;= a_{mk}^{(i+1)} = s \, a_{jm}^{(i)}  + c \, a_{km}^{(i)} &amp;amp; m \ne j,k \\&lt;br /&gt;
 a_{ml}^{(i+1)} &amp;amp;= a_{ml}^{(i)} &amp;amp;m,l \ne j,k&lt;br /&gt;
\end{align}&amp;lt;/math&amp;gt;&lt;br /&gt;
&lt;br /&gt;
Т.к внедиагональные элементы должны быть равны 0, то выбираем &amp;lt;math&amp;gt;\theta&amp;lt;/math&amp;gt; так, чтобы &amp;lt;math&amp;gt;a_{jk}^{(i+1)} = 0&amp;lt;/math&amp;gt; и &amp;lt;math&amp;gt;a_{kj}^{(i+1)} = 0&amp;lt;/math&amp;gt;.&lt;br /&gt;
&lt;br /&gt;
Тогда решая уравнение получаем, что&lt;br /&gt;
&lt;br /&gt;
&amp;lt;math&amp;gt;&lt;br /&gt;
         \begin{align}&lt;br /&gt;
         \tau &amp;amp;= {a_{jj} - a_{kk}}/{2a_{jk}} \\&lt;br /&gt;
         t &amp;amp;= {sign(\tau)}/(|\tau| + \sqrt{1 + \tau^2}) \\&lt;br /&gt;
         c &amp;amp;= 1/(\sqrt{1 + t^2}) \\&lt;br /&gt;
         s &amp;amp;= ct \\&lt;br /&gt;
         \end{align}&amp;lt;/math&amp;gt;&lt;br /&gt;
&lt;br /&gt;
Остановка вычислений алгоритма наступает, когда внедиагональные элементы становятся меньше некоторого наперед заданного числа &amp;lt;math&amp;gt;\varepsilon&amp;lt;/math&amp;gt;.&lt;br /&gt;
&lt;br /&gt;
=== Вычислительное ядро алгоритма ===&lt;br /&gt;
Вычислительное ядро алгоритма составляет непосредственно вычисление одностороннего вращения Якоби, т.е. вычисление элементов матрицы &amp;lt;math&amp;gt;g_{jm}^{(i+1)} = g_{mj}^{(i+1)}&amp;lt;/math&amp;gt; и &amp;lt;math&amp;gt;g_{km}^{(i+1)} = g_{mk}^{(i+1)}&amp;lt;/math&amp;gt;, &amp;lt;math&amp;gt;m \ne j,k&amp;lt;/math&amp;gt;, а также вычисления элементов &amp;lt;math&amp;gt;g_{jj}^{(i+1)} &amp;lt;/math&amp;gt; и &amp;lt;math&amp;gt;g_{kk}^{(i+1)} &amp;lt;/math&amp;gt;, получившихся после умножения промежуточной матрицы на матрицу вращений Якоби:&lt;br /&gt;
&lt;br /&gt;
&amp;lt;math&amp;gt;\begin{align}&lt;br /&gt;
 g_{jj}^{(i+1)} &amp;amp;= c^2\, g_{jj}^{(i)}  -  2\, s c \,g_{jk}^{(i)}  +  s^2\, g_{kk}^{(i)} \\&lt;br /&gt;
 g_{kk}^{(i+1)} &amp;amp;= s^2 \,g_{jj}^{(i)}  +  2 s c\, g_{jk}^{(i)}  +  c^2 \, g_{kk}^{(i)} \\&lt;br /&gt;
 g_{jk}^{(i+1)} &amp;amp;= g_{kj}^{(i+1)} = (c^2 - s^2 ) \, g_{jk}^{(i)}  +  s c \, (g_{kk}^{(i)} - g_{jj}^{(i)} ) \\&lt;br /&gt;
 g_{jm}^{(i+1)} &amp;amp;= g_{mj}^{(i+1)} = c \, g_{jm}^{(i)}  -  s \, g_{km}^{(i)} &amp;amp; m \ne j,k \\&lt;br /&gt;
 g_{km}^{(i+1)} &amp;amp;= g_{mk}^{(i+1)} = s \, g_{jm}^{(i)}  + c \, g_{km}^{(i)} &amp;amp; m \ne j,k \\&lt;br /&gt;
 g_{ml}^{(i+1)} &amp;amp;= g_{ml}^{(i)} &amp;amp;m,l \ne j,k&lt;br /&gt;
\end{align}&amp;lt;/math&amp;gt;&lt;br /&gt;
&lt;br /&gt;
=== Макроструктура алгоритма ===&lt;br /&gt;
Основную часть метода составляет процедура односторонних вращений матрицы, которая в свою очередь состоит из:&lt;br /&gt;
&lt;br /&gt;
#Вычисление &amp;lt;math&amp;gt;\tau, c, s, t&amp;lt;/math&amp;gt;.&lt;br /&gt;
#Одностороннее вращение матрицы. &lt;br /&gt;
&lt;br /&gt;
Что требует &amp;lt;math&amp;gt;O(n)&amp;lt;/math&amp;gt; операций.&lt;br /&gt;
&lt;br /&gt;
После этого необходимо:&lt;br /&gt;
&lt;br /&gt;
#Вычислить сингулярные числа &amp;lt;math&amp;gt;\sigma_i&amp;lt;/math&amp;gt;.  Что требует &amp;lt;math&amp;gt;O(n)&amp;lt;/math&amp;gt; операций.&lt;br /&gt;
#Вычислить &amp;lt;math&amp;gt;U&amp;lt;/math&amp;gt; и &amp;lt;math&amp;gt;V&amp;lt;/math&amp;gt;. Что требует &amp;lt;math&amp;gt;O(n^2)&amp;lt;/math&amp;gt; операций.&lt;br /&gt;
&lt;br /&gt;
=== Схема реализации последовательного алгоритма ===&lt;br /&gt;
Применение метода Якоби к матрице &amp;lt;math&amp;gt;A = (G^TG)&amp;lt;/math&amp;gt; можно описать следующим образом&amp;lt;ref&amp;gt;Дж. Деммель «Вычислительная линейная алгебра» (стр. 261-263)&amp;lt;/ref&amp;gt;:&lt;br /&gt;
&lt;br /&gt;
Если &amp;lt;math&amp;gt;G = U\Sigma V^T&amp;lt;/math&amp;gt; и &amp;lt;math&amp;gt;\Sigma = diag(\sigma_{i})&amp;lt;/math&amp;gt;, то алгоритм вычисляет сингулярные числа &amp;lt;math&amp;gt;\sigma_{i}&amp;lt;/math&amp;gt;, матрицу &amp;lt;math&amp;gt;U&amp;lt;/math&amp;gt; левых сингулярных векторов и матрицу &amp;lt;math&amp;gt;V&amp;lt;/math&amp;gt; правых сингулярных векторов по следующей схеме:&lt;br /&gt;
&lt;br /&gt;
 repeat&lt;br /&gt;
     for &amp;lt;math&amp;gt;j=1&amp;lt;/math&amp;gt; to &amp;lt;math&amp;gt;n-1&amp;lt;/math&amp;gt;&lt;br /&gt;
         for &amp;lt;math&amp;gt;k=j+1&amp;lt;/math&amp;gt; to &amp;lt;math&amp;gt;n&amp;lt;/math&amp;gt;&lt;br /&gt;
             обратиться к процедуре &#039;&#039;&#039;&#039;&#039;One-Sided-Jacobi-Rotation&amp;lt;math&amp;gt;(G,j,k)&amp;lt;/math&amp;gt;&#039;&#039;&#039;&#039;&#039;&lt;br /&gt;
         end for&lt;br /&gt;
     end for&lt;br /&gt;
 пока &amp;lt;math&amp;gt;G^TG&amp;lt;/math&amp;gt; не станет достаточно близка к диагональной матрице&lt;br /&gt;
 Положить &amp;lt;math&amp;gt;\sigma_{i} = ||G(:,i)||_2 &amp;lt;/math&amp;gt; (норма &amp;lt;math&amp;gt;i&amp;lt;/math&amp;gt;-го столбца в &amp;lt;math&amp;gt;G&amp;lt;/math&amp;gt;)&lt;br /&gt;
 Положить &amp;lt;math&amp;gt;U = [u_{1},\dots, u_{n}]&amp;lt;/math&amp;gt;, где &amp;lt;math&amp;gt;u_{i} = G(:,i)/\sigma_{i}&amp;lt;/math&amp;gt;&lt;br /&gt;
 Положить &amp;lt;math&amp;gt;V = J&amp;lt;/math&amp;gt;, где &amp;lt;math&amp;gt;J&amp;lt;/math&amp;gt; - накопленное произведение вращений Якоби.&lt;br /&gt;
&lt;br /&gt;
Где процедура &#039;&#039;&#039;&#039;&#039;One-Sided-Jacobi-Rotation&#039;&#039;&#039;&#039;&#039; является метод односторонних вращений Якоби:&lt;br /&gt;
&lt;br /&gt;
 proc &#039;&#039;&#039;&#039;&#039;One-Sided-Jacobi-Rotation&amp;lt;math&amp;gt;(G,j,k)&amp;lt;/math&amp;gt;&#039;&#039;&#039;&#039;&#039;&lt;br /&gt;
     вычислить &amp;lt;math&amp;gt;a_{jj} = (G^TG)_{jj}, a_{jk} = (G^TG)_{jk}&amp;lt;/math&amp;gt; и &amp;lt;math&amp;gt;a_{kk} = (G^TG)_{kk}&amp;lt;/math&amp;gt;&lt;br /&gt;
     if &amp;lt;math&amp;gt;|a_{jk}|&amp;lt;/math&amp;gt; не слишком мал&lt;br /&gt;
         &amp;lt;math&amp;gt;&lt;br /&gt;
         \begin{align}&lt;br /&gt;
         \tau &amp;amp;= {a_{jj} - a_{kk}}/{2a_{jk}} \\&lt;br /&gt;
         t &amp;amp;= {sign(\tau)}/(|\tau| + \sqrt{1 + \tau^2}) \\&lt;br /&gt;
         c &amp;amp;= 1/(\sqrt{1 + t^2}) \\&lt;br /&gt;
         s &amp;amp;= ct \\&lt;br /&gt;
         G &amp;amp;= GR(j,k,\theta) \  \dots c=cos\theta, s=sin\theta \end{align}&amp;lt;/math&amp;gt;&lt;br /&gt;
         if нужны правые сингулярные векторы &lt;br /&gt;
             &amp;lt;math&amp;gt;J = JR(j,k,\theta)&amp;lt;/math&amp;gt;&lt;br /&gt;
         end if&lt;br /&gt;
     end if&lt;br /&gt;
&lt;br /&gt;
=== Последовательная сложность алгоритма ===&lt;br /&gt;
Для одного вращения Якоби необходимо выполнить &amp;lt;math&amp;gt;O(n)&amp;lt;/math&amp;gt; операций умножения и сложения. &lt;br /&gt;
&lt;br /&gt;
Всего вариантов выбора &amp;lt;math&amp;gt;j&amp;lt;/math&amp;gt; и &amp;lt;math&amp;gt;k&amp;lt;/math&amp;gt; существует &amp;lt;math&amp;gt;\frac{n(n-1)}{2}&amp;lt;/math&amp;gt;.&lt;br /&gt;
&lt;br /&gt;
Таким образом последовательный алгоритм Якоби вычисления сингулярных чисел и векторов является алгоритмом с кубической сложностью.&lt;br /&gt;
&lt;br /&gt;
=== Информационный граф ===&lt;br /&gt;
Граф алгоритма состоит из четырех групп вершин&lt;br /&gt;
&lt;br /&gt;
(А)Первая группа вершин расположена в двумерной области, соответствующая ей операция - вычисление элементов матрицы произведения &amp;lt;math&amp;gt;a_{jj},a_{jk},a_{kk}&amp;lt;/math&amp;gt; . Где &amp;lt;math&amp;gt;j&amp;lt;/math&amp;gt; изменяется от &amp;lt;math&amp;gt;1&amp;lt;/math&amp;gt; до &amp;lt;math&amp;gt;n-1&amp;lt;/math&amp;gt;, принимая все целочисленные значения, &amp;lt;math&amp;gt;k&amp;lt;/math&amp;gt;  изменяется от &amp;lt;math&amp;gt;j+1&amp;lt;/math&amp;gt; до &amp;lt;math&amp;gt;n&amp;lt;/math&amp;gt;, принимая все целочисленные значения.&lt;br /&gt;
&lt;br /&gt;
Граф вычисления каждого из элементов приведен на рисунке 1, где значениям &amp;lt;math&amp;gt;a_{ij}&amp;lt;/math&amp;gt; соответствуют обозначения &amp;lt;math&amp;gt;x_{ij}&amp;lt;/math&amp;gt;, а элементам &amp;lt;math&amp;gt;r_{ij}&amp;lt;/math&amp;gt; элементы &amp;lt;math&amp;gt;z_{ij}&amp;lt;/math&amp;gt;. Значение &amp;lt;math&amp;gt;s_{ij}&amp;lt;/math&amp;gt; является значением результирующего элемента.&lt;br /&gt;
&lt;br /&gt;
(Б)Вторая группа вершин расположена в двумерной области, соответствующая ей операция – вычисление &amp;lt;math&amp;gt;c&amp;lt;/math&amp;gt; и &amp;lt;math&amp;gt;s&amp;lt;/math&amp;gt;.&lt;br /&gt;
&lt;br /&gt;
Информационный граф с входными и выходными данными вычисления пункта (Б) представлен на рисунке 2.&lt;br /&gt;
&lt;br /&gt;
(В)Третья группа вершин расположена в двумерной области, соответствующая ей операция вычисление значений элементов &amp;lt;math&amp;gt;g_{jm}^{(i+1)} = g_{mj}^{(i+1)}&amp;lt;/math&amp;gt; и &amp;lt;math&amp;gt;g_{km}^{(i+1)} = g_{mk}^{(i+1)}&amp;lt;/math&amp;gt;, &amp;lt;math&amp;gt;m \ne j,k&amp;lt;/math&amp;gt;.&lt;br /&gt;
&lt;br /&gt;
(Г)Четвертая группа вершин расположена в двумерной области, соответствующая ей операция вычисление значений элементов &amp;lt;math&amp;gt;g_{jj}^{(i+1)} &amp;lt;/math&amp;gt; и &amp;lt;math&amp;gt;g_{kk}^{(i+1)} &amp;lt;/math&amp;gt;.&lt;br /&gt;
&lt;br /&gt;
Элементы групп (В) и (Г) вычисляются аналогично вычислению элементов матрицы произведения, т.к. фактически представляют собой перемножение матриц &amp;lt;math&amp;gt;G&amp;lt;/math&amp;gt; и &amp;lt;math&amp;gt;R&amp;lt;/math&amp;gt;&lt;br /&gt;
&lt;br /&gt;
[[File:Jacobi_2.jpg|none|thumb|1000px|Рисунок 1. Информационный граф с входными и выходными параметрами вычисления каждого элемента матрицы произведения.]]&lt;br /&gt;
&lt;br /&gt;
[[File:Jacobi_1.jpg|none|thumb|1000px|Рисунок 2. ]]&lt;br /&gt;
&lt;br /&gt;
Обобщенный граф метода Якоби представлен на рисунке 3, где буквами А, Б, В и Г обозначено вычисление групп вершин (А), (Б), (В) и (Г).&lt;br /&gt;
&lt;br /&gt;
[[File:Graf2.png|none|thumb|2000px|Рисунок 3. Обобщенный граф алгоритма вычисления сингулярных чисел и векторов методом Якоби.]]&lt;br /&gt;
&lt;br /&gt;
=== Ресурс параллелизма алгоритма ===&lt;br /&gt;
Для выполнения одной итерации метода Якоби требуется последовательно выполнить несколько ярусов:&lt;br /&gt;
# вычислить &amp;lt;math&amp;gt;\tau&amp;lt;/math&amp;gt; &lt;br /&gt;
# вычислить &amp;lt;math&amp;gt;t&amp;lt;/math&amp;gt; &lt;br /&gt;
# вычислить &amp;lt;math&amp;gt;c&amp;lt;/math&amp;gt; &lt;br /&gt;
# выполнить поворот матрицы &amp;lt;math&amp;gt;G&amp;lt;/math&amp;gt; с параллельным выполнением &amp;lt;math&amp;gt;2(n-2)&amp;lt;/math&amp;gt; операций вычисления элементов матрицы &amp;lt;math&amp;gt;g_{jm}^{(i+1)} = g_{mj}^{(i+1)}&amp;lt;/math&amp;gt; и &amp;lt;math&amp;gt;g_{km}^{(i+1)} = g_{mk}^{(i+1)}&amp;lt;/math&amp;gt;, &amp;lt;math&amp;gt;m \ne j,k&amp;lt;/math&amp;gt;, а также вычисления элементов &amp;lt;math&amp;gt;g_{jj}^{(i+1)} &amp;lt;/math&amp;gt; и &amp;lt;math&amp;gt;g_{kk}^{(i+1)} &amp;lt;/math&amp;gt;. &lt;br /&gt;
&lt;br /&gt;
Суммарное количество итераций равно &amp;lt;math&amp;gt;\frac{n(n-1)}{2}&amp;lt;/math&amp;gt; (Различные варианты выбора &amp;lt;math&amp;gt;j&amp;lt;/math&amp;gt; и &amp;lt;math&amp;gt;k&amp;lt;/math&amp;gt;). &lt;br /&gt;
&lt;br /&gt;
Асимптотически метод сходится квадратично. &lt;br /&gt;
&lt;br /&gt;
Таким образом, при классификации по высоте ЯПФ метод Якоби относится к алгоритмам со сложностью &amp;lt;math&amp;gt;O(n^2)&amp;lt;/math&amp;gt;&amp;amp;nbsp;, а при классификации по ширине ЯПФ — к алгоритмам со сложностью &amp;lt;math&amp;gt;O(n)&amp;lt;/math&amp;gt;.&lt;br /&gt;
&lt;br /&gt;
=== Входные и выходные данные алгоритма ===&lt;br /&gt;
&#039;&#039;&#039;Входные данные&#039;&#039;&#039;: плотная матрица &amp;lt;math&amp;gt;G&amp;lt;/math&amp;gt; размера &amp;lt;math&amp;gt;n&amp;lt;/math&amp;gt;х&amp;lt;math&amp;gt;n&amp;lt;/math&amp;gt;, где &amp;lt;math&amp;gt;A= G^TG&amp;lt;/math&amp;gt; – симметрическая матрица.&lt;br /&gt;
&lt;br /&gt;
&#039;&#039;&#039;Объём входных данных&#039;&#039;&#039;: &amp;lt;math&amp;gt;n^2&amp;lt;/math&amp;gt; (т.к. для хранения матрицы &amp;lt;math&amp;gt;G&amp;lt;/math&amp;gt; используем двумерный массив размера &amp;lt;math&amp;gt;n&amp;lt;/math&amp;gt;х&amp;lt;math&amp;gt;n&amp;lt;/math&amp;gt;)&lt;br /&gt;
&lt;br /&gt;
&#039;&#039;&#039;Выходные данные&#039;&#039;&#039;: &amp;lt;math&amp;gt;\sigma_{i}&amp;lt;/math&amp;gt;  - сингулярные числа, матрица &amp;lt;math&amp;gt;U&amp;lt;/math&amp;gt; левых сингулярных векторов и матрица &amp;lt;math&amp;gt;V&amp;lt;/math&amp;gt; правых сингулярных векторов.&lt;br /&gt;
&lt;br /&gt;
&#039;&#039;&#039;Объём выходных данных&#039;&#039;&#039;: &amp;lt;math&amp;gt;2n^2 + n&amp;lt;/math&amp;gt; (т.к. необходимо хранить вектор сингулярных чисел длины &amp;lt;math&amp;gt;n&amp;lt;/math&amp;gt;, а также две матрицы &amp;lt;math&amp;gt;U, V&amp;lt;/math&amp;gt; левых и правых сингулярных векторов размера &amp;lt;math&amp;gt;n&amp;lt;/math&amp;gt;х&amp;lt;math&amp;gt;n&amp;lt;/math&amp;gt;).&lt;br /&gt;
&lt;br /&gt;
=== Свойства алгоритма ===&lt;br /&gt;
Метод Якоби является самым медленным из имеющихся алгоритмов вычисления сингулярных чисел и сингулярных векторов матрицы. Тем не менее, для  матриц &amp;lt;math&amp;gt;G&amp;lt;/math&amp;gt;, которые могут быть представлены в виде &amp;lt;math&amp;gt;G=DX&amp;lt;/math&amp;gt;, где &amp;lt;math&amp;gt;D&amp;lt;/math&amp;gt; - диагональная, а &amp;lt;math&amp;gt;X&amp;lt;/math&amp;gt; - хорошо обусловлена, он способен вычислять сингулярные числа и вектора намного точнее, чем другие методы&amp;lt;ref&amp;gt;Дж. Деммель «Вычислительная линейная алгебра» (стр. 261-264)&amp;lt;/ref&amp;gt;. &lt;br /&gt;
&lt;br /&gt;
Вычислительная мощность алгоритма, как отношение числа операций к суммарному объему входных и выходных данных является линейной.&lt;br /&gt;
&lt;br /&gt;
Метод Якоби не детерминирован, так как является итерационным алгоритмом с выходом по точности (число итераций зависит от входных данных и порогового значения).&lt;br /&gt;
&lt;br /&gt;
== Программная реализация алгоритма ==&lt;br /&gt;
&lt;br /&gt;
=== Особенности реализации последовательного алгоритма ===&lt;br /&gt;
&lt;br /&gt;
=== Локальность данных и вычислений ===&lt;br /&gt;
&lt;br /&gt;
=== Возможные способы и особенности параллельной реализации алгоритма ===&lt;br /&gt;
&lt;br /&gt;
=== Масштабируемость алгоритма и его реализации ===&lt;br /&gt;
&lt;br /&gt;
=== Динамические характеристики и эффективность реализации алгоритма ===&lt;br /&gt;
&lt;br /&gt;
=== Выводы для классов архитектур ===&lt;br /&gt;
&lt;br /&gt;
=== Существующие реализации алгоритма ===&lt;br /&gt;
Метод Якоби нахождения сингулярных значений и векторов реализован в таких пакетах, как LAPACK, LINPACK/EISPACK, Intel MKL &amp;lt;ref&amp;gt;http://www.alglib.net/matrixops/general/svd.php&amp;lt;/ref&amp;gt;.&lt;br /&gt;
&lt;br /&gt;
Так же функция Якоби реализована в пакете Matlab.&lt;br /&gt;
&lt;br /&gt;
Т. к. алгоритм считается медленным, он не включен во многие известные пакеты.&lt;br /&gt;
&lt;br /&gt;
== Литература ==&lt;br /&gt;
1. Дж. Деммель Вычислительная линейная алгебра. Изд. Мир, 2001.&lt;/div&gt;</summary>
		<author><name>Davletshuna Alexandra</name></author>
	</entry>
	<entry>
		<id>https://xn--80aecvaldz.xn--80ahdrnmvk.xn--p1ai/w/ru/index.php?title=%D0%A3%D1%87%D0%B0%D1%81%D1%82%D0%BD%D0%B8%D0%BA:Davletshuna_Alexandra/%D0%9C%D0%B5%D1%82%D0%BE%D0%B4_%D0%AF%D0%BA%D0%BE%D0%B1%D0%B8_%D0%B2%D1%8B%D1%87%D0%B8%D1%81%D0%BB%D0%B5%D0%BD%D0%B8%D1%8F_%D1%81%D0%B8%D0%BD%D0%B3%D1%83%D0%BB%D1%8F%D1%80%D0%BD%D1%8B%D1%85_%D1%87%D0%B8%D1%81%D0%B5%D0%BB_%D0%B8_%D0%B2%D0%B5%D0%BA%D1%82%D0%BE%D1%80%D0%BE%D0%B2&amp;diff=15638</id>
		<title>Участник:Davletshuna Alexandra/Метод Якоби вычисления сингулярных чисел и векторов</title>
		<link rel="alternate" type="text/html" href="https://xn--80aecvaldz.xn--80ahdrnmvk.xn--p1ai/w/ru/index.php?title=%D0%A3%D1%87%D0%B0%D1%81%D1%82%D0%BD%D0%B8%D0%BA:Davletshuna_Alexandra/%D0%9C%D0%B5%D1%82%D0%BE%D0%B4_%D0%AF%D0%BA%D0%BE%D0%B1%D0%B8_%D0%B2%D1%8B%D1%87%D0%B8%D1%81%D0%BB%D0%B5%D0%BD%D0%B8%D1%8F_%D1%81%D0%B8%D0%BD%D0%B3%D1%83%D0%BB%D1%8F%D1%80%D0%BD%D1%8B%D1%85_%D1%87%D0%B8%D1%81%D0%B5%D0%BB_%D0%B8_%D0%B2%D0%B5%D0%BA%D1%82%D0%BE%D1%80%D0%BE%D0%B2&amp;diff=15638"/>
		<updated>2016-11-01T19:50:35Z</updated>

		<summary type="html">&lt;p&gt;Davletshuna Alexandra: /* Вычислительное ядро алгоритма */&lt;/p&gt;
&lt;hr /&gt;
&lt;div&gt;{{algorithm&lt;br /&gt;
| name              = Метод Якоби вычисления сингулярных чисел и векторов&lt;br /&gt;
| serial_complexity = &amp;lt;math&amp;gt;O(n^3)&amp;lt;/math&amp;gt;&lt;br /&gt;
| pf_height         = &amp;lt;math&amp;gt;O(n^2)&amp;lt;/math&amp;gt;&lt;br /&gt;
| pf_width          = &amp;lt;math&amp;gt;O(n)&amp;lt;/math&amp;gt;&lt;br /&gt;
| input_data        = &amp;lt;math&amp;gt;n^2&amp;lt;/math&amp;gt;&lt;br /&gt;
| output_data       = &amp;lt;math&amp;gt;2n^2 + n&amp;lt;/math&amp;gt;&lt;br /&gt;
}}&lt;br /&gt;
&lt;br /&gt;
Авторы статьи: [[Участница:Davletshuna Alexandra|Давлетшина Александра]] (группа 619), [[Участница:Alek sandra|Зайцева Александра]] (группа 601)&lt;br /&gt;
&lt;br /&gt;
== Свойства и структура алгоритма ==&lt;br /&gt;
&lt;br /&gt;
=== Общее описание алгоритма ===&lt;br /&gt;
&#039;&#039;&#039;Сингулярным разложением&#039;&#039;&#039; называется разложение прямоугольной вещественной или комплексной матрицы, имеющее широкое применение, в силу своей наглядной геометрической интерпретации, при решении многих прикладных задач. Сингулярное разложение матрицы А позволяет вычислять сингулярные числа данной матрицы, а также, левые и правые сингулярные векторы матрицы А:&lt;br /&gt;
&lt;br /&gt;
•	левые сингулярные векторы матрицы А — это собственные векторы матрицы &amp;lt;math&amp;gt;AA^*&amp;lt;/math&amp;gt;;&lt;br /&gt;
&lt;br /&gt;
•	правые сингулярные векторы матрицы A — это собственные векторы матрицы &amp;lt;math&amp;gt;A^*A&amp;lt;/math&amp;gt;.&lt;br /&gt;
&lt;br /&gt;
Геометрическая интерпретация сингулярного разложения заключается в следующем факте из геометрии: &#039;&#039;Образом любого линейного преобразования, заданного с помощью матрицы &amp;lt;math&amp;gt;m&amp;lt;/math&amp;gt;x&amp;lt;math&amp;gt;n&amp;lt;/math&amp;gt;, примененного к единичной сфере является гиперэллипсоид&#039;&#039;.&lt;br /&gt;
&lt;br /&gt;
Из многочисленных разложений матриц, наиболее удобным является сингулярное разложение матрицы в виде: &amp;lt;math&amp;gt;A=U\Sigma V^*&amp;lt;/math&amp;gt;, где &amp;lt;math&amp;gt;U, V&amp;lt;/math&amp;gt; – унитарные матрицы, а &amp;lt;math&amp;gt;\Sigma&amp;lt;/math&amp;gt; – диагональная матрица с вещественными положительными числами на диагонали &amp;lt;ref&amp;gt;http://algorithms.parallel.ru/&amp;lt;/ref&amp;gt;.&lt;br /&gt;
&lt;br /&gt;
Диагональные элементы матрицы &amp;lt;math&amp;gt;\Sigma&amp;lt;/math&amp;gt; называются сингулярными числами матрицы &amp;lt;math&amp;gt;A&amp;lt;/math&amp;gt;, а столбцы матриц &amp;lt;math&amp;gt;U,V&amp;lt;/math&amp;gt; левыми и правыми сингулярными векторами соответственно.&lt;br /&gt;
&lt;br /&gt;
Алгоритм Якоби сингулярного разложения матрицы был предложен одним из первых в 1846 году. Он приводит прямоугольную матрицу к диагональной матрице с помощью последовательности элементарных вращений. Метод может найти все сингулярные значения с очень высокой точностью. Однако его производительность является довольно низкой, в сравнении с конкурирующими методами.&lt;br /&gt;
&lt;br /&gt;
&#039;&#039;Неявный&#039;&#039;&amp;lt;ref&amp;gt;Дж. Деммель «Вычислительная линейная алгебра» (стр. 261-264)&amp;lt;/ref&amp;gt; метод Якоби математически эквивалентен применению метода Якоби вычисления собственных значений к матрице &amp;lt;math&amp;gt;A = G^TG&amp;lt;/math&amp;gt;.&lt;br /&gt;
Это значит, что на каждом шаге вычисляется вращение Якоби &amp;lt;math&amp;gt;J&amp;lt;/math&amp;gt;, с помощью которого матрица &amp;lt;math&amp;gt;G^TG&amp;lt;/math&amp;gt; неявно пересчитывется в &amp;lt;math&amp;gt;J^TG^TGJ&amp;lt;/math&amp;gt;; вращение выбрано так, чтобы пара внедиагональных элементов из &amp;lt;math&amp;gt;G^TG&amp;lt;/math&amp;gt; обратилась в нули в матрице &amp;lt;math&amp;gt;J^TG^TGJ&amp;lt;/math&amp;gt;. При этом ни &amp;lt;math&amp;gt;G^TG&amp;lt;/math&amp;gt;, ни &amp;lt;math&amp;gt;J^TG^TGJ&amp;lt;/math&amp;gt; не вычисляются в явном виде; вместо них вычисляется матрица &amp;lt;math&amp;gt;GJ&amp;lt;/math&amp;gt;. Поэтому алгоритм называется &#039;&#039;методом односторонних вращений&#039;&#039;.&lt;br /&gt;
&lt;br /&gt;
=== Математическое описание алгоритма ===&lt;br /&gt;
Исходные данные: матрица &amp;lt;math&amp;gt;G&amp;lt;/math&amp;gt; (элементы &amp;lt;math&amp;gt;g_{ij}, i, j = 1, \ldots, n&amp;lt;/math&amp;gt;).&lt;br /&gt;
&lt;br /&gt;
Вычисляемые данные: матрица &amp;lt;math&amp;gt;\Sigma = diag(\sigma_{i})&amp;lt;/math&amp;gt;, где &amp;lt;math&amp;gt;\sigma_{i}&amp;lt;/math&amp;gt; - сингулярные числа, &amp;lt;math&amp;gt;U&amp;lt;/math&amp;gt; - матрица левых сингулярных векторов, &amp;lt;math&amp;gt;V&amp;lt;/math&amp;gt; - матрица правых сингулярных векторов.&lt;br /&gt;
&lt;br /&gt;
симметричную матрицу &amp;lt;math&amp;gt;A = (G^TG)&amp;lt;/math&amp;gt; можно привести к диагональному виду:&lt;br /&gt;
&amp;lt;math&amp;gt;RG^TGR^T&amp;lt;/math&amp;gt;, где&lt;br /&gt;
&lt;br /&gt;
&amp;lt;math&amp;gt;&lt;br /&gt;
R(j,k,\theta) = &lt;br /&gt;
\begin{matrix}&lt;br /&gt;
  \\&lt;br /&gt;
  \\&lt;br /&gt;
  \\&lt;br /&gt;
j \\&lt;br /&gt;
  \\&lt;br /&gt;
k \\&lt;br /&gt;
  \\&lt;br /&gt;
  \\&lt;br /&gt;
  \\&lt;br /&gt;
\end{matrix}&lt;br /&gt;
&amp;lt;/math&amp;gt;  &lt;br /&gt;
&amp;lt;math&amp;gt;&lt;br /&gt;
\begin{bmatrix}&lt;br /&gt;
  &amp;amp; 1 &amp;amp;   &amp;amp;        &amp;amp;              &amp;amp;        &amp;amp;               &amp;amp;         &amp;amp;    &amp;amp;   \\&lt;br /&gt;
  &amp;amp;   &amp;amp; 1 &amp;amp;        &amp;amp;              &amp;amp;        &amp;amp;               &amp;amp;         &amp;amp;    &amp;amp;   \\&lt;br /&gt;
  &amp;amp;   &amp;amp;   &amp;amp; \ddots &amp;amp;              &amp;amp;        &amp;amp;               &amp;amp;         &amp;amp;    &amp;amp;   \\&lt;br /&gt;
  &amp;amp;   &amp;amp;   &amp;amp;        &amp;amp; \cos(\theta) &amp;amp;        &amp;amp; -\sin(\theta) &amp;amp;         &amp;amp;    &amp;amp;   \\&lt;br /&gt;
  &amp;amp;   &amp;amp;   &amp;amp;        &amp;amp;              &amp;amp; \ddots &amp;amp;               &amp;amp;         &amp;amp;    &amp;amp;   \\&lt;br /&gt;
  &amp;amp;   &amp;amp;   &amp;amp;        &amp;amp; \sin(\theta) &amp;amp;        &amp;amp; \cos(\theta)  &amp;amp;         &amp;amp;    &amp;amp;   \\&lt;br /&gt;
  &amp;amp;   &amp;amp;   &amp;amp;        &amp;amp;              &amp;amp;        &amp;amp;               &amp;amp; \ddots  &amp;amp;    &amp;amp;   \\&lt;br /&gt;
  &amp;amp;   &amp;amp;   &amp;amp;        &amp;amp;              &amp;amp;        &amp;amp;               &amp;amp;         &amp;amp; 1  &amp;amp;   \\&lt;br /&gt;
  &amp;amp;   &amp;amp;   &amp;amp;        &amp;amp;              &amp;amp;        &amp;amp;               &amp;amp;         &amp;amp;    &amp;amp; 1 \\&lt;br /&gt;
\end{bmatrix}&lt;br /&gt;
&amp;lt;/math&amp;gt;&lt;br /&gt;
&lt;br /&gt;
Обозначим &amp;lt;math&amp;gt;s = \sin \theta&amp;lt;/math&amp;gt; и &amp;lt;math&amp;gt;c = \cos \theta&amp;lt;/math&amp;gt;.&lt;br /&gt;
&lt;br /&gt;
Перемножив матрицы &amp;lt;math&amp;gt;RG^TGR^T&amp;lt;/math&amp;gt;, получим следующие выражения&amp;lt;ref&amp;gt;http://www.astro.tsu.ru/OsChMet/5_2.html&amp;lt;/ref&amp;gt;:&lt;br /&gt;
&lt;br /&gt;
&amp;lt;math&amp;gt;\begin{align}&lt;br /&gt;
 a_{jj}^{(i+1)} &amp;amp;= c^2\, a_{jj}^{(i)}  -  2\, s c \,a_{jk}^{(i)}  +  s^2\, a_{kk}^{(i)} \\&lt;br /&gt;
 a_{kk}^{(i+1)} &amp;amp;= s^2 \,a_{jj}^{(i)}  +  2 s c\, a_{jk}^{(i)}  +  c^2 \, a_{kk}^{(i)} \\&lt;br /&gt;
 a_{jk}^{(i+1)} &amp;amp;= a_{kj}^{(i+1)} = (c^2 - s^2 ) \, a_{jk}^{(i)}  +  s c \, (a_{kk}^{(i)} - a_{jj}^{(i)} ) \\&lt;br /&gt;
 a_{jm}^{(i+1)} &amp;amp;= a_{mj}^{(i+1)} = c \, a_{jm}^{(i)}  -  s \, a_{km}^{(i)} &amp;amp; m \ne j,k \\&lt;br /&gt;
 a_{km}^{(i+1)} &amp;amp;= a_{mk}^{(i+1)} = s \, a_{jm}^{(i)}  + c \, a_{km}^{(i)} &amp;amp; m \ne j,k \\&lt;br /&gt;
 a_{ml}^{(i+1)} &amp;amp;= a_{ml}^{(i)} &amp;amp;m,l \ne j,k&lt;br /&gt;
\end{align}&amp;lt;/math&amp;gt;&lt;br /&gt;
&lt;br /&gt;
Т.к внедиагональные элементы должны быть равны 0, то выбираем &amp;lt;math&amp;gt;\theta&amp;lt;/math&amp;gt; так, чтобы &amp;lt;math&amp;gt;a_{jk}^{(i+1)} = 0&amp;lt;/math&amp;gt; и &amp;lt;math&amp;gt;a_{kj}^{(i+1)} = 0&amp;lt;/math&amp;gt;.&lt;br /&gt;
&lt;br /&gt;
Тогда решая уравнение получаем, что&lt;br /&gt;
&lt;br /&gt;
&amp;lt;math&amp;gt;&lt;br /&gt;
         \begin{align}&lt;br /&gt;
         \tau &amp;amp;= {a_{jj} - a_{kk}}/{2a_{jk}} \\&lt;br /&gt;
         t &amp;amp;= {sign(\tau)}/(|\tau| + \sqrt{1 + \tau^2}) \\&lt;br /&gt;
         c &amp;amp;= 1/(\sqrt{1 + t^2}) \\&lt;br /&gt;
         s &amp;amp;= ct \\&lt;br /&gt;
         \end{align}&amp;lt;/math&amp;gt;&lt;br /&gt;
&lt;br /&gt;
Остановка вычислений алгоритма наступает, когда внедиагональные элементы становятся меньше некоторого наперед заданного числа &amp;lt;math&amp;gt;\varepsilon&amp;lt;/math&amp;gt;.&lt;br /&gt;
&lt;br /&gt;
=== Вычислительное ядро алгоритма ===&lt;br /&gt;
Вычислительное ядро алгоритма составляет непосредственно вычисление одностороннего вращения Якоби, т.е. вычисление элементов матрицы &amp;lt;math&amp;gt;g_{jm}^{(i+1)} = g_{mj}^{(i+1)}&amp;lt;/math&amp;gt; и &amp;lt;math&amp;gt;g_{km}^{(i+1)} = g_{mk}^{(i+1)}&amp;lt;/math&amp;gt;, &amp;lt;math&amp;gt;m \ne j,k&amp;lt;/math&amp;gt;, а также вычисления элементов &amp;lt;math&amp;gt;g_{jj}^{(i+1)} &amp;lt;/math&amp;gt; и &amp;lt;math&amp;gt;g_{kk}^{(i+1)} &amp;lt;/math&amp;gt;, получившихся после умножения промежуточной матрицы на матрицу вращений Якоби:&lt;br /&gt;
&lt;br /&gt;
&amp;lt;math&amp;gt;\begin{align}&lt;br /&gt;
 g_{jj}^{(i+1)} &amp;amp;= c^2\, g_{jj}^{(i)}  -  2\, s c \,g_{jk}^{(i)}  +  s^2\, g_{kk}^{(i)} \\&lt;br /&gt;
 g_{kk}^{(i+1)} &amp;amp;= s^2 \,g_{jj}^{(i)}  +  2 s c\, g_{jk}^{(i)}  +  c^2 \, g_{kk}^{(i)} \\&lt;br /&gt;
 g_{jk}^{(i+1)} &amp;amp;= g_{kj}^{(i+1)} = (c^2 - s^2 ) \, g_{jk}^{(i)}  +  s c \, (g_{kk}^{(i)} - g_{jj}^{(i)} ) \\&lt;br /&gt;
 g_{jm}^{(i+1)} &amp;amp;= g_{mj}^{(i+1)} = c \, g_{jm}^{(i)}  -  s \, g_{km}^{(i)} &amp;amp; m \ne j,k \\&lt;br /&gt;
 g_{km}^{(i+1)} &amp;amp;= g_{mk}^{(i+1)} = s \, g_{jm}^{(i)}  + c \, g_{km}^{(i)} &amp;amp; m \ne j,k \\&lt;br /&gt;
 g_{ml}^{(i+1)} &amp;amp;= g_{ml}^{(i)} &amp;amp;m,l \ne j,k&lt;br /&gt;
\end{align}&amp;lt;/math&amp;gt;&lt;br /&gt;
&lt;br /&gt;
=== Макроструктура алгоритма ===&lt;br /&gt;
Основную часть метода составляет процедура односторонних вращений матрицы, которая в свою очередь состоит из:&lt;br /&gt;
&lt;br /&gt;
#Вычисление &amp;lt;math&amp;gt;\tau, c, s, t&amp;lt;/math&amp;gt;.&lt;br /&gt;
#Одностороннее вращение матрицы. &lt;br /&gt;
&lt;br /&gt;
Что требует &amp;lt;math&amp;gt;O(n)&amp;lt;/math&amp;gt; операций.&lt;br /&gt;
&lt;br /&gt;
После этого необходимо:&lt;br /&gt;
&lt;br /&gt;
#Вычислить сингулярные числа &amp;lt;math&amp;gt;\sigma_i&amp;lt;/math&amp;gt;.  Что требует &amp;lt;math&amp;gt;O(n)&amp;lt;/math&amp;gt; операций.&lt;br /&gt;
#Вычислить &amp;lt;math&amp;gt;U&amp;lt;/math&amp;gt; и &amp;lt;math&amp;gt;V&amp;lt;/math&amp;gt;. Что требует &amp;lt;math&amp;gt;O(n^2)&amp;lt;/math&amp;gt; операций.&lt;br /&gt;
&lt;br /&gt;
=== Схема реализации последовательного алгоритма ===&lt;br /&gt;
Применение метода Якоби к матрице &amp;lt;math&amp;gt;A = (G^TG)&amp;lt;/math&amp;gt; можно описать следующим образом&amp;lt;ref&amp;gt;Дж. Деммель «Вычислительная линейная алгебра» (стр. 261-263)&amp;lt;/ref&amp;gt;:&lt;br /&gt;
&lt;br /&gt;
Если &amp;lt;math&amp;gt;G = U\Sigma V^T&amp;lt;/math&amp;gt; и &amp;lt;math&amp;gt;\Sigma = diag(\sigma_{i})&amp;lt;/math&amp;gt;, то алгоритм вычисляет сингулярные числа &amp;lt;math&amp;gt;\sigma_{i}&amp;lt;/math&amp;gt;, матрицу &amp;lt;math&amp;gt;U&amp;lt;/math&amp;gt; левых сингулярных векторов и матрицу &amp;lt;math&amp;gt;V&amp;lt;/math&amp;gt; правых сингулярных векторов по следующей схеме:&lt;br /&gt;
&lt;br /&gt;
 repeat&lt;br /&gt;
     for &amp;lt;math&amp;gt;j=1&amp;lt;/math&amp;gt; to &amp;lt;math&amp;gt;n-1&amp;lt;/math&amp;gt;&lt;br /&gt;
         for &amp;lt;math&amp;gt;k=j+1&amp;lt;/math&amp;gt; to &amp;lt;math&amp;gt;n&amp;lt;/math&amp;gt;&lt;br /&gt;
             обратиться к процедуре &#039;&#039;&#039;&#039;&#039;One-Sided-Jacobi-Rotation&amp;lt;math&amp;gt;(G,j,k)&amp;lt;/math&amp;gt;&#039;&#039;&#039;&#039;&#039;&lt;br /&gt;
         end for&lt;br /&gt;
     end for&lt;br /&gt;
 пока &amp;lt;math&amp;gt;G^TG&amp;lt;/math&amp;gt; не станет достаточно близка к диагональной матрице&lt;br /&gt;
 Положить &amp;lt;math&amp;gt;\sigma_{i} = ||G(:,i)||_2 &amp;lt;/math&amp;gt; (норма &amp;lt;math&amp;gt;i&amp;lt;/math&amp;gt;-го столбца в &amp;lt;math&amp;gt;G&amp;lt;/math&amp;gt;)&lt;br /&gt;
 Положить &amp;lt;math&amp;gt;U = [u_{1},\dots, u_{n}]&amp;lt;/math&amp;gt;, где &amp;lt;math&amp;gt;u_{i} = G(:,i)/\sigma_{i}&amp;lt;/math&amp;gt;&lt;br /&gt;
 Положить &amp;lt;math&amp;gt;V = J&amp;lt;/math&amp;gt;, где &amp;lt;math&amp;gt;J&amp;lt;/math&amp;gt; - накопленное произведение вращений Якоби.&lt;br /&gt;
&lt;br /&gt;
Где процедура &#039;&#039;&#039;&#039;&#039;One-Sided-Jacobi-Rotation&#039;&#039;&#039;&#039;&#039; является метод односторонних вращений Якоби:&lt;br /&gt;
&lt;br /&gt;
 proc &#039;&#039;&#039;&#039;&#039;One-Sided-Jacobi-Rotation&amp;lt;math&amp;gt;(G,j,k)&amp;lt;/math&amp;gt;&#039;&#039;&#039;&#039;&#039;&lt;br /&gt;
     вычислить &amp;lt;math&amp;gt;a_{jj} = (G^TG)_{jj}, a_{jk} = (G^TG)_{jk}&amp;lt;/math&amp;gt; и &amp;lt;math&amp;gt;a_{kk} = (G^TG)_{kk}&amp;lt;/math&amp;gt;&lt;br /&gt;
     if &amp;lt;math&amp;gt;|a_{jk}|&amp;lt;/math&amp;gt; не слишком мал&lt;br /&gt;
         &amp;lt;math&amp;gt;&lt;br /&gt;
         \begin{align}&lt;br /&gt;
         \tau &amp;amp;= {a_{jj} - a_{kk}}/{2a_{jk}} \\&lt;br /&gt;
         t &amp;amp;= {sign(\tau)}/(|\tau| + \sqrt{1 + \tau^2}) \\&lt;br /&gt;
         c &amp;amp;= 1/(\sqrt{1 + t^2}) \\&lt;br /&gt;
         s &amp;amp;= ct \\&lt;br /&gt;
         G &amp;amp;= GR(j,k,\theta) \  \dots c=cos\theta, s=sin\theta \end{align}&amp;lt;/math&amp;gt;&lt;br /&gt;
         if нужны правые сингулярные векторы &lt;br /&gt;
             &amp;lt;math&amp;gt;J = JR(j,k,\theta)&amp;lt;/math&amp;gt;&lt;br /&gt;
         end if&lt;br /&gt;
     end if&lt;br /&gt;
&lt;br /&gt;
=== Последовательная сложность алгоритма ===&lt;br /&gt;
Для одного вращения Якоби необходимо выполнить &amp;lt;math&amp;gt;O(n)&amp;lt;/math&amp;gt; операций умножения и сложения. &lt;br /&gt;
&lt;br /&gt;
Всего вариантов выбора &amp;lt;math&amp;gt;j&amp;lt;/math&amp;gt; и &amp;lt;math&amp;gt;k&amp;lt;/math&amp;gt; существует &amp;lt;math&amp;gt;\frac{n(n-1)}{2}&amp;lt;/math&amp;gt;.&lt;br /&gt;
&lt;br /&gt;
Таким образом последовательный алгоритм Якоби вычисления сингулярных чисел и векторов является алгоритмом с кубической сложностью.&lt;br /&gt;
&lt;br /&gt;
=== Информационный граф ===&lt;br /&gt;
Граф алгоритма состоит из четырех групп вершин&lt;br /&gt;
&lt;br /&gt;
(А)Первая группа вершин расположена в двумерной области, соответствующая ей операция - вычисление &amp;lt;math&amp;gt;a_{jj},a_{jk},a_{kk}&amp;lt;/math&amp;gt; . Где &amp;lt;math&amp;gt;j&amp;lt;/math&amp;gt; изменяется от &amp;lt;math&amp;gt;1&amp;lt;/math&amp;gt; до &amp;lt;math&amp;gt;n-1&amp;lt;/math&amp;gt;, принимая все целочисленные значения, &amp;lt;math&amp;gt;k&amp;lt;/math&amp;gt;  изменяется от &amp;lt;math&amp;gt;j+1&amp;lt;/math&amp;gt; до &amp;lt;math&amp;gt;n&amp;lt;/math&amp;gt;, принимая все целочисленные значения.&lt;br /&gt;
&lt;br /&gt;
[[File:Graf1.png|none|thumb|2000px|Рисунок 1. Информационная структура вычисления данных параметром.]]&lt;br /&gt;
&lt;br /&gt;
(Б)Вторая группа вершин расположена в двумерной области, соответствующая ей операция – вычисление &amp;lt;math&amp;gt;c&amp;lt;/math&amp;gt; и &amp;lt;math&amp;gt;s&amp;lt;/math&amp;gt;.&lt;br /&gt;
&lt;br /&gt;
(В)Третья группа вершин расположена в двумерной области, соответствующая ей операция вычисление значений элементов &amp;lt;math&amp;gt;g_{jm}^{(i+1)} = g_{mj}^{(i+1)}&amp;lt;/math&amp;gt; и &amp;lt;math&amp;gt;g_{km}^{(i+1)} = g_{mk}^{(i+1)}&amp;lt;/math&amp;gt;, &amp;lt;math&amp;gt;m \ne j,k&amp;lt;/math&amp;gt;.&lt;br /&gt;
&lt;br /&gt;
(Г)Четвертая группа вершин расположена в двумерной области, соответствующая ей операция вычисление значений элементов &amp;lt;math&amp;gt;g_{jj}^{(i+1)} &amp;lt;/math&amp;gt; и &amp;lt;math&amp;gt;g_{kk}^{(i+1)} &amp;lt;/math&amp;gt;.&lt;br /&gt;
&lt;br /&gt;
[[File:Graf2.png|none|thumb|2000px|Рисунок 2. Граф алгоритма вычисления сингулярных чисел и векторов методом Якоби.]]&lt;br /&gt;
&lt;br /&gt;
=== Ресурс параллелизма алгоритма ===&lt;br /&gt;
Для выполнения одной итерации метода Якоби требуется последовательно выполнить несколько ярусов:&lt;br /&gt;
# вычислить &amp;lt;math&amp;gt;\tau&amp;lt;/math&amp;gt; &lt;br /&gt;
# вычислить &amp;lt;math&amp;gt;t&amp;lt;/math&amp;gt; &lt;br /&gt;
# вычислить &amp;lt;math&amp;gt;c&amp;lt;/math&amp;gt; &lt;br /&gt;
# выполнить поворот матрицы &amp;lt;math&amp;gt;G&amp;lt;/math&amp;gt; с параллельным выполнением &amp;lt;math&amp;gt;2(n-2)&amp;lt;/math&amp;gt; операций вычисления элементов матрицы &amp;lt;math&amp;gt;g_{jm}^{(i+1)} = g_{mj}^{(i+1)}&amp;lt;/math&amp;gt; и &amp;lt;math&amp;gt;g_{km}^{(i+1)} = g_{mk}^{(i+1)}&amp;lt;/math&amp;gt;, &amp;lt;math&amp;gt;m \ne j,k&amp;lt;/math&amp;gt;, а также вычисления элементов &amp;lt;math&amp;gt;g_{jj}^{(i+1)} &amp;lt;/math&amp;gt; и &amp;lt;math&amp;gt;g_{kk}^{(i+1)} &amp;lt;/math&amp;gt;. &lt;br /&gt;
&lt;br /&gt;
Суммарное количество итераций равно &amp;lt;math&amp;gt;\frac{n(n-1)}{2}&amp;lt;/math&amp;gt; (Различные варианты выбора &amp;lt;math&amp;gt;j&amp;lt;/math&amp;gt; и &amp;lt;math&amp;gt;k&amp;lt;/math&amp;gt;). &lt;br /&gt;
&lt;br /&gt;
Асимптотически метод сходится квадратично. &lt;br /&gt;
&lt;br /&gt;
Таким образом, при классификации по высоте ЯПФ метод Якоби относится к алгоритмам со сложностью &amp;lt;math&amp;gt;O(n^2)&amp;lt;/math&amp;gt;&amp;amp;nbsp;, а при классификации по ширине ЯПФ — к алгоритмам со сложностью &amp;lt;math&amp;gt;O(n)&amp;lt;/math&amp;gt;.&lt;br /&gt;
&lt;br /&gt;
=== Входные и выходные данные алгоритма ===&lt;br /&gt;
&#039;&#039;&#039;Входные данные&#039;&#039;&#039;: плотная матрица &amp;lt;math&amp;gt;G&amp;lt;/math&amp;gt; размера &amp;lt;math&amp;gt;n&amp;lt;/math&amp;gt;х&amp;lt;math&amp;gt;n&amp;lt;/math&amp;gt;, где &amp;lt;math&amp;gt;A= G^TG&amp;lt;/math&amp;gt; – симметрическая матрица.&lt;br /&gt;
&lt;br /&gt;
&#039;&#039;&#039;Объём входных данных&#039;&#039;&#039;: &amp;lt;math&amp;gt;n^2&amp;lt;/math&amp;gt; (т.к. для хранения матрицы &amp;lt;math&amp;gt;G&amp;lt;/math&amp;gt; используем двумерный массив размера &amp;lt;math&amp;gt;n&amp;lt;/math&amp;gt;х&amp;lt;math&amp;gt;n&amp;lt;/math&amp;gt;)&lt;br /&gt;
&lt;br /&gt;
&#039;&#039;&#039;Выходные данные&#039;&#039;&#039;: &amp;lt;math&amp;gt;\sigma_{i}&amp;lt;/math&amp;gt;  - сингулярные числа, матрица &amp;lt;math&amp;gt;U&amp;lt;/math&amp;gt; левых сингулярных векторов и матрица &amp;lt;math&amp;gt;V&amp;lt;/math&amp;gt; правых сингулярных векторов.&lt;br /&gt;
&lt;br /&gt;
&#039;&#039;&#039;Объём выходных данных&#039;&#039;&#039;: &amp;lt;math&amp;gt;2n^2 + n&amp;lt;/math&amp;gt; (т.к. необходимо хранить вектор сингулярных чисел длины &amp;lt;math&amp;gt;n&amp;lt;/math&amp;gt;, а также две матрицы &amp;lt;math&amp;gt;U, V&amp;lt;/math&amp;gt; левых и правых сингулярных векторов размера &amp;lt;math&amp;gt;n&amp;lt;/math&amp;gt;х&amp;lt;math&amp;gt;n&amp;lt;/math&amp;gt;).&lt;br /&gt;
&lt;br /&gt;
=== Свойства алгоритма ===&lt;br /&gt;
Метод Якоби является самым медленным из имеющихся алгоритмов вычисления сингулярных чисел и сингулярных векторов матрицы. Тем не менее, для  матриц &amp;lt;math&amp;gt;G&amp;lt;/math&amp;gt;, которые могут быть представлены в виде &amp;lt;math&amp;gt;G=DX&amp;lt;/math&amp;gt;, где &amp;lt;math&amp;gt;D&amp;lt;/math&amp;gt; - диагональная, а &amp;lt;math&amp;gt;X&amp;lt;/math&amp;gt; - хорошо обусловлена, он способен вычислять сингулярные числа и вектора намного точнее, чем другие методы&amp;lt;ref&amp;gt;Дж. Деммель «Вычислительная линейная алгебра» (стр. 261-264)&amp;lt;/ref&amp;gt;. &lt;br /&gt;
&lt;br /&gt;
Вычислительная мощность алгоритма, как отношение числа операций к суммарному объему входных и выходных данных является линейной.&lt;br /&gt;
&lt;br /&gt;
Метод Якоби не детерминирован, так как является итерационным алгоритмом с выходом по точности (число итераций зависит от входных данных и порогового значения).&lt;br /&gt;
&lt;br /&gt;
== Программная реализация алгоритма ==&lt;br /&gt;
&lt;br /&gt;
=== Особенности реализации последовательного алгоритма ===&lt;br /&gt;
&lt;br /&gt;
=== Локальность данных и вычислений ===&lt;br /&gt;
&lt;br /&gt;
=== Возможные способы и особенности параллельной реализации алгоритма ===&lt;br /&gt;
&lt;br /&gt;
=== Масштабируемость алгоритма и его реализации ===&lt;br /&gt;
&lt;br /&gt;
=== Динамические характеристики и эффективность реализации алгоритма ===&lt;br /&gt;
&lt;br /&gt;
=== Выводы для классов архитектур ===&lt;br /&gt;
&lt;br /&gt;
=== Существующие реализации алгоритма ===&lt;br /&gt;
Метод Якоби нахождения сингулярных значений и векторов реализован в таких пакетах, как LAPACK, LINPACK/EISPACK, Intel MKL &amp;lt;ref&amp;gt;http://www.alglib.net/matrixops/general/svd.php&amp;lt;/ref&amp;gt;.&lt;br /&gt;
&lt;br /&gt;
Так же функция Якоби реализована в пакете Matlab.&lt;br /&gt;
&lt;br /&gt;
Т. к. алгоритм считается медленным, он не включен во многие известные пакеты.&lt;br /&gt;
&lt;br /&gt;
== Литература ==&lt;br /&gt;
1. Дж. Деммель Вычислительная линейная алгебра. Изд. Мир, 2001.&lt;/div&gt;</summary>
		<author><name>Davletshuna Alexandra</name></author>
	</entry>
	<entry>
		<id>https://xn--80aecvaldz.xn--80ahdrnmvk.xn--p1ai/w/ru/index.php?title=%D0%A3%D1%87%D0%B0%D1%81%D1%82%D0%BD%D0%B8%D0%BA:Davletshuna_Alexandra/%D0%9C%D0%B5%D1%82%D0%BE%D0%B4_%D0%AF%D0%BA%D0%BE%D0%B1%D0%B8_%D0%B2%D1%8B%D1%87%D0%B8%D1%81%D0%BB%D0%B5%D0%BD%D0%B8%D1%8F_%D1%81%D0%B8%D0%BD%D0%B3%D1%83%D0%BB%D1%8F%D1%80%D0%BD%D1%8B%D1%85_%D1%87%D0%B8%D1%81%D0%B5%D0%BB_%D0%B8_%D0%B2%D0%B5%D0%BA%D1%82%D0%BE%D1%80%D0%BE%D0%B2&amp;diff=11630</id>
		<title>Участник:Davletshuna Alexandra/Метод Якоби вычисления сингулярных чисел и векторов</title>
		<link rel="alternate" type="text/html" href="https://xn--80aecvaldz.xn--80ahdrnmvk.xn--p1ai/w/ru/index.php?title=%D0%A3%D1%87%D0%B0%D1%81%D1%82%D0%BD%D0%B8%D0%BA:Davletshuna_Alexandra/%D0%9C%D0%B5%D1%82%D0%BE%D0%B4_%D0%AF%D0%BA%D0%BE%D0%B1%D0%B8_%D0%B2%D1%8B%D1%87%D0%B8%D1%81%D0%BB%D0%B5%D0%BD%D0%B8%D1%8F_%D1%81%D0%B8%D0%BD%D0%B3%D1%83%D0%BB%D1%8F%D1%80%D0%BD%D1%8B%D1%85_%D1%87%D0%B8%D1%81%D0%B5%D0%BB_%D0%B8_%D0%B2%D0%B5%D0%BA%D1%82%D0%BE%D1%80%D0%BE%D0%B2&amp;diff=11630"/>
		<updated>2016-10-15T20:04:31Z</updated>

		<summary type="html">&lt;p&gt;Davletshuna Alexandra: &lt;/p&gt;
&lt;hr /&gt;
&lt;div&gt;{{Assignment}}&lt;br /&gt;
&lt;br /&gt;
{{algorithm&lt;br /&gt;
| name              = Метод Якоби вычисления сингулярных чисел и векторов&lt;br /&gt;
| serial_complexity = &amp;lt;math&amp;gt;O(n^3)&amp;lt;/math&amp;gt;&lt;br /&gt;
| pf_height         = &amp;lt;math&amp;gt;O(n^2)&amp;lt;/math&amp;gt;&lt;br /&gt;
| pf_width          = &amp;lt;math&amp;gt;O(n)&amp;lt;/math&amp;gt;&lt;br /&gt;
| input_data        = &amp;lt;math&amp;gt;n^2&amp;lt;/math&amp;gt;&lt;br /&gt;
| output_data       = &amp;lt;math&amp;gt;2n^2 + n&amp;lt;/math&amp;gt;&lt;br /&gt;
}}&lt;br /&gt;
&lt;br /&gt;
Авторы статьи: [[Участница:Davletshuna Alexandra|Давлетшина Александра]] (группа 619), [[Участница:Alek sandra|Зайцева Александра]] (группа 601)&lt;br /&gt;
&lt;br /&gt;
== Свойства и структура алгоритма ==&lt;br /&gt;
&lt;br /&gt;
=== Общее описание алгоритма ===&lt;br /&gt;
&#039;&#039;&#039;Сингулярным разложением&#039;&#039;&#039; называется разложение прямоугольной вещественной или комплексной матрицы, имеющее широкое применение, в силу своей наглядной геометрической интерпретации, при решении многих прикладных задач. Сингулярное разложение матрицы А позволяет вычислять сингулярные числа данной матрицы, а также, левые и правые сингулярные векторы матрицы А:&lt;br /&gt;
&lt;br /&gt;
•	левые сингулярные векторы матрицы А — это собственные векторы матрицы &amp;lt;math&amp;gt;AA^*&amp;lt;/math&amp;gt;;&lt;br /&gt;
&lt;br /&gt;
•	правые сингулярные векторы матрицы A — это собственные векторы матрицы &amp;lt;math&amp;gt;A^*A&amp;lt;/math&amp;gt;.&lt;br /&gt;
&lt;br /&gt;
Геометрическая интерпретация сингулярного разложения заключается в следующем факте из геометрии: &#039;&#039;Образом любого линейного преобразования, заданного с помощью матрицы &amp;lt;math&amp;gt;m&amp;lt;/math&amp;gt;x&amp;lt;math&amp;gt;n&amp;lt;/math&amp;gt;, примененного к единичной сфере является гиперэллипсоид&#039;&#039;.&lt;br /&gt;
&lt;br /&gt;
Из многочисленных разложений матриц, наиболее удобным является сингулярное разложение матрицы в виде: &amp;lt;math&amp;gt;A=U\Sigma V^*&amp;lt;/math&amp;gt;, где &amp;lt;math&amp;gt;U, V&amp;lt;/math&amp;gt; – унитарные матрицы, а &amp;lt;math&amp;gt;\Sigma&amp;lt;/math&amp;gt; – диагональная матрица с вещественными положительными числами на диагонали &amp;lt;ref&amp;gt;http://algorithms.parallel.ru/&amp;lt;/ref&amp;gt;.&lt;br /&gt;
&lt;br /&gt;
Диагональные элементы матрицы &amp;lt;math&amp;gt;\Sigma&amp;lt;/math&amp;gt; называются сингулярными числами матрицы &amp;lt;math&amp;gt;A&amp;lt;/math&amp;gt;, а столбцы матриц &amp;lt;math&amp;gt;U,V&amp;lt;/math&amp;gt; левыми и правыми сингулярными векторами соответственно.&lt;br /&gt;
&lt;br /&gt;
Алгоритм Якоби сингулярного разложения матрицы был предложен одним из первых в 1846 году. Он приводит прямоугольную матрицу к диагональной матрице с помощью последовательности элементарных вращений. Метод может найти все сингулярные значения с очень высокой точностью. Однако его производительность является довольно низкой, в сравнении с конкурирующими методами.&lt;br /&gt;
&lt;br /&gt;
&#039;&#039;Неявный&#039;&#039;&amp;lt;ref&amp;gt;Дж. Деммель «Вычислительная линейная алгебра» (стр. 261-264)&amp;lt;/ref&amp;gt; метод Якоби математически эквивалентен применению метода Якоби вычисления собственных значений к матрице &amp;lt;math&amp;gt;A = G^TG&amp;lt;/math&amp;gt;.&lt;br /&gt;
Это значит, что на каждом шаге вычисляется вращение Якоби &amp;lt;math&amp;gt;J&amp;lt;/math&amp;gt;, с помощью которого матрица &amp;lt;math&amp;gt;G^TG&amp;lt;/math&amp;gt; неявно пересчитывется в &amp;lt;math&amp;gt;J^TG^TGJ&amp;lt;/math&amp;gt;; вращение выбрано так, чтобы пара внедиагональных элементов из &amp;lt;math&amp;gt;G^TG&amp;lt;/math&amp;gt; обратилась в нули в матрице &amp;lt;math&amp;gt;J^TG^TGJ&amp;lt;/math&amp;gt;. При этом ни &amp;lt;math&amp;gt;G^TG&amp;lt;/math&amp;gt;, ни &amp;lt;math&amp;gt;J^TG^TGJ&amp;lt;/math&amp;gt; не вычисляются в явном виде; вместо них вычисляется матрица &amp;lt;math&amp;gt;GJ&amp;lt;/math&amp;gt;. Поэтому алгоритм называется &#039;&#039;методом односторонних вращений&#039;&#039;.&lt;br /&gt;
&lt;br /&gt;
=== Математическое описание алгоритма ===&lt;br /&gt;
Исходные данные: матрица &amp;lt;math&amp;gt;G&amp;lt;/math&amp;gt; (элементы &amp;lt;math&amp;gt;g_{ij}, i, j = 1, \ldots, n&amp;lt;/math&amp;gt;).&lt;br /&gt;
&lt;br /&gt;
Вычисляемые данные: матрица &amp;lt;math&amp;gt;\Sigma = diag(\sigma_{i})&amp;lt;/math&amp;gt;, где &amp;lt;math&amp;gt;\sigma_{i}&amp;lt;/math&amp;gt; - сингулярные числа, &amp;lt;math&amp;gt;U&amp;lt;/math&amp;gt; - матрица левых сингулярных векторов, &amp;lt;math&amp;gt;V&amp;lt;/math&amp;gt; - матрица правых сингулярных векторов.&lt;br /&gt;
&lt;br /&gt;
симметричную матрицу &amp;lt;math&amp;gt;A = (G^TG)&amp;lt;/math&amp;gt; можно привести к диагональному виду:&lt;br /&gt;
&amp;lt;math&amp;gt;RG^TGR^T&amp;lt;/math&amp;gt;, где&lt;br /&gt;
&lt;br /&gt;
&amp;lt;math&amp;gt;&lt;br /&gt;
R(j,k,\theta) = &lt;br /&gt;
\begin{matrix}&lt;br /&gt;
  \\&lt;br /&gt;
  \\&lt;br /&gt;
  \\&lt;br /&gt;
j \\&lt;br /&gt;
  \\&lt;br /&gt;
k \\&lt;br /&gt;
  \\&lt;br /&gt;
  \\&lt;br /&gt;
  \\&lt;br /&gt;
\end{matrix}&lt;br /&gt;
&amp;lt;/math&amp;gt;  &lt;br /&gt;
&amp;lt;math&amp;gt;&lt;br /&gt;
\begin{bmatrix}&lt;br /&gt;
  &amp;amp; 1 &amp;amp;   &amp;amp;        &amp;amp;              &amp;amp;        &amp;amp;               &amp;amp;         &amp;amp;    &amp;amp;   \\&lt;br /&gt;
  &amp;amp;   &amp;amp; 1 &amp;amp;        &amp;amp;              &amp;amp;        &amp;amp;               &amp;amp;         &amp;amp;    &amp;amp;   \\&lt;br /&gt;
  &amp;amp;   &amp;amp;   &amp;amp; \ddots &amp;amp;              &amp;amp;        &amp;amp;               &amp;amp;         &amp;amp;    &amp;amp;   \\&lt;br /&gt;
  &amp;amp;   &amp;amp;   &amp;amp;        &amp;amp; \cos(\theta) &amp;amp;        &amp;amp; -\sin(\theta) &amp;amp;         &amp;amp;    &amp;amp;   \\&lt;br /&gt;
  &amp;amp;   &amp;amp;   &amp;amp;        &amp;amp;              &amp;amp; \ddots &amp;amp;               &amp;amp;         &amp;amp;    &amp;amp;   \\&lt;br /&gt;
  &amp;amp;   &amp;amp;   &amp;amp;        &amp;amp; \sin(\theta) &amp;amp;        &amp;amp; \cos(\theta)  &amp;amp;         &amp;amp;    &amp;amp;   \\&lt;br /&gt;
  &amp;amp;   &amp;amp;   &amp;amp;        &amp;amp;              &amp;amp;        &amp;amp;               &amp;amp; \ddots  &amp;amp;    &amp;amp;   \\&lt;br /&gt;
  &amp;amp;   &amp;amp;   &amp;amp;        &amp;amp;              &amp;amp;        &amp;amp;               &amp;amp;         &amp;amp; 1  &amp;amp;   \\&lt;br /&gt;
  &amp;amp;   &amp;amp;   &amp;amp;        &amp;amp;              &amp;amp;        &amp;amp;               &amp;amp;         &amp;amp;    &amp;amp; 1 \\&lt;br /&gt;
\end{bmatrix}&lt;br /&gt;
&amp;lt;/math&amp;gt;&lt;br /&gt;
&lt;br /&gt;
Обозначим &amp;lt;math&amp;gt;s = \sin \theta&amp;lt;/math&amp;gt; и &amp;lt;math&amp;gt;c = \cos \theta&amp;lt;/math&amp;gt;.&lt;br /&gt;
&lt;br /&gt;
Перемножив матрицы &amp;lt;math&amp;gt;RG^TGR^T&amp;lt;/math&amp;gt;, получим следующие выражения&amp;lt;ref&amp;gt;http://www.astro.tsu.ru/OsChMet/5_2.html&amp;lt;/ref&amp;gt;:&lt;br /&gt;
&lt;br /&gt;
&amp;lt;math&amp;gt;\begin{align}&lt;br /&gt;
 a_{jj}^{(i+1)} &amp;amp;= c^2\, a_{jj}^{(i)}  -  2\, s c \,a_{jk}^{(i)}  +  s^2\, a_{kk}^{(i)} \\&lt;br /&gt;
 a_{kk}^{(i+1)} &amp;amp;= s^2 \,a_{jj}^{(i)}  +  2 s c\, a_{jk}^{(i)}  +  c^2 \, a_{kk}^{(i)} \\&lt;br /&gt;
 a_{jk}^{(i+1)} &amp;amp;= a_{kj}^{(i+1)} = (c^2 - s^2 ) \, a_{jk}^{(i)}  +  s c \, (a_{kk}^{(i)} - a_{jj}^{(i)} ) \\&lt;br /&gt;
 a_{jm}^{(i+1)} &amp;amp;= a_{mj}^{(i+1)} = c \, a_{jm}^{(i)}  -  s \, a_{km}^{(i)} &amp;amp; m \ne j,k \\&lt;br /&gt;
 a_{km}^{(i+1)} &amp;amp;= a_{mk}^{(i+1)} = s \, a_{jm}^{(i)}  + c \, a_{km}^{(i)} &amp;amp; m \ne j,k \\&lt;br /&gt;
 a_{ml}^{(i+1)} &amp;amp;= a_{ml}^{(i)} &amp;amp;m,l \ne j,k&lt;br /&gt;
\end{align}&amp;lt;/math&amp;gt;&lt;br /&gt;
&lt;br /&gt;
Т.к внедиагональные элементы должны быть равны 0, то выбираем &amp;lt;math&amp;gt;\theta&amp;lt;/math&amp;gt; так, чтобы &amp;lt;math&amp;gt;a_{jk}^{(i+1)} = 0&amp;lt;/math&amp;gt; и &amp;lt;math&amp;gt;a_{kj}^{(i+1)} = 0&amp;lt;/math&amp;gt;.&lt;br /&gt;
&lt;br /&gt;
Тогда решая уравнение получаем, что&lt;br /&gt;
&lt;br /&gt;
&amp;lt;math&amp;gt;&lt;br /&gt;
         \begin{align}&lt;br /&gt;
         \tau &amp;amp;= {a_{jj} - a_{kk}}/{2a_{jk}} \\&lt;br /&gt;
         t &amp;amp;= {sign(\tau)}/(|\tau| + \sqrt{1 + \tau^2}) \\&lt;br /&gt;
         c &amp;amp;= 1/(\sqrt{1 + t^2}) \\&lt;br /&gt;
         s &amp;amp;= ct \\&lt;br /&gt;
         \end{align}&amp;lt;/math&amp;gt;&lt;br /&gt;
&lt;br /&gt;
Остановка вычислений алгоритма наступает, когда внедиагональные элементы становятся меньше некоторого наперед заданного числа &amp;lt;math&amp;gt;\varepsilon&amp;lt;/math&amp;gt;.&lt;br /&gt;
&lt;br /&gt;
=== Вычислительное ядро алгоритма ===&lt;br /&gt;
Вычислительное ядро алгоритма составляет непосредственно вычисление одностороннего вращения Якоби, т.е. вычисление элементов матрицы &amp;lt;math&amp;gt;g_{jm}^{(i+1)} = g_{mj}^{(i+1)}&amp;lt;/math&amp;gt; и &amp;lt;math&amp;gt;g_{km}^{(i+1)} = g_{mk}^{(i+1)}&amp;lt;/math&amp;gt;, &amp;lt;math&amp;gt;m \ne j,k&amp;lt;/math&amp;gt;, а также вычисления элементов &amp;lt;math&amp;gt;g_{jj}^{(i+1)} &amp;lt;/math&amp;gt; и &amp;lt;math&amp;gt;g_{kk}^{(i+1)} &amp;lt;/math&amp;gt;, получившихся после умножения промежуточной матрицы на матрицу вращений Якоби:&lt;br /&gt;
&lt;br /&gt;
&amp;lt;math&amp;gt;\begin{align}&lt;br /&gt;
 g_{jj}^{(i+1)} &amp;amp;= c^2\, a_{jj}^{(i)}  -  2\, s c \,g_{jk}^{(i)}  +  s^2\, g_{kk}^{(i)} \\&lt;br /&gt;
 g_{kk}^{(i+1)} &amp;amp;= s^2 \,a_{jj}^{(i)}  +  2 s c\, g_{jk}^{(i)}  +  c^2 \, g_{kk}^{(i)} \\&lt;br /&gt;
 g_{jk}^{(i+1)} &amp;amp;= g_{kj}^{(i+1)} = (c^2 - s^2 ) \, g_{jk}^{(i)}  +  s c \, (g_{kk}^{(i)} - g_{jj}^{(i)} ) \\&lt;br /&gt;
 g_{jm}^{(i+1)} &amp;amp;= g_{mj}^{(i+1)} = c \, g_{jm}^{(i)}  -  s \, g_{km}^{(i)} &amp;amp; m \ne j,k \\&lt;br /&gt;
 g_{km}^{(i+1)} &amp;amp;= g_{mk}^{(i+1)} = s \, g_{jm}^{(i)}  + c \, g_{km}^{(i)} &amp;amp; m \ne j,k \\&lt;br /&gt;
 g_{ml}^{(i+1)} &amp;amp;= g_{ml}^{(i)} &amp;amp;m,l \ne j,k&lt;br /&gt;
\end{align}&amp;lt;/math&amp;gt;&lt;br /&gt;
&lt;br /&gt;
=== Макроструктура алгоритма ===&lt;br /&gt;
Основную часть метода составляет процедура односторонних вращений матрицы, которая в свою очередь состоит из:&lt;br /&gt;
&lt;br /&gt;
#Вычисление &amp;lt;math&amp;gt;\tau, c, s, t&amp;lt;/math&amp;gt;.&lt;br /&gt;
#Одностороннее вращение матрицы. &lt;br /&gt;
&lt;br /&gt;
Что требует &amp;lt;math&amp;gt;O(n)&amp;lt;/math&amp;gt; операций.&lt;br /&gt;
&lt;br /&gt;
После этого необходимо:&lt;br /&gt;
&lt;br /&gt;
#Вычислить сингулярные числа &amp;lt;math&amp;gt;\sigma_i&amp;lt;/math&amp;gt;.  Что требует &amp;lt;math&amp;gt;O(n)&amp;lt;/math&amp;gt; операций.&lt;br /&gt;
#Вычислить &amp;lt;math&amp;gt;U&amp;lt;/math&amp;gt; и &amp;lt;math&amp;gt;V&amp;lt;/math&amp;gt;. Что требует &amp;lt;math&amp;gt;O(n^2)&amp;lt;/math&amp;gt; операций.&lt;br /&gt;
&lt;br /&gt;
=== Схема реализации последовательного алгоритма ===&lt;br /&gt;
Применение метода Якоби к матрице &amp;lt;math&amp;gt;A = (G^TG)&amp;lt;/math&amp;gt; можно описать следующим образом&amp;lt;ref&amp;gt;Дж. Деммель «Вычислительная линейная алгебра» (стр. 261-263)&amp;lt;/ref&amp;gt;:&lt;br /&gt;
&lt;br /&gt;
Если &amp;lt;math&amp;gt;G = U\Sigma V^T&amp;lt;/math&amp;gt; и &amp;lt;math&amp;gt;\Sigma = diag(\sigma_{i})&amp;lt;/math&amp;gt;, то алгоритм вычисляет сингулярные числа &amp;lt;math&amp;gt;\sigma_{i}&amp;lt;/math&amp;gt;, матрицу &amp;lt;math&amp;gt;U&amp;lt;/math&amp;gt; левых сингулярных векторов и матрицу &amp;lt;math&amp;gt;V&amp;lt;/math&amp;gt; правых сингулярных векторов по следующей схеме:&lt;br /&gt;
&lt;br /&gt;
 repeat&lt;br /&gt;
     for &amp;lt;math&amp;gt;j=1&amp;lt;/math&amp;gt; to &amp;lt;math&amp;gt;n-1&amp;lt;/math&amp;gt;&lt;br /&gt;
         for &amp;lt;math&amp;gt;k=j+1&amp;lt;/math&amp;gt; to &amp;lt;math&amp;gt;n&amp;lt;/math&amp;gt;&lt;br /&gt;
             обратиться к процедуре &#039;&#039;&#039;&#039;&#039;One-Sided-Jacobi-Rotation&amp;lt;math&amp;gt;(G,j,k)&amp;lt;/math&amp;gt;&#039;&#039;&#039;&#039;&#039;&lt;br /&gt;
         end for&lt;br /&gt;
     end for&lt;br /&gt;
 пока &amp;lt;math&amp;gt;G^TG&amp;lt;/math&amp;gt; не станет достаточно близка к диагональной матрице&lt;br /&gt;
 Положить &amp;lt;math&amp;gt;\sigma_{i} = ||G(:,i)||_2 &amp;lt;/math&amp;gt; (норма &amp;lt;math&amp;gt;i&amp;lt;/math&amp;gt;-го столбца в &amp;lt;math&amp;gt;G&amp;lt;/math&amp;gt;)&lt;br /&gt;
 Положить &amp;lt;math&amp;gt;U = [u_{1},\dots, u_{n}]&amp;lt;/math&amp;gt;, где &amp;lt;math&amp;gt;u_{i} = G(:,i)/\sigma_{i}&amp;lt;/math&amp;gt;&lt;br /&gt;
 Положить &amp;lt;math&amp;gt;V = J&amp;lt;/math&amp;gt;, где &amp;lt;math&amp;gt;J&amp;lt;/math&amp;gt; - накопленное произведение вращений Якоби.&lt;br /&gt;
&lt;br /&gt;
Где процедура &#039;&#039;&#039;&#039;&#039;One-Sided-Jacobi-Rotation&#039;&#039;&#039;&#039;&#039; является метод односторонних вращений Якоби:&lt;br /&gt;
&lt;br /&gt;
 proc &#039;&#039;&#039;&#039;&#039;One-Sided-Jacobi-Rotation&amp;lt;math&amp;gt;(G,j,k)&amp;lt;/math&amp;gt;&#039;&#039;&#039;&#039;&#039;&lt;br /&gt;
     вычислить &amp;lt;math&amp;gt;a_{jj} = (G^TG)_{jj}, a_{jk} = (G^TG)_{jk}&amp;lt;/math&amp;gt; и &amp;lt;math&amp;gt;a_{kk} = (G^TG)_{kk}&amp;lt;/math&amp;gt;&lt;br /&gt;
     if &amp;lt;math&amp;gt;|a_{jk}|&amp;lt;/math&amp;gt; не слишком мал&lt;br /&gt;
         &amp;lt;math&amp;gt;&lt;br /&gt;
         \begin{align}&lt;br /&gt;
         \tau &amp;amp;= {a_{jj} - a_{kk}}/{2a_{jk}} \\&lt;br /&gt;
         t &amp;amp;= {sign(\tau)}/(|\tau| + \sqrt{1 + \tau^2}) \\&lt;br /&gt;
         c &amp;amp;= 1/(\sqrt{1 + t^2}) \\&lt;br /&gt;
         s &amp;amp;= ct \\&lt;br /&gt;
         G &amp;amp;= GR(j,k,\theta) \  \dots c=cos\theta, s=sin\theta \end{align}&amp;lt;/math&amp;gt;&lt;br /&gt;
         if нужны правые сингулярные векторы &lt;br /&gt;
             &amp;lt;math&amp;gt;J = JR(j,k,\theta)&amp;lt;/math&amp;gt;&lt;br /&gt;
         end if&lt;br /&gt;
     end if&lt;br /&gt;
&lt;br /&gt;
=== Последовательная сложность алгоритма ===&lt;br /&gt;
Для одного вращения Якоби необходимо выполнить &amp;lt;math&amp;gt;O(n)&amp;lt;/math&amp;gt; операций умножения и сложения. &lt;br /&gt;
&lt;br /&gt;
Всего вариантов выбора &amp;lt;math&amp;gt;j&amp;lt;/math&amp;gt; и &amp;lt;math&amp;gt;k&amp;lt;/math&amp;gt; существует &amp;lt;math&amp;gt;\frac{n(n-1)}{2}&amp;lt;/math&amp;gt;.&lt;br /&gt;
&lt;br /&gt;
Таким образом последовательный алгоритм Якоби вычисления сингулярных чисел и векторов является алгоритмом с кубической сложностью.&lt;br /&gt;
&lt;br /&gt;
=== Информационный граф ===&lt;br /&gt;
Граф алгоритма состоит из четырех групп вершин&lt;br /&gt;
&lt;br /&gt;
(А)Первая группа вершин расположена в двумерной области, соответствующая ей операция - вычисление &amp;lt;math&amp;gt;a_{jj},a_{jk},a_{kk}&amp;lt;/math&amp;gt; . Где &amp;lt;math&amp;gt;j&amp;lt;/math&amp;gt; изменяется от &amp;lt;math&amp;gt;1&amp;lt;/math&amp;gt; до &amp;lt;math&amp;gt;n-1&amp;lt;/math&amp;gt;, принимая все целочисленные значения, &amp;lt;math&amp;gt;k&amp;lt;/math&amp;gt;  изменяется от &amp;lt;math&amp;gt;j+1&amp;lt;/math&amp;gt; до &amp;lt;math&amp;gt;n&amp;lt;/math&amp;gt;, принимая все целочисленные значения.&lt;br /&gt;
&lt;br /&gt;
[[File:Graf1.png|none|thumb|2000px|Рисунок 1. Информационная структура вычисления данных параметром.]]&lt;br /&gt;
&lt;br /&gt;
(Б)Вторая группа вершин расположена в двумерной области, соответствующая ей операция – вычисление &amp;lt;math&amp;gt;c&amp;lt;/math&amp;gt; и &amp;lt;math&amp;gt;s&amp;lt;/math&amp;gt;.&lt;br /&gt;
&lt;br /&gt;
(В)Третья группа вершин расположена в двумерной области, соответствующая ей операция вычисление значений элементов &amp;lt;math&amp;gt;g_{jm}^{(i+1)} = g_{mj}^{(i+1)}&amp;lt;/math&amp;gt; и &amp;lt;math&amp;gt;g_{km}^{(i+1)} = g_{mk}^{(i+1)}&amp;lt;/math&amp;gt;, &amp;lt;math&amp;gt;m \ne j,k&amp;lt;/math&amp;gt;.&lt;br /&gt;
&lt;br /&gt;
(Г)Четвертая группа вершин расположена в двумерной области, соответствующая ей операция вычисление значений элементов &amp;lt;math&amp;gt;g_{jj}^{(i+1)} &amp;lt;/math&amp;gt; и &amp;lt;math&amp;gt;g_{kk}^{(i+1)} &amp;lt;/math&amp;gt;.&lt;br /&gt;
&lt;br /&gt;
[[File:Graf2.png|none|thumb|2000px|Рисунок 2. Граф алгоритма вычисления сингулярных чисел и векторов методом Якоби.]]&lt;br /&gt;
&lt;br /&gt;
=== Ресурс параллелизма алгоритма ===&lt;br /&gt;
Для выполнения одной итерации метода Якоби требуется последовательно выполнить несколько ярусов:&lt;br /&gt;
# вычислить &amp;lt;math&amp;gt;\tau&amp;lt;/math&amp;gt; &lt;br /&gt;
# вычислить &amp;lt;math&amp;gt;t&amp;lt;/math&amp;gt; &lt;br /&gt;
# вычислить &amp;lt;math&amp;gt;c&amp;lt;/math&amp;gt; &lt;br /&gt;
# выполнить поворот матрицы &amp;lt;math&amp;gt;G&amp;lt;/math&amp;gt; с параллельным выполнением &amp;lt;math&amp;gt;2(n-2)&amp;lt;/math&amp;gt; операций вычисления элементов матрицы &amp;lt;math&amp;gt;g_{jm}^{(i+1)} = g_{mj}^{(i+1)}&amp;lt;/math&amp;gt; и &amp;lt;math&amp;gt;g_{km}^{(i+1)} = g_{mk}^{(i+1)}&amp;lt;/math&amp;gt;, &amp;lt;math&amp;gt;m \ne j,k&amp;lt;/math&amp;gt;, а также вычисления элементов &amp;lt;math&amp;gt;g_{jj}^{(i+1)} &amp;lt;/math&amp;gt; и &amp;lt;math&amp;gt;g_{kk}^{(i+1)} &amp;lt;/math&amp;gt;. &lt;br /&gt;
&lt;br /&gt;
Суммарное количество итераций равно &amp;lt;math&amp;gt;\frac{n(n-1)}{2}&amp;lt;/math&amp;gt; (Различные варианты выбора &amp;lt;math&amp;gt;j&amp;lt;/math&amp;gt; и &amp;lt;math&amp;gt;k&amp;lt;/math&amp;gt;). &lt;br /&gt;
&lt;br /&gt;
Асимптотически метод сходится квадратично. &lt;br /&gt;
&lt;br /&gt;
Таким образом, при классификации по высоте ЯПФ метод Якоби относится к алгоритмам со сложностью &amp;lt;math&amp;gt;O(n^2)&amp;lt;/math&amp;gt;&amp;amp;nbsp;, а при классификации по ширине ЯПФ — к алгоритмам со сложностью &amp;lt;math&amp;gt;O(n)&amp;lt;/math&amp;gt;.&lt;br /&gt;
&lt;br /&gt;
=== Входные и выходные данные алгоритма ===&lt;br /&gt;
&#039;&#039;&#039;Входные данные&#039;&#039;&#039;: плотная матрица &amp;lt;math&amp;gt;G&amp;lt;/math&amp;gt; размера &amp;lt;math&amp;gt;n&amp;lt;/math&amp;gt;х&amp;lt;math&amp;gt;n&amp;lt;/math&amp;gt;, где &amp;lt;math&amp;gt;A= G^TG&amp;lt;/math&amp;gt; – симметрическая матрица.&lt;br /&gt;
&lt;br /&gt;
&#039;&#039;&#039;Объём входных данных&#039;&#039;&#039;: &amp;lt;math&amp;gt;n^2&amp;lt;/math&amp;gt; (т.к. для хранения матрицы &amp;lt;math&amp;gt;G&amp;lt;/math&amp;gt; используем двумерный массив размера &amp;lt;math&amp;gt;n&amp;lt;/math&amp;gt;х&amp;lt;math&amp;gt;n&amp;lt;/math&amp;gt;)&lt;br /&gt;
&lt;br /&gt;
&#039;&#039;&#039;Выходные данные&#039;&#039;&#039;: &amp;lt;math&amp;gt;\sigma_{i}&amp;lt;/math&amp;gt;  - сингулярные числа, матрица &amp;lt;math&amp;gt;U&amp;lt;/math&amp;gt; левых сингулярных векторов и матрица &amp;lt;math&amp;gt;V&amp;lt;/math&amp;gt; правых сингулярных векторов.&lt;br /&gt;
&lt;br /&gt;
&#039;&#039;&#039;Объём выходных данных&#039;&#039;&#039;: &amp;lt;math&amp;gt;2n^2 + n&amp;lt;/math&amp;gt; (т.к. необходимо хранить вектор сингулярных чисел длины &amp;lt;math&amp;gt;n&amp;lt;/math&amp;gt;, а также две матрицы &amp;lt;math&amp;gt;U, V&amp;lt;/math&amp;gt; левых и правых сингулярных векторов размера &amp;lt;math&amp;gt;n&amp;lt;/math&amp;gt;х&amp;lt;math&amp;gt;n&amp;lt;/math&amp;gt;).&lt;br /&gt;
&lt;br /&gt;
=== Свойства алгоритма ===&lt;br /&gt;
Метод Якоби является самым медленным из имеющихся алгоритмов вычисления сингулярных чисел и сингулярных векторов матрицы. Тем не менее, для  матриц &amp;lt;math&amp;gt;G&amp;lt;/math&amp;gt;, которые могут быть представлены в виде &amp;lt;math&amp;gt;G=DX&amp;lt;/math&amp;gt;, где &amp;lt;math&amp;gt;D&amp;lt;/math&amp;gt; - диагональная, а &amp;lt;math&amp;gt;X&amp;lt;/math&amp;gt; - хорошо обусловлена, он способен вычислять сингулярные числа и вектора намного точнее, чем другие методы&amp;lt;ref&amp;gt;Дж. Деммель «Вычислительная линейная алгебра» (стр. 261-264)&amp;lt;/ref&amp;gt;. &lt;br /&gt;
&lt;br /&gt;
Вычислительная мощность алгоритма, как отношение числа операций к суммарному объему входных и выходных данных является линейной.&lt;br /&gt;
&lt;br /&gt;
Метод Якоби не детерминирован, так как является итерационным алгоритмом с выходом по точности (число итераций зависит от входных данных и порогового значения).&lt;br /&gt;
&lt;br /&gt;
== Программная реализация алгоритма ==&lt;br /&gt;
&lt;br /&gt;
=== Особенности реализации последовательного алгоритма ===&lt;br /&gt;
&lt;br /&gt;
=== Локальность данных и вычислений ===&lt;br /&gt;
&lt;br /&gt;
=== Возможные способы и особенности параллельной реализации алгоритма ===&lt;br /&gt;
&lt;br /&gt;
=== Масштабируемость алгоритма и его реализации ===&lt;br /&gt;
&lt;br /&gt;
=== Динамические характеристики и эффективность реализации алгоритма ===&lt;br /&gt;
&lt;br /&gt;
=== Выводы для классов архитектур ===&lt;br /&gt;
&lt;br /&gt;
=== Существующие реализации алгоритма ===&lt;br /&gt;
Метод Якоби нахождения сингулярных значений и векторов реализован в таких пакетах, как LAPACK, LINPACK/EISPACK, Intel MKL &amp;lt;ref&amp;gt;http://www.alglib.net/matrixops/general/svd.php&amp;lt;/ref&amp;gt;.&lt;br /&gt;
&lt;br /&gt;
Так же функция Якоби реализована в пакете Matlab.&lt;br /&gt;
&lt;br /&gt;
Т. к. алгоритм считается медленным, он не включен во многие известные пакеты.&lt;br /&gt;
&lt;br /&gt;
== Литература ==&lt;br /&gt;
1. Дж. Деммель Вычислительная линейная алгебра. Изд. Мир, 2001.&lt;/div&gt;</summary>
		<author><name>Davletshuna Alexandra</name></author>
	</entry>
	<entry>
		<id>https://xn--80aecvaldz.xn--80ahdrnmvk.xn--p1ai/w/ru/index.php?title=%D0%A3%D1%87%D0%B0%D1%81%D1%82%D0%BD%D0%B8%D0%BA:Davletshuna_Alexandra/%D0%9C%D0%B5%D1%82%D0%BE%D0%B4_%D0%AF%D0%BA%D0%BE%D0%B1%D0%B8_%D0%B2%D1%8B%D1%87%D0%B8%D1%81%D0%BB%D0%B5%D0%BD%D0%B8%D1%8F_%D1%81%D0%B8%D0%BD%D0%B3%D1%83%D0%BB%D1%8F%D1%80%D0%BD%D1%8B%D1%85_%D1%87%D0%B8%D1%81%D0%B5%D0%BB_%D0%B8_%D0%B2%D0%B5%D0%BA%D1%82%D0%BE%D1%80%D0%BE%D0%B2&amp;diff=11614</id>
		<title>Участник:Davletshuna Alexandra/Метод Якоби вычисления сингулярных чисел и векторов</title>
		<link rel="alternate" type="text/html" href="https://xn--80aecvaldz.xn--80ahdrnmvk.xn--p1ai/w/ru/index.php?title=%D0%A3%D1%87%D0%B0%D1%81%D1%82%D0%BD%D0%B8%D0%BA:Davletshuna_Alexandra/%D0%9C%D0%B5%D1%82%D0%BE%D0%B4_%D0%AF%D0%BA%D0%BE%D0%B1%D0%B8_%D0%B2%D1%8B%D1%87%D0%B8%D1%81%D0%BB%D0%B5%D0%BD%D0%B8%D1%8F_%D1%81%D0%B8%D0%BD%D0%B3%D1%83%D0%BB%D1%8F%D1%80%D0%BD%D1%8B%D1%85_%D1%87%D0%B8%D1%81%D0%B5%D0%BB_%D0%B8_%D0%B2%D0%B5%D0%BA%D1%82%D0%BE%D1%80%D0%BE%D0%B2&amp;diff=11614"/>
		<updated>2016-10-15T20:02:33Z</updated>

		<summary type="html">&lt;p&gt;Davletshuna Alexandra: /* Информационный граф */&lt;/p&gt;
&lt;hr /&gt;
&lt;div&gt;&lt;br /&gt;
{{algorithm&lt;br /&gt;
| name              = Метод Якоби вычисления сингулярных чисел и векторов&lt;br /&gt;
| serial_complexity = &amp;lt;math&amp;gt;O(n^3)&amp;lt;/math&amp;gt;&lt;br /&gt;
| pf_height         = &amp;lt;math&amp;gt;O(n^2)&amp;lt;/math&amp;gt;&lt;br /&gt;
| pf_width          = &amp;lt;math&amp;gt;O(n)&amp;lt;/math&amp;gt;&lt;br /&gt;
| input_data        = &amp;lt;math&amp;gt;n^2&amp;lt;/math&amp;gt;&lt;br /&gt;
| output_data       = &amp;lt;math&amp;gt;2n^2 + n&amp;lt;/math&amp;gt;&lt;br /&gt;
}}&lt;br /&gt;
&lt;br /&gt;
Авторы статьи: [[Участница:Davletshuna Alexandra|Давлетшина Александра]] (группа 619), [[Участница:Alek sandra|Зайцева Александра]] (группа 601)&lt;br /&gt;
&lt;br /&gt;
== Свойства и структура алгоритма ==&lt;br /&gt;
&lt;br /&gt;
=== Общее описание алгоритма ===&lt;br /&gt;
&#039;&#039;&#039;Сингулярным разложением&#039;&#039;&#039; называется разложение прямоугольной вещественной или комплексной матрицы, имеющее широкое применение, в силу своей наглядной геометрической интерпретации, при решении многих прикладных задач. Сингулярное разложение матрицы А позволяет вычислять сингулярные числа данной матрицы, а также, левые и правые сингулярные векторы матрицы А:&lt;br /&gt;
&lt;br /&gt;
•	левые сингулярные векторы матрицы А — это собственные векторы матрицы &amp;lt;math&amp;gt;AA^*&amp;lt;/math&amp;gt;;&lt;br /&gt;
&lt;br /&gt;
•	правые сингулярные векторы матрицы A — это собственные векторы матрицы &amp;lt;math&amp;gt;A^*A&amp;lt;/math&amp;gt;.&lt;br /&gt;
&lt;br /&gt;
Геометрическая интерпретация сингулярного разложения заключается в следующем факте из геометрии: &#039;&#039;Образом любого линейного преобразования, заданного с помощью матрицы &amp;lt;math&amp;gt;m&amp;lt;/math&amp;gt;x&amp;lt;math&amp;gt;n&amp;lt;/math&amp;gt;, примененного к единичной сфере является гиперэллипсоид&#039;&#039;.&lt;br /&gt;
&lt;br /&gt;
Из многочисленных разложений матриц, наиболее удобным является сингулярное разложение матрицы в виде: &amp;lt;math&amp;gt;A=U\Sigma V^*&amp;lt;/math&amp;gt;, где &amp;lt;math&amp;gt;U, V&amp;lt;/math&amp;gt; – унитарные матрицы, а &amp;lt;math&amp;gt;\Sigma&amp;lt;/math&amp;gt; – диагональная матрица с вещественными положительными числами на диагонали &amp;lt;ref&amp;gt;http://algorithms.parallel.ru/&amp;lt;/ref&amp;gt;.&lt;br /&gt;
&lt;br /&gt;
Диагональные элементы матрицы &amp;lt;math&amp;gt;\Sigma&amp;lt;/math&amp;gt; называются сингулярными числами матрицы &amp;lt;math&amp;gt;A&amp;lt;/math&amp;gt;, а столбцы матриц &amp;lt;math&amp;gt;U,V&amp;lt;/math&amp;gt; левыми и правыми сингулярными векторами соответственно.&lt;br /&gt;
&lt;br /&gt;
Алгоритм Якоби сингулярного разложения матрицы был предложен одним из первых в 1846 году. Он приводит прямоугольную матрицу к диагональной матрице с помощью последовательности элементарных вращений. Метод может найти все сингулярные значения с очень высокой точностью. Однако его производительность является довольно низкой, в сравнении с конкурирующими методами.&lt;br /&gt;
&lt;br /&gt;
&#039;&#039;Неявный&#039;&#039;&amp;lt;ref&amp;gt;Дж. Деммель «Вычислительная линейная алгебра» (стр. 261-264)&amp;lt;/ref&amp;gt; метод Якоби математически эквивалентен применению метода Якоби вычисления собственных значений к матрице &amp;lt;math&amp;gt;A = G^TG&amp;lt;/math&amp;gt;.&lt;br /&gt;
Это значит, что на каждом шаге вычисляется вращение Якоби &amp;lt;math&amp;gt;J&amp;lt;/math&amp;gt;, с помощью которого матрица &amp;lt;math&amp;gt;G^TG&amp;lt;/math&amp;gt; неявно пересчитывется в &amp;lt;math&amp;gt;J^TG^TGJ&amp;lt;/math&amp;gt;; вращение выбрано так, чтобы пара внедиагональных элементов из &amp;lt;math&amp;gt;G^TG&amp;lt;/math&amp;gt; обратилась в нули в матрице &amp;lt;math&amp;gt;J^TG^TGJ&amp;lt;/math&amp;gt;. При этом ни &amp;lt;math&amp;gt;G^TG&amp;lt;/math&amp;gt;, ни &amp;lt;math&amp;gt;J^TG^TGJ&amp;lt;/math&amp;gt; не вычисляются в явном виде; вместо них вычисляется матрица &amp;lt;math&amp;gt;GJ&amp;lt;/math&amp;gt;. Поэтому алгоритм называется &#039;&#039;методом односторонних вращений&#039;&#039;.&lt;br /&gt;
&lt;br /&gt;
=== Математическое описание алгоритма ===&lt;br /&gt;
Исходные данные: матрица &amp;lt;math&amp;gt;G&amp;lt;/math&amp;gt; (элементы &amp;lt;math&amp;gt;g_{ij}, i, j = 1, \ldots, n&amp;lt;/math&amp;gt;).&lt;br /&gt;
&lt;br /&gt;
Вычисляемые данные: матрица &amp;lt;math&amp;gt;\Sigma = diag(\sigma_{i})&amp;lt;/math&amp;gt;, где &amp;lt;math&amp;gt;\sigma_{i}&amp;lt;/math&amp;gt; - сингулярные числа, &amp;lt;math&amp;gt;U&amp;lt;/math&amp;gt; - матрица левых сингулярных векторов, &amp;lt;math&amp;gt;V&amp;lt;/math&amp;gt; - матрица правых сингулярных векторов.&lt;br /&gt;
&lt;br /&gt;
симметричную матрицу &amp;lt;math&amp;gt;A = (G^TG)&amp;lt;/math&amp;gt; можно привести к диагональному виду:&lt;br /&gt;
&amp;lt;math&amp;gt;RG^TGR^T&amp;lt;/math&amp;gt;, где&lt;br /&gt;
&lt;br /&gt;
&amp;lt;math&amp;gt;&lt;br /&gt;
R(j,k,\theta) = &lt;br /&gt;
\begin{matrix}&lt;br /&gt;
  \\&lt;br /&gt;
  \\&lt;br /&gt;
  \\&lt;br /&gt;
j \\&lt;br /&gt;
  \\&lt;br /&gt;
k \\&lt;br /&gt;
  \\&lt;br /&gt;
  \\&lt;br /&gt;
  \\&lt;br /&gt;
\end{matrix}&lt;br /&gt;
&amp;lt;/math&amp;gt;  &lt;br /&gt;
&amp;lt;math&amp;gt;&lt;br /&gt;
\begin{bmatrix}&lt;br /&gt;
  &amp;amp; 1 &amp;amp;   &amp;amp;        &amp;amp;              &amp;amp;        &amp;amp;               &amp;amp;         &amp;amp;    &amp;amp;   \\&lt;br /&gt;
  &amp;amp;   &amp;amp; 1 &amp;amp;        &amp;amp;              &amp;amp;        &amp;amp;               &amp;amp;         &amp;amp;    &amp;amp;   \\&lt;br /&gt;
  &amp;amp;   &amp;amp;   &amp;amp; \ddots &amp;amp;              &amp;amp;        &amp;amp;               &amp;amp;         &amp;amp;    &amp;amp;   \\&lt;br /&gt;
  &amp;amp;   &amp;amp;   &amp;amp;        &amp;amp; \cos(\theta) &amp;amp;        &amp;amp; -\sin(\theta) &amp;amp;         &amp;amp;    &amp;amp;   \\&lt;br /&gt;
  &amp;amp;   &amp;amp;   &amp;amp;        &amp;amp;              &amp;amp; \ddots &amp;amp;               &amp;amp;         &amp;amp;    &amp;amp;   \\&lt;br /&gt;
  &amp;amp;   &amp;amp;   &amp;amp;        &amp;amp; \sin(\theta) &amp;amp;        &amp;amp; \cos(\theta)  &amp;amp;         &amp;amp;    &amp;amp;   \\&lt;br /&gt;
  &amp;amp;   &amp;amp;   &amp;amp;        &amp;amp;              &amp;amp;        &amp;amp;               &amp;amp; \ddots  &amp;amp;    &amp;amp;   \\&lt;br /&gt;
  &amp;amp;   &amp;amp;   &amp;amp;        &amp;amp;              &amp;amp;        &amp;amp;               &amp;amp;         &amp;amp; 1  &amp;amp;   \\&lt;br /&gt;
  &amp;amp;   &amp;amp;   &amp;amp;        &amp;amp;              &amp;amp;        &amp;amp;               &amp;amp;         &amp;amp;    &amp;amp; 1 \\&lt;br /&gt;
\end{bmatrix}&lt;br /&gt;
&amp;lt;/math&amp;gt;&lt;br /&gt;
&lt;br /&gt;
Обозначим &amp;lt;math&amp;gt;s = \sin \theta&amp;lt;/math&amp;gt; и &amp;lt;math&amp;gt;c = \cos \theta&amp;lt;/math&amp;gt;.&lt;br /&gt;
&lt;br /&gt;
Перемножив матрицы &amp;lt;math&amp;gt;RG^TGR^T&amp;lt;/math&amp;gt;, получим следующие выражения&amp;lt;ref&amp;gt;http://www.astro.tsu.ru/OsChMet/5_2.html&amp;lt;/ref&amp;gt;:&lt;br /&gt;
&lt;br /&gt;
&amp;lt;math&amp;gt;\begin{align}&lt;br /&gt;
 a_{jj}^{(i+1)} &amp;amp;= c^2\, a_{jj}^{(i)}  -  2\, s c \,a_{jk}^{(i)}  +  s^2\, a_{kk}^{(i)} \\&lt;br /&gt;
 a_{kk}^{(i+1)} &amp;amp;= s^2 \,a_{jj}^{(i)}  +  2 s c\, a_{jk}^{(i)}  +  c^2 \, a_{kk}^{(i)} \\&lt;br /&gt;
 a_{jk}^{(i+1)} &amp;amp;= a_{kj}^{(i+1)} = (c^2 - s^2 ) \, a_{jk}^{(i)}  +  s c \, (a_{kk}^{(i)} - a_{jj}^{(i)} ) \\&lt;br /&gt;
 a_{jm}^{(i+1)} &amp;amp;= a_{mj}^{(i+1)} = c \, a_{jm}^{(i)}  -  s \, a_{km}^{(i)} &amp;amp; m \ne j,k \\&lt;br /&gt;
 a_{km}^{(i+1)} &amp;amp;= a_{mk}^{(i+1)} = s \, a_{jm}^{(i)}  + c \, a_{km}^{(i)} &amp;amp; m \ne j,k \\&lt;br /&gt;
 a_{ml}^{(i+1)} &amp;amp;= a_{ml}^{(i)} &amp;amp;m,l \ne j,k&lt;br /&gt;
\end{align}&amp;lt;/math&amp;gt;&lt;br /&gt;
&lt;br /&gt;
Т.к внедиагональные элементы должны быть равны 0, то выбираем &amp;lt;math&amp;gt;\theta&amp;lt;/math&amp;gt; так, чтобы &amp;lt;math&amp;gt;a_{jk}^{(i+1)} = 0&amp;lt;/math&amp;gt; и &amp;lt;math&amp;gt;a_{kj}^{(i+1)} = 0&amp;lt;/math&amp;gt;.&lt;br /&gt;
&lt;br /&gt;
Тогда решая уравнение получаем, что&lt;br /&gt;
&lt;br /&gt;
&amp;lt;math&amp;gt;&lt;br /&gt;
         \begin{align}&lt;br /&gt;
         \tau &amp;amp;= {a_{jj} - a_{kk}}/{2a_{jk}} \\&lt;br /&gt;
         t &amp;amp;= {sign(\tau)}/(|\tau| + \sqrt{1 + \tau^2}) \\&lt;br /&gt;
         c &amp;amp;= 1/(\sqrt{1 + t^2}) \\&lt;br /&gt;
         s &amp;amp;= ct \\&lt;br /&gt;
         \end{align}&amp;lt;/math&amp;gt;&lt;br /&gt;
&lt;br /&gt;
Остановка вычислений алгоритма наступает, когда внедиагональные элементы становятся меньше некоторого наперед заданного числа &amp;lt;math&amp;gt;\varepsilon&amp;lt;/math&amp;gt;.&lt;br /&gt;
&lt;br /&gt;
=== Вычислительное ядро алгоритма ===&lt;br /&gt;
Вычислительное ядро алгоритма составляет непосредственно вычисление одностороннего вращения Якоби, т.е. вычисление элементов матрицы &amp;lt;math&amp;gt;g_{jm}^{(i+1)} = g_{mj}^{(i+1)}&amp;lt;/math&amp;gt; и &amp;lt;math&amp;gt;g_{km}^{(i+1)} = g_{mk}^{(i+1)}&amp;lt;/math&amp;gt;, &amp;lt;math&amp;gt;m \ne j,k&amp;lt;/math&amp;gt;, а также вычисления элементов &amp;lt;math&amp;gt;g_{jj}^{(i+1)} &amp;lt;/math&amp;gt; и &amp;lt;math&amp;gt;g_{kk}^{(i+1)} &amp;lt;/math&amp;gt;, получившихся после умножения промежуточной матрицы на матрицу вращений Якоби:&lt;br /&gt;
&lt;br /&gt;
&amp;lt;math&amp;gt;\begin{align}&lt;br /&gt;
 g_{jj}^{(i+1)} &amp;amp;= c^2\, a_{jj}^{(i)}  -  2\, s c \,g_{jk}^{(i)}  +  s^2\, g_{kk}^{(i)} \\&lt;br /&gt;
 g_{kk}^{(i+1)} &amp;amp;= s^2 \,a_{jj}^{(i)}  +  2 s c\, g_{jk}^{(i)}  +  c^2 \, g_{kk}^{(i)} \\&lt;br /&gt;
 g_{jk}^{(i+1)} &amp;amp;= g_{kj}^{(i+1)} = (c^2 - s^2 ) \, g_{jk}^{(i)}  +  s c \, (g_{kk}^{(i)} - g_{jj}^{(i)} ) \\&lt;br /&gt;
 g_{jm}^{(i+1)} &amp;amp;= g_{mj}^{(i+1)} = c \, g_{jm}^{(i)}  -  s \, g_{km}^{(i)} &amp;amp; m \ne j,k \\&lt;br /&gt;
 g_{km}^{(i+1)} &amp;amp;= g_{mk}^{(i+1)} = s \, g_{jm}^{(i)}  + c \, g_{km}^{(i)} &amp;amp; m \ne j,k \\&lt;br /&gt;
 g_{ml}^{(i+1)} &amp;amp;= g_{ml}^{(i)} &amp;amp;m,l \ne j,k&lt;br /&gt;
\end{align}&amp;lt;/math&amp;gt;&lt;br /&gt;
&lt;br /&gt;
=== Макроструктура алгоритма ===&lt;br /&gt;
Основную часть метода составляет процедура односторонних вращений матрицы, которая в свою очередь состоит из:&lt;br /&gt;
&lt;br /&gt;
#Вычисление &amp;lt;math&amp;gt;\tau, c, s, t&amp;lt;/math&amp;gt;.&lt;br /&gt;
#Одностороннее вращение матрицы. &lt;br /&gt;
&lt;br /&gt;
Что требует &amp;lt;math&amp;gt;O(n)&amp;lt;/math&amp;gt; операций.&lt;br /&gt;
&lt;br /&gt;
После этого необходимо:&lt;br /&gt;
&lt;br /&gt;
#Вычислить сингулярные числа &amp;lt;math&amp;gt;\sigma_i&amp;lt;/math&amp;gt;.  Что требует &amp;lt;math&amp;gt;O(n)&amp;lt;/math&amp;gt; операций.&lt;br /&gt;
#Вычислить &amp;lt;math&amp;gt;U&amp;lt;/math&amp;gt; и &amp;lt;math&amp;gt;V&amp;lt;/math&amp;gt;. Что требует &amp;lt;math&amp;gt;O(n^2)&amp;lt;/math&amp;gt; операций.&lt;br /&gt;
&lt;br /&gt;
=== Схема реализации последовательного алгоритма ===&lt;br /&gt;
Применение метода Якоби к матрице &amp;lt;math&amp;gt;A = (G^TG)&amp;lt;/math&amp;gt; можно описать следующим образом&amp;lt;ref&amp;gt;Дж. Деммель «Вычислительная линейная алгебра» (стр. 261-263)&amp;lt;/ref&amp;gt;:&lt;br /&gt;
&lt;br /&gt;
Если &amp;lt;math&amp;gt;G = U\Sigma V^T&amp;lt;/math&amp;gt; и &amp;lt;math&amp;gt;\Sigma = diag(\sigma_{i})&amp;lt;/math&amp;gt;, то алгоритм вычисляет сингулярные числа &amp;lt;math&amp;gt;\sigma_{i}&amp;lt;/math&amp;gt;, матрицу &amp;lt;math&amp;gt;U&amp;lt;/math&amp;gt; левых сингулярных векторов и матрицу &amp;lt;math&amp;gt;V&amp;lt;/math&amp;gt; правых сингулярных векторов по следующей схеме:&lt;br /&gt;
&lt;br /&gt;
 repeat&lt;br /&gt;
     for &amp;lt;math&amp;gt;j=1&amp;lt;/math&amp;gt; to &amp;lt;math&amp;gt;n-1&amp;lt;/math&amp;gt;&lt;br /&gt;
         for &amp;lt;math&amp;gt;k=j+1&amp;lt;/math&amp;gt; to &amp;lt;math&amp;gt;n&amp;lt;/math&amp;gt;&lt;br /&gt;
             обратиться к процедуре &#039;&#039;&#039;&#039;&#039;One-Sided-Jacobi-Rotation&amp;lt;math&amp;gt;(G,j,k)&amp;lt;/math&amp;gt;&#039;&#039;&#039;&#039;&#039;&lt;br /&gt;
         end for&lt;br /&gt;
     end for&lt;br /&gt;
 пока &amp;lt;math&amp;gt;G^TG&amp;lt;/math&amp;gt; не станет достаточно близка к диагональной матрице&lt;br /&gt;
 Положить &amp;lt;math&amp;gt;\sigma_{i} = ||G(:,i)||_2 &amp;lt;/math&amp;gt; (норма &amp;lt;math&amp;gt;i&amp;lt;/math&amp;gt;-го столбца в &amp;lt;math&amp;gt;G&amp;lt;/math&amp;gt;)&lt;br /&gt;
 Положить &amp;lt;math&amp;gt;U = [u_{1},\dots, u_{n}]&amp;lt;/math&amp;gt;, где &amp;lt;math&amp;gt;u_{i} = G(:,i)/\sigma_{i}&amp;lt;/math&amp;gt;&lt;br /&gt;
 Положить &amp;lt;math&amp;gt;V = J&amp;lt;/math&amp;gt;, где &amp;lt;math&amp;gt;J&amp;lt;/math&amp;gt; - накопленное произведение вращений Якоби.&lt;br /&gt;
&lt;br /&gt;
Где процедура &#039;&#039;&#039;&#039;&#039;One-Sided-Jacobi-Rotation&#039;&#039;&#039;&#039;&#039; является метод односторонних вращений Якоби:&lt;br /&gt;
&lt;br /&gt;
 proc &#039;&#039;&#039;&#039;&#039;One-Sided-Jacobi-Rotation&amp;lt;math&amp;gt;(G,j,k)&amp;lt;/math&amp;gt;&#039;&#039;&#039;&#039;&#039;&lt;br /&gt;
     вычислить &amp;lt;math&amp;gt;a_{jj} = (G^TG)_{jj}, a_{jk} = (G^TG)_{jk}&amp;lt;/math&amp;gt; и &amp;lt;math&amp;gt;a_{kk} = (G^TG)_{kk}&amp;lt;/math&amp;gt;&lt;br /&gt;
     if &amp;lt;math&amp;gt;|a_{jk}|&amp;lt;/math&amp;gt; не слишком мал&lt;br /&gt;
         &amp;lt;math&amp;gt;&lt;br /&gt;
         \begin{align}&lt;br /&gt;
         \tau &amp;amp;= {a_{jj} - a_{kk}}/{2a_{jk}} \\&lt;br /&gt;
         t &amp;amp;= {sign(\tau)}/(|\tau| + \sqrt{1 + \tau^2}) \\&lt;br /&gt;
         c &amp;amp;= 1/(\sqrt{1 + t^2}) \\&lt;br /&gt;
         s &amp;amp;= ct \\&lt;br /&gt;
         G &amp;amp;= GR(j,k,\theta) \  \dots c=cos\theta, s=sin\theta \end{align}&amp;lt;/math&amp;gt;&lt;br /&gt;
         if нужны правые сингулярные векторы &lt;br /&gt;
             &amp;lt;math&amp;gt;J = JR(j,k,\theta)&amp;lt;/math&amp;gt;&lt;br /&gt;
         end if&lt;br /&gt;
     end if&lt;br /&gt;
&lt;br /&gt;
=== Последовательная сложность алгоритма ===&lt;br /&gt;
Для одного вращения Якоби необходимо выполнить &amp;lt;math&amp;gt;O(n)&amp;lt;/math&amp;gt; операций умножения и сложения. &lt;br /&gt;
&lt;br /&gt;
Всего вариантов выбора &amp;lt;math&amp;gt;j&amp;lt;/math&amp;gt; и &amp;lt;math&amp;gt;k&amp;lt;/math&amp;gt; существует &amp;lt;math&amp;gt;\frac{n(n-1)}{2}&amp;lt;/math&amp;gt;.&lt;br /&gt;
&lt;br /&gt;
Таким образом последовательный алгоритм Якоби вычисления сингулярных чисел и векторов является алгоритмом с кубической сложностью.&lt;br /&gt;
&lt;br /&gt;
=== Информационный граф ===&lt;br /&gt;
Граф алгоритма состоит из четырех групп вершин&lt;br /&gt;
&lt;br /&gt;
(А)Первая группа вершин расположена в двумерной области, соответствующая ей операция - вычисление &amp;lt;math&amp;gt;a_{jj},a_{jk},a_{kk}&amp;lt;/math&amp;gt; . Где &amp;lt;math&amp;gt;j&amp;lt;/math&amp;gt; изменяется от &amp;lt;math&amp;gt;1&amp;lt;/math&amp;gt; до &amp;lt;math&amp;gt;n-1&amp;lt;/math&amp;gt;, принимая все целочисленные значения, &amp;lt;math&amp;gt;k&amp;lt;/math&amp;gt;  изменяется от &amp;lt;math&amp;gt;j+1&amp;lt;/math&amp;gt; до &amp;lt;math&amp;gt;n&amp;lt;/math&amp;gt;, принимая все целочисленные значения.&lt;br /&gt;
&lt;br /&gt;
[[File:Graf1.png|none|thumb|2000px|Рисунок 1. Информационная структура вычисления данных параметром.]]&lt;br /&gt;
&lt;br /&gt;
(Б)Вторая группа вершин расположена в двумерной области, соответствующая ей операция – вычисление &amp;lt;math&amp;gt;c&amp;lt;/math&amp;gt; и &amp;lt;math&amp;gt;s&amp;lt;/math&amp;gt;.&lt;br /&gt;
&lt;br /&gt;
(В)Третья группа вершин расположена в двумерной области, соответствующая ей операция вычисление значений элементов &amp;lt;math&amp;gt;g_{jm}^{(i+1)} = g_{mj}^{(i+1)}&amp;lt;/math&amp;gt; и &amp;lt;math&amp;gt;g_{km}^{(i+1)} = g_{mk}^{(i+1)}&amp;lt;/math&amp;gt;, &amp;lt;math&amp;gt;m \ne j,k&amp;lt;/math&amp;gt;.&lt;br /&gt;
&lt;br /&gt;
(Г)Четвертая группа вершин расположена в двумерной области, соответствующая ей операция вычисление значений элементов &amp;lt;math&amp;gt;g_{jj}^{(i+1)} &amp;lt;/math&amp;gt; и &amp;lt;math&amp;gt;g_{kk}^{(i+1)} &amp;lt;/math&amp;gt;.&lt;br /&gt;
&lt;br /&gt;
[[File:Graf2.png|none|thumb|2000px|Рисунок 2. Граф алгоритма вычисления сингулярных чисел и векторов методом Якоби.]]&lt;br /&gt;
&lt;br /&gt;
=== Ресурс параллелизма алгоритма ===&lt;br /&gt;
Для выполнения одной итерации метода Якоби требуется последовательно выполнить несколько ярусов:&lt;br /&gt;
# вычислить &amp;lt;math&amp;gt;\tau&amp;lt;/math&amp;gt; &lt;br /&gt;
# вычислить &amp;lt;math&amp;gt;t&amp;lt;/math&amp;gt; &lt;br /&gt;
# вычислить &amp;lt;math&amp;gt;c&amp;lt;/math&amp;gt; &lt;br /&gt;
# выполнить поворот матрицы &amp;lt;math&amp;gt;G&amp;lt;/math&amp;gt; с параллельным выполнением &amp;lt;math&amp;gt;2(n-2)&amp;lt;/math&amp;gt; операций вычисления элементов матрицы &amp;lt;math&amp;gt;g_{jm}^{(i+1)} = g_{mj}^{(i+1)}&amp;lt;/math&amp;gt; и &amp;lt;math&amp;gt;g_{km}^{(i+1)} = g_{mk}^{(i+1)}&amp;lt;/math&amp;gt;, &amp;lt;math&amp;gt;m \ne j,k&amp;lt;/math&amp;gt;, а также вычисления элементов &amp;lt;math&amp;gt;g_{jj}^{(i+1)} &amp;lt;/math&amp;gt; и &amp;lt;math&amp;gt;g_{kk}^{(i+1)} &amp;lt;/math&amp;gt;. &lt;br /&gt;
&lt;br /&gt;
Суммарное количество итераций равно &amp;lt;math&amp;gt;\frac{n(n-1)}{2}&amp;lt;/math&amp;gt; (Различные варианты выбора &amp;lt;math&amp;gt;j&amp;lt;/math&amp;gt; и &amp;lt;math&amp;gt;k&amp;lt;/math&amp;gt;). &lt;br /&gt;
&lt;br /&gt;
Асимптотически метод сходится квадратично. &lt;br /&gt;
&lt;br /&gt;
Таким образом, при классификации по высоте ЯПФ метод Якоби относится к алгоритмам со сложностью &amp;lt;math&amp;gt;O(n^2)&amp;lt;/math&amp;gt;&amp;amp;nbsp;, а при классификации по ширине ЯПФ — к алгоритмам со сложностью &amp;lt;math&amp;gt;O(n)&amp;lt;/math&amp;gt;.&lt;br /&gt;
&lt;br /&gt;
=== Входные и выходные данные алгоритма ===&lt;br /&gt;
&#039;&#039;&#039;Входные данные&#039;&#039;&#039;: плотная матрица &amp;lt;math&amp;gt;G&amp;lt;/math&amp;gt; размера &amp;lt;math&amp;gt;n&amp;lt;/math&amp;gt;х&amp;lt;math&amp;gt;n&amp;lt;/math&amp;gt;, где &amp;lt;math&amp;gt;A= G^TG&amp;lt;/math&amp;gt; – симметрическая матрица.&lt;br /&gt;
&lt;br /&gt;
&#039;&#039;&#039;Объём входных данных&#039;&#039;&#039;: &amp;lt;math&amp;gt;n^2&amp;lt;/math&amp;gt; (т.к. для хранения матрицы &amp;lt;math&amp;gt;G&amp;lt;/math&amp;gt; используем двумерный массив размера &amp;lt;math&amp;gt;n&amp;lt;/math&amp;gt;х&amp;lt;math&amp;gt;n&amp;lt;/math&amp;gt;)&lt;br /&gt;
&lt;br /&gt;
&#039;&#039;&#039;Выходные данные&#039;&#039;&#039;: &amp;lt;math&amp;gt;\sigma_{i}&amp;lt;/math&amp;gt;  - сингулярные числа, матрица &amp;lt;math&amp;gt;U&amp;lt;/math&amp;gt; левых сингулярных векторов и матрица &amp;lt;math&amp;gt;V&amp;lt;/math&amp;gt; правых сингулярных векторов.&lt;br /&gt;
&lt;br /&gt;
&#039;&#039;&#039;Объём выходных данных&#039;&#039;&#039;: &amp;lt;math&amp;gt;2n^2 + n&amp;lt;/math&amp;gt; (т.к. необходимо хранить вектор сингулярных чисел длины &amp;lt;math&amp;gt;n&amp;lt;/math&amp;gt;, а также две матрицы &amp;lt;math&amp;gt;U, V&amp;lt;/math&amp;gt; левых и правых сингулярных векторов размера &amp;lt;math&amp;gt;n&amp;lt;/math&amp;gt;х&amp;lt;math&amp;gt;n&amp;lt;/math&amp;gt;).&lt;br /&gt;
&lt;br /&gt;
=== Свойства алгоритма ===&lt;br /&gt;
Метод Якоби является самым медленным из имеющихся алгоритмов вычисления сингулярных чисел и сингулярных векторов матрицы. Тем не менее, для  матриц &amp;lt;math&amp;gt;G&amp;lt;/math&amp;gt;, которые могут быть представлены в виде &amp;lt;math&amp;gt;G=DX&amp;lt;/math&amp;gt;, где &amp;lt;math&amp;gt;D&amp;lt;/math&amp;gt; - диагональная, а &amp;lt;math&amp;gt;X&amp;lt;/math&amp;gt; - хорошо обусловлена, он способен вычислять сингулярные числа и вектора намного точнее, чем другие методы&amp;lt;ref&amp;gt;Дж. Деммель «Вычислительная линейная алгебра» (стр. 261-264)&amp;lt;/ref&amp;gt;. &lt;br /&gt;
&lt;br /&gt;
Вычислительная мощность алгоритма, как отношение числа операций к суммарному объему входных и выходных данных является линейной.&lt;br /&gt;
&lt;br /&gt;
Метод Якоби не детерминирован, так как является итерационным алгоритмом с выходом по точности (число итераций зависит от входных данных и порогового значения).&lt;br /&gt;
&lt;br /&gt;
== Программная реализация алгоритма ==&lt;br /&gt;
&lt;br /&gt;
=== Особенности реализации последовательного алгоритма ===&lt;br /&gt;
&lt;br /&gt;
=== Локальность данных и вычислений ===&lt;br /&gt;
&lt;br /&gt;
=== Возможные способы и особенности параллельной реализации алгоритма ===&lt;br /&gt;
&lt;br /&gt;
=== Масштабируемость алгоритма и его реализации ===&lt;br /&gt;
&lt;br /&gt;
=== Динамические характеристики и эффективность реализации алгоритма ===&lt;br /&gt;
&lt;br /&gt;
=== Выводы для классов архитектур ===&lt;br /&gt;
&lt;br /&gt;
=== Существующие реализации алгоритма ===&lt;br /&gt;
Метод Якоби нахождения сингулярных значений и векторов реализован в таких пакетах, как LAPACK, LINPACK/EISPACK, Intel MKL &amp;lt;ref&amp;gt;http://www.alglib.net/matrixops/general/svd.php&amp;lt;/ref&amp;gt;.&lt;br /&gt;
&lt;br /&gt;
Так же функция Якоби реализована в пакете Matlab.&lt;br /&gt;
&lt;br /&gt;
Т. к. алгоритм считается медленным, он не включен во многие известные пакеты.&lt;br /&gt;
&lt;br /&gt;
== Литература ==&lt;br /&gt;
1. Дж. Деммель Вычислительная линейная алгебра. Изд. Мир, 2001.&lt;/div&gt;</summary>
		<author><name>Davletshuna Alexandra</name></author>
	</entry>
	<entry>
		<id>https://xn--80aecvaldz.xn--80ahdrnmvk.xn--p1ai/w/ru/index.php?title=%D0%A3%D1%87%D0%B0%D1%81%D1%82%D0%BD%D0%B8%D0%BA:Davletshuna_Alexandra/%D0%9C%D0%B5%D1%82%D0%BE%D0%B4_%D0%AF%D0%BA%D0%BE%D0%B1%D0%B8_%D0%B2%D1%8B%D1%87%D0%B8%D1%81%D0%BB%D0%B5%D0%BD%D0%B8%D1%8F_%D1%81%D0%B8%D0%BD%D0%B3%D1%83%D0%BB%D1%8F%D1%80%D0%BD%D1%8B%D1%85_%D1%87%D0%B8%D1%81%D0%B5%D0%BB_%D0%B8_%D0%B2%D0%B5%D0%BA%D1%82%D0%BE%D1%80%D0%BE%D0%B2&amp;diff=9934</id>
		<title>Участник:Davletshuna Alexandra/Метод Якоби вычисления сингулярных чисел и векторов</title>
		<link rel="alternate" type="text/html" href="https://xn--80aecvaldz.xn--80ahdrnmvk.xn--p1ai/w/ru/index.php?title=%D0%A3%D1%87%D0%B0%D1%81%D1%82%D0%BD%D0%B8%D0%BA:Davletshuna_Alexandra/%D0%9C%D0%B5%D1%82%D0%BE%D0%B4_%D0%AF%D0%BA%D0%BE%D0%B1%D0%B8_%D0%B2%D1%8B%D1%87%D0%B8%D1%81%D0%BB%D0%B5%D0%BD%D0%B8%D1%8F_%D1%81%D0%B8%D0%BD%D0%B3%D1%83%D0%BB%D1%8F%D1%80%D0%BD%D1%8B%D1%85_%D1%87%D0%B8%D1%81%D0%B5%D0%BB_%D0%B8_%D0%B2%D0%B5%D0%BA%D1%82%D0%BE%D1%80%D0%BE%D0%B2&amp;diff=9934"/>
		<updated>2016-10-15T14:33:27Z</updated>

		<summary type="html">&lt;p&gt;Davletshuna Alexandra: /* Последовательная сложность алгоритма */&lt;/p&gt;
&lt;hr /&gt;
&lt;div&gt;&lt;br /&gt;
{{algorithm&lt;br /&gt;
| name              = Метод Якоби вычисления сингулярных чисел и векторов&lt;br /&gt;
| serial_complexity = &amp;lt;math&amp;gt;O(n^3)&amp;lt;/math&amp;gt;&lt;br /&gt;
| pf_height         = &amp;lt;math&amp;gt;O(n^2)&amp;lt;/math&amp;gt;&lt;br /&gt;
| pf_width          = &amp;lt;math&amp;gt;O(n)&amp;lt;/math&amp;gt;&lt;br /&gt;
| input_data        = &amp;lt;math&amp;gt;n^2&amp;lt;/math&amp;gt;&lt;br /&gt;
| output_data       = &amp;lt;math&amp;gt;2n^2 + n&amp;lt;/math&amp;gt;&lt;br /&gt;
}}&lt;br /&gt;
&lt;br /&gt;
Авторы статьи: [[Участница:Davletshuna Alexandra|Давлетшина Александра]] (группа 619), [[Участница:Alek sandra|Зайцева Александра]] (группа 601)&lt;br /&gt;
&lt;br /&gt;
== Свойства и структура алгоритма ==&lt;br /&gt;
&lt;br /&gt;
=== Общее описание алгоритма ===&lt;br /&gt;
&#039;&#039;&#039;Сингулярным разложением&#039;&#039;&#039; называется разложение прямоугольной вещественной или комплексной матрицы, имеющее широкое применение, в силу своей наглядной геометрической интерпретации, при решении многих прикладных задач. Сингулярное разложение матрицы А позволяет вычислять сингулярные числа данной матрицы, а также, левые и правые сингулярные векторы матрицы А:&lt;br /&gt;
&lt;br /&gt;
•	левые сингулярные векторы матрицы А — это собственные векторы матрицы &amp;lt;math&amp;gt;AA^*&amp;lt;/math&amp;gt;;&lt;br /&gt;
&lt;br /&gt;
•	правые сингулярные векторы матрицы A — это собственные векторы матрицы &amp;lt;math&amp;gt;A^*A&amp;lt;/math&amp;gt;.&lt;br /&gt;
&lt;br /&gt;
Геометрическая интерпретация сингулярного разложения заключается в следующем факте из геометрии: &#039;&#039;Образом любого линейного преобразования, заданного с помощью матрицы &amp;lt;math&amp;gt;m&amp;lt;/math&amp;gt;x&amp;lt;math&amp;gt;n&amp;lt;/math&amp;gt;, примененного к единичной сфере является гиперэллипсоид&#039;&#039;.&lt;br /&gt;
&lt;br /&gt;
Из многочисленных разложений матриц, наиболее удобным является сингулярное разложение матрицы в виде: &amp;lt;math&amp;gt;A=U\Sigma V^*&amp;lt;/math&amp;gt;, где &amp;lt;math&amp;gt;U, V&amp;lt;/math&amp;gt; – унитарные матрицы, а &amp;lt;math&amp;gt;\Sigma&amp;lt;/math&amp;gt; – диагональная матрица с вещественными положительными числами на диагонали &amp;lt;ref&amp;gt;http://algorithms.parallel.ru/&amp;lt;/ref&amp;gt;.&lt;br /&gt;
&lt;br /&gt;
Диагональные элементы матрицы &amp;lt;math&amp;gt;\Sigma&amp;lt;/math&amp;gt; называются сингулярными числами матрицы &amp;lt;math&amp;gt;A&amp;lt;/math&amp;gt;, а столбцы матриц &amp;lt;math&amp;gt;U,V&amp;lt;/math&amp;gt; левыми и правыми сингулярными векторами соответственно.&lt;br /&gt;
&lt;br /&gt;
Алгоритм Якоби сингулярного разложения матрицы был предложен одним из первых в 1846 году. Он приводит прямоугольную матрицу к диагональной матрице с помощью последовательности элементарных вращений. Метод может найти все сингулярные значения с очень высокой точностью. Однако его производительность является довольно низкой, в сравнении с конкурирующими методами.&lt;br /&gt;
&lt;br /&gt;
&#039;&#039;Неявный&#039;&#039;&amp;lt;ref&amp;gt;Дж. Деммель «Вычислительная линейная алгебра» (стр. 261-264)&amp;lt;/ref&amp;gt; метод Якоби математически эквивалентен применению метода Якоби вычисления собственных значений к матрице &amp;lt;math&amp;gt;A = G^TG&amp;lt;/math&amp;gt;.&lt;br /&gt;
Это значит, что на каждом шаге вычисляется вращение Якоби &amp;lt;math&amp;gt;J&amp;lt;/math&amp;gt;, с помощью которого матрица &amp;lt;math&amp;gt;G^TG&amp;lt;/math&amp;gt; неявно пересчитывется в &amp;lt;math&amp;gt;J^TG^TGJ&amp;lt;/math&amp;gt;; вращение выбрано так, чтобы пара внедиагональных элементов из &amp;lt;math&amp;gt;G^TG&amp;lt;/math&amp;gt; обратилась в нули в матрице &amp;lt;math&amp;gt;J^TG^TGJ&amp;lt;/math&amp;gt;. При этом ни &amp;lt;math&amp;gt;G^TG&amp;lt;/math&amp;gt;, ни &amp;lt;math&amp;gt;J^TG^TGJ&amp;lt;/math&amp;gt; не вычисляются в явном виде; вместо них вычисляется матрица &amp;lt;math&amp;gt;GJ&amp;lt;/math&amp;gt;. Поэтому алгоритм называется &#039;&#039;методом односторонних вращений&#039;&#039;.&lt;br /&gt;
&lt;br /&gt;
=== Математическое описание алгоритма ===&lt;br /&gt;
Исходные данные: матрица &amp;lt;math&amp;gt;G&amp;lt;/math&amp;gt; (элементы &amp;lt;math&amp;gt;g_{ij}, i, j = 1, \ldots, n&amp;lt;/math&amp;gt;).&lt;br /&gt;
&lt;br /&gt;
Вычисляемые данные: матрица &amp;lt;math&amp;gt;\Sigma = diag(\sigma_{i})&amp;lt;/math&amp;gt;, где &amp;lt;math&amp;gt;\sigma_{i}&amp;lt;/math&amp;gt; - сингулярные числа, &amp;lt;math&amp;gt;U&amp;lt;/math&amp;gt; - матрица левых сингулярных векторов, &amp;lt;math&amp;gt;V&amp;lt;/math&amp;gt; - матрица правых сингулярных векторов.&lt;br /&gt;
&lt;br /&gt;
симметричную матрицу &amp;lt;math&amp;gt;A = (G^TG)&amp;lt;/math&amp;gt; можно привести к диагональному виду:&lt;br /&gt;
&amp;lt;math&amp;gt;RG^TGR^T&amp;lt;/math&amp;gt;, где&lt;br /&gt;
&lt;br /&gt;
&amp;lt;math&amp;gt;&lt;br /&gt;
R(j,k,\theta) = &lt;br /&gt;
\begin{matrix}&lt;br /&gt;
  \\&lt;br /&gt;
  \\&lt;br /&gt;
  \\&lt;br /&gt;
j \\&lt;br /&gt;
  \\&lt;br /&gt;
k \\&lt;br /&gt;
  \\&lt;br /&gt;
  \\&lt;br /&gt;
  \\&lt;br /&gt;
\end{matrix}&lt;br /&gt;
&amp;lt;/math&amp;gt;  &lt;br /&gt;
&amp;lt;math&amp;gt;&lt;br /&gt;
\begin{bmatrix}&lt;br /&gt;
  &amp;amp; 1 &amp;amp;   &amp;amp;        &amp;amp;              &amp;amp;        &amp;amp;               &amp;amp;         &amp;amp;    &amp;amp;   \\&lt;br /&gt;
  &amp;amp;   &amp;amp; 1 &amp;amp;        &amp;amp;              &amp;amp;        &amp;amp;               &amp;amp;         &amp;amp;    &amp;amp;   \\&lt;br /&gt;
  &amp;amp;   &amp;amp;   &amp;amp; \ddots &amp;amp;              &amp;amp;        &amp;amp;               &amp;amp;         &amp;amp;    &amp;amp;   \\&lt;br /&gt;
  &amp;amp;   &amp;amp;   &amp;amp;        &amp;amp; \cos(\theta) &amp;amp;        &amp;amp; -\sin(\theta) &amp;amp;         &amp;amp;    &amp;amp;   \\&lt;br /&gt;
  &amp;amp;   &amp;amp;   &amp;amp;        &amp;amp;              &amp;amp; \ddots &amp;amp;               &amp;amp;         &amp;amp;    &amp;amp;   \\&lt;br /&gt;
  &amp;amp;   &amp;amp;   &amp;amp;        &amp;amp; \sin(\theta) &amp;amp;        &amp;amp; \cos(\theta)  &amp;amp;         &amp;amp;    &amp;amp;   \\&lt;br /&gt;
  &amp;amp;   &amp;amp;   &amp;amp;        &amp;amp;              &amp;amp;        &amp;amp;               &amp;amp; \ddots  &amp;amp;    &amp;amp;   \\&lt;br /&gt;
  &amp;amp;   &amp;amp;   &amp;amp;        &amp;amp;              &amp;amp;        &amp;amp;               &amp;amp;         &amp;amp; 1  &amp;amp;   \\&lt;br /&gt;
  &amp;amp;   &amp;amp;   &amp;amp;        &amp;amp;              &amp;amp;        &amp;amp;               &amp;amp;         &amp;amp;    &amp;amp; 1 \\&lt;br /&gt;
\end{bmatrix}&lt;br /&gt;
&amp;lt;/math&amp;gt;&lt;br /&gt;
&lt;br /&gt;
Обозначим &amp;lt;math&amp;gt;s = \sin \theta&amp;lt;/math&amp;gt; и &amp;lt;math&amp;gt;c = \cos \theta&amp;lt;/math&amp;gt;.&lt;br /&gt;
&lt;br /&gt;
Перемножив матрицы &amp;lt;math&amp;gt;RG^TGR^T&amp;lt;/math&amp;gt;, получим следующие выражения&amp;lt;ref&amp;gt;http://www.astro.tsu.ru/OsChMet/5_2.html&amp;lt;/ref&amp;gt;:&lt;br /&gt;
&lt;br /&gt;
&amp;lt;math&amp;gt;\begin{align}&lt;br /&gt;
 a_{jj}^{(i+1)} &amp;amp;= c^2\, a_{jj}^{(i)}  -  2\, s c \,a_{jk}^{(i)}  +  s^2\, a_{kk}^{(i)} \\&lt;br /&gt;
 a_{kk}^{(i+1)} &amp;amp;= s^2 \,a_{jj}^{(i)}  +  2 s c\, a_{jk}^{(i)}  +  c^2 \, a_{kk}^{(i)} \\&lt;br /&gt;
 a_{jk}^{(i+1)} &amp;amp;= a_{kj}^{(i+1)} = (c^2 - s^2 ) \, a_{jk}^{(i)}  +  s c \, (a_{kk}^{(i)} - a_{jj}^{(i)} ) \\&lt;br /&gt;
 a_{jm}^{(i+1)} &amp;amp;= a_{mj}^{(i+1)} = c \, a_{jm}^{(i)}  -  s \, a_{km}^{(i)} &amp;amp; m \ne j,k \\&lt;br /&gt;
 a_{km}^{(i+1)} &amp;amp;= a_{mk}^{(i+1)} = s \, a_{jm}^{(i)}  + c \, a_{km}^{(i)} &amp;amp; m \ne j,k \\&lt;br /&gt;
 a_{ml}^{(i+1)} &amp;amp;= a_{ml}^{(i)} &amp;amp;m,l \ne j,k&lt;br /&gt;
\end{align}&amp;lt;/math&amp;gt;&lt;br /&gt;
&lt;br /&gt;
Т.к внедиагональные элементы должны быть равны 0, то выбираем &amp;lt;math&amp;gt;\theta&amp;lt;/math&amp;gt; так, чтобы &amp;lt;math&amp;gt;a_{jk}^{(i+1)} = 0&amp;lt;/math&amp;gt; и &amp;lt;math&amp;gt;a_{kj}^{(i+1)} = 0&amp;lt;/math&amp;gt;.&lt;br /&gt;
&lt;br /&gt;
Тогда решая уравнение получаем, что&lt;br /&gt;
&lt;br /&gt;
&amp;lt;math&amp;gt;&lt;br /&gt;
         \begin{align}&lt;br /&gt;
         \tau &amp;amp;= {a_{jj} - a_{kk}}/{2a_{jk}} \\&lt;br /&gt;
         t &amp;amp;= {sign(\tau)}/(|\tau| + \sqrt{1 + \tau^2}) \\&lt;br /&gt;
         c &amp;amp;= 1/(\sqrt{1 + t^2}) \\&lt;br /&gt;
         s &amp;amp;= ct \\&lt;br /&gt;
         \end{align}&amp;lt;/math&amp;gt;&lt;br /&gt;
&lt;br /&gt;
Остановка вычислений алгоритма наступает, когда внедиагональные элементы становятся меньше некоторого наперед заданного числа &amp;lt;math&amp;gt;\varepsilon&amp;lt;/math&amp;gt;.&lt;br /&gt;
&lt;br /&gt;
=== Вычислительное ядро алгоритма ===&lt;br /&gt;
Вычислительное ядро алгоритма составляет непосредственно вычисление одностороннего вращения Якоби, т.е. вычисление элементов матрицы &amp;lt;math&amp;gt;g_{jm}^{(i+1)} = g_{mj}^{(i+1)}&amp;lt;/math&amp;gt; и &amp;lt;math&amp;gt;g_{km}^{(i+1)} = g_{mk}^{(i+1)}&amp;lt;/math&amp;gt;, &amp;lt;math&amp;gt;m \ne j,k&amp;lt;/math&amp;gt;, а также вычисления элементов &amp;lt;math&amp;gt;g_{jj}^{(i+1)} &amp;lt;/math&amp;gt; и &amp;lt;math&amp;gt;g_{kk}^{(i+1)} &amp;lt;/math&amp;gt;, получившихся после умножения промежуточной матрицы на матрицу вращений Якоби:&lt;br /&gt;
&lt;br /&gt;
&amp;lt;math&amp;gt;\begin{align}&lt;br /&gt;
 g_{jj}^{(i+1)} &amp;amp;= c^2\, a_{jj}^{(i)}  -  2\, s c \,g_{jk}^{(i)}  +  s^2\, g_{kk}^{(i)} \\&lt;br /&gt;
 g_{kk}^{(i+1)} &amp;amp;= s^2 \,a_{jj}^{(i)}  +  2 s c\, g_{jk}^{(i)}  +  c^2 \, g_{kk}^{(i)} \\&lt;br /&gt;
 g_{jk}^{(i+1)} &amp;amp;= g_{kj}^{(i+1)} = (c^2 - s^2 ) \, g_{jk}^{(i)}  +  s c \, (g_{kk}^{(i)} - g_{jj}^{(i)} ) \\&lt;br /&gt;
 g_{jm}^{(i+1)} &amp;amp;= g_{mj}^{(i+1)} = c \, g_{jm}^{(i)}  -  s \, g_{km}^{(i)} &amp;amp; m \ne j,k \\&lt;br /&gt;
 g_{km}^{(i+1)} &amp;amp;= g_{mk}^{(i+1)} = s \, g_{jm}^{(i)}  + c \, g_{km}^{(i)} &amp;amp; m \ne j,k \\&lt;br /&gt;
 g_{ml}^{(i+1)} &amp;amp;= g_{ml}^{(i)} &amp;amp;m,l \ne j,k&lt;br /&gt;
\end{align}&amp;lt;/math&amp;gt;&lt;br /&gt;
&lt;br /&gt;
=== Макроструктура алгоритма ===&lt;br /&gt;
Основную часть метода составляет процедура односторонних вращений матрицы, которая в свою очередь состоит из:&lt;br /&gt;
&lt;br /&gt;
#Вычисление &amp;lt;math&amp;gt;\tau, c, s, t&amp;lt;/math&amp;gt;.&lt;br /&gt;
#Одностороннее вращение матрицы. &lt;br /&gt;
&lt;br /&gt;
Что требует &amp;lt;math&amp;gt;O(n)&amp;lt;/math&amp;gt; операций.&lt;br /&gt;
&lt;br /&gt;
После этого необходимо:&lt;br /&gt;
&lt;br /&gt;
#Вычислить сингулярные числа &amp;lt;math&amp;gt;\sigma_i&amp;lt;/math&amp;gt;.  Что требует &amp;lt;math&amp;gt;O(n)&amp;lt;/math&amp;gt; операций.&lt;br /&gt;
#Вычислить &amp;lt;math&amp;gt;U&amp;lt;/math&amp;gt; и &amp;lt;math&amp;gt;V&amp;lt;/math&amp;gt;. Что требует &amp;lt;math&amp;gt;O(n^2)&amp;lt;/math&amp;gt; операций.&lt;br /&gt;
&lt;br /&gt;
=== Схема реализации последовательного алгоритма ===&lt;br /&gt;
Применение метода Якоби к матрице &amp;lt;math&amp;gt;A = (G^TG)&amp;lt;/math&amp;gt; можно описать следующим образом&amp;lt;ref&amp;gt;Дж. Деммель «Вычислительная линейная алгебра» (стр. 261-263)&amp;lt;/ref&amp;gt;:&lt;br /&gt;
&lt;br /&gt;
Если &amp;lt;math&amp;gt;G = U\Sigma V^T&amp;lt;/math&amp;gt; и &amp;lt;math&amp;gt;\Sigma = diag(\sigma_{i})&amp;lt;/math&amp;gt;, то алгоритм вычисляет сингулярные числа &amp;lt;math&amp;gt;\sigma_{i}&amp;lt;/math&amp;gt;, матрицу &amp;lt;math&amp;gt;U&amp;lt;/math&amp;gt; левых сингулярных векторов и матрицу &amp;lt;math&amp;gt;V&amp;lt;/math&amp;gt; правых сингулярных векторов по следующей схеме:&lt;br /&gt;
&lt;br /&gt;
 repeat&lt;br /&gt;
     for &amp;lt;math&amp;gt;j=1&amp;lt;/math&amp;gt; to &amp;lt;math&amp;gt;n-1&amp;lt;/math&amp;gt;&lt;br /&gt;
         for &amp;lt;math&amp;gt;k=j+1&amp;lt;/math&amp;gt; to &amp;lt;math&amp;gt;n&amp;lt;/math&amp;gt;&lt;br /&gt;
             обратиться к процедуре &#039;&#039;&#039;&#039;&#039;One-Sided-Jacobi-Rotation&amp;lt;math&amp;gt;(G,j,k)&amp;lt;/math&amp;gt;&#039;&#039;&#039;&#039;&#039;&lt;br /&gt;
         end for&lt;br /&gt;
     end for&lt;br /&gt;
 пока &amp;lt;math&amp;gt;G^TG&amp;lt;/math&amp;gt; не станет достаточно близка к диагональной матрице&lt;br /&gt;
 Положить &amp;lt;math&amp;gt;\sigma_{i} = ||G(:,i)||_2 &amp;lt;/math&amp;gt; (норма &amp;lt;math&amp;gt;i&amp;lt;/math&amp;gt;-го столбца в &amp;lt;math&amp;gt;G&amp;lt;/math&amp;gt;)&lt;br /&gt;
 Положить &amp;lt;math&amp;gt;U = [u_{1},\dots, u_{n}]&amp;lt;/math&amp;gt;, где &amp;lt;math&amp;gt;u_{i} = G(:,i)/\sigma_{i}&amp;lt;/math&amp;gt;&lt;br /&gt;
 Положить &amp;lt;math&amp;gt;V = J&amp;lt;/math&amp;gt;, где &amp;lt;math&amp;gt;J&amp;lt;/math&amp;gt; - накопленное произведение вращений Якоби.&lt;br /&gt;
&lt;br /&gt;
Где процедура &#039;&#039;&#039;&#039;&#039;One-Sided-Jacobi-Rotation&#039;&#039;&#039;&#039;&#039; является метод односторонних вращений Якоби:&lt;br /&gt;
&lt;br /&gt;
 proc &#039;&#039;&#039;&#039;&#039;One-Sided-Jacobi-Rotation&amp;lt;math&amp;gt;(G,j,k)&amp;lt;/math&amp;gt;&#039;&#039;&#039;&#039;&#039;&lt;br /&gt;
     вычислить &amp;lt;math&amp;gt;a_{jj} = (G^TG)_{jj}, a_{jk} = (G^TG)_{jk}&amp;lt;/math&amp;gt; и &amp;lt;math&amp;gt;a_{kk} = (G^TG)_{kk}&amp;lt;/math&amp;gt;&lt;br /&gt;
     if &amp;lt;math&amp;gt;|a_{jk}|&amp;lt;/math&amp;gt; не слишком мал&lt;br /&gt;
         &amp;lt;math&amp;gt;&lt;br /&gt;
         \begin{align}&lt;br /&gt;
         \tau &amp;amp;= {a_{jj} - a_{kk}}/{2a_{jk}} \\&lt;br /&gt;
         t &amp;amp;= {sign(\tau)}/(|\tau| + \sqrt{1 + \tau^2}) \\&lt;br /&gt;
         c &amp;amp;= 1/(\sqrt{1 + t^2}) \\&lt;br /&gt;
         s &amp;amp;= ct \\&lt;br /&gt;
         G &amp;amp;= GR(j,k,\theta) \  \dots c=cos\theta, s=sin\theta \end{align}&amp;lt;/math&amp;gt;&lt;br /&gt;
         if нужны правые сингулярные векторы &lt;br /&gt;
             &amp;lt;math&amp;gt;J = JR(j,k,\theta)&amp;lt;/math&amp;gt;&lt;br /&gt;
         end if&lt;br /&gt;
     end if&lt;br /&gt;
&lt;br /&gt;
=== Последовательная сложность алгоритма ===&lt;br /&gt;
Для одного вращения Якоби необходимо выполнить &amp;lt;math&amp;gt;O(n)&amp;lt;/math&amp;gt; операций умножения и сложения. &lt;br /&gt;
&lt;br /&gt;
Всего вариантов выбора &amp;lt;math&amp;gt;j&amp;lt;/math&amp;gt; и &amp;lt;math&amp;gt;k&amp;lt;/math&amp;gt; существует &amp;lt;math&amp;gt;\frac{n(n-1)}{2}&amp;lt;/math&amp;gt;.&lt;br /&gt;
&lt;br /&gt;
Таким образом последовательный алгоритм Якоби вычисления сингулярных чисел и векторов является алгоритмом с кубической сложностью.&lt;br /&gt;
&lt;br /&gt;
=== Информационный граф ===&lt;br /&gt;
&lt;br /&gt;
=== Ресурс параллелизма алгоритма ===&lt;br /&gt;
Для выполнения одной итерации метода Якоби требуется последовательно выполнить несколько ярусов:&lt;br /&gt;
# вычислить &amp;lt;math&amp;gt;\tau&amp;lt;/math&amp;gt; &lt;br /&gt;
# вычислить &amp;lt;math&amp;gt;t&amp;lt;/math&amp;gt; &lt;br /&gt;
# вычислить &amp;lt;math&amp;gt;c&amp;lt;/math&amp;gt; &lt;br /&gt;
# выполнить поворот матрицы &amp;lt;math&amp;gt;G&amp;lt;/math&amp;gt; с параллельным выполнением &amp;lt;math&amp;gt;2(n-2)&amp;lt;/math&amp;gt; операций вычисления элементов матрицы &amp;lt;math&amp;gt;g_{jm}^{(i+1)} = g_{mj}^{(i+1)}&amp;lt;/math&amp;gt; и &amp;lt;math&amp;gt;g_{km}^{(i+1)} = g_{mk}^{(i+1)}&amp;lt;/math&amp;gt;, &amp;lt;math&amp;gt;m \ne j,k&amp;lt;/math&amp;gt;, а также вычисления элементов &amp;lt;math&amp;gt;g_{jj}^{(i+1)} &amp;lt;/math&amp;gt; и &amp;lt;math&amp;gt;g_{kk}^{(i+1)} &amp;lt;/math&amp;gt;. &lt;br /&gt;
&lt;br /&gt;
Суммарное количество итераций равно &amp;lt;math&amp;gt;\frac{n(n-1)}{2}&amp;lt;/math&amp;gt; (Различные варианты выбора &amp;lt;math&amp;gt;j&amp;lt;/math&amp;gt; и &amp;lt;math&amp;gt;k&amp;lt;/math&amp;gt;). &lt;br /&gt;
&lt;br /&gt;
Асимптотически метод сходится квадратично. &lt;br /&gt;
&lt;br /&gt;
Таким образом, при классификации по высоте ЯПФ метод Якоби относится к алгоритмам со сложностью &amp;lt;math&amp;gt;O(n^2)&amp;lt;/math&amp;gt;&amp;amp;nbsp;, а при классификации по ширине ЯПФ — к алгоритмам со сложностью &amp;lt;math&amp;gt;O(n)&amp;lt;/math&amp;gt;.&lt;br /&gt;
&lt;br /&gt;
=== Входные и выходные данные алгоритма ===&lt;br /&gt;
&#039;&#039;&#039;Входные данные&#039;&#039;&#039;: плотная матрица &amp;lt;math&amp;gt;G&amp;lt;/math&amp;gt; размера &amp;lt;math&amp;gt;n&amp;lt;/math&amp;gt;х&amp;lt;math&amp;gt;n&amp;lt;/math&amp;gt;, где &amp;lt;math&amp;gt;A= G^TG&amp;lt;/math&amp;gt; – симметрическая матрица.&lt;br /&gt;
&lt;br /&gt;
&#039;&#039;&#039;Объём входных данных&#039;&#039;&#039;: &amp;lt;math&amp;gt;n^2&amp;lt;/math&amp;gt; (т.к. для хранения матрицы &amp;lt;math&amp;gt;G&amp;lt;/math&amp;gt; используем двумерный массив размера &amp;lt;math&amp;gt;n&amp;lt;/math&amp;gt;х&amp;lt;math&amp;gt;n&amp;lt;/math&amp;gt;)&lt;br /&gt;
&lt;br /&gt;
&#039;&#039;&#039;Выходные данные&#039;&#039;&#039;: &amp;lt;math&amp;gt;\sigma_{i}&amp;lt;/math&amp;gt;  - сингулярные числа, матрица &amp;lt;math&amp;gt;U&amp;lt;/math&amp;gt; левых сингулярных векторов и матрица &amp;lt;math&amp;gt;V&amp;lt;/math&amp;gt; правых сингулярных векторов.&lt;br /&gt;
&lt;br /&gt;
&#039;&#039;&#039;Объём выходных данных&#039;&#039;&#039;: &amp;lt;math&amp;gt;2n^2 + n&amp;lt;/math&amp;gt; (т.к. необходимо хранить вектор сингулярных чисел длины &amp;lt;math&amp;gt;n&amp;lt;/math&amp;gt;, а также две матрицы &amp;lt;math&amp;gt;U, V&amp;lt;/math&amp;gt; левых и правых сингулярных векторов размера &amp;lt;math&amp;gt;n&amp;lt;/math&amp;gt;х&amp;lt;math&amp;gt;n&amp;lt;/math&amp;gt;).&lt;br /&gt;
&lt;br /&gt;
=== Свойства алгоритма ===&lt;br /&gt;
Метод Якоби является самым медленным из имеющихся алгоритмов вычисления сингулярных чисел и сингулярных векторов матрицы. Тем не менее, для  матриц &amp;lt;math&amp;gt;G&amp;lt;/math&amp;gt;, которые могут быть представлены в виде &amp;lt;math&amp;gt;G=DX&amp;lt;/math&amp;gt;, где &amp;lt;math&amp;gt;D&amp;lt;/math&amp;gt; - диагональная, а &amp;lt;math&amp;gt;X&amp;lt;/math&amp;gt; - хорошо обусловлена, он способен вычислять сингулярные числа и вектора намного точнее, чем другие методы&amp;lt;ref&amp;gt;Дж. Деммель «Вычислительная линейная алгебра» (стр. 261-264)&amp;lt;/ref&amp;gt;. &lt;br /&gt;
&lt;br /&gt;
Вычислительная мощность алгоритма, как отношение числа операций к суммарному объему входных и выходных данных является линейной.&lt;br /&gt;
&lt;br /&gt;
Метод Якоби не детерминирован, так как является итерационным алгоритмом с выходом по точности (число итераций зависит от входных данных и порогового значения).&lt;br /&gt;
&lt;br /&gt;
== Программная реализация алгоритма ==&lt;br /&gt;
&lt;br /&gt;
=== Особенности реализации последовательного алгоритма ===&lt;br /&gt;
&lt;br /&gt;
=== Локальность данных и вычислений ===&lt;br /&gt;
&lt;br /&gt;
=== Возможные способы и особенности параллельной реализации алгоритма ===&lt;br /&gt;
&lt;br /&gt;
=== Масштабируемость алгоритма и его реализации ===&lt;br /&gt;
&lt;br /&gt;
=== Динамические характеристики и эффективность реализации алгоритма ===&lt;br /&gt;
&lt;br /&gt;
=== Выводы для классов архитектур ===&lt;br /&gt;
&lt;br /&gt;
=== Существующие реализации алгоритма ===&lt;br /&gt;
Метод Якоби нахождения сингулярных значений и векторов реализован в таких пакетах, как LAPACK, LINPACK/EISPACK, Intel MKL &amp;lt;ref&amp;gt;http://www.alglib.net/matrixops/general/svd.php&amp;lt;/ref&amp;gt;.&lt;br /&gt;
&lt;br /&gt;
Так же функция Якоби реализована в пакете Matlab.&lt;br /&gt;
&lt;br /&gt;
Т. к. алгоритм считается медленным, он не включен во многие известные пакеты.&lt;br /&gt;
&lt;br /&gt;
== Литература ==&lt;br /&gt;
1. Дж. Деммель Вычислительная линейная алгебра. Изд. Мир, 2001.&lt;/div&gt;</summary>
		<author><name>Davletshuna Alexandra</name></author>
	</entry>
	<entry>
		<id>https://xn--80aecvaldz.xn--80ahdrnmvk.xn--p1ai/w/ru/index.php?title=%D0%A3%D1%87%D0%B0%D1%81%D1%82%D0%BD%D0%B8%D0%BA:Davletshuna_Alexandra/%D0%9C%D0%B5%D1%82%D0%BE%D0%B4_%D0%AF%D0%BA%D0%BE%D0%B1%D0%B8_%D0%B2%D1%8B%D1%87%D0%B8%D1%81%D0%BB%D0%B5%D0%BD%D0%B8%D1%8F_%D1%81%D0%B8%D0%BD%D0%B3%D1%83%D0%BB%D1%8F%D1%80%D0%BD%D1%8B%D1%85_%D1%87%D0%B8%D1%81%D0%B5%D0%BB_%D0%B8_%D0%B2%D0%B5%D0%BA%D1%82%D0%BE%D1%80%D0%BE%D0%B2&amp;diff=9901</id>
		<title>Участник:Davletshuna Alexandra/Метод Якоби вычисления сингулярных чисел и векторов</title>
		<link rel="alternate" type="text/html" href="https://xn--80aecvaldz.xn--80ahdrnmvk.xn--p1ai/w/ru/index.php?title=%D0%A3%D1%87%D0%B0%D1%81%D1%82%D0%BD%D0%B8%D0%BA:Davletshuna_Alexandra/%D0%9C%D0%B5%D1%82%D0%BE%D0%B4_%D0%AF%D0%BA%D0%BE%D0%B1%D0%B8_%D0%B2%D1%8B%D1%87%D0%B8%D1%81%D0%BB%D0%B5%D0%BD%D0%B8%D1%8F_%D1%81%D0%B8%D0%BD%D0%B3%D1%83%D0%BB%D1%8F%D1%80%D0%BD%D1%8B%D1%85_%D1%87%D0%B8%D1%81%D0%B5%D0%BB_%D0%B8_%D0%B2%D0%B5%D0%BA%D1%82%D0%BE%D1%80%D0%BE%D0%B2&amp;diff=9901"/>
		<updated>2016-10-15T14:28:51Z</updated>

		<summary type="html">&lt;p&gt;Davletshuna Alexandra: /* Математическое описание алгоритма */&lt;/p&gt;
&lt;hr /&gt;
&lt;div&gt;&lt;br /&gt;
{{algorithm&lt;br /&gt;
| name              = Метод Якоби вычисления сингулярных чисел и векторов&lt;br /&gt;
| serial_complexity = &amp;lt;math&amp;gt;O(n^3)&amp;lt;/math&amp;gt;&lt;br /&gt;
| pf_height         = &amp;lt;math&amp;gt;O(n^2)&amp;lt;/math&amp;gt;&lt;br /&gt;
| pf_width          = &amp;lt;math&amp;gt;O(n)&amp;lt;/math&amp;gt;&lt;br /&gt;
| input_data        = &amp;lt;math&amp;gt;n^2&amp;lt;/math&amp;gt;&lt;br /&gt;
| output_data       = &amp;lt;math&amp;gt;2n^2 + n&amp;lt;/math&amp;gt;&lt;br /&gt;
}}&lt;br /&gt;
&lt;br /&gt;
Авторы статьи: [[Участница:Davletshuna Alexandra|Давлетшина Александра]] (группа 619), [[Участница:Alek sandra|Зайцева Александра]] (группа 601)&lt;br /&gt;
&lt;br /&gt;
== Свойства и структура алгоритма ==&lt;br /&gt;
&lt;br /&gt;
=== Общее описание алгоритма ===&lt;br /&gt;
&#039;&#039;&#039;Сингулярным разложением&#039;&#039;&#039; называется разложение прямоугольной вещественной или комплексной матрицы, имеющее широкое применение, в силу своей наглядной геометрической интерпретации, при решении многих прикладных задач. Сингулярное разложение матрицы А позволяет вычислять сингулярные числа данной матрицы, а также, левые и правые сингулярные векторы матрицы А:&lt;br /&gt;
&lt;br /&gt;
•	левые сингулярные векторы матрицы А — это собственные векторы матрицы &amp;lt;math&amp;gt;AA^*&amp;lt;/math&amp;gt;;&lt;br /&gt;
&lt;br /&gt;
•	правые сингулярные векторы матрицы A — это собственные векторы матрицы &amp;lt;math&amp;gt;A^*A&amp;lt;/math&amp;gt;.&lt;br /&gt;
&lt;br /&gt;
Геометрическая интерпретация сингулярного разложения заключается в следующем факте из геометрии: &#039;&#039;Образом любого линейного преобразования, заданного с помощью матрицы &amp;lt;math&amp;gt;m&amp;lt;/math&amp;gt;x&amp;lt;math&amp;gt;n&amp;lt;/math&amp;gt;, примененного к единичной сфере является гиперэллипсоид&#039;&#039;.&lt;br /&gt;
&lt;br /&gt;
Из многочисленных разложений матриц, наиболее удобным является сингулярное разложение матрицы в виде: &amp;lt;math&amp;gt;A=U\Sigma V^*&amp;lt;/math&amp;gt;, где &amp;lt;math&amp;gt;U, V&amp;lt;/math&amp;gt; – унитарные матрицы, а &amp;lt;math&amp;gt;\Sigma&amp;lt;/math&amp;gt; – диагональная матрица с вещественными положительными числами на диагонали &amp;lt;ref&amp;gt;http://algorithms.parallel.ru/&amp;lt;/ref&amp;gt;.&lt;br /&gt;
&lt;br /&gt;
Диагональные элементы матрицы &amp;lt;math&amp;gt;\Sigma&amp;lt;/math&amp;gt; называются сингулярными числами матрицы &amp;lt;math&amp;gt;A&amp;lt;/math&amp;gt;, а столбцы матриц &amp;lt;math&amp;gt;U,V&amp;lt;/math&amp;gt; левыми и правыми сингулярными векторами соответственно.&lt;br /&gt;
&lt;br /&gt;
Алгоритм Якоби сингулярного разложения матрицы был предложен одним из первых в 1846 году. Он приводит прямоугольную матрицу к диагональной матрице с помощью последовательности элементарных вращений. Метод может найти все сингулярные значения с очень высокой точностью. Однако его производительность является довольно низкой, в сравнении с конкурирующими методами.&lt;br /&gt;
&lt;br /&gt;
&#039;&#039;Неявный&#039;&#039;&amp;lt;ref&amp;gt;Дж. Деммель «Вычислительная линейная алгебра» (стр. 261-264)&amp;lt;/ref&amp;gt; метод Якоби математически эквивалентен применению метода Якоби вычисления собственных значений к матрице &amp;lt;math&amp;gt;A = G^TG&amp;lt;/math&amp;gt;.&lt;br /&gt;
Это значит, что на каждом шаге вычисляется вращение Якоби &amp;lt;math&amp;gt;J&amp;lt;/math&amp;gt;, с помощью которого матрица &amp;lt;math&amp;gt;G^TG&amp;lt;/math&amp;gt; неявно пересчитывется в &amp;lt;math&amp;gt;J^TG^TGJ&amp;lt;/math&amp;gt;; вращение выбрано так, чтобы пара внедиагональных элементов из &amp;lt;math&amp;gt;G^TG&amp;lt;/math&amp;gt; обратилась в нули в матрице &amp;lt;math&amp;gt;J^TG^TGJ&amp;lt;/math&amp;gt;. При этом ни &amp;lt;math&amp;gt;G^TG&amp;lt;/math&amp;gt;, ни &amp;lt;math&amp;gt;J^TG^TGJ&amp;lt;/math&amp;gt; не вычисляются в явном виде; вместо них вычисляется матрица &amp;lt;math&amp;gt;GJ&amp;lt;/math&amp;gt;. Поэтому алгоритм называется &#039;&#039;методом односторонних вращений&#039;&#039;.&lt;br /&gt;
&lt;br /&gt;
=== Математическое описание алгоритма ===&lt;br /&gt;
Исходные данные: матрица &amp;lt;math&amp;gt;G&amp;lt;/math&amp;gt; (элементы &amp;lt;math&amp;gt;g_{ij}, i, j = 1, \ldots, n&amp;lt;/math&amp;gt;).&lt;br /&gt;
&lt;br /&gt;
Вычисляемые данные: матрица &amp;lt;math&amp;gt;\Sigma = diag(\sigma_{i})&amp;lt;/math&amp;gt;, где &amp;lt;math&amp;gt;\sigma_{i}&amp;lt;/math&amp;gt; - сингулярные числа, &amp;lt;math&amp;gt;U&amp;lt;/math&amp;gt; - матрица левых сингулярных векторов, &amp;lt;math&amp;gt;V&amp;lt;/math&amp;gt; - матрица правых сингулярных векторов.&lt;br /&gt;
&lt;br /&gt;
симметричную матрицу &amp;lt;math&amp;gt;A = (G^TG)&amp;lt;/math&amp;gt; можно привести к диагональному виду:&lt;br /&gt;
&amp;lt;math&amp;gt;RG^TGR^T&amp;lt;/math&amp;gt;, где&lt;br /&gt;
&lt;br /&gt;
&amp;lt;math&amp;gt;&lt;br /&gt;
R(j,k,\theta) = &lt;br /&gt;
\begin{matrix}&lt;br /&gt;
  \\&lt;br /&gt;
  \\&lt;br /&gt;
  \\&lt;br /&gt;
j \\&lt;br /&gt;
  \\&lt;br /&gt;
k \\&lt;br /&gt;
  \\&lt;br /&gt;
  \\&lt;br /&gt;
  \\&lt;br /&gt;
\end{matrix}&lt;br /&gt;
&amp;lt;/math&amp;gt;  &lt;br /&gt;
&amp;lt;math&amp;gt;&lt;br /&gt;
\begin{bmatrix}&lt;br /&gt;
  &amp;amp; 1 &amp;amp;   &amp;amp;        &amp;amp;              &amp;amp;        &amp;amp;               &amp;amp;         &amp;amp;    &amp;amp;   \\&lt;br /&gt;
  &amp;amp;   &amp;amp; 1 &amp;amp;        &amp;amp;              &amp;amp;        &amp;amp;               &amp;amp;         &amp;amp;    &amp;amp;   \\&lt;br /&gt;
  &amp;amp;   &amp;amp;   &amp;amp; \ddots &amp;amp;              &amp;amp;        &amp;amp;               &amp;amp;         &amp;amp;    &amp;amp;   \\&lt;br /&gt;
  &amp;amp;   &amp;amp;   &amp;amp;        &amp;amp; \cos(\theta) &amp;amp;        &amp;amp; -\sin(\theta) &amp;amp;         &amp;amp;    &amp;amp;   \\&lt;br /&gt;
  &amp;amp;   &amp;amp;   &amp;amp;        &amp;amp;              &amp;amp; \ddots &amp;amp;               &amp;amp;         &amp;amp;    &amp;amp;   \\&lt;br /&gt;
  &amp;amp;   &amp;amp;   &amp;amp;        &amp;amp; \sin(\theta) &amp;amp;        &amp;amp; \cos(\theta)  &amp;amp;         &amp;amp;    &amp;amp;   \\&lt;br /&gt;
  &amp;amp;   &amp;amp;   &amp;amp;        &amp;amp;              &amp;amp;        &amp;amp;               &amp;amp; \ddots  &amp;amp;    &amp;amp;   \\&lt;br /&gt;
  &amp;amp;   &amp;amp;   &amp;amp;        &amp;amp;              &amp;amp;        &amp;amp;               &amp;amp;         &amp;amp; 1  &amp;amp;   \\&lt;br /&gt;
  &amp;amp;   &amp;amp;   &amp;amp;        &amp;amp;              &amp;amp;        &amp;amp;               &amp;amp;         &amp;amp;    &amp;amp; 1 \\&lt;br /&gt;
\end{bmatrix}&lt;br /&gt;
&amp;lt;/math&amp;gt;&lt;br /&gt;
&lt;br /&gt;
Обозначим &amp;lt;math&amp;gt;s = \sin \theta&amp;lt;/math&amp;gt; и &amp;lt;math&amp;gt;c = \cos \theta&amp;lt;/math&amp;gt;.&lt;br /&gt;
&lt;br /&gt;
Перемножив матрицы &amp;lt;math&amp;gt;RG^TGR^T&amp;lt;/math&amp;gt;, получим следующие выражения&amp;lt;ref&amp;gt;http://www.astro.tsu.ru/OsChMet/5_2.html&amp;lt;/ref&amp;gt;:&lt;br /&gt;
&lt;br /&gt;
&amp;lt;math&amp;gt;\begin{align}&lt;br /&gt;
 a_{jj}^{(i+1)} &amp;amp;= c^2\, a_{jj}^{(i)}  -  2\, s c \,a_{jk}^{(i)}  +  s^2\, a_{kk}^{(i)} \\&lt;br /&gt;
 a_{kk}^{(i+1)} &amp;amp;= s^2 \,a_{jj}^{(i)}  +  2 s c\, a_{jk}^{(i)}  +  c^2 \, a_{kk}^{(i)} \\&lt;br /&gt;
 a_{jk}^{(i+1)} &amp;amp;= a_{kj}^{(i+1)} = (c^2 - s^2 ) \, a_{jk}^{(i)}  +  s c \, (a_{kk}^{(i)} - a_{jj}^{(i)} ) \\&lt;br /&gt;
 a_{jm}^{(i+1)} &amp;amp;= a_{mj}^{(i+1)} = c \, a_{jm}^{(i)}  -  s \, a_{km}^{(i)} &amp;amp; m \ne j,k \\&lt;br /&gt;
 a_{km}^{(i+1)} &amp;amp;= a_{mk}^{(i+1)} = s \, a_{jm}^{(i)}  + c \, a_{km}^{(i)} &amp;amp; m \ne j,k \\&lt;br /&gt;
 a_{ml}^{(i+1)} &amp;amp;= a_{ml}^{(i)} &amp;amp;m,l \ne j,k&lt;br /&gt;
\end{align}&amp;lt;/math&amp;gt;&lt;br /&gt;
&lt;br /&gt;
Т.к внедиагональные элементы должны быть равны 0, то выбираем &amp;lt;math&amp;gt;\theta&amp;lt;/math&amp;gt; так, чтобы &amp;lt;math&amp;gt;a_{jk}^{(i+1)} = 0&amp;lt;/math&amp;gt; и &amp;lt;math&amp;gt;a_{kj}^{(i+1)} = 0&amp;lt;/math&amp;gt;.&lt;br /&gt;
&lt;br /&gt;
Тогда решая уравнение получаем, что&lt;br /&gt;
&lt;br /&gt;
&amp;lt;math&amp;gt;&lt;br /&gt;
         \begin{align}&lt;br /&gt;
         \tau &amp;amp;= {a_{jj} - a_{kk}}/{2a_{jk}} \\&lt;br /&gt;
         t &amp;amp;= {sign(\tau)}/(|\tau| + \sqrt{1 + \tau^2}) \\&lt;br /&gt;
         c &amp;amp;= 1/(\sqrt{1 + t^2}) \\&lt;br /&gt;
         s &amp;amp;= ct \\&lt;br /&gt;
         \end{align}&amp;lt;/math&amp;gt;&lt;br /&gt;
&lt;br /&gt;
Остановка вычислений алгоритма наступает, когда внедиагональные элементы становятся меньше некоторого наперед заданного числа &amp;lt;math&amp;gt;\varepsilon&amp;lt;/math&amp;gt;.&lt;br /&gt;
&lt;br /&gt;
=== Вычислительное ядро алгоритма ===&lt;br /&gt;
Вычислительное ядро алгоритма составляет непосредственно вычисление одностороннего вращения Якоби, т.е. вычисление элементов матрицы &amp;lt;math&amp;gt;g_{jm}^{(i+1)} = g_{mj}^{(i+1)}&amp;lt;/math&amp;gt; и &amp;lt;math&amp;gt;g_{km}^{(i+1)} = g_{mk}^{(i+1)}&amp;lt;/math&amp;gt;, &amp;lt;math&amp;gt;m \ne j,k&amp;lt;/math&amp;gt;, а также вычисления элементов &amp;lt;math&amp;gt;g_{jj}^{(i+1)} &amp;lt;/math&amp;gt; и &amp;lt;math&amp;gt;g_{kk}^{(i+1)} &amp;lt;/math&amp;gt;, получившихся после умножения промежуточной матрицы на матрицу вращений Якоби:&lt;br /&gt;
&lt;br /&gt;
&amp;lt;math&amp;gt;\begin{align}&lt;br /&gt;
 g_{jj}^{(i+1)} &amp;amp;= c^2\, a_{jj}^{(i)}  -  2\, s c \,g_{jk}^{(i)}  +  s^2\, g_{kk}^{(i)} \\&lt;br /&gt;
 g_{kk}^{(i+1)} &amp;amp;= s^2 \,a_{jj}^{(i)}  +  2 s c\, g_{jk}^{(i)}  +  c^2 \, g_{kk}^{(i)} \\&lt;br /&gt;
 g_{jk}^{(i+1)} &amp;amp;= g_{kj}^{(i+1)} = (c^2 - s^2 ) \, g_{jk}^{(i)}  +  s c \, (g_{kk}^{(i)} - g_{jj}^{(i)} ) \\&lt;br /&gt;
 g_{jm}^{(i+1)} &amp;amp;= g_{mj}^{(i+1)} = c \, g_{jm}^{(i)}  -  s \, g_{km}^{(i)} &amp;amp; m \ne j,k \\&lt;br /&gt;
 g_{km}^{(i+1)} &amp;amp;= g_{mk}^{(i+1)} = s \, g_{jm}^{(i)}  + c \, g_{km}^{(i)} &amp;amp; m \ne j,k \\&lt;br /&gt;
 g_{ml}^{(i+1)} &amp;amp;= g_{ml}^{(i)} &amp;amp;m,l \ne j,k&lt;br /&gt;
\end{align}&amp;lt;/math&amp;gt;&lt;br /&gt;
&lt;br /&gt;
=== Макроструктура алгоритма ===&lt;br /&gt;
Основную часть метода составляет процедура односторонних вращений матрицы, которая в свою очередь состоит из:&lt;br /&gt;
&lt;br /&gt;
#Вычисление &amp;lt;math&amp;gt;\tau, c, s, t&amp;lt;/math&amp;gt;.&lt;br /&gt;
#Одностороннее вращение матрицы. &lt;br /&gt;
&lt;br /&gt;
Что требует &amp;lt;math&amp;gt;O(n)&amp;lt;/math&amp;gt; операций.&lt;br /&gt;
&lt;br /&gt;
После этого необходимо:&lt;br /&gt;
&lt;br /&gt;
#Вычислить сингулярные числа &amp;lt;math&amp;gt;\sigma_i&amp;lt;/math&amp;gt;.  Что требует &amp;lt;math&amp;gt;O(n)&amp;lt;/math&amp;gt; операций.&lt;br /&gt;
#Вычислить &amp;lt;math&amp;gt;U&amp;lt;/math&amp;gt; и &amp;lt;math&amp;gt;V&amp;lt;/math&amp;gt;. Что требует &amp;lt;math&amp;gt;O(n^2)&amp;lt;/math&amp;gt; операций.&lt;br /&gt;
&lt;br /&gt;
=== Схема реализации последовательного алгоритма ===&lt;br /&gt;
Применение метода Якоби к матрице &amp;lt;math&amp;gt;A = (G^TG)&amp;lt;/math&amp;gt; можно описать следующим образом&amp;lt;ref&amp;gt;Дж. Деммель «Вычислительная линейная алгебра» (стр. 261-263)&amp;lt;/ref&amp;gt;:&lt;br /&gt;
&lt;br /&gt;
Если &amp;lt;math&amp;gt;G = U\Sigma V^T&amp;lt;/math&amp;gt; и &amp;lt;math&amp;gt;\Sigma = diag(\sigma_{i})&amp;lt;/math&amp;gt;, то алгоритм вычисляет сингулярные числа &amp;lt;math&amp;gt;\sigma_{i}&amp;lt;/math&amp;gt;, матрицу &amp;lt;math&amp;gt;U&amp;lt;/math&amp;gt; левых сингулярных векторов и матрицу &amp;lt;math&amp;gt;V&amp;lt;/math&amp;gt; правых сингулярных векторов по следующей схеме:&lt;br /&gt;
&lt;br /&gt;
 repeat&lt;br /&gt;
     for &amp;lt;math&amp;gt;j=1&amp;lt;/math&amp;gt; to &amp;lt;math&amp;gt;n-1&amp;lt;/math&amp;gt;&lt;br /&gt;
         for &amp;lt;math&amp;gt;k=j+1&amp;lt;/math&amp;gt; to &amp;lt;math&amp;gt;n&amp;lt;/math&amp;gt;&lt;br /&gt;
             обратиться к процедуре &#039;&#039;&#039;&#039;&#039;One-Sided-Jacobi-Rotation&amp;lt;math&amp;gt;(G,j,k)&amp;lt;/math&amp;gt;&#039;&#039;&#039;&#039;&#039;&lt;br /&gt;
         end for&lt;br /&gt;
     end for&lt;br /&gt;
 пока &amp;lt;math&amp;gt;G^TG&amp;lt;/math&amp;gt; не станет достаточно близка к диагональной матрице&lt;br /&gt;
 Положить &amp;lt;math&amp;gt;\sigma_{i} = ||G(:,i)||_2 &amp;lt;/math&amp;gt; (норма &amp;lt;math&amp;gt;i&amp;lt;/math&amp;gt;-го столбца в &amp;lt;math&amp;gt;G&amp;lt;/math&amp;gt;)&lt;br /&gt;
 Положить &amp;lt;math&amp;gt;U = [u_{1},\dots, u_{n}]&amp;lt;/math&amp;gt;, где &amp;lt;math&amp;gt;u_{i} = G(:,i)/\sigma_{i}&amp;lt;/math&amp;gt;&lt;br /&gt;
 Положить &amp;lt;math&amp;gt;V = J&amp;lt;/math&amp;gt;, где &amp;lt;math&amp;gt;J&amp;lt;/math&amp;gt; - накопленное произведение вращений Якоби.&lt;br /&gt;
&lt;br /&gt;
Где процедура &#039;&#039;&#039;&#039;&#039;One-Sided-Jacobi-Rotation&#039;&#039;&#039;&#039;&#039; является метод односторонних вращений Якоби:&lt;br /&gt;
&lt;br /&gt;
 proc &#039;&#039;&#039;&#039;&#039;One-Sided-Jacobi-Rotation&amp;lt;math&amp;gt;(G,j,k)&amp;lt;/math&amp;gt;&#039;&#039;&#039;&#039;&#039;&lt;br /&gt;
     вычислить &amp;lt;math&amp;gt;a_{jj} = (G^TG)_{jj}, a_{jk} = (G^TG)_{jk}&amp;lt;/math&amp;gt; и &amp;lt;math&amp;gt;a_{kk} = (G^TG)_{kk}&amp;lt;/math&amp;gt;&lt;br /&gt;
     if &amp;lt;math&amp;gt;|a_{jk}|&amp;lt;/math&amp;gt; не слишком мал&lt;br /&gt;
         &amp;lt;math&amp;gt;&lt;br /&gt;
         \begin{align}&lt;br /&gt;
         \tau &amp;amp;= {a_{jj} - a_{kk}}/{2a_{jk}} \\&lt;br /&gt;
         t &amp;amp;= {sign(\tau)}/(|\tau| + \sqrt{1 + \tau^2}) \\&lt;br /&gt;
         c &amp;amp;= 1/(\sqrt{1 + t^2}) \\&lt;br /&gt;
         s &amp;amp;= ct \\&lt;br /&gt;
         G &amp;amp;= GR(j,k,\theta) \  \dots c=cos\theta, s=sin\theta \end{align}&amp;lt;/math&amp;gt;&lt;br /&gt;
         if нужны правые сингулярные векторы &lt;br /&gt;
             &amp;lt;math&amp;gt;J = JR(j,k,\theta)&amp;lt;/math&amp;gt;&lt;br /&gt;
         end if&lt;br /&gt;
     end if&lt;br /&gt;
&lt;br /&gt;
=== Последовательная сложность алгоритма ===&lt;br /&gt;
&lt;br /&gt;
=== Информационный граф ===&lt;br /&gt;
&lt;br /&gt;
=== Ресурс параллелизма алгоритма ===&lt;br /&gt;
Для выполнения одной итерации метода Якоби требуется последовательно выполнить несколько ярусов:&lt;br /&gt;
# вычислить &amp;lt;math&amp;gt;\tau&amp;lt;/math&amp;gt; &lt;br /&gt;
# вычислить &amp;lt;math&amp;gt;t&amp;lt;/math&amp;gt; &lt;br /&gt;
# вычислить &amp;lt;math&amp;gt;c&amp;lt;/math&amp;gt; &lt;br /&gt;
# выполнить поворот матрицы &amp;lt;math&amp;gt;G&amp;lt;/math&amp;gt; с параллельным выполнением &amp;lt;math&amp;gt;2(n-2)&amp;lt;/math&amp;gt; операций вычисления элементов матрицы &amp;lt;math&amp;gt;g_{jm}^{(i+1)} = g_{mj}^{(i+1)}&amp;lt;/math&amp;gt; и &amp;lt;math&amp;gt;g_{km}^{(i+1)} = g_{mk}^{(i+1)}&amp;lt;/math&amp;gt;, &amp;lt;math&amp;gt;m \ne j,k&amp;lt;/math&amp;gt;, а также вычисления элементов &amp;lt;math&amp;gt;g_{jj}^{(i+1)} &amp;lt;/math&amp;gt; и &amp;lt;math&amp;gt;g_{kk}^{(i+1)} &amp;lt;/math&amp;gt;. &lt;br /&gt;
&lt;br /&gt;
Суммарное количество итераций равно &amp;lt;math&amp;gt;\frac{n(n-1)}{2}&amp;lt;/math&amp;gt; (Различные варианты выбора &amp;lt;math&amp;gt;j&amp;lt;/math&amp;gt; и &amp;lt;math&amp;gt;k&amp;lt;/math&amp;gt;). &lt;br /&gt;
&lt;br /&gt;
Асимптотически метод сходится квадратично. &lt;br /&gt;
&lt;br /&gt;
Таким образом, при классификации по высоте ЯПФ метод Якоби относится к алгоритмам со сложностью &amp;lt;math&amp;gt;O(n^2)&amp;lt;/math&amp;gt;&amp;amp;nbsp;, а при классификации по ширине ЯПФ — к алгоритмам со сложностью &amp;lt;math&amp;gt;O(n)&amp;lt;/math&amp;gt;.&lt;br /&gt;
&lt;br /&gt;
=== Входные и выходные данные алгоритма ===&lt;br /&gt;
&#039;&#039;&#039;Входные данные&#039;&#039;&#039;: плотная матрица &amp;lt;math&amp;gt;G&amp;lt;/math&amp;gt; размера &amp;lt;math&amp;gt;n&amp;lt;/math&amp;gt;х&amp;lt;math&amp;gt;n&amp;lt;/math&amp;gt;, где &amp;lt;math&amp;gt;A= G^TG&amp;lt;/math&amp;gt; – симметрическая матрица.&lt;br /&gt;
&lt;br /&gt;
&#039;&#039;&#039;Объём входных данных&#039;&#039;&#039;: &amp;lt;math&amp;gt;n^2&amp;lt;/math&amp;gt; (т.к. для хранения матрицы &amp;lt;math&amp;gt;G&amp;lt;/math&amp;gt; используем двумерный массив размера &amp;lt;math&amp;gt;n&amp;lt;/math&amp;gt;х&amp;lt;math&amp;gt;n&amp;lt;/math&amp;gt;)&lt;br /&gt;
&lt;br /&gt;
&#039;&#039;&#039;Выходные данные&#039;&#039;&#039;: &amp;lt;math&amp;gt;\sigma_{i}&amp;lt;/math&amp;gt;  - сингулярные числа, матрица &amp;lt;math&amp;gt;U&amp;lt;/math&amp;gt; левых сингулярных векторов и матрица &amp;lt;math&amp;gt;V&amp;lt;/math&amp;gt; правых сингулярных векторов.&lt;br /&gt;
&lt;br /&gt;
&#039;&#039;&#039;Объём выходных данных&#039;&#039;&#039;: &amp;lt;math&amp;gt;2n^2 + n&amp;lt;/math&amp;gt; (т.к. необходимо хранить вектор сингулярных чисел длины &amp;lt;math&amp;gt;n&amp;lt;/math&amp;gt;, а также две матрицы &amp;lt;math&amp;gt;U, V&amp;lt;/math&amp;gt; левых и правых сингулярных векторов размера &amp;lt;math&amp;gt;n&amp;lt;/math&amp;gt;х&amp;lt;math&amp;gt;n&amp;lt;/math&amp;gt;).&lt;br /&gt;
&lt;br /&gt;
=== Свойства алгоритма ===&lt;br /&gt;
Метод Якоби является самым медленным из имеющихся алгоритмов вычисления сингулярных чисел и сингулярных векторов матрицы. Тем не менее, для  матриц &amp;lt;math&amp;gt;G&amp;lt;/math&amp;gt;, которые могут быть представлены в виде &amp;lt;math&amp;gt;G=DX&amp;lt;/math&amp;gt;, где &amp;lt;math&amp;gt;D&amp;lt;/math&amp;gt; - диагональная, а &amp;lt;math&amp;gt;X&amp;lt;/math&amp;gt; - хорошо обусловлена, он способен вычислять сингулярные числа и вектора намного точнее, чем другие методы&amp;lt;ref&amp;gt;Дж. Деммель «Вычислительная линейная алгебра» (стр. 261-264)&amp;lt;/ref&amp;gt;. &lt;br /&gt;
&lt;br /&gt;
Вычислительная мощность алгоритма, как отношение числа операций к суммарному объему входных и выходных данных является линейной.&lt;br /&gt;
&lt;br /&gt;
Метод Якоби не детерминирован, так как является итерационным алгоритмом с выходом по точности (число итераций зависит от входных данных и порогового значения).&lt;br /&gt;
&lt;br /&gt;
== Программная реализация алгоритма ==&lt;br /&gt;
&lt;br /&gt;
=== Особенности реализации последовательного алгоритма ===&lt;br /&gt;
&lt;br /&gt;
=== Локальность данных и вычислений ===&lt;br /&gt;
&lt;br /&gt;
=== Возможные способы и особенности параллельной реализации алгоритма ===&lt;br /&gt;
&lt;br /&gt;
=== Масштабируемость алгоритма и его реализации ===&lt;br /&gt;
&lt;br /&gt;
=== Динамические характеристики и эффективность реализации алгоритма ===&lt;br /&gt;
&lt;br /&gt;
=== Выводы для классов архитектур ===&lt;br /&gt;
&lt;br /&gt;
=== Существующие реализации алгоритма ===&lt;br /&gt;
Метод Якоби нахождения сингулярных значений и векторов реализован в таких пакетах, как LAPACK, LINPACK/EISPACK, Intel MKL &amp;lt;ref&amp;gt;http://www.alglib.net/matrixops/general/svd.php&amp;lt;/ref&amp;gt;.&lt;br /&gt;
&lt;br /&gt;
Так же функция Якоби реализована в пакете Matlab.&lt;br /&gt;
&lt;br /&gt;
Т. к. алгоритм считается медленным, он не включен во многие известные пакеты.&lt;br /&gt;
&lt;br /&gt;
== Литература ==&lt;br /&gt;
1. Дж. Деммель Вычислительная линейная алгебра. Изд. Мир, 2001.&lt;/div&gt;</summary>
		<author><name>Davletshuna Alexandra</name></author>
	</entry>
	<entry>
		<id>https://xn--80aecvaldz.xn--80ahdrnmvk.xn--p1ai/w/ru/index.php?title=%D0%A3%D1%87%D0%B0%D1%81%D1%82%D0%BD%D0%B8%D0%BA:Davletshuna_Alexandra/%D0%9C%D0%B5%D1%82%D0%BE%D0%B4_%D0%AF%D0%BA%D0%BE%D0%B1%D0%B8_%D0%B2%D1%8B%D1%87%D0%B8%D1%81%D0%BB%D0%B5%D0%BD%D0%B8%D1%8F_%D1%81%D0%B8%D0%BD%D0%B3%D1%83%D0%BB%D1%8F%D1%80%D0%BD%D1%8B%D1%85_%D1%87%D0%B8%D1%81%D0%B5%D0%BB_%D0%B8_%D0%B2%D0%B5%D0%BA%D1%82%D0%BE%D1%80%D0%BE%D0%B2&amp;diff=9896</id>
		<title>Участник:Davletshuna Alexandra/Метод Якоби вычисления сингулярных чисел и векторов</title>
		<link rel="alternate" type="text/html" href="https://xn--80aecvaldz.xn--80ahdrnmvk.xn--p1ai/w/ru/index.php?title=%D0%A3%D1%87%D0%B0%D1%81%D1%82%D0%BD%D0%B8%D0%BA:Davletshuna_Alexandra/%D0%9C%D0%B5%D1%82%D0%BE%D0%B4_%D0%AF%D0%BA%D0%BE%D0%B1%D0%B8_%D0%B2%D1%8B%D1%87%D0%B8%D1%81%D0%BB%D0%B5%D0%BD%D0%B8%D1%8F_%D1%81%D0%B8%D0%BD%D0%B3%D1%83%D0%BB%D1%8F%D1%80%D0%BD%D1%8B%D1%85_%D1%87%D0%B8%D1%81%D0%B5%D0%BB_%D0%B8_%D0%B2%D0%B5%D0%BA%D1%82%D0%BE%D1%80%D0%BE%D0%B2&amp;diff=9896"/>
		<updated>2016-10-15T14:27:55Z</updated>

		<summary type="html">&lt;p&gt;Davletshuna Alexandra: /* Математическое описание алгоритма */&lt;/p&gt;
&lt;hr /&gt;
&lt;div&gt;&lt;br /&gt;
{{algorithm&lt;br /&gt;
| name              = Метод Якоби вычисления сингулярных чисел и векторов&lt;br /&gt;
| serial_complexity = &amp;lt;math&amp;gt;O(n^3)&amp;lt;/math&amp;gt;&lt;br /&gt;
| pf_height         = &amp;lt;math&amp;gt;O(n^2)&amp;lt;/math&amp;gt;&lt;br /&gt;
| pf_width          = &amp;lt;math&amp;gt;O(n)&amp;lt;/math&amp;gt;&lt;br /&gt;
| input_data        = &amp;lt;math&amp;gt;n^2&amp;lt;/math&amp;gt;&lt;br /&gt;
| output_data       = &amp;lt;math&amp;gt;2n^2 + n&amp;lt;/math&amp;gt;&lt;br /&gt;
}}&lt;br /&gt;
&lt;br /&gt;
Авторы статьи: [[Участница:Davletshuna Alexandra|Давлетшина Александра]] (группа 619), [[Участница:Alek sandra|Зайцева Александра]] (группа 601)&lt;br /&gt;
&lt;br /&gt;
== Свойства и структура алгоритма ==&lt;br /&gt;
&lt;br /&gt;
=== Общее описание алгоритма ===&lt;br /&gt;
&#039;&#039;&#039;Сингулярным разложением&#039;&#039;&#039; называется разложение прямоугольной вещественной или комплексной матрицы, имеющее широкое применение, в силу своей наглядной геометрической интерпретации, при решении многих прикладных задач. Сингулярное разложение матрицы А позволяет вычислять сингулярные числа данной матрицы, а также, левые и правые сингулярные векторы матрицы А:&lt;br /&gt;
&lt;br /&gt;
•	левые сингулярные векторы матрицы А — это собственные векторы матрицы &amp;lt;math&amp;gt;AA^*&amp;lt;/math&amp;gt;;&lt;br /&gt;
&lt;br /&gt;
•	правые сингулярные векторы матрицы A — это собственные векторы матрицы &amp;lt;math&amp;gt;A^*A&amp;lt;/math&amp;gt;.&lt;br /&gt;
&lt;br /&gt;
Геометрическая интерпретация сингулярного разложения заключается в следующем факте из геометрии: &#039;&#039;Образом любого линейного преобразования, заданного с помощью матрицы &amp;lt;math&amp;gt;m&amp;lt;/math&amp;gt;x&amp;lt;math&amp;gt;n&amp;lt;/math&amp;gt;, примененного к единичной сфере является гиперэллипсоид&#039;&#039;.&lt;br /&gt;
&lt;br /&gt;
Из многочисленных разложений матриц, наиболее удобным является сингулярное разложение матрицы в виде: &amp;lt;math&amp;gt;A=U\Sigma V^*&amp;lt;/math&amp;gt;, где &amp;lt;math&amp;gt;U, V&amp;lt;/math&amp;gt; – унитарные матрицы, а &amp;lt;math&amp;gt;\Sigma&amp;lt;/math&amp;gt; – диагональная матрица с вещественными положительными числами на диагонали &amp;lt;ref&amp;gt;http://algorithms.parallel.ru/&amp;lt;/ref&amp;gt;.&lt;br /&gt;
&lt;br /&gt;
Диагональные элементы матрицы &amp;lt;math&amp;gt;\Sigma&amp;lt;/math&amp;gt; называются сингулярными числами матрицы &amp;lt;math&amp;gt;A&amp;lt;/math&amp;gt;, а столбцы матриц &amp;lt;math&amp;gt;U,V&amp;lt;/math&amp;gt; левыми и правыми сингулярными векторами соответственно.&lt;br /&gt;
&lt;br /&gt;
Алгоритм Якоби сингулярного разложения матрицы был предложен одним из первых в 1846 году. Он приводит прямоугольную матрицу к диагональной матрице с помощью последовательности элементарных вращений. Метод может найти все сингулярные значения с очень высокой точностью. Однако его производительность является довольно низкой, в сравнении с конкурирующими методами.&lt;br /&gt;
&lt;br /&gt;
&#039;&#039;Неявный&#039;&#039;&amp;lt;ref&amp;gt;Дж. Деммель «Вычислительная линейная алгебра» (стр. 261-264)&amp;lt;/ref&amp;gt; метод Якоби математически эквивалентен применению метода Якоби вычисления собственных значений к матрице &amp;lt;math&amp;gt;A = G^TG&amp;lt;/math&amp;gt;.&lt;br /&gt;
Это значит, что на каждом шаге вычисляется вращение Якоби &amp;lt;math&amp;gt;J&amp;lt;/math&amp;gt;, с помощью которого матрица &amp;lt;math&amp;gt;G^TG&amp;lt;/math&amp;gt; неявно пересчитывется в &amp;lt;math&amp;gt;J^TG^TGJ&amp;lt;/math&amp;gt;; вращение выбрано так, чтобы пара внедиагональных элементов из &amp;lt;math&amp;gt;G^TG&amp;lt;/math&amp;gt; обратилась в нули в матрице &amp;lt;math&amp;gt;J^TG^TGJ&amp;lt;/math&amp;gt;. При этом ни &amp;lt;math&amp;gt;G^TG&amp;lt;/math&amp;gt;, ни &amp;lt;math&amp;gt;J^TG^TGJ&amp;lt;/math&amp;gt; не вычисляются в явном виде; вместо них вычисляется матрица &amp;lt;math&amp;gt;GJ&amp;lt;/math&amp;gt;. Поэтому алгоритм называется &#039;&#039;методом односторонних вращений&#039;&#039;.&lt;br /&gt;
&lt;br /&gt;
=== Математическое описание алгоритма ===&lt;br /&gt;
Исходные данные: матрица &amp;lt;math&amp;gt;G&amp;lt;/math&amp;gt; (элементы &amp;lt;math&amp;gt;g_{ij}, i, j = 1, \ldots, n&amp;lt;/math&amp;gt;).&lt;br /&gt;
&lt;br /&gt;
Вычисляемые данные: матрица &amp;lt;math&amp;gt;\Sigma = diag(\sigma_{i})&amp;lt;/math&amp;gt;, где &amp;lt;math&amp;gt;\sigma_{i}&amp;lt;/math&amp;gt; - сингулярные числа, &amp;lt;math&amp;gt;U&amp;lt;/math&amp;gt; - матрица левых сингулярных векторов, &amp;lt;math&amp;gt;V&amp;lt;/math&amp;gt; - матрица правых сингулярных векторов.&lt;br /&gt;
&lt;br /&gt;
симметричную матрицу &amp;lt;math&amp;gt;A = (G^TG)&amp;lt;/math&amp;gt; можно привести к диагональному виду:&lt;br /&gt;
&amp;lt;math&amp;gt;RG^TGR^T&amp;lt;/math&amp;gt;, где&lt;br /&gt;
&lt;br /&gt;
&amp;lt;math&amp;gt;&lt;br /&gt;
\begin{matrix}&lt;br /&gt;
  &amp;amp;     &amp;amp;      &amp;amp;       &amp;amp; j &amp;amp;         &amp;amp; k &amp;amp;         &amp;amp;    &amp;amp;   \\&lt;br /&gt;
\end{matrix}&lt;br /&gt;
&amp;lt;/math&amp;gt;&lt;br /&gt;
&lt;br /&gt;
&amp;lt;math&amp;gt;&lt;br /&gt;
R(j,k,\theta) = &lt;br /&gt;
\begin{matrix}&lt;br /&gt;
  \\&lt;br /&gt;
  \\&lt;br /&gt;
  \\&lt;br /&gt;
j \\&lt;br /&gt;
  \\&lt;br /&gt;
k \\&lt;br /&gt;
  \\&lt;br /&gt;
  \\&lt;br /&gt;
  \\&lt;br /&gt;
\end{matrix}&lt;br /&gt;
&amp;lt;/math&amp;gt;  &lt;br /&gt;
&amp;lt;math&amp;gt;&lt;br /&gt;
\begin{bmatrix}&lt;br /&gt;
  &amp;amp; 1 &amp;amp;   &amp;amp;        &amp;amp;              &amp;amp;        &amp;amp;               &amp;amp;         &amp;amp;    &amp;amp;   \\&lt;br /&gt;
  &amp;amp;   &amp;amp; 1 &amp;amp;        &amp;amp;              &amp;amp;        &amp;amp;               &amp;amp;         &amp;amp;    &amp;amp;   \\&lt;br /&gt;
  &amp;amp;   &amp;amp;   &amp;amp; \ddots &amp;amp;              &amp;amp;        &amp;amp;               &amp;amp;         &amp;amp;    &amp;amp;   \\&lt;br /&gt;
  &amp;amp;   &amp;amp;   &amp;amp;        &amp;amp; \cos(\theta) &amp;amp;        &amp;amp; -\sin(\theta) &amp;amp;         &amp;amp;    &amp;amp;   \\&lt;br /&gt;
  &amp;amp;   &amp;amp;   &amp;amp;        &amp;amp;              &amp;amp; \ddots &amp;amp;               &amp;amp;         &amp;amp;    &amp;amp;   \\&lt;br /&gt;
  &amp;amp;   &amp;amp;   &amp;amp;        &amp;amp; \sin(\theta) &amp;amp;        &amp;amp; \cos(\theta)  &amp;amp;         &amp;amp;    &amp;amp;   \\&lt;br /&gt;
  &amp;amp;   &amp;amp;   &amp;amp;        &amp;amp;              &amp;amp;        &amp;amp;               &amp;amp; \ddots  &amp;amp;    &amp;amp;   \\&lt;br /&gt;
  &amp;amp;   &amp;amp;   &amp;amp;        &amp;amp;              &amp;amp;        &amp;amp;               &amp;amp;         &amp;amp; 1  &amp;amp;   \\&lt;br /&gt;
  &amp;amp;   &amp;amp;   &amp;amp;        &amp;amp;              &amp;amp;        &amp;amp;               &amp;amp;         &amp;amp;    &amp;amp; 1 \\&lt;br /&gt;
\end{bmatrix}&lt;br /&gt;
&amp;lt;/math&amp;gt;&lt;br /&gt;
&lt;br /&gt;
Обозначим &amp;lt;math&amp;gt;s = \sin \theta&amp;lt;/math&amp;gt; и &amp;lt;math&amp;gt;c = \cos \theta&amp;lt;/math&amp;gt;.&lt;br /&gt;
&lt;br /&gt;
Перемножив матрицы &amp;lt;math&amp;gt;RG^TGR^T&amp;lt;/math&amp;gt;, получим следующие выражения&amp;lt;ref&amp;gt;http://www.astro.tsu.ru/OsChMet/5_2.html&amp;lt;/ref&amp;gt;:&lt;br /&gt;
&lt;br /&gt;
&amp;lt;math&amp;gt;\begin{align}&lt;br /&gt;
 a_{jj}^{(i+1)} &amp;amp;= c^2\, a_{jj}^{(i)}  -  2\, s c \,a_{jk}^{(i)}  +  s^2\, a_{kk}^{(i)} \\&lt;br /&gt;
 a_{kk}^{(i+1)} &amp;amp;= s^2 \,a_{jj}^{(i)}  +  2 s c\, a_{jk}^{(i)}  +  c^2 \, a_{kk}^{(i)} \\&lt;br /&gt;
 a_{jk}^{(i+1)} &amp;amp;= a_{kj}^{(i+1)} = (c^2 - s^2 ) \, a_{jk}^{(i)}  +  s c \, (a_{kk}^{(i)} - a_{jj}^{(i)} ) \\&lt;br /&gt;
 a_{jm}^{(i+1)} &amp;amp;= a_{mj}^{(i+1)} = c \, a_{jm}^{(i)}  -  s \, a_{km}^{(i)} &amp;amp; m \ne j,k \\&lt;br /&gt;
 a_{km}^{(i+1)} &amp;amp;= a_{mk}^{(i+1)} = s \, a_{jm}^{(i)}  + c \, a_{km}^{(i)} &amp;amp; m \ne j,k \\&lt;br /&gt;
 a_{ml}^{(i+1)} &amp;amp;= a_{ml}^{(i)} &amp;amp;m,l \ne j,k&lt;br /&gt;
\end{align}&amp;lt;/math&amp;gt;&lt;br /&gt;
&lt;br /&gt;
Т.к внедиагональные элементы должны быть равны 0, то выбираем &amp;lt;math&amp;gt;\theta&amp;lt;/math&amp;gt; так, чтобы &amp;lt;math&amp;gt;a_{jk}^{(i+1)} = 0&amp;lt;/math&amp;gt; и &amp;lt;math&amp;gt;a_{kj}^{(i+1)} = 0&amp;lt;/math&amp;gt;.&lt;br /&gt;
&lt;br /&gt;
Тогда решая уравнение получаем, что&lt;br /&gt;
&lt;br /&gt;
&amp;lt;math&amp;gt;&lt;br /&gt;
         \begin{align}&lt;br /&gt;
         \tau &amp;amp;= {a_{jj} - a_{kk}}/{2a_{jk}} \\&lt;br /&gt;
         t &amp;amp;= {sign(\tau)}/(|\tau| + \sqrt{1 + \tau^2}) \\&lt;br /&gt;
         c &amp;amp;= 1/(\sqrt{1 + t^2}) \\&lt;br /&gt;
         s &amp;amp;= ct \\&lt;br /&gt;
         \end{align}&amp;lt;/math&amp;gt;&lt;br /&gt;
&lt;br /&gt;
Остановка вычислений алгоритма наступает, когда внедиагональные элементы становятся меньше некоторого наперед заданного числа &amp;lt;math&amp;gt;\varepsilon&amp;lt;/math&amp;gt;.&lt;br /&gt;
&lt;br /&gt;
=== Вычислительное ядро алгоритма ===&lt;br /&gt;
Вычислительное ядро алгоритма составляет непосредственно вычисление одностороннего вращения Якоби, т.е. вычисление элементов матрицы &amp;lt;math&amp;gt;g_{jm}^{(i+1)} = g_{mj}^{(i+1)}&amp;lt;/math&amp;gt; и &amp;lt;math&amp;gt;g_{km}^{(i+1)} = g_{mk}^{(i+1)}&amp;lt;/math&amp;gt;, &amp;lt;math&amp;gt;m \ne j,k&amp;lt;/math&amp;gt;, а также вычисления элементов &amp;lt;math&amp;gt;g_{jj}^{(i+1)} &amp;lt;/math&amp;gt; и &amp;lt;math&amp;gt;g_{kk}^{(i+1)} &amp;lt;/math&amp;gt;, получившихся после умножения промежуточной матрицы на матрицу вращений Якоби:&lt;br /&gt;
&lt;br /&gt;
&amp;lt;math&amp;gt;\begin{align}&lt;br /&gt;
 g_{jj}^{(i+1)} &amp;amp;= c^2\, a_{jj}^{(i)}  -  2\, s c \,g_{jk}^{(i)}  +  s^2\, g_{kk}^{(i)} \\&lt;br /&gt;
 g_{kk}^{(i+1)} &amp;amp;= s^2 \,a_{jj}^{(i)}  +  2 s c\, g_{jk}^{(i)}  +  c^2 \, g_{kk}^{(i)} \\&lt;br /&gt;
 g_{jk}^{(i+1)} &amp;amp;= g_{kj}^{(i+1)} = (c^2 - s^2 ) \, g_{jk}^{(i)}  +  s c \, (g_{kk}^{(i)} - g_{jj}^{(i)} ) \\&lt;br /&gt;
 g_{jm}^{(i+1)} &amp;amp;= g_{mj}^{(i+1)} = c \, g_{jm}^{(i)}  -  s \, g_{km}^{(i)} &amp;amp; m \ne j,k \\&lt;br /&gt;
 g_{km}^{(i+1)} &amp;amp;= g_{mk}^{(i+1)} = s \, g_{jm}^{(i)}  + c \, g_{km}^{(i)} &amp;amp; m \ne j,k \\&lt;br /&gt;
 g_{ml}^{(i+1)} &amp;amp;= g_{ml}^{(i)} &amp;amp;m,l \ne j,k&lt;br /&gt;
\end{align}&amp;lt;/math&amp;gt;&lt;br /&gt;
&lt;br /&gt;
=== Макроструктура алгоритма ===&lt;br /&gt;
Основную часть метода составляет процедура односторонних вращений матрицы, которая в свою очередь состоит из:&lt;br /&gt;
&lt;br /&gt;
#Вычисление &amp;lt;math&amp;gt;\tau, c, s, t&amp;lt;/math&amp;gt;.&lt;br /&gt;
#Одностороннее вращение матрицы. &lt;br /&gt;
&lt;br /&gt;
Что требует &amp;lt;math&amp;gt;O(n)&amp;lt;/math&amp;gt; операций.&lt;br /&gt;
&lt;br /&gt;
После этого необходимо:&lt;br /&gt;
&lt;br /&gt;
#Вычислить сингулярные числа &amp;lt;math&amp;gt;\sigma_i&amp;lt;/math&amp;gt;.  Что требует &amp;lt;math&amp;gt;O(n)&amp;lt;/math&amp;gt; операций.&lt;br /&gt;
#Вычислить &amp;lt;math&amp;gt;U&amp;lt;/math&amp;gt; и &amp;lt;math&amp;gt;V&amp;lt;/math&amp;gt;. Что требует &amp;lt;math&amp;gt;O(n^2)&amp;lt;/math&amp;gt; операций.&lt;br /&gt;
&lt;br /&gt;
=== Схема реализации последовательного алгоритма ===&lt;br /&gt;
Применение метода Якоби к матрице &amp;lt;math&amp;gt;A = (G^TG)&amp;lt;/math&amp;gt; можно описать следующим образом&amp;lt;ref&amp;gt;Дж. Деммель «Вычислительная линейная алгебра» (стр. 261-263)&amp;lt;/ref&amp;gt;:&lt;br /&gt;
&lt;br /&gt;
Если &amp;lt;math&amp;gt;G = U\Sigma V^T&amp;lt;/math&amp;gt; и &amp;lt;math&amp;gt;\Sigma = diag(\sigma_{i})&amp;lt;/math&amp;gt;, то алгоритм вычисляет сингулярные числа &amp;lt;math&amp;gt;\sigma_{i}&amp;lt;/math&amp;gt;, матрицу &amp;lt;math&amp;gt;U&amp;lt;/math&amp;gt; левых сингулярных векторов и матрицу &amp;lt;math&amp;gt;V&amp;lt;/math&amp;gt; правых сингулярных векторов по следующей схеме:&lt;br /&gt;
&lt;br /&gt;
 repeat&lt;br /&gt;
     for &amp;lt;math&amp;gt;j=1&amp;lt;/math&amp;gt; to &amp;lt;math&amp;gt;n-1&amp;lt;/math&amp;gt;&lt;br /&gt;
         for &amp;lt;math&amp;gt;k=j+1&amp;lt;/math&amp;gt; to &amp;lt;math&amp;gt;n&amp;lt;/math&amp;gt;&lt;br /&gt;
             обратиться к процедуре &#039;&#039;&#039;&#039;&#039;One-Sided-Jacobi-Rotation&amp;lt;math&amp;gt;(G,j,k)&amp;lt;/math&amp;gt;&#039;&#039;&#039;&#039;&#039;&lt;br /&gt;
         end for&lt;br /&gt;
     end for&lt;br /&gt;
 пока &amp;lt;math&amp;gt;G^TG&amp;lt;/math&amp;gt; не станет достаточно близка к диагональной матрице&lt;br /&gt;
 Положить &amp;lt;math&amp;gt;\sigma_{i} = ||G(:,i)||_2 &amp;lt;/math&amp;gt; (норма &amp;lt;math&amp;gt;i&amp;lt;/math&amp;gt;-го столбца в &amp;lt;math&amp;gt;G&amp;lt;/math&amp;gt;)&lt;br /&gt;
 Положить &amp;lt;math&amp;gt;U = [u_{1},\dots, u_{n}]&amp;lt;/math&amp;gt;, где &amp;lt;math&amp;gt;u_{i} = G(:,i)/\sigma_{i}&amp;lt;/math&amp;gt;&lt;br /&gt;
 Положить &amp;lt;math&amp;gt;V = J&amp;lt;/math&amp;gt;, где &amp;lt;math&amp;gt;J&amp;lt;/math&amp;gt; - накопленное произведение вращений Якоби.&lt;br /&gt;
&lt;br /&gt;
Где процедура &#039;&#039;&#039;&#039;&#039;One-Sided-Jacobi-Rotation&#039;&#039;&#039;&#039;&#039; является метод односторонних вращений Якоби:&lt;br /&gt;
&lt;br /&gt;
 proc &#039;&#039;&#039;&#039;&#039;One-Sided-Jacobi-Rotation&amp;lt;math&amp;gt;(G,j,k)&amp;lt;/math&amp;gt;&#039;&#039;&#039;&#039;&#039;&lt;br /&gt;
     вычислить &amp;lt;math&amp;gt;a_{jj} = (G^TG)_{jj}, a_{jk} = (G^TG)_{jk}&amp;lt;/math&amp;gt; и &amp;lt;math&amp;gt;a_{kk} = (G^TG)_{kk}&amp;lt;/math&amp;gt;&lt;br /&gt;
     if &amp;lt;math&amp;gt;|a_{jk}|&amp;lt;/math&amp;gt; не слишком мал&lt;br /&gt;
         &amp;lt;math&amp;gt;&lt;br /&gt;
         \begin{align}&lt;br /&gt;
         \tau &amp;amp;= {a_{jj} - a_{kk}}/{2a_{jk}} \\&lt;br /&gt;
         t &amp;amp;= {sign(\tau)}/(|\tau| + \sqrt{1 + \tau^2}) \\&lt;br /&gt;
         c &amp;amp;= 1/(\sqrt{1 + t^2}) \\&lt;br /&gt;
         s &amp;amp;= ct \\&lt;br /&gt;
         G &amp;amp;= GR(j,k,\theta) \  \dots c=cos\theta, s=sin\theta \end{align}&amp;lt;/math&amp;gt;&lt;br /&gt;
         if нужны правые сингулярные векторы &lt;br /&gt;
             &amp;lt;math&amp;gt;J = JR(j,k,\theta)&amp;lt;/math&amp;gt;&lt;br /&gt;
         end if&lt;br /&gt;
     end if&lt;br /&gt;
&lt;br /&gt;
=== Последовательная сложность алгоритма ===&lt;br /&gt;
&lt;br /&gt;
=== Информационный граф ===&lt;br /&gt;
&lt;br /&gt;
=== Ресурс параллелизма алгоритма ===&lt;br /&gt;
Для выполнения одной итерации метода Якоби требуется последовательно выполнить несколько ярусов:&lt;br /&gt;
# вычислить &amp;lt;math&amp;gt;\tau&amp;lt;/math&amp;gt; &lt;br /&gt;
# вычислить &amp;lt;math&amp;gt;t&amp;lt;/math&amp;gt; &lt;br /&gt;
# вычислить &amp;lt;math&amp;gt;c&amp;lt;/math&amp;gt; &lt;br /&gt;
# выполнить поворот матрицы &amp;lt;math&amp;gt;G&amp;lt;/math&amp;gt; с параллельным выполнением &amp;lt;math&amp;gt;2(n-2)&amp;lt;/math&amp;gt; операций вычисления элементов матрицы &amp;lt;math&amp;gt;g_{jm}^{(i+1)} = g_{mj}^{(i+1)}&amp;lt;/math&amp;gt; и &amp;lt;math&amp;gt;g_{km}^{(i+1)} = g_{mk}^{(i+1)}&amp;lt;/math&amp;gt;, &amp;lt;math&amp;gt;m \ne j,k&amp;lt;/math&amp;gt;, а также вычисления элементов &amp;lt;math&amp;gt;g_{jj}^{(i+1)} &amp;lt;/math&amp;gt; и &amp;lt;math&amp;gt;g_{kk}^{(i+1)} &amp;lt;/math&amp;gt;. &lt;br /&gt;
&lt;br /&gt;
Суммарное количество итераций равно &amp;lt;math&amp;gt;\frac{n(n-1)}{2}&amp;lt;/math&amp;gt; (Различные варианты выбора &amp;lt;math&amp;gt;j&amp;lt;/math&amp;gt; и &amp;lt;math&amp;gt;k&amp;lt;/math&amp;gt;). &lt;br /&gt;
&lt;br /&gt;
Асимптотически метод сходится квадратично. &lt;br /&gt;
&lt;br /&gt;
Таким образом, при классификации по высоте ЯПФ метод Якоби относится к алгоритмам со сложностью &amp;lt;math&amp;gt;O(n^2)&amp;lt;/math&amp;gt;&amp;amp;nbsp;, а при классификации по ширине ЯПФ — к алгоритмам со сложностью &amp;lt;math&amp;gt;O(n)&amp;lt;/math&amp;gt;.&lt;br /&gt;
&lt;br /&gt;
=== Входные и выходные данные алгоритма ===&lt;br /&gt;
&#039;&#039;&#039;Входные данные&#039;&#039;&#039;: плотная матрица &amp;lt;math&amp;gt;G&amp;lt;/math&amp;gt; размера &amp;lt;math&amp;gt;n&amp;lt;/math&amp;gt;х&amp;lt;math&amp;gt;n&amp;lt;/math&amp;gt;, где &amp;lt;math&amp;gt;A= G^TG&amp;lt;/math&amp;gt; – симметрическая матрица.&lt;br /&gt;
&lt;br /&gt;
&#039;&#039;&#039;Объём входных данных&#039;&#039;&#039;: &amp;lt;math&amp;gt;n^2&amp;lt;/math&amp;gt; (т.к. для хранения матрицы &amp;lt;math&amp;gt;G&amp;lt;/math&amp;gt; используем двумерный массив размера &amp;lt;math&amp;gt;n&amp;lt;/math&amp;gt;х&amp;lt;math&amp;gt;n&amp;lt;/math&amp;gt;)&lt;br /&gt;
&lt;br /&gt;
&#039;&#039;&#039;Выходные данные&#039;&#039;&#039;: &amp;lt;math&amp;gt;\sigma_{i}&amp;lt;/math&amp;gt;  - сингулярные числа, матрица &amp;lt;math&amp;gt;U&amp;lt;/math&amp;gt; левых сингулярных векторов и матрица &amp;lt;math&amp;gt;V&amp;lt;/math&amp;gt; правых сингулярных векторов.&lt;br /&gt;
&lt;br /&gt;
&#039;&#039;&#039;Объём выходных данных&#039;&#039;&#039;: &amp;lt;math&amp;gt;2n^2 + n&amp;lt;/math&amp;gt; (т.к. необходимо хранить вектор сингулярных чисел длины &amp;lt;math&amp;gt;n&amp;lt;/math&amp;gt;, а также две матрицы &amp;lt;math&amp;gt;U, V&amp;lt;/math&amp;gt; левых и правых сингулярных векторов размера &amp;lt;math&amp;gt;n&amp;lt;/math&amp;gt;х&amp;lt;math&amp;gt;n&amp;lt;/math&amp;gt;).&lt;br /&gt;
&lt;br /&gt;
=== Свойства алгоритма ===&lt;br /&gt;
Метод Якоби является самым медленным из имеющихся алгоритмов вычисления сингулярных чисел и сингулярных векторов матрицы. Тем не менее, для  матриц &amp;lt;math&amp;gt;G&amp;lt;/math&amp;gt;, которые могут быть представлены в виде &amp;lt;math&amp;gt;G=DX&amp;lt;/math&amp;gt;, где &amp;lt;math&amp;gt;D&amp;lt;/math&amp;gt; - диагональная, а &amp;lt;math&amp;gt;X&amp;lt;/math&amp;gt; - хорошо обусловлена, он способен вычислять сингулярные числа и вектора намного точнее, чем другие методы&amp;lt;ref&amp;gt;Дж. Деммель «Вычислительная линейная алгебра» (стр. 261-264)&amp;lt;/ref&amp;gt;. &lt;br /&gt;
&lt;br /&gt;
Вычислительная мощность алгоритма, как отношение числа операций к суммарному объему входных и выходных данных является линейной.&lt;br /&gt;
&lt;br /&gt;
Метод Якоби не детерминирован, так как является итерационным алгоритмом с выходом по точности (число итераций зависит от входных данных и порогового значения).&lt;br /&gt;
&lt;br /&gt;
== Программная реализация алгоритма ==&lt;br /&gt;
&lt;br /&gt;
=== Особенности реализации последовательного алгоритма ===&lt;br /&gt;
&lt;br /&gt;
=== Локальность данных и вычислений ===&lt;br /&gt;
&lt;br /&gt;
=== Возможные способы и особенности параллельной реализации алгоритма ===&lt;br /&gt;
&lt;br /&gt;
=== Масштабируемость алгоритма и его реализации ===&lt;br /&gt;
&lt;br /&gt;
=== Динамические характеристики и эффективность реализации алгоритма ===&lt;br /&gt;
&lt;br /&gt;
=== Выводы для классов архитектур ===&lt;br /&gt;
&lt;br /&gt;
=== Существующие реализации алгоритма ===&lt;br /&gt;
Метод Якоби нахождения сингулярных значений и векторов реализован в таких пакетах, как LAPACK, LINPACK/EISPACK, Intel MKL &amp;lt;ref&amp;gt;http://www.alglib.net/matrixops/general/svd.php&amp;lt;/ref&amp;gt;.&lt;br /&gt;
&lt;br /&gt;
Так же функция Якоби реализована в пакете Matlab.&lt;br /&gt;
&lt;br /&gt;
Т. к. алгоритм считается медленным, он не включен во многие известные пакеты.&lt;br /&gt;
&lt;br /&gt;
== Литература ==&lt;br /&gt;
1. Дж. Деммель Вычислительная линейная алгебра. Изд. Мир, 2001.&lt;/div&gt;</summary>
		<author><name>Davletshuna Alexandra</name></author>
	</entry>
	<entry>
		<id>https://xn--80aecvaldz.xn--80ahdrnmvk.xn--p1ai/w/ru/index.php?title=%D0%A3%D1%87%D0%B0%D1%81%D1%82%D0%BD%D0%B8%D0%BA:Davletshuna_Alexandra/%D0%9C%D0%B5%D1%82%D0%BE%D0%B4_%D0%AF%D0%BA%D0%BE%D0%B1%D0%B8_%D0%B2%D1%8B%D1%87%D0%B8%D1%81%D0%BB%D0%B5%D0%BD%D0%B8%D1%8F_%D1%81%D0%B8%D0%BD%D0%B3%D1%83%D0%BB%D1%8F%D1%80%D0%BD%D1%8B%D1%85_%D1%87%D0%B8%D1%81%D0%B5%D0%BB_%D0%B8_%D0%B2%D0%B5%D0%BA%D1%82%D0%BE%D1%80%D0%BE%D0%B2&amp;diff=9894</id>
		<title>Участник:Davletshuna Alexandra/Метод Якоби вычисления сингулярных чисел и векторов</title>
		<link rel="alternate" type="text/html" href="https://xn--80aecvaldz.xn--80ahdrnmvk.xn--p1ai/w/ru/index.php?title=%D0%A3%D1%87%D0%B0%D1%81%D1%82%D0%BD%D0%B8%D0%BA:Davletshuna_Alexandra/%D0%9C%D0%B5%D1%82%D0%BE%D0%B4_%D0%AF%D0%BA%D0%BE%D0%B1%D0%B8_%D0%B2%D1%8B%D1%87%D0%B8%D1%81%D0%BB%D0%B5%D0%BD%D0%B8%D1%8F_%D1%81%D0%B8%D0%BD%D0%B3%D1%83%D0%BB%D1%8F%D1%80%D0%BD%D1%8B%D1%85_%D1%87%D0%B8%D1%81%D0%B5%D0%BB_%D0%B8_%D0%B2%D0%B5%D0%BA%D1%82%D0%BE%D1%80%D0%BE%D0%B2&amp;diff=9894"/>
		<updated>2016-10-15T14:27:35Z</updated>

		<summary type="html">&lt;p&gt;Davletshuna Alexandra: /* Математическое описание алгоритма */&lt;/p&gt;
&lt;hr /&gt;
&lt;div&gt;&lt;br /&gt;
{{algorithm&lt;br /&gt;
| name              = Метод Якоби вычисления сингулярных чисел и векторов&lt;br /&gt;
| serial_complexity = &amp;lt;math&amp;gt;O(n^3)&amp;lt;/math&amp;gt;&lt;br /&gt;
| pf_height         = &amp;lt;math&amp;gt;O(n^2)&amp;lt;/math&amp;gt;&lt;br /&gt;
| pf_width          = &amp;lt;math&amp;gt;O(n)&amp;lt;/math&amp;gt;&lt;br /&gt;
| input_data        = &amp;lt;math&amp;gt;n^2&amp;lt;/math&amp;gt;&lt;br /&gt;
| output_data       = &amp;lt;math&amp;gt;2n^2 + n&amp;lt;/math&amp;gt;&lt;br /&gt;
}}&lt;br /&gt;
&lt;br /&gt;
Авторы статьи: [[Участница:Davletshuna Alexandra|Давлетшина Александра]] (группа 619), [[Участница:Alek sandra|Зайцева Александра]] (группа 601)&lt;br /&gt;
&lt;br /&gt;
== Свойства и структура алгоритма ==&lt;br /&gt;
&lt;br /&gt;
=== Общее описание алгоритма ===&lt;br /&gt;
&#039;&#039;&#039;Сингулярным разложением&#039;&#039;&#039; называется разложение прямоугольной вещественной или комплексной матрицы, имеющее широкое применение, в силу своей наглядной геометрической интерпретации, при решении многих прикладных задач. Сингулярное разложение матрицы А позволяет вычислять сингулярные числа данной матрицы, а также, левые и правые сингулярные векторы матрицы А:&lt;br /&gt;
&lt;br /&gt;
•	левые сингулярные векторы матрицы А — это собственные векторы матрицы &amp;lt;math&amp;gt;AA^*&amp;lt;/math&amp;gt;;&lt;br /&gt;
&lt;br /&gt;
•	правые сингулярные векторы матрицы A — это собственные векторы матрицы &amp;lt;math&amp;gt;A^*A&amp;lt;/math&amp;gt;.&lt;br /&gt;
&lt;br /&gt;
Геометрическая интерпретация сингулярного разложения заключается в следующем факте из геометрии: &#039;&#039;Образом любого линейного преобразования, заданного с помощью матрицы &amp;lt;math&amp;gt;m&amp;lt;/math&amp;gt;x&amp;lt;math&amp;gt;n&amp;lt;/math&amp;gt;, примененного к единичной сфере является гиперэллипсоид&#039;&#039;.&lt;br /&gt;
&lt;br /&gt;
Из многочисленных разложений матриц, наиболее удобным является сингулярное разложение матрицы в виде: &amp;lt;math&amp;gt;A=U\Sigma V^*&amp;lt;/math&amp;gt;, где &amp;lt;math&amp;gt;U, V&amp;lt;/math&amp;gt; – унитарные матрицы, а &amp;lt;math&amp;gt;\Sigma&amp;lt;/math&amp;gt; – диагональная матрица с вещественными положительными числами на диагонали &amp;lt;ref&amp;gt;http://algorithms.parallel.ru/&amp;lt;/ref&amp;gt;.&lt;br /&gt;
&lt;br /&gt;
Диагональные элементы матрицы &amp;lt;math&amp;gt;\Sigma&amp;lt;/math&amp;gt; называются сингулярными числами матрицы &amp;lt;math&amp;gt;A&amp;lt;/math&amp;gt;, а столбцы матриц &amp;lt;math&amp;gt;U,V&amp;lt;/math&amp;gt; левыми и правыми сингулярными векторами соответственно.&lt;br /&gt;
&lt;br /&gt;
Алгоритм Якоби сингулярного разложения матрицы был предложен одним из первых в 1846 году. Он приводит прямоугольную матрицу к диагональной матрице с помощью последовательности элементарных вращений. Метод может найти все сингулярные значения с очень высокой точностью. Однако его производительность является довольно низкой, в сравнении с конкурирующими методами.&lt;br /&gt;
&lt;br /&gt;
&#039;&#039;Неявный&#039;&#039;&amp;lt;ref&amp;gt;Дж. Деммель «Вычислительная линейная алгебра» (стр. 261-264)&amp;lt;/ref&amp;gt; метод Якоби математически эквивалентен применению метода Якоби вычисления собственных значений к матрице &amp;lt;math&amp;gt;A = G^TG&amp;lt;/math&amp;gt;.&lt;br /&gt;
Это значит, что на каждом шаге вычисляется вращение Якоби &amp;lt;math&amp;gt;J&amp;lt;/math&amp;gt;, с помощью которого матрица &amp;lt;math&amp;gt;G^TG&amp;lt;/math&amp;gt; неявно пересчитывется в &amp;lt;math&amp;gt;J^TG^TGJ&amp;lt;/math&amp;gt;; вращение выбрано так, чтобы пара внедиагональных элементов из &amp;lt;math&amp;gt;G^TG&amp;lt;/math&amp;gt; обратилась в нули в матрице &amp;lt;math&amp;gt;J^TG^TGJ&amp;lt;/math&amp;gt;. При этом ни &amp;lt;math&amp;gt;G^TG&amp;lt;/math&amp;gt;, ни &amp;lt;math&amp;gt;J^TG^TGJ&amp;lt;/math&amp;gt; не вычисляются в явном виде; вместо них вычисляется матрица &amp;lt;math&amp;gt;GJ&amp;lt;/math&amp;gt;. Поэтому алгоритм называется &#039;&#039;методом односторонних вращений&#039;&#039;.&lt;br /&gt;
&lt;br /&gt;
=== Математическое описание алгоритма ===&lt;br /&gt;
Исходные данные: матрица &amp;lt;math&amp;gt;G&amp;lt;/math&amp;gt; (элементы &amp;lt;math&amp;gt;g_{ij}, i, j = 1, \ldots, n&amp;lt;/math&amp;gt;).&lt;br /&gt;
&lt;br /&gt;
Вычисляемые данные: матрица &amp;lt;math&amp;gt;\Sigma = diag(\sigma_{i})&amp;lt;/math&amp;gt;, где &amp;lt;math&amp;gt;\sigma_{i}&amp;lt;/math&amp;gt; - сингулярные числа, &amp;lt;math&amp;gt;U&amp;lt;/math&amp;gt; - матрица левых сингулярных векторов, &amp;lt;math&amp;gt;V&amp;lt;/math&amp;gt; - матрица правых сингулярных векторов.&lt;br /&gt;
&lt;br /&gt;
симметричную матрицу &amp;lt;math&amp;gt;A = (G^TG)&amp;lt;/math&amp;gt; можно привести к диагональному виду:&lt;br /&gt;
&amp;lt;math&amp;gt;RG^TGR^T&amp;lt;/math&amp;gt;, где&lt;br /&gt;
&lt;br /&gt;
&amp;lt;math&amp;gt;&lt;br /&gt;
\begin{matrix}&lt;br /&gt;
  &amp;amp;     &amp;amp;      &amp;amp;       &amp;amp; j &amp;amp;         &amp;amp; k &amp;amp;         &amp;amp;    &amp;amp;   \\&lt;br /&gt;
\end{matrix}&lt;br /&gt;
&amp;lt;/math&amp;gt;&lt;br /&gt;
&lt;br /&gt;
&amp;lt;math&amp;gt;&lt;br /&gt;
R(j,k,\theta) = &lt;br /&gt;
\begin{matrix}&lt;br /&gt;
  \\&lt;br /&gt;
  \\&lt;br /&gt;
  \\&lt;br /&gt;
j \\&lt;br /&gt;
  \\&lt;br /&gt;
k \\&lt;br /&gt;
  \\&lt;br /&gt;
  \\&lt;br /&gt;
  \\&lt;br /&gt;
\end{matrix}&lt;br /&gt;
&amp;lt;/math&amp;gt;  &lt;br /&gt;
&amp;lt;math&amp;gt;&lt;br /&gt;
\begin{bmatrix}&lt;br /&gt;
  &amp;amp; 1 &amp;amp;   &amp;amp;        &amp;amp;              &amp;amp;        &amp;amp;               &amp;amp;         &amp;amp;    &amp;amp;   \\&lt;br /&gt;
  &amp;amp;   &amp;amp; 1 &amp;amp;        &amp;amp;              &amp;amp;        &amp;amp;               &amp;amp;         &amp;amp;    &amp;amp;   \\&lt;br /&gt;
  &amp;amp;   &amp;amp;   &amp;amp; \ddots &amp;amp;              &amp;amp;        &amp;amp;               &amp;amp;         &amp;amp;    &amp;amp;   \\&lt;br /&gt;
  &amp;amp;   &amp;amp;   &amp;amp;        &amp;amp; \cos(\theta) &amp;amp;        &amp;amp; -\sin(\theta) &amp;amp;         &amp;amp;    &amp;amp;   \\&lt;br /&gt;
  &amp;amp;   &amp;amp;   &amp;amp;        &amp;amp;              &amp;amp; \ddots &amp;amp;               &amp;amp;         &amp;amp;    &amp;amp;   \\&lt;br /&gt;
  &amp;amp;   &amp;amp;   &amp;amp;        &amp;amp; \sin(\theta) &amp;amp;        &amp;amp; \cos(\theta)  &amp;amp;         &amp;amp;    &amp;amp;   \\&lt;br /&gt;
  &amp;amp;   &amp;amp;   &amp;amp;        &amp;amp;              &amp;amp;        &amp;amp;               &amp;amp; \ddots  &amp;amp;    &amp;amp;   \\&lt;br /&gt;
  &amp;amp;   &amp;amp;   &amp;amp;        &amp;amp;              &amp;amp;        &amp;amp;               &amp;amp;         &amp;amp; 1  &amp;amp;   \\&lt;br /&gt;
  &amp;amp;   &amp;amp;   &amp;amp;        &amp;amp;              &amp;amp;        &amp;amp;               &amp;amp;         &amp;amp;    &amp;amp; 1 \\&lt;br /&gt;
\end{bmatrix}&lt;br /&gt;
&amp;lt;/math&amp;gt;&lt;br /&gt;
&lt;br /&gt;
Обозначим &amp;lt;math&amp;gt;s = \sin \theta&amp;lt;/math&amp;gt; и &amp;lt;math&amp;gt;c = \cos \theta&amp;lt;/math&amp;gt;.&lt;br /&gt;
&lt;br /&gt;
Перемножив матрицы &amp;lt;math&amp;gt;RG^TGR^T&amp;lt;/math&amp;gt;, получим следующие выражения&amp;lt;ref&amp;gt;http://www.astro.tsu.ru/OsChMet/5_2.html&amp;lt;\ref&amp;gt;:&lt;br /&gt;
&lt;br /&gt;
&amp;lt;math&amp;gt;\begin{align}&lt;br /&gt;
 a_{jj}^{(i+1)} &amp;amp;= c^2\, a_{jj}^{(i)}  -  2\, s c \,a_{jk}^{(i)}  +  s^2\, a_{kk}^{(i)} \\&lt;br /&gt;
 a_{kk}^{(i+1)} &amp;amp;= s^2 \,a_{jj}^{(i)}  +  2 s c\, a_{jk}^{(i)}  +  c^2 \, a_{kk}^{(i)} \\&lt;br /&gt;
 a_{jk}^{(i+1)} &amp;amp;= a_{kj}^{(i+1)} = (c^2 - s^2 ) \, a_{jk}^{(i)}  +  s c \, (a_{kk}^{(i)} - a_{jj}^{(i)} ) \\&lt;br /&gt;
 a_{jm}^{(i+1)} &amp;amp;= a_{mj}^{(i+1)} = c \, a_{jm}^{(i)}  -  s \, a_{km}^{(i)} &amp;amp; m \ne j,k \\&lt;br /&gt;
 a_{km}^{(i+1)} &amp;amp;= a_{mk}^{(i+1)} = s \, a_{jm}^{(i)}  + c \, a_{km}^{(i)} &amp;amp; m \ne j,k \\&lt;br /&gt;
 a_{ml}^{(i+1)} &amp;amp;= a_{ml}^{(i)} &amp;amp;m,l \ne j,k&lt;br /&gt;
\end{align}&amp;lt;/math&amp;gt;&lt;br /&gt;
&lt;br /&gt;
Т.к внедиагональные элементы должны быть равны 0, то выбираем &amp;lt;math&amp;gt;\theta&amp;lt;/math&amp;gt; так, чтобы &amp;lt;math&amp;gt;a_{jk}^{(i+1)} = 0&amp;lt;/math&amp;gt; и &amp;lt;math&amp;gt;a_{kj}^{(i+1)} = 0&amp;lt;/math&amp;gt;.&lt;br /&gt;
&lt;br /&gt;
Тогда решая уравнение получаем, что&lt;br /&gt;
&lt;br /&gt;
&amp;lt;math&amp;gt;&lt;br /&gt;
         \begin{align}&lt;br /&gt;
         \tau &amp;amp;= {a_{jj} - a_{kk}}/{2a_{jk}} \\&lt;br /&gt;
         t &amp;amp;= {sign(\tau)}/(|\tau| + \sqrt{1 + \tau^2}) \\&lt;br /&gt;
         c &amp;amp;= 1/(\sqrt{1 + t^2}) \\&lt;br /&gt;
         s &amp;amp;= ct \\&lt;br /&gt;
         \end{align}&amp;lt;/math&amp;gt;&lt;br /&gt;
&lt;br /&gt;
Остановка вычислений алгоритма наступает, когда внедиагональные элементы становятся меньше некоторого наперед заданного числа &amp;lt;math&amp;gt;\varepsilon&amp;lt;/math&amp;gt;.&lt;br /&gt;
&lt;br /&gt;
=== Вычислительное ядро алгоритма ===&lt;br /&gt;
Вычислительное ядро алгоритма составляет непосредственно вычисление одностороннего вращения Якоби, т.е. вычисление элементов матрицы &amp;lt;math&amp;gt;g_{jm}^{(i+1)} = g_{mj}^{(i+1)}&amp;lt;/math&amp;gt; и &amp;lt;math&amp;gt;g_{km}^{(i+1)} = g_{mk}^{(i+1)}&amp;lt;/math&amp;gt;, &amp;lt;math&amp;gt;m \ne j,k&amp;lt;/math&amp;gt;, а также вычисления элементов &amp;lt;math&amp;gt;g_{jj}^{(i+1)} &amp;lt;/math&amp;gt; и &amp;lt;math&amp;gt;g_{kk}^{(i+1)} &amp;lt;/math&amp;gt;, получившихся после умножения промежуточной матрицы на матрицу вращений Якоби:&lt;br /&gt;
&lt;br /&gt;
&amp;lt;math&amp;gt;\begin{align}&lt;br /&gt;
 g_{jj}^{(i+1)} &amp;amp;= c^2\, a_{jj}^{(i)}  -  2\, s c \,g_{jk}^{(i)}  +  s^2\, g_{kk}^{(i)} \\&lt;br /&gt;
 g_{kk}^{(i+1)} &amp;amp;= s^2 \,a_{jj}^{(i)}  +  2 s c\, g_{jk}^{(i)}  +  c^2 \, g_{kk}^{(i)} \\&lt;br /&gt;
 g_{jk}^{(i+1)} &amp;amp;= g_{kj}^{(i+1)} = (c^2 - s^2 ) \, g_{jk}^{(i)}  +  s c \, (g_{kk}^{(i)} - g_{jj}^{(i)} ) \\&lt;br /&gt;
 g_{jm}^{(i+1)} &amp;amp;= g_{mj}^{(i+1)} = c \, g_{jm}^{(i)}  -  s \, g_{km}^{(i)} &amp;amp; m \ne j,k \\&lt;br /&gt;
 g_{km}^{(i+1)} &amp;amp;= g_{mk}^{(i+1)} = s \, g_{jm}^{(i)}  + c \, g_{km}^{(i)} &amp;amp; m \ne j,k \\&lt;br /&gt;
 g_{ml}^{(i+1)} &amp;amp;= g_{ml}^{(i)} &amp;amp;m,l \ne j,k&lt;br /&gt;
\end{align}&amp;lt;/math&amp;gt;&lt;br /&gt;
&lt;br /&gt;
=== Макроструктура алгоритма ===&lt;br /&gt;
Основную часть метода составляет процедура односторонних вращений матрицы, которая в свою очередь состоит из:&lt;br /&gt;
&lt;br /&gt;
#Вычисление &amp;lt;math&amp;gt;\tau, c, s, t&amp;lt;/math&amp;gt;.&lt;br /&gt;
#Одностороннее вращение матрицы. &lt;br /&gt;
&lt;br /&gt;
Что требует &amp;lt;math&amp;gt;O(n)&amp;lt;/math&amp;gt; операций.&lt;br /&gt;
&lt;br /&gt;
После этого необходимо:&lt;br /&gt;
&lt;br /&gt;
#Вычислить сингулярные числа &amp;lt;math&amp;gt;\sigma_i&amp;lt;/math&amp;gt;.  Что требует &amp;lt;math&amp;gt;O(n)&amp;lt;/math&amp;gt; операций.&lt;br /&gt;
#Вычислить &amp;lt;math&amp;gt;U&amp;lt;/math&amp;gt; и &amp;lt;math&amp;gt;V&amp;lt;/math&amp;gt;. Что требует &amp;lt;math&amp;gt;O(n^2)&amp;lt;/math&amp;gt; операций.&lt;br /&gt;
&lt;br /&gt;
=== Схема реализации последовательного алгоритма ===&lt;br /&gt;
Применение метода Якоби к матрице &amp;lt;math&amp;gt;A = (G^TG)&amp;lt;/math&amp;gt; можно описать следующим образом&amp;lt;ref&amp;gt;Дж. Деммель «Вычислительная линейная алгебра» (стр. 261-263)&amp;lt;/ref&amp;gt;:&lt;br /&gt;
&lt;br /&gt;
Если &amp;lt;math&amp;gt;G = U\Sigma V^T&amp;lt;/math&amp;gt; и &amp;lt;math&amp;gt;\Sigma = diag(\sigma_{i})&amp;lt;/math&amp;gt;, то алгоритм вычисляет сингулярные числа &amp;lt;math&amp;gt;\sigma_{i}&amp;lt;/math&amp;gt;, матрицу &amp;lt;math&amp;gt;U&amp;lt;/math&amp;gt; левых сингулярных векторов и матрицу &amp;lt;math&amp;gt;V&amp;lt;/math&amp;gt; правых сингулярных векторов по следующей схеме:&lt;br /&gt;
&lt;br /&gt;
 repeat&lt;br /&gt;
     for &amp;lt;math&amp;gt;j=1&amp;lt;/math&amp;gt; to &amp;lt;math&amp;gt;n-1&amp;lt;/math&amp;gt;&lt;br /&gt;
         for &amp;lt;math&amp;gt;k=j+1&amp;lt;/math&amp;gt; to &amp;lt;math&amp;gt;n&amp;lt;/math&amp;gt;&lt;br /&gt;
             обратиться к процедуре &#039;&#039;&#039;&#039;&#039;One-Sided-Jacobi-Rotation&amp;lt;math&amp;gt;(G,j,k)&amp;lt;/math&amp;gt;&#039;&#039;&#039;&#039;&#039;&lt;br /&gt;
         end for&lt;br /&gt;
     end for&lt;br /&gt;
 пока &amp;lt;math&amp;gt;G^TG&amp;lt;/math&amp;gt; не станет достаточно близка к диагональной матрице&lt;br /&gt;
 Положить &amp;lt;math&amp;gt;\sigma_{i} = ||G(:,i)||_2 &amp;lt;/math&amp;gt; (норма &amp;lt;math&amp;gt;i&amp;lt;/math&amp;gt;-го столбца в &amp;lt;math&amp;gt;G&amp;lt;/math&amp;gt;)&lt;br /&gt;
 Положить &amp;lt;math&amp;gt;U = [u_{1},\dots, u_{n}]&amp;lt;/math&amp;gt;, где &amp;lt;math&amp;gt;u_{i} = G(:,i)/\sigma_{i}&amp;lt;/math&amp;gt;&lt;br /&gt;
 Положить &amp;lt;math&amp;gt;V = J&amp;lt;/math&amp;gt;, где &amp;lt;math&amp;gt;J&amp;lt;/math&amp;gt; - накопленное произведение вращений Якоби.&lt;br /&gt;
&lt;br /&gt;
Где процедура &#039;&#039;&#039;&#039;&#039;One-Sided-Jacobi-Rotation&#039;&#039;&#039;&#039;&#039; является метод односторонних вращений Якоби:&lt;br /&gt;
&lt;br /&gt;
 proc &#039;&#039;&#039;&#039;&#039;One-Sided-Jacobi-Rotation&amp;lt;math&amp;gt;(G,j,k)&amp;lt;/math&amp;gt;&#039;&#039;&#039;&#039;&#039;&lt;br /&gt;
     вычислить &amp;lt;math&amp;gt;a_{jj} = (G^TG)_{jj}, a_{jk} = (G^TG)_{jk}&amp;lt;/math&amp;gt; и &amp;lt;math&amp;gt;a_{kk} = (G^TG)_{kk}&amp;lt;/math&amp;gt;&lt;br /&gt;
     if &amp;lt;math&amp;gt;|a_{jk}|&amp;lt;/math&amp;gt; не слишком мал&lt;br /&gt;
         &amp;lt;math&amp;gt;&lt;br /&gt;
         \begin{align}&lt;br /&gt;
         \tau &amp;amp;= {a_{jj} - a_{kk}}/{2a_{jk}} \\&lt;br /&gt;
         t &amp;amp;= {sign(\tau)}/(|\tau| + \sqrt{1 + \tau^2}) \\&lt;br /&gt;
         c &amp;amp;= 1/(\sqrt{1 + t^2}) \\&lt;br /&gt;
         s &amp;amp;= ct \\&lt;br /&gt;
         G &amp;amp;= GR(j,k,\theta) \  \dots c=cos\theta, s=sin\theta \end{align}&amp;lt;/math&amp;gt;&lt;br /&gt;
         if нужны правые сингулярные векторы &lt;br /&gt;
             &amp;lt;math&amp;gt;J = JR(j,k,\theta)&amp;lt;/math&amp;gt;&lt;br /&gt;
         end if&lt;br /&gt;
     end if&lt;br /&gt;
&lt;br /&gt;
=== Последовательная сложность алгоритма ===&lt;br /&gt;
&lt;br /&gt;
=== Информационный граф ===&lt;br /&gt;
&lt;br /&gt;
=== Ресурс параллелизма алгоритма ===&lt;br /&gt;
Для выполнения одной итерации метода Якоби требуется последовательно выполнить несколько ярусов:&lt;br /&gt;
# вычислить &amp;lt;math&amp;gt;\tau&amp;lt;/math&amp;gt; &lt;br /&gt;
# вычислить &amp;lt;math&amp;gt;t&amp;lt;/math&amp;gt; &lt;br /&gt;
# вычислить &amp;lt;math&amp;gt;c&amp;lt;/math&amp;gt; &lt;br /&gt;
# выполнить поворот матрицы &amp;lt;math&amp;gt;G&amp;lt;/math&amp;gt; с параллельным выполнением &amp;lt;math&amp;gt;2(n-2)&amp;lt;/math&amp;gt; операций вычисления элементов матрицы &amp;lt;math&amp;gt;g_{jm}^{(i+1)} = g_{mj}^{(i+1)}&amp;lt;/math&amp;gt; и &amp;lt;math&amp;gt;g_{km}^{(i+1)} = g_{mk}^{(i+1)}&amp;lt;/math&amp;gt;, &amp;lt;math&amp;gt;m \ne j,k&amp;lt;/math&amp;gt;, а также вычисления элементов &amp;lt;math&amp;gt;g_{jj}^{(i+1)} &amp;lt;/math&amp;gt; и &amp;lt;math&amp;gt;g_{kk}^{(i+1)} &amp;lt;/math&amp;gt;. &lt;br /&gt;
&lt;br /&gt;
Суммарное количество итераций равно &amp;lt;math&amp;gt;\frac{n(n-1)}{2}&amp;lt;/math&amp;gt; (Различные варианты выбора &amp;lt;math&amp;gt;j&amp;lt;/math&amp;gt; и &amp;lt;math&amp;gt;k&amp;lt;/math&amp;gt;). &lt;br /&gt;
&lt;br /&gt;
Асимптотически метод сходится квадратично. &lt;br /&gt;
&lt;br /&gt;
Таким образом, при классификации по высоте ЯПФ метод Якоби относится к алгоритмам со сложностью &amp;lt;math&amp;gt;O(n^2)&amp;lt;/math&amp;gt;&amp;amp;nbsp;, а при классификации по ширине ЯПФ — к алгоритмам со сложностью &amp;lt;math&amp;gt;O(n)&amp;lt;/math&amp;gt;.&lt;br /&gt;
&lt;br /&gt;
=== Входные и выходные данные алгоритма ===&lt;br /&gt;
&#039;&#039;&#039;Входные данные&#039;&#039;&#039;: плотная матрица &amp;lt;math&amp;gt;G&amp;lt;/math&amp;gt; размера &amp;lt;math&amp;gt;n&amp;lt;/math&amp;gt;х&amp;lt;math&amp;gt;n&amp;lt;/math&amp;gt;, где &amp;lt;math&amp;gt;A= G^TG&amp;lt;/math&amp;gt; – симметрическая матрица.&lt;br /&gt;
&lt;br /&gt;
&#039;&#039;&#039;Объём входных данных&#039;&#039;&#039;: &amp;lt;math&amp;gt;n^2&amp;lt;/math&amp;gt; (т.к. для хранения матрицы &amp;lt;math&amp;gt;G&amp;lt;/math&amp;gt; используем двумерный массив размера &amp;lt;math&amp;gt;n&amp;lt;/math&amp;gt;х&amp;lt;math&amp;gt;n&amp;lt;/math&amp;gt;)&lt;br /&gt;
&lt;br /&gt;
&#039;&#039;&#039;Выходные данные&#039;&#039;&#039;: &amp;lt;math&amp;gt;\sigma_{i}&amp;lt;/math&amp;gt;  - сингулярные числа, матрица &amp;lt;math&amp;gt;U&amp;lt;/math&amp;gt; левых сингулярных векторов и матрица &amp;lt;math&amp;gt;V&amp;lt;/math&amp;gt; правых сингулярных векторов.&lt;br /&gt;
&lt;br /&gt;
&#039;&#039;&#039;Объём выходных данных&#039;&#039;&#039;: &amp;lt;math&amp;gt;2n^2 + n&amp;lt;/math&amp;gt; (т.к. необходимо хранить вектор сингулярных чисел длины &amp;lt;math&amp;gt;n&amp;lt;/math&amp;gt;, а также две матрицы &amp;lt;math&amp;gt;U, V&amp;lt;/math&amp;gt; левых и правых сингулярных векторов размера &amp;lt;math&amp;gt;n&amp;lt;/math&amp;gt;х&amp;lt;math&amp;gt;n&amp;lt;/math&amp;gt;).&lt;br /&gt;
&lt;br /&gt;
=== Свойства алгоритма ===&lt;br /&gt;
Метод Якоби является самым медленным из имеющихся алгоритмов вычисления сингулярных чисел и сингулярных векторов матрицы. Тем не менее, для  матриц &amp;lt;math&amp;gt;G&amp;lt;/math&amp;gt;, которые могут быть представлены в виде &amp;lt;math&amp;gt;G=DX&amp;lt;/math&amp;gt;, где &amp;lt;math&amp;gt;D&amp;lt;/math&amp;gt; - диагональная, а &amp;lt;math&amp;gt;X&amp;lt;/math&amp;gt; - хорошо обусловлена, он способен вычислять сингулярные числа и вектора намного точнее, чем другие методы&amp;lt;ref&amp;gt;Дж. Деммель «Вычислительная линейная алгебра» (стр. 261-264)&amp;lt;/ref&amp;gt;. &lt;br /&gt;
&lt;br /&gt;
Вычислительная мощность алгоритма, как отношение числа операций к суммарному объему входных и выходных данных является линейной.&lt;br /&gt;
&lt;br /&gt;
Метод Якоби не детерминирован, так как является итерационным алгоритмом с выходом по точности (число итераций зависит от входных данных и порогового значения).&lt;br /&gt;
&lt;br /&gt;
== Программная реализация алгоритма ==&lt;br /&gt;
&lt;br /&gt;
=== Особенности реализации последовательного алгоритма ===&lt;br /&gt;
&lt;br /&gt;
=== Локальность данных и вычислений ===&lt;br /&gt;
&lt;br /&gt;
=== Возможные способы и особенности параллельной реализации алгоритма ===&lt;br /&gt;
&lt;br /&gt;
=== Масштабируемость алгоритма и его реализации ===&lt;br /&gt;
&lt;br /&gt;
=== Динамические характеристики и эффективность реализации алгоритма ===&lt;br /&gt;
&lt;br /&gt;
=== Выводы для классов архитектур ===&lt;br /&gt;
&lt;br /&gt;
=== Существующие реализации алгоритма ===&lt;br /&gt;
Метод Якоби нахождения сингулярных значений и векторов реализован в таких пакетах, как LAPACK, LINPACK/EISPACK, Intel MKL &amp;lt;ref&amp;gt;http://www.alglib.net/matrixops/general/svd.php&amp;lt;/ref&amp;gt;.&lt;br /&gt;
&lt;br /&gt;
Так же функция Якоби реализована в пакете Matlab.&lt;br /&gt;
&lt;br /&gt;
Т. к. алгоритм считается медленным, он не включен во многие известные пакеты.&lt;br /&gt;
&lt;br /&gt;
== Литература ==&lt;br /&gt;
1. Дж. Деммель Вычислительная линейная алгебра. Изд. Мир, 2001.&lt;/div&gt;</summary>
		<author><name>Davletshuna Alexandra</name></author>
	</entry>
	<entry>
		<id>https://xn--80aecvaldz.xn--80ahdrnmvk.xn--p1ai/w/ru/index.php?title=%D0%A3%D1%87%D0%B0%D1%81%D1%82%D0%BD%D0%B8%D0%BA:Davletshuna_Alexandra/%D0%9C%D0%B5%D1%82%D0%BE%D0%B4_%D0%AF%D0%BA%D0%BE%D0%B1%D0%B8_%D0%B2%D1%8B%D1%87%D0%B8%D1%81%D0%BB%D0%B5%D0%BD%D0%B8%D1%8F_%D1%81%D0%B8%D0%BD%D0%B3%D1%83%D0%BB%D1%8F%D1%80%D0%BD%D1%8B%D1%85_%D1%87%D0%B8%D1%81%D0%B5%D0%BB_%D0%B8_%D0%B2%D0%B5%D0%BA%D1%82%D0%BE%D1%80%D0%BE%D0%B2&amp;diff=9884</id>
		<title>Участник:Davletshuna Alexandra/Метод Якоби вычисления сингулярных чисел и векторов</title>
		<link rel="alternate" type="text/html" href="https://xn--80aecvaldz.xn--80ahdrnmvk.xn--p1ai/w/ru/index.php?title=%D0%A3%D1%87%D0%B0%D1%81%D1%82%D0%BD%D0%B8%D0%BA:Davletshuna_Alexandra/%D0%9C%D0%B5%D1%82%D0%BE%D0%B4_%D0%AF%D0%BA%D0%BE%D0%B1%D0%B8_%D0%B2%D1%8B%D1%87%D0%B8%D1%81%D0%BB%D0%B5%D0%BD%D0%B8%D1%8F_%D1%81%D0%B8%D0%BD%D0%B3%D1%83%D0%BB%D1%8F%D1%80%D0%BD%D1%8B%D1%85_%D1%87%D0%B8%D1%81%D0%B5%D0%BB_%D0%B8_%D0%B2%D0%B5%D0%BA%D1%82%D0%BE%D1%80%D0%BE%D0%B2&amp;diff=9884"/>
		<updated>2016-10-15T14:25:15Z</updated>

		<summary type="html">&lt;p&gt;Davletshuna Alexandra: /* Вычислительное ядро алгоритма */&lt;/p&gt;
&lt;hr /&gt;
&lt;div&gt;&lt;br /&gt;
{{algorithm&lt;br /&gt;
| name              = Метод Якоби вычисления сингулярных чисел и векторов&lt;br /&gt;
| serial_complexity = &amp;lt;math&amp;gt;O(n^3)&amp;lt;/math&amp;gt;&lt;br /&gt;
| pf_height         = &amp;lt;math&amp;gt;O(n^2)&amp;lt;/math&amp;gt;&lt;br /&gt;
| pf_width          = &amp;lt;math&amp;gt;O(n)&amp;lt;/math&amp;gt;&lt;br /&gt;
| input_data        = &amp;lt;math&amp;gt;n^2&amp;lt;/math&amp;gt;&lt;br /&gt;
| output_data       = &amp;lt;math&amp;gt;2n^2 + n&amp;lt;/math&amp;gt;&lt;br /&gt;
}}&lt;br /&gt;
&lt;br /&gt;
Авторы статьи: [[Участница:Davletshuna Alexandra|Давлетшина Александра]] (группа 619), [[Участница:Alek sandra|Зайцева Александра]] (группа 601)&lt;br /&gt;
&lt;br /&gt;
== Свойства и структура алгоритма ==&lt;br /&gt;
&lt;br /&gt;
=== Общее описание алгоритма ===&lt;br /&gt;
&#039;&#039;&#039;Сингулярным разложением&#039;&#039;&#039; называется разложение прямоугольной вещественной или комплексной матрицы, имеющее широкое применение, в силу своей наглядной геометрической интерпретации, при решении многих прикладных задач. Сингулярное разложение матрицы А позволяет вычислять сингулярные числа данной матрицы, а также, левые и правые сингулярные векторы матрицы А:&lt;br /&gt;
&lt;br /&gt;
•	левые сингулярные векторы матрицы А — это собственные векторы матрицы &amp;lt;math&amp;gt;AA^*&amp;lt;/math&amp;gt;;&lt;br /&gt;
&lt;br /&gt;
•	правые сингулярные векторы матрицы A — это собственные векторы матрицы &amp;lt;math&amp;gt;A^*A&amp;lt;/math&amp;gt;.&lt;br /&gt;
&lt;br /&gt;
Геометрическая интерпретация сингулярного разложения заключается в следующем факте из геометрии: &#039;&#039;Образом любого линейного преобразования, заданного с помощью матрицы &amp;lt;math&amp;gt;m&amp;lt;/math&amp;gt;x&amp;lt;math&amp;gt;n&amp;lt;/math&amp;gt;, примененного к единичной сфере является гиперэллипсоид&#039;&#039;.&lt;br /&gt;
&lt;br /&gt;
Из многочисленных разложений матриц, наиболее удобным является сингулярное разложение матрицы в виде: &amp;lt;math&amp;gt;A=U\Sigma V^*&amp;lt;/math&amp;gt;, где &amp;lt;math&amp;gt;U, V&amp;lt;/math&amp;gt; – унитарные матрицы, а &amp;lt;math&amp;gt;\Sigma&amp;lt;/math&amp;gt; – диагональная матрица с вещественными положительными числами на диагонали &amp;lt;ref&amp;gt;http://algorithms.parallel.ru/&amp;lt;/ref&amp;gt;.&lt;br /&gt;
&lt;br /&gt;
Диагональные элементы матрицы &amp;lt;math&amp;gt;\Sigma&amp;lt;/math&amp;gt; называются сингулярными числами матрицы &amp;lt;math&amp;gt;A&amp;lt;/math&amp;gt;, а столбцы матриц &amp;lt;math&amp;gt;U,V&amp;lt;/math&amp;gt; левыми и правыми сингулярными векторами соответственно.&lt;br /&gt;
&lt;br /&gt;
Алгоритм Якоби сингулярного разложения матрицы был предложен одним из первых в 1846 году. Он приводит прямоугольную матрицу к диагональной матрице с помощью последовательности элементарных вращений. Метод может найти все сингулярные значения с очень высокой точностью. Однако его производительность является довольно низкой, в сравнении с конкурирующими методами.&lt;br /&gt;
&lt;br /&gt;
&#039;&#039;Неявный&#039;&#039;&amp;lt;ref&amp;gt;Дж. Деммель «Вычислительная линейная алгебра» (стр. 261-264)&amp;lt;/ref&amp;gt; метод Якоби математически эквивалентен применению метода Якоби вычисления собственных значений к матрице &amp;lt;math&amp;gt;A = G^TG&amp;lt;/math&amp;gt;.&lt;br /&gt;
Это значит, что на каждом шаге вычисляется вращение Якоби &amp;lt;math&amp;gt;J&amp;lt;/math&amp;gt;, с помощью которого матрица &amp;lt;math&amp;gt;G^TG&amp;lt;/math&amp;gt; неявно пересчитывется в &amp;lt;math&amp;gt;J^TG^TGJ&amp;lt;/math&amp;gt;; вращение выбрано так, чтобы пара внедиагональных элементов из &amp;lt;math&amp;gt;G^TG&amp;lt;/math&amp;gt; обратилась в нули в матрице &amp;lt;math&amp;gt;J^TG^TGJ&amp;lt;/math&amp;gt;. При этом ни &amp;lt;math&amp;gt;G^TG&amp;lt;/math&amp;gt;, ни &amp;lt;math&amp;gt;J^TG^TGJ&amp;lt;/math&amp;gt; не вычисляются в явном виде; вместо них вычисляется матрица &amp;lt;math&amp;gt;GJ&amp;lt;/math&amp;gt;. Поэтому алгоритм называется &#039;&#039;методом односторонних вращений&#039;&#039;.&lt;br /&gt;
&lt;br /&gt;
=== Математическое описание алгоритма ===&lt;br /&gt;
Исходные данные: матрица &amp;lt;math&amp;gt;G&amp;lt;/math&amp;gt; (элементы &amp;lt;math&amp;gt;g_{ij}, i, j = 1, \ldots, n&amp;lt;/math&amp;gt;).&lt;br /&gt;
&lt;br /&gt;
Вычисляемые данные: матрица &amp;lt;math&amp;gt;\Sigma = diag(\sigma_{i})&amp;lt;/math&amp;gt;, где &amp;lt;math&amp;gt;\sigma_{i}&amp;lt;/math&amp;gt; - сингулярные числа, &amp;lt;math&amp;gt;U&amp;lt;/math&amp;gt; - матрица левых сингулярных векторов, &amp;lt;math&amp;gt;V&amp;lt;/math&amp;gt; - матрица правых сингулярных векторов.&lt;br /&gt;
&lt;br /&gt;
симметричную матрицу &amp;lt;math&amp;gt;A = (G^TG)&amp;lt;/math&amp;gt; можно привести к диагональному виду:&lt;br /&gt;
&amp;lt;math&amp;gt;RG^TGR^T&amp;lt;/math&amp;gt;, где&lt;br /&gt;
&lt;br /&gt;
&amp;lt;math&amp;gt;&lt;br /&gt;
\begin{matrix}&lt;br /&gt;
  &amp;amp;     &amp;amp;      &amp;amp;       &amp;amp; j &amp;amp;         &amp;amp; k &amp;amp;         &amp;amp;    &amp;amp;   \\&lt;br /&gt;
\end{matrix}&lt;br /&gt;
&amp;lt;/math&amp;gt;&lt;br /&gt;
&lt;br /&gt;
&amp;lt;math&amp;gt;&lt;br /&gt;
R(j,k,\theta) = &lt;br /&gt;
\begin{matrix}&lt;br /&gt;
  \\&lt;br /&gt;
  \\&lt;br /&gt;
  \\&lt;br /&gt;
j \\&lt;br /&gt;
  \\&lt;br /&gt;
k \\&lt;br /&gt;
  \\&lt;br /&gt;
  \\&lt;br /&gt;
  \\&lt;br /&gt;
\end{matrix}&lt;br /&gt;
&amp;lt;/math&amp;gt;  &lt;br /&gt;
&amp;lt;math&amp;gt;&lt;br /&gt;
\begin{bmatrix}&lt;br /&gt;
  &amp;amp; 1 &amp;amp;   &amp;amp;        &amp;amp;              &amp;amp;        &amp;amp;               &amp;amp;         &amp;amp;    &amp;amp;   \\&lt;br /&gt;
  &amp;amp;   &amp;amp; 1 &amp;amp;        &amp;amp;              &amp;amp;        &amp;amp;               &amp;amp;         &amp;amp;    &amp;amp;   \\&lt;br /&gt;
  &amp;amp;   &amp;amp;   &amp;amp; \ddots &amp;amp;              &amp;amp;        &amp;amp;               &amp;amp;         &amp;amp;    &amp;amp;   \\&lt;br /&gt;
  &amp;amp;   &amp;amp;   &amp;amp;        &amp;amp; \cos(\theta) &amp;amp;        &amp;amp; -\sin(\theta) &amp;amp;         &amp;amp;    &amp;amp;   \\&lt;br /&gt;
  &amp;amp;   &amp;amp;   &amp;amp;        &amp;amp;              &amp;amp; \ddots &amp;amp;               &amp;amp;         &amp;amp;    &amp;amp;   \\&lt;br /&gt;
  &amp;amp;   &amp;amp;   &amp;amp;        &amp;amp; \sin(\theta) &amp;amp;        &amp;amp; \cos(\theta)  &amp;amp;         &amp;amp;    &amp;amp;   \\&lt;br /&gt;
  &amp;amp;   &amp;amp;   &amp;amp;        &amp;amp;              &amp;amp;        &amp;amp;               &amp;amp; \ddots  &amp;amp;    &amp;amp;   \\&lt;br /&gt;
  &amp;amp;   &amp;amp;   &amp;amp;        &amp;amp;              &amp;amp;        &amp;amp;               &amp;amp;         &amp;amp; 1  &amp;amp;   \\&lt;br /&gt;
  &amp;amp;   &amp;amp;   &amp;amp;        &amp;amp;              &amp;amp;        &amp;amp;               &amp;amp;         &amp;amp;    &amp;amp; 1 \\&lt;br /&gt;
\end{bmatrix}&lt;br /&gt;
&amp;lt;/math&amp;gt;&lt;br /&gt;
&lt;br /&gt;
Обозначим &amp;lt;math&amp;gt;s = \sin \theta&amp;lt;/math&amp;gt; и &amp;lt;math&amp;gt;c = \cos \theta&amp;lt;/math&amp;gt;.&lt;br /&gt;
&lt;br /&gt;
Перемножив матрицы &amp;lt;math&amp;gt;RG^TGR^T&amp;lt;/math&amp;gt;, получим следующие выражения:&lt;br /&gt;
&lt;br /&gt;
&amp;lt;math&amp;gt;\begin{align}&lt;br /&gt;
 a_{jj}^{(i+1)} &amp;amp;= c^2\, a_{jj}^{(i)}  -  2\, s c \,a_{jk}^{(i)}  +  s^2\, a_{kk}^{(i)} \\&lt;br /&gt;
 a_{kk}^{(i+1)} &amp;amp;= s^2 \,a_{jj}^{(i)}  +  2 s c\, a_{jk}^{(i)}  +  c^2 \, a_{kk}^{(i)} \\&lt;br /&gt;
 a_{jk}^{(i+1)} &amp;amp;= a_{kj}^{(i+1)} = (c^2 - s^2 ) \, a_{jk}^{(i)}  +  s c \, (a_{kk}^{(i)} - a_{jj}^{(i)} ) \\&lt;br /&gt;
 a_{jm}^{(i+1)} &amp;amp;= a_{mj}^{(i+1)} = c \, a_{jm}^{(i)}  -  s \, a_{km}^{(i)} &amp;amp; m \ne j,k \\&lt;br /&gt;
 a_{km}^{(i+1)} &amp;amp;= a_{mk}^{(i+1)} = s \, a_{jm}^{(i)}  + c \, a_{km}^{(i)} &amp;amp; m \ne j,k \\&lt;br /&gt;
 a_{ml}^{(i+1)} &amp;amp;= a_{ml}^{(i)} &amp;amp;m,l \ne j,k&lt;br /&gt;
\end{align}&amp;lt;/math&amp;gt;&lt;br /&gt;
&lt;br /&gt;
Т.к внедиагональные элементы должны быть равны 0, то выбираем &amp;lt;math&amp;gt;\theta&amp;lt;/math&amp;gt; так, чтобы &amp;lt;math&amp;gt;a_{jk}^{(i+1)} = 0&amp;lt;/math&amp;gt; и &amp;lt;math&amp;gt;a_{kj}^{(i+1)} = 0&amp;lt;/math&amp;gt;.&lt;br /&gt;
&lt;br /&gt;
Тогда решая уравнение получаем, что&lt;br /&gt;
&lt;br /&gt;
&amp;lt;math&amp;gt;&lt;br /&gt;
         \begin{align}&lt;br /&gt;
         \tau &amp;amp;= {a_{jj} - a_{kk}}/{2a_{jk}} \\&lt;br /&gt;
         t &amp;amp;= {sign(\tau)}/(|\tau| + \sqrt{1 + \tau^2}) \\&lt;br /&gt;
         c &amp;amp;= 1/(\sqrt{1 + t^2}) \\&lt;br /&gt;
         s &amp;amp;= ct \\&lt;br /&gt;
         \end{align}&amp;lt;/math&amp;gt;&lt;br /&gt;
&lt;br /&gt;
Остановка вычислений алгоритма наступает, когда внедиагональные элементы становятся меньше некоторого наперед заданного числа &amp;lt;math&amp;gt;\varepsilon&amp;lt;/math&amp;gt;.&lt;br /&gt;
&lt;br /&gt;
=== Вычислительное ядро алгоритма ===&lt;br /&gt;
Вычислительное ядро алгоритма составляет непосредственно вычисление одностороннего вращения Якоби, т.е. вычисление элементов матрицы &amp;lt;math&amp;gt;g_{jm}^{(i+1)} = g_{mj}^{(i+1)}&amp;lt;/math&amp;gt; и &amp;lt;math&amp;gt;g_{km}^{(i+1)} = g_{mk}^{(i+1)}&amp;lt;/math&amp;gt;, &amp;lt;math&amp;gt;m \ne j,k&amp;lt;/math&amp;gt;, а также вычисления элементов &amp;lt;math&amp;gt;g_{jj}^{(i+1)} &amp;lt;/math&amp;gt; и &amp;lt;math&amp;gt;g_{kk}^{(i+1)} &amp;lt;/math&amp;gt;, получившихся после умножения промежуточной матрицы на матрицу вращений Якоби:&lt;br /&gt;
&lt;br /&gt;
&amp;lt;math&amp;gt;\begin{align}&lt;br /&gt;
 g_{jj}^{(i+1)} &amp;amp;= c^2\, a_{jj}^{(i)}  -  2\, s c \,g_{jk}^{(i)}  +  s^2\, g_{kk}^{(i)} \\&lt;br /&gt;
 g_{kk}^{(i+1)} &amp;amp;= s^2 \,a_{jj}^{(i)}  +  2 s c\, g_{jk}^{(i)}  +  c^2 \, g_{kk}^{(i)} \\&lt;br /&gt;
 g_{jk}^{(i+1)} &amp;amp;= g_{kj}^{(i+1)} = (c^2 - s^2 ) \, g_{jk}^{(i)}  +  s c \, (g_{kk}^{(i)} - g_{jj}^{(i)} ) \\&lt;br /&gt;
 g_{jm}^{(i+1)} &amp;amp;= g_{mj}^{(i+1)} = c \, g_{jm}^{(i)}  -  s \, g_{km}^{(i)} &amp;amp; m \ne j,k \\&lt;br /&gt;
 g_{km}^{(i+1)} &amp;amp;= g_{mk}^{(i+1)} = s \, g_{jm}^{(i)}  + c \, g_{km}^{(i)} &amp;amp; m \ne j,k \\&lt;br /&gt;
 g_{ml}^{(i+1)} &amp;amp;= g_{ml}^{(i)} &amp;amp;m,l \ne j,k&lt;br /&gt;
\end{align}&amp;lt;/math&amp;gt;&lt;br /&gt;
&lt;br /&gt;
=== Макроструктура алгоритма ===&lt;br /&gt;
Основную часть метода составляет процедура односторонних вращений матрицы, которая в свою очередь состоит из:&lt;br /&gt;
&lt;br /&gt;
#Вычисление &amp;lt;math&amp;gt;\tau, c, s, t&amp;lt;/math&amp;gt;.&lt;br /&gt;
#Одностороннее вращение матрицы. &lt;br /&gt;
&lt;br /&gt;
Что требует &amp;lt;math&amp;gt;O(n)&amp;lt;/math&amp;gt; операций.&lt;br /&gt;
&lt;br /&gt;
После этого необходимо:&lt;br /&gt;
&lt;br /&gt;
#Вычислить сингулярные числа &amp;lt;math&amp;gt;\sigma_i&amp;lt;/math&amp;gt;.  Что требует &amp;lt;math&amp;gt;O(n)&amp;lt;/math&amp;gt; операций.&lt;br /&gt;
#Вычислить &amp;lt;math&amp;gt;U&amp;lt;/math&amp;gt; и &amp;lt;math&amp;gt;V&amp;lt;/math&amp;gt;. Что требует &amp;lt;math&amp;gt;O(n^2)&amp;lt;/math&amp;gt; операций.&lt;br /&gt;
&lt;br /&gt;
=== Схема реализации последовательного алгоритма ===&lt;br /&gt;
Применение метода Якоби к матрице &amp;lt;math&amp;gt;A = (G^TG)&amp;lt;/math&amp;gt; можно описать следующим образом&amp;lt;ref&amp;gt;Дж. Деммель «Вычислительная линейная алгебра» (стр. 261-263)&amp;lt;/ref&amp;gt;:&lt;br /&gt;
&lt;br /&gt;
Если &amp;lt;math&amp;gt;G = U\Sigma V^T&amp;lt;/math&amp;gt; и &amp;lt;math&amp;gt;\Sigma = diag(\sigma_{i})&amp;lt;/math&amp;gt;, то алгоритм вычисляет сингулярные числа &amp;lt;math&amp;gt;\sigma_{i}&amp;lt;/math&amp;gt;, матрицу &amp;lt;math&amp;gt;U&amp;lt;/math&amp;gt; левых сингулярных векторов и матрицу &amp;lt;math&amp;gt;V&amp;lt;/math&amp;gt; правых сингулярных векторов по следующей схеме:&lt;br /&gt;
&lt;br /&gt;
 repeat&lt;br /&gt;
     for &amp;lt;math&amp;gt;j=1&amp;lt;/math&amp;gt; to &amp;lt;math&amp;gt;n-1&amp;lt;/math&amp;gt;&lt;br /&gt;
         for &amp;lt;math&amp;gt;k=j+1&amp;lt;/math&amp;gt; to &amp;lt;math&amp;gt;n&amp;lt;/math&amp;gt;&lt;br /&gt;
             обратиться к процедуре &#039;&#039;&#039;&#039;&#039;One-Sided-Jacobi-Rotation&amp;lt;math&amp;gt;(G,j,k)&amp;lt;/math&amp;gt;&#039;&#039;&#039;&#039;&#039;&lt;br /&gt;
         end for&lt;br /&gt;
     end for&lt;br /&gt;
 пока &amp;lt;math&amp;gt;G^TG&amp;lt;/math&amp;gt; не станет достаточно близка к диагональной матрице&lt;br /&gt;
 Положить &amp;lt;math&amp;gt;\sigma_{i} = ||G(:,i)||_2 &amp;lt;/math&amp;gt; (норма &amp;lt;math&amp;gt;i&amp;lt;/math&amp;gt;-го столбца в &amp;lt;math&amp;gt;G&amp;lt;/math&amp;gt;)&lt;br /&gt;
 Положить &amp;lt;math&amp;gt;U = [u_{1},\dots, u_{n}]&amp;lt;/math&amp;gt;, где &amp;lt;math&amp;gt;u_{i} = G(:,i)/\sigma_{i}&amp;lt;/math&amp;gt;&lt;br /&gt;
 Положить &amp;lt;math&amp;gt;V = J&amp;lt;/math&amp;gt;, где &amp;lt;math&amp;gt;J&amp;lt;/math&amp;gt; - накопленное произведение вращений Якоби.&lt;br /&gt;
&lt;br /&gt;
Где процедура &#039;&#039;&#039;&#039;&#039;One-Sided-Jacobi-Rotation&#039;&#039;&#039;&#039;&#039; является метод односторонних вращений Якоби:&lt;br /&gt;
&lt;br /&gt;
 proc &#039;&#039;&#039;&#039;&#039;One-Sided-Jacobi-Rotation&amp;lt;math&amp;gt;(G,j,k)&amp;lt;/math&amp;gt;&#039;&#039;&#039;&#039;&#039;&lt;br /&gt;
     вычислить &amp;lt;math&amp;gt;a_{jj} = (G^TG)_{jj}, a_{jk} = (G^TG)_{jk}&amp;lt;/math&amp;gt; и &amp;lt;math&amp;gt;a_{kk} = (G^TG)_{kk}&amp;lt;/math&amp;gt;&lt;br /&gt;
     if &amp;lt;math&amp;gt;|a_{jk}|&amp;lt;/math&amp;gt; не слишком мал&lt;br /&gt;
         &amp;lt;math&amp;gt;&lt;br /&gt;
         \begin{align}&lt;br /&gt;
         \tau &amp;amp;= {a_{jj} - a_{kk}}/{2a_{jk}} \\&lt;br /&gt;
         t &amp;amp;= {sign(\tau)}/(|\tau| + \sqrt{1 + \tau^2}) \\&lt;br /&gt;
         c &amp;amp;= 1/(\sqrt{1 + t^2}) \\&lt;br /&gt;
         s &amp;amp;= ct \\&lt;br /&gt;
         G &amp;amp;= GR(j,k,\theta) \  \dots c=cos\theta, s=sin\theta \end{align}&amp;lt;/math&amp;gt;&lt;br /&gt;
         if нужны правые сингулярные векторы &lt;br /&gt;
             &amp;lt;math&amp;gt;J = JR(j,k,\theta)&amp;lt;/math&amp;gt;&lt;br /&gt;
         end if&lt;br /&gt;
     end if&lt;br /&gt;
&lt;br /&gt;
=== Последовательная сложность алгоритма ===&lt;br /&gt;
&lt;br /&gt;
=== Информационный граф ===&lt;br /&gt;
&lt;br /&gt;
=== Ресурс параллелизма алгоритма ===&lt;br /&gt;
Для выполнения одной итерации метода Якоби требуется последовательно выполнить несколько ярусов:&lt;br /&gt;
# вычислить &amp;lt;math&amp;gt;\tau&amp;lt;/math&amp;gt; &lt;br /&gt;
# вычислить &amp;lt;math&amp;gt;t&amp;lt;/math&amp;gt; &lt;br /&gt;
# вычислить &amp;lt;math&amp;gt;c&amp;lt;/math&amp;gt; &lt;br /&gt;
# выполнить поворот матрицы &amp;lt;math&amp;gt;G&amp;lt;/math&amp;gt; с параллельным выполнением &amp;lt;math&amp;gt;2(n-2)&amp;lt;/math&amp;gt; операций вычисления элементов матрицы &amp;lt;math&amp;gt;g_{jm}^{(i+1)} = g_{mj}^{(i+1)}&amp;lt;/math&amp;gt; и &amp;lt;math&amp;gt;g_{km}^{(i+1)} = g_{mk}^{(i+1)}&amp;lt;/math&amp;gt;, &amp;lt;math&amp;gt;m \ne j,k&amp;lt;/math&amp;gt;, а также вычисления элементов &amp;lt;math&amp;gt;g_{jj}^{(i+1)} &amp;lt;/math&amp;gt; и &amp;lt;math&amp;gt;g_{kk}^{(i+1)} &amp;lt;/math&amp;gt;. &lt;br /&gt;
&lt;br /&gt;
Суммарное количество итераций равно &amp;lt;math&amp;gt;\frac{n(n-1)}{2}&amp;lt;/math&amp;gt; (Различные варианты выбора &amp;lt;math&amp;gt;j&amp;lt;/math&amp;gt; и &amp;lt;math&amp;gt;k&amp;lt;/math&amp;gt;). &lt;br /&gt;
&lt;br /&gt;
Асимптотически метод сходится квадратично. &lt;br /&gt;
&lt;br /&gt;
Таким образом, при классификации по высоте ЯПФ метод Якоби относится к алгоритмам со сложностью &amp;lt;math&amp;gt;O(n^2)&amp;lt;/math&amp;gt;&amp;amp;nbsp;, а при классификации по ширине ЯПФ — к алгоритмам со сложностью &amp;lt;math&amp;gt;O(n)&amp;lt;/math&amp;gt;.&lt;br /&gt;
&lt;br /&gt;
=== Входные и выходные данные алгоритма ===&lt;br /&gt;
&#039;&#039;&#039;Входные данные&#039;&#039;&#039;: плотная матрица &amp;lt;math&amp;gt;G&amp;lt;/math&amp;gt; размера &amp;lt;math&amp;gt;n&amp;lt;/math&amp;gt;х&amp;lt;math&amp;gt;n&amp;lt;/math&amp;gt;, где &amp;lt;math&amp;gt;A= G^TG&amp;lt;/math&amp;gt; – симметрическая матрица.&lt;br /&gt;
&lt;br /&gt;
&#039;&#039;&#039;Объём входных данных&#039;&#039;&#039;: &amp;lt;math&amp;gt;n^2&amp;lt;/math&amp;gt; (т.к. для хранения матрицы &amp;lt;math&amp;gt;G&amp;lt;/math&amp;gt; используем двумерный массив размера &amp;lt;math&amp;gt;n&amp;lt;/math&amp;gt;х&amp;lt;math&amp;gt;n&amp;lt;/math&amp;gt;)&lt;br /&gt;
&lt;br /&gt;
&#039;&#039;&#039;Выходные данные&#039;&#039;&#039;: &amp;lt;math&amp;gt;\sigma_{i}&amp;lt;/math&amp;gt;  - сингулярные числа, матрица &amp;lt;math&amp;gt;U&amp;lt;/math&amp;gt; левых сингулярных векторов и матрица &amp;lt;math&amp;gt;V&amp;lt;/math&amp;gt; правых сингулярных векторов.&lt;br /&gt;
&lt;br /&gt;
&#039;&#039;&#039;Объём выходных данных&#039;&#039;&#039;: &amp;lt;math&amp;gt;2n^2 + n&amp;lt;/math&amp;gt; (т.к. необходимо хранить вектор сингулярных чисел длины &amp;lt;math&amp;gt;n&amp;lt;/math&amp;gt;, а также две матрицы &amp;lt;math&amp;gt;U, V&amp;lt;/math&amp;gt; левых и правых сингулярных векторов размера &amp;lt;math&amp;gt;n&amp;lt;/math&amp;gt;х&amp;lt;math&amp;gt;n&amp;lt;/math&amp;gt;).&lt;br /&gt;
&lt;br /&gt;
=== Свойства алгоритма ===&lt;br /&gt;
Метод Якоби является самым медленным из имеющихся алгоритмов вычисления сингулярных чисел и сингулярных векторов матрицы. Тем не менее, для  матриц &amp;lt;math&amp;gt;G&amp;lt;/math&amp;gt;, которые могут быть представлены в виде &amp;lt;math&amp;gt;G=DX&amp;lt;/math&amp;gt;, где &amp;lt;math&amp;gt;D&amp;lt;/math&amp;gt; - диагональная, а &amp;lt;math&amp;gt;X&amp;lt;/math&amp;gt; - хорошо обусловлена, он способен вычислять сингулярные числа и вектора намного точнее, чем другие методы&amp;lt;ref&amp;gt;Дж. Деммель «Вычислительная линейная алгебра» (стр. 261-264)&amp;lt;/ref&amp;gt;. &lt;br /&gt;
&lt;br /&gt;
Вычислительная мощность алгоритма, как отношение числа операций к суммарному объему входных и выходных данных является линейной.&lt;br /&gt;
&lt;br /&gt;
Метод Якоби не детерминирован, так как является итерационным алгоритмом с выходом по точности (число итераций зависит от входных данных и порогового значения).&lt;br /&gt;
&lt;br /&gt;
== Программная реализация алгоритма ==&lt;br /&gt;
&lt;br /&gt;
=== Особенности реализации последовательного алгоритма ===&lt;br /&gt;
&lt;br /&gt;
=== Локальность данных и вычислений ===&lt;br /&gt;
&lt;br /&gt;
=== Возможные способы и особенности параллельной реализации алгоритма ===&lt;br /&gt;
&lt;br /&gt;
=== Масштабируемость алгоритма и его реализации ===&lt;br /&gt;
&lt;br /&gt;
=== Динамические характеристики и эффективность реализации алгоритма ===&lt;br /&gt;
&lt;br /&gt;
=== Выводы для классов архитектур ===&lt;br /&gt;
&lt;br /&gt;
=== Существующие реализации алгоритма ===&lt;br /&gt;
Метод Якоби нахождения сингулярных значений и векторов реализован в таких пакетах, как LAPACK, LINPACK/EISPACK, Intel MKL &amp;lt;ref&amp;gt;http://www.alglib.net/matrixops/general/svd.php&amp;lt;/ref&amp;gt;.&lt;br /&gt;
&lt;br /&gt;
Так же функция Якоби реализована в пакете Matlab.&lt;br /&gt;
&lt;br /&gt;
Т. к. алгоритм считается медленным, он не включен во многие известные пакеты.&lt;br /&gt;
&lt;br /&gt;
== Литература ==&lt;br /&gt;
1. Дж. Деммель Вычислительная линейная алгебра. Изд. Мир, 2001.&lt;/div&gt;</summary>
		<author><name>Davletshuna Alexandra</name></author>
	</entry>
	<entry>
		<id>https://xn--80aecvaldz.xn--80ahdrnmvk.xn--p1ai/w/ru/index.php?title=%D0%A3%D1%87%D0%B0%D1%81%D1%82%D0%BD%D0%B8%D0%BA:Davletshuna_Alexandra/%D0%9C%D0%B5%D1%82%D0%BE%D0%B4_%D0%AF%D0%BA%D0%BE%D0%B1%D0%B8_%D0%B2%D1%8B%D1%87%D0%B8%D1%81%D0%BB%D0%B5%D0%BD%D0%B8%D1%8F_%D1%81%D0%B8%D0%BD%D0%B3%D1%83%D0%BB%D1%8F%D1%80%D0%BD%D1%8B%D1%85_%D1%87%D0%B8%D1%81%D0%B5%D0%BB_%D0%B8_%D0%B2%D0%B5%D0%BA%D1%82%D0%BE%D1%80%D0%BE%D0%B2&amp;diff=9871</id>
		<title>Участник:Davletshuna Alexandra/Метод Якоби вычисления сингулярных чисел и векторов</title>
		<link rel="alternate" type="text/html" href="https://xn--80aecvaldz.xn--80ahdrnmvk.xn--p1ai/w/ru/index.php?title=%D0%A3%D1%87%D0%B0%D1%81%D1%82%D0%BD%D0%B8%D0%BA:Davletshuna_Alexandra/%D0%9C%D0%B5%D1%82%D0%BE%D0%B4_%D0%AF%D0%BA%D0%BE%D0%B1%D0%B8_%D0%B2%D1%8B%D1%87%D0%B8%D1%81%D0%BB%D0%B5%D0%BD%D0%B8%D1%8F_%D1%81%D0%B8%D0%BD%D0%B3%D1%83%D0%BB%D1%8F%D1%80%D0%BD%D1%8B%D1%85_%D1%87%D0%B8%D1%81%D0%B5%D0%BB_%D0%B8_%D0%B2%D0%B5%D0%BA%D1%82%D0%BE%D1%80%D0%BE%D0%B2&amp;diff=9871"/>
		<updated>2016-10-15T14:23:31Z</updated>

		<summary type="html">&lt;p&gt;Davletshuna Alexandra: /* Ресурс параллелизма алгоритма */&lt;/p&gt;
&lt;hr /&gt;
&lt;div&gt;&lt;br /&gt;
{{algorithm&lt;br /&gt;
| name              = Метод Якоби вычисления сингулярных чисел и векторов&lt;br /&gt;
| serial_complexity = &amp;lt;math&amp;gt;O(n^3)&amp;lt;/math&amp;gt;&lt;br /&gt;
| pf_height         = &amp;lt;math&amp;gt;O(n^2)&amp;lt;/math&amp;gt;&lt;br /&gt;
| pf_width          = &amp;lt;math&amp;gt;O(n)&amp;lt;/math&amp;gt;&lt;br /&gt;
| input_data        = &amp;lt;math&amp;gt;n^2&amp;lt;/math&amp;gt;&lt;br /&gt;
| output_data       = &amp;lt;math&amp;gt;2n^2 + n&amp;lt;/math&amp;gt;&lt;br /&gt;
}}&lt;br /&gt;
&lt;br /&gt;
Авторы статьи: [[Участница:Davletshuna Alexandra|Давлетшина Александра]] (группа 619), [[Участница:Alek sandra|Зайцева Александра]] (группа 601)&lt;br /&gt;
&lt;br /&gt;
== Свойства и структура алгоритма ==&lt;br /&gt;
&lt;br /&gt;
=== Общее описание алгоритма ===&lt;br /&gt;
&#039;&#039;&#039;Сингулярным разложением&#039;&#039;&#039; называется разложение прямоугольной вещественной или комплексной матрицы, имеющее широкое применение, в силу своей наглядной геометрической интерпретации, при решении многих прикладных задач. Сингулярное разложение матрицы А позволяет вычислять сингулярные числа данной матрицы, а также, левые и правые сингулярные векторы матрицы А:&lt;br /&gt;
&lt;br /&gt;
•	левые сингулярные векторы матрицы А — это собственные векторы матрицы &amp;lt;math&amp;gt;AA^*&amp;lt;/math&amp;gt;;&lt;br /&gt;
&lt;br /&gt;
•	правые сингулярные векторы матрицы A — это собственные векторы матрицы &amp;lt;math&amp;gt;A^*A&amp;lt;/math&amp;gt;.&lt;br /&gt;
&lt;br /&gt;
Геометрическая интерпретация сингулярного разложения заключается в следующем факте из геометрии: &#039;&#039;Образом любого линейного преобразования, заданного с помощью матрицы &amp;lt;math&amp;gt;m&amp;lt;/math&amp;gt;x&amp;lt;math&amp;gt;n&amp;lt;/math&amp;gt;, примененного к единичной сфере является гиперэллипсоид&#039;&#039;.&lt;br /&gt;
&lt;br /&gt;
Из многочисленных разложений матриц, наиболее удобным является сингулярное разложение матрицы в виде: &amp;lt;math&amp;gt;A=U\Sigma V^*&amp;lt;/math&amp;gt;, где &amp;lt;math&amp;gt;U, V&amp;lt;/math&amp;gt; – унитарные матрицы, а &amp;lt;math&amp;gt;\Sigma&amp;lt;/math&amp;gt; – диагональная матрица с вещественными положительными числами на диагонали &amp;lt;ref&amp;gt;http://algorithms.parallel.ru/&amp;lt;/ref&amp;gt;.&lt;br /&gt;
&lt;br /&gt;
Диагональные элементы матрицы &amp;lt;math&amp;gt;\Sigma&amp;lt;/math&amp;gt; называются сингулярными числами матрицы &amp;lt;math&amp;gt;A&amp;lt;/math&amp;gt;, а столбцы матриц &amp;lt;math&amp;gt;U,V&amp;lt;/math&amp;gt; левыми и правыми сингулярными векторами соответственно.&lt;br /&gt;
&lt;br /&gt;
Алгоритм Якоби сингулярного разложения матрицы был предложен одним из первых в 1846 году. Он приводит прямоугольную матрицу к диагональной матрице с помощью последовательности элементарных вращений. Метод может найти все сингулярные значения с очень высокой точностью. Однако его производительность является довольно низкой, в сравнении с конкурирующими методами.&lt;br /&gt;
&lt;br /&gt;
&#039;&#039;Неявный&#039;&#039;&amp;lt;ref&amp;gt;Дж. Деммель «Вычислительная линейная алгебра» (стр. 261-264)&amp;lt;/ref&amp;gt; метод Якоби математически эквивалентен применению метода Якоби вычисления собственных значений к матрице &amp;lt;math&amp;gt;A = G^TG&amp;lt;/math&amp;gt;.&lt;br /&gt;
Это значит, что на каждом шаге вычисляется вращение Якоби &amp;lt;math&amp;gt;J&amp;lt;/math&amp;gt;, с помощью которого матрица &amp;lt;math&amp;gt;G^TG&amp;lt;/math&amp;gt; неявно пересчитывется в &amp;lt;math&amp;gt;J^TG^TGJ&amp;lt;/math&amp;gt;; вращение выбрано так, чтобы пара внедиагональных элементов из &amp;lt;math&amp;gt;G^TG&amp;lt;/math&amp;gt; обратилась в нули в матрице &amp;lt;math&amp;gt;J^TG^TGJ&amp;lt;/math&amp;gt;. При этом ни &amp;lt;math&amp;gt;G^TG&amp;lt;/math&amp;gt;, ни &amp;lt;math&amp;gt;J^TG^TGJ&amp;lt;/math&amp;gt; не вычисляются в явном виде; вместо них вычисляется матрица &amp;lt;math&amp;gt;GJ&amp;lt;/math&amp;gt;. Поэтому алгоритм называется &#039;&#039;методом односторонних вращений&#039;&#039;.&lt;br /&gt;
&lt;br /&gt;
=== Математическое описание алгоритма ===&lt;br /&gt;
Исходные данные: матрица &amp;lt;math&amp;gt;G&amp;lt;/math&amp;gt; (элементы &amp;lt;math&amp;gt;g_{ij}, i, j = 1, \ldots, n&amp;lt;/math&amp;gt;).&lt;br /&gt;
&lt;br /&gt;
Вычисляемые данные: матрица &amp;lt;math&amp;gt;\Sigma = diag(\sigma_{i})&amp;lt;/math&amp;gt;, где &amp;lt;math&amp;gt;\sigma_{i}&amp;lt;/math&amp;gt; - сингулярные числа, &amp;lt;math&amp;gt;U&amp;lt;/math&amp;gt; - матрица левых сингулярных векторов, &amp;lt;math&amp;gt;V&amp;lt;/math&amp;gt; - матрица правых сингулярных векторов.&lt;br /&gt;
&lt;br /&gt;
симметричную матрицу &amp;lt;math&amp;gt;A = (G^TG)&amp;lt;/math&amp;gt; можно привести к диагональному виду:&lt;br /&gt;
&amp;lt;math&amp;gt;RG^TGR^T&amp;lt;/math&amp;gt;, где&lt;br /&gt;
&lt;br /&gt;
&amp;lt;math&amp;gt;&lt;br /&gt;
\begin{matrix}&lt;br /&gt;
  &amp;amp;     &amp;amp;      &amp;amp;       &amp;amp; j &amp;amp;         &amp;amp; k &amp;amp;         &amp;amp;    &amp;amp;   \\&lt;br /&gt;
\end{matrix}&lt;br /&gt;
&amp;lt;/math&amp;gt;&lt;br /&gt;
&lt;br /&gt;
&amp;lt;math&amp;gt;&lt;br /&gt;
R(j,k,\theta) = &lt;br /&gt;
\begin{matrix}&lt;br /&gt;
  \\&lt;br /&gt;
  \\&lt;br /&gt;
  \\&lt;br /&gt;
j \\&lt;br /&gt;
  \\&lt;br /&gt;
k \\&lt;br /&gt;
  \\&lt;br /&gt;
  \\&lt;br /&gt;
  \\&lt;br /&gt;
\end{matrix}&lt;br /&gt;
&amp;lt;/math&amp;gt;  &lt;br /&gt;
&amp;lt;math&amp;gt;&lt;br /&gt;
\begin{bmatrix}&lt;br /&gt;
  &amp;amp; 1 &amp;amp;   &amp;amp;        &amp;amp;              &amp;amp;        &amp;amp;               &amp;amp;         &amp;amp;    &amp;amp;   \\&lt;br /&gt;
  &amp;amp;   &amp;amp; 1 &amp;amp;        &amp;amp;              &amp;amp;        &amp;amp;               &amp;amp;         &amp;amp;    &amp;amp;   \\&lt;br /&gt;
  &amp;amp;   &amp;amp;   &amp;amp; \ddots &amp;amp;              &amp;amp;        &amp;amp;               &amp;amp;         &amp;amp;    &amp;amp;   \\&lt;br /&gt;
  &amp;amp;   &amp;amp;   &amp;amp;        &amp;amp; \cos(\theta) &amp;amp;        &amp;amp; -\sin(\theta) &amp;amp;         &amp;amp;    &amp;amp;   \\&lt;br /&gt;
  &amp;amp;   &amp;amp;   &amp;amp;        &amp;amp;              &amp;amp; \ddots &amp;amp;               &amp;amp;         &amp;amp;    &amp;amp;   \\&lt;br /&gt;
  &amp;amp;   &amp;amp;   &amp;amp;        &amp;amp; \sin(\theta) &amp;amp;        &amp;amp; \cos(\theta)  &amp;amp;         &amp;amp;    &amp;amp;   \\&lt;br /&gt;
  &amp;amp;   &amp;amp;   &amp;amp;        &amp;amp;              &amp;amp;        &amp;amp;               &amp;amp; \ddots  &amp;amp;    &amp;amp;   \\&lt;br /&gt;
  &amp;amp;   &amp;amp;   &amp;amp;        &amp;amp;              &amp;amp;        &amp;amp;               &amp;amp;         &amp;amp; 1  &amp;amp;   \\&lt;br /&gt;
  &amp;amp;   &amp;amp;   &amp;amp;        &amp;amp;              &amp;amp;        &amp;amp;               &amp;amp;         &amp;amp;    &amp;amp; 1 \\&lt;br /&gt;
\end{bmatrix}&lt;br /&gt;
&amp;lt;/math&amp;gt;&lt;br /&gt;
&lt;br /&gt;
Обозначим &amp;lt;math&amp;gt;s = \sin \theta&amp;lt;/math&amp;gt; и &amp;lt;math&amp;gt;c = \cos \theta&amp;lt;/math&amp;gt;.&lt;br /&gt;
&lt;br /&gt;
Перемножив матрицы &amp;lt;math&amp;gt;RG^TGR^T&amp;lt;/math&amp;gt;, получим следующие выражения:&lt;br /&gt;
&lt;br /&gt;
&amp;lt;math&amp;gt;\begin{align}&lt;br /&gt;
 a_{jj}^{(i+1)} &amp;amp;= c^2\, a_{jj}^{(i)}  -  2\, s c \,a_{jk}^{(i)}  +  s^2\, a_{kk}^{(i)} \\&lt;br /&gt;
 a_{kk}^{(i+1)} &amp;amp;= s^2 \,a_{jj}^{(i)}  +  2 s c\, a_{jk}^{(i)}  +  c^2 \, a_{kk}^{(i)} \\&lt;br /&gt;
 a_{jk}^{(i+1)} &amp;amp;= a_{kj}^{(i+1)} = (c^2 - s^2 ) \, a_{jk}^{(i)}  +  s c \, (a_{kk}^{(i)} - a_{jj}^{(i)} ) \\&lt;br /&gt;
 a_{jm}^{(i+1)} &amp;amp;= a_{mj}^{(i+1)} = c \, a_{jm}^{(i)}  -  s \, a_{km}^{(i)} &amp;amp; m \ne j,k \\&lt;br /&gt;
 a_{km}^{(i+1)} &amp;amp;= a_{mk}^{(i+1)} = s \, a_{jm}^{(i)}  + c \, a_{km}^{(i)} &amp;amp; m \ne j,k \\&lt;br /&gt;
 a_{ml}^{(i+1)} &amp;amp;= a_{ml}^{(i)} &amp;amp;m,l \ne j,k&lt;br /&gt;
\end{align}&amp;lt;/math&amp;gt;&lt;br /&gt;
&lt;br /&gt;
Т.к внедиагональные элементы должны быть равны 0, то выбираем &amp;lt;math&amp;gt;\theta&amp;lt;/math&amp;gt; так, чтобы &amp;lt;math&amp;gt;a_{jk}^{(i+1)} = 0&amp;lt;/math&amp;gt; и &amp;lt;math&amp;gt;a_{kj}^{(i+1)} = 0&amp;lt;/math&amp;gt;.&lt;br /&gt;
&lt;br /&gt;
Тогда решая уравнение получаем, что&lt;br /&gt;
&lt;br /&gt;
&amp;lt;math&amp;gt;&lt;br /&gt;
         \begin{align}&lt;br /&gt;
         \tau &amp;amp;= {a_{jj} - a_{kk}}/{2a_{jk}} \\&lt;br /&gt;
         t &amp;amp;= {sign(\tau)}/(|\tau| + \sqrt{1 + \tau^2}) \\&lt;br /&gt;
         c &amp;amp;= 1/(\sqrt{1 + t^2}) \\&lt;br /&gt;
         s &amp;amp;= ct \\&lt;br /&gt;
         \end{align}&amp;lt;/math&amp;gt;&lt;br /&gt;
&lt;br /&gt;
Остановка вычислений алгоритма наступает, когда внедиагональные элементы становятся меньше некоторого наперед заданного числа &amp;lt;math&amp;gt;\varepsilon&amp;lt;/math&amp;gt;.&lt;br /&gt;
&lt;br /&gt;
=== Вычислительное ядро алгоритма ===&lt;br /&gt;
Вычислительное ядро алгоритма составляет непосредственно вычисление одностороннего вращения Якоби, т.е. вычисление элементов матрицы &amp;lt;math&amp;gt;g_{jm}^{(i+1)} = g_{mj}^{(i+1)}&amp;lt;/math&amp;gt; и &amp;lt;math&amp;gt;g_{km}^{(i+1)} = g_{mk}^{(i+1)}&amp;lt;/math&amp;gt;, &amp;lt;math&amp;gt;m \ne j,k&amp;lt;/math&amp;gt;, а также вычисления элементов &amp;lt;math&amp;gt;g_{jj}^{(i+1)} &amp;lt;/math&amp;gt; и &amp;lt;math&amp;gt;g_{kk}^{(i+1)} &amp;lt;/math&amp;gt;, получившихся после умножения промежуточной матрицы на матрицу вращений Якоби.&lt;br /&gt;
&lt;br /&gt;
=== Макроструктура алгоритма ===&lt;br /&gt;
Основную часть метода составляет процедура односторонних вращений матрицы, которая в свою очередь состоит из:&lt;br /&gt;
&lt;br /&gt;
#Вычисление &amp;lt;math&amp;gt;\tau, c, s, t&amp;lt;/math&amp;gt;.&lt;br /&gt;
#Одностороннее вращение матрицы. &lt;br /&gt;
&lt;br /&gt;
Что требует &amp;lt;math&amp;gt;O(n)&amp;lt;/math&amp;gt; операций.&lt;br /&gt;
&lt;br /&gt;
После этого необходимо:&lt;br /&gt;
&lt;br /&gt;
#Вычислить сингулярные числа &amp;lt;math&amp;gt;\sigma_i&amp;lt;/math&amp;gt;.  Что требует &amp;lt;math&amp;gt;O(n)&amp;lt;/math&amp;gt; операций.&lt;br /&gt;
#Вычислить &amp;lt;math&amp;gt;U&amp;lt;/math&amp;gt; и &amp;lt;math&amp;gt;V&amp;lt;/math&amp;gt;. Что требует &amp;lt;math&amp;gt;O(n^2)&amp;lt;/math&amp;gt; операций.&lt;br /&gt;
&lt;br /&gt;
=== Схема реализации последовательного алгоритма ===&lt;br /&gt;
Применение метода Якоби к матрице &amp;lt;math&amp;gt;A = (G^TG)&amp;lt;/math&amp;gt; можно описать следующим образом&amp;lt;ref&amp;gt;Дж. Деммель «Вычислительная линейная алгебра» (стр. 261-263)&amp;lt;/ref&amp;gt;:&lt;br /&gt;
&lt;br /&gt;
Если &amp;lt;math&amp;gt;G = U\Sigma V^T&amp;lt;/math&amp;gt; и &amp;lt;math&amp;gt;\Sigma = diag(\sigma_{i})&amp;lt;/math&amp;gt;, то алгоритм вычисляет сингулярные числа &amp;lt;math&amp;gt;\sigma_{i}&amp;lt;/math&amp;gt;, матрицу &amp;lt;math&amp;gt;U&amp;lt;/math&amp;gt; левых сингулярных векторов и матрицу &amp;lt;math&amp;gt;V&amp;lt;/math&amp;gt; правых сингулярных векторов по следующей схеме:&lt;br /&gt;
&lt;br /&gt;
 repeat&lt;br /&gt;
     for &amp;lt;math&amp;gt;j=1&amp;lt;/math&amp;gt; to &amp;lt;math&amp;gt;n-1&amp;lt;/math&amp;gt;&lt;br /&gt;
         for &amp;lt;math&amp;gt;k=j+1&amp;lt;/math&amp;gt; to &amp;lt;math&amp;gt;n&amp;lt;/math&amp;gt;&lt;br /&gt;
             обратиться к процедуре &#039;&#039;&#039;&#039;&#039;One-Sided-Jacobi-Rotation&amp;lt;math&amp;gt;(G,j,k)&amp;lt;/math&amp;gt;&#039;&#039;&#039;&#039;&#039;&lt;br /&gt;
         end for&lt;br /&gt;
     end for&lt;br /&gt;
 пока &amp;lt;math&amp;gt;G^TG&amp;lt;/math&amp;gt; не станет достаточно близка к диагональной матрице&lt;br /&gt;
 Положить &amp;lt;math&amp;gt;\sigma_{i} = ||G(:,i)||_2 &amp;lt;/math&amp;gt; (норма &amp;lt;math&amp;gt;i&amp;lt;/math&amp;gt;-го столбца в &amp;lt;math&amp;gt;G&amp;lt;/math&amp;gt;)&lt;br /&gt;
 Положить &amp;lt;math&amp;gt;U = [u_{1},\dots, u_{n}]&amp;lt;/math&amp;gt;, где &amp;lt;math&amp;gt;u_{i} = G(:,i)/\sigma_{i}&amp;lt;/math&amp;gt;&lt;br /&gt;
 Положить &amp;lt;math&amp;gt;V = J&amp;lt;/math&amp;gt;, где &amp;lt;math&amp;gt;J&amp;lt;/math&amp;gt; - накопленное произведение вращений Якоби.&lt;br /&gt;
&lt;br /&gt;
Где процедура &#039;&#039;&#039;&#039;&#039;One-Sided-Jacobi-Rotation&#039;&#039;&#039;&#039;&#039; является метод односторонних вращений Якоби:&lt;br /&gt;
&lt;br /&gt;
 proc &#039;&#039;&#039;&#039;&#039;One-Sided-Jacobi-Rotation&amp;lt;math&amp;gt;(G,j,k)&amp;lt;/math&amp;gt;&#039;&#039;&#039;&#039;&#039;&lt;br /&gt;
     вычислить &amp;lt;math&amp;gt;a_{jj} = (G^TG)_{jj}, a_{jk} = (G^TG)_{jk}&amp;lt;/math&amp;gt; и &amp;lt;math&amp;gt;a_{kk} = (G^TG)_{kk}&amp;lt;/math&amp;gt;&lt;br /&gt;
     if &amp;lt;math&amp;gt;|a_{jk}|&amp;lt;/math&amp;gt; не слишком мал&lt;br /&gt;
         &amp;lt;math&amp;gt;&lt;br /&gt;
         \begin{align}&lt;br /&gt;
         \tau &amp;amp;= {a_{jj} - a_{kk}}/{2a_{jk}} \\&lt;br /&gt;
         t &amp;amp;= {sign(\tau)}/(|\tau| + \sqrt{1 + \tau^2}) \\&lt;br /&gt;
         c &amp;amp;= 1/(\sqrt{1 + t^2}) \\&lt;br /&gt;
         s &amp;amp;= ct \\&lt;br /&gt;
         G &amp;amp;= GR(j,k,\theta) \  \dots c=cos\theta, s=sin\theta \end{align}&amp;lt;/math&amp;gt;&lt;br /&gt;
         if нужны правые сингулярные векторы &lt;br /&gt;
             &amp;lt;math&amp;gt;J = JR(j,k,\theta)&amp;lt;/math&amp;gt;&lt;br /&gt;
         end if&lt;br /&gt;
     end if&lt;br /&gt;
&lt;br /&gt;
=== Последовательная сложность алгоритма ===&lt;br /&gt;
&lt;br /&gt;
=== Информационный граф ===&lt;br /&gt;
&lt;br /&gt;
=== Ресурс параллелизма алгоритма ===&lt;br /&gt;
Для выполнения одной итерации метода Якоби требуется последовательно выполнить несколько ярусов:&lt;br /&gt;
# вычислить &amp;lt;math&amp;gt;\tau&amp;lt;/math&amp;gt; &lt;br /&gt;
# вычислить &amp;lt;math&amp;gt;t&amp;lt;/math&amp;gt; &lt;br /&gt;
# вычислить &amp;lt;math&amp;gt;c&amp;lt;/math&amp;gt; &lt;br /&gt;
# выполнить поворот матрицы &amp;lt;math&amp;gt;G&amp;lt;/math&amp;gt; с параллельным выполнением &amp;lt;math&amp;gt;2(n-2)&amp;lt;/math&amp;gt; операций вычисления элементов матрицы &amp;lt;math&amp;gt;g_{jm}^{(i+1)} = g_{mj}^{(i+1)}&amp;lt;/math&amp;gt; и &amp;lt;math&amp;gt;g_{km}^{(i+1)} = g_{mk}^{(i+1)}&amp;lt;/math&amp;gt;, &amp;lt;math&amp;gt;m \ne j,k&amp;lt;/math&amp;gt;, а также вычисления элементов &amp;lt;math&amp;gt;g_{jj}^{(i+1)} &amp;lt;/math&amp;gt; и &amp;lt;math&amp;gt;g_{kk}^{(i+1)} &amp;lt;/math&amp;gt;. &lt;br /&gt;
&lt;br /&gt;
Суммарное количество итераций равно &amp;lt;math&amp;gt;\frac{n(n-1)}{2}&amp;lt;/math&amp;gt; (Различные варианты выбора &amp;lt;math&amp;gt;j&amp;lt;/math&amp;gt; и &amp;lt;math&amp;gt;k&amp;lt;/math&amp;gt;). &lt;br /&gt;
&lt;br /&gt;
Асимптотически метод сходится квадратично. &lt;br /&gt;
&lt;br /&gt;
Таким образом, при классификации по высоте ЯПФ метод Якоби относится к алгоритмам со сложностью &amp;lt;math&amp;gt;O(n^2)&amp;lt;/math&amp;gt;&amp;amp;nbsp;, а при классификации по ширине ЯПФ — к алгоритмам со сложностью &amp;lt;math&amp;gt;O(n)&amp;lt;/math&amp;gt;.&lt;br /&gt;
&lt;br /&gt;
=== Входные и выходные данные алгоритма ===&lt;br /&gt;
&#039;&#039;&#039;Входные данные&#039;&#039;&#039;: плотная матрица &amp;lt;math&amp;gt;G&amp;lt;/math&amp;gt; размера &amp;lt;math&amp;gt;n&amp;lt;/math&amp;gt;х&amp;lt;math&amp;gt;n&amp;lt;/math&amp;gt;, где &amp;lt;math&amp;gt;A= G^TG&amp;lt;/math&amp;gt; – симметрическая матрица.&lt;br /&gt;
&lt;br /&gt;
&#039;&#039;&#039;Объём входных данных&#039;&#039;&#039;: &amp;lt;math&amp;gt;n^2&amp;lt;/math&amp;gt; (т.к. для хранения матрицы &amp;lt;math&amp;gt;G&amp;lt;/math&amp;gt; используем двумерный массив размера &amp;lt;math&amp;gt;n&amp;lt;/math&amp;gt;х&amp;lt;math&amp;gt;n&amp;lt;/math&amp;gt;)&lt;br /&gt;
&lt;br /&gt;
&#039;&#039;&#039;Выходные данные&#039;&#039;&#039;: &amp;lt;math&amp;gt;\sigma_{i}&amp;lt;/math&amp;gt;  - сингулярные числа, матрица &amp;lt;math&amp;gt;U&amp;lt;/math&amp;gt; левых сингулярных векторов и матрица &amp;lt;math&amp;gt;V&amp;lt;/math&amp;gt; правых сингулярных векторов.&lt;br /&gt;
&lt;br /&gt;
&#039;&#039;&#039;Объём выходных данных&#039;&#039;&#039;: &amp;lt;math&amp;gt;2n^2 + n&amp;lt;/math&amp;gt; (т.к. необходимо хранить вектор сингулярных чисел длины &amp;lt;math&amp;gt;n&amp;lt;/math&amp;gt;, а также две матрицы &amp;lt;math&amp;gt;U, V&amp;lt;/math&amp;gt; левых и правых сингулярных векторов размера &amp;lt;math&amp;gt;n&amp;lt;/math&amp;gt;х&amp;lt;math&amp;gt;n&amp;lt;/math&amp;gt;).&lt;br /&gt;
&lt;br /&gt;
=== Свойства алгоритма ===&lt;br /&gt;
Метод Якоби является самым медленным из имеющихся алгоритмов вычисления сингулярных чисел и сингулярных векторов матрицы. Тем не менее, для  матриц &amp;lt;math&amp;gt;G&amp;lt;/math&amp;gt;, которые могут быть представлены в виде &amp;lt;math&amp;gt;G=DX&amp;lt;/math&amp;gt;, где &amp;lt;math&amp;gt;D&amp;lt;/math&amp;gt; - диагональная, а &amp;lt;math&amp;gt;X&amp;lt;/math&amp;gt; - хорошо обусловлена, он способен вычислять сингулярные числа и вектора намного точнее, чем другие методы&amp;lt;ref&amp;gt;Дж. Деммель «Вычислительная линейная алгебра» (стр. 261-264)&amp;lt;/ref&amp;gt;. &lt;br /&gt;
&lt;br /&gt;
Вычислительная мощность алгоритма, как отношение числа операций к суммарному объему входных и выходных данных является линейной.&lt;br /&gt;
&lt;br /&gt;
Метод Якоби не детерминирован, так как является итерационным алгоритмом с выходом по точности (число итераций зависит от входных данных и порогового значения).&lt;br /&gt;
&lt;br /&gt;
== Программная реализация алгоритма ==&lt;br /&gt;
&lt;br /&gt;
=== Особенности реализации последовательного алгоритма ===&lt;br /&gt;
&lt;br /&gt;
=== Локальность данных и вычислений ===&lt;br /&gt;
&lt;br /&gt;
=== Возможные способы и особенности параллельной реализации алгоритма ===&lt;br /&gt;
&lt;br /&gt;
=== Масштабируемость алгоритма и его реализации ===&lt;br /&gt;
&lt;br /&gt;
=== Динамические характеристики и эффективность реализации алгоритма ===&lt;br /&gt;
&lt;br /&gt;
=== Выводы для классов архитектур ===&lt;br /&gt;
&lt;br /&gt;
=== Существующие реализации алгоритма ===&lt;br /&gt;
Метод Якоби нахождения сингулярных значений и векторов реализован в таких пакетах, как LAPACK, LINPACK/EISPACK, Intel MKL &amp;lt;ref&amp;gt;http://www.alglib.net/matrixops/general/svd.php&amp;lt;/ref&amp;gt;.&lt;br /&gt;
&lt;br /&gt;
Так же функция Якоби реализована в пакете Matlab.&lt;br /&gt;
&lt;br /&gt;
Т. к. алгоритм считается медленным, он не включен во многие известные пакеты.&lt;br /&gt;
&lt;br /&gt;
== Литература ==&lt;br /&gt;
1. Дж. Деммель Вычислительная линейная алгебра. Изд. Мир, 2001.&lt;/div&gt;</summary>
		<author><name>Davletshuna Alexandra</name></author>
	</entry>
	<entry>
		<id>https://xn--80aecvaldz.xn--80ahdrnmvk.xn--p1ai/w/ru/index.php?title=%D0%A3%D1%87%D0%B0%D1%81%D1%82%D0%BD%D0%B8%D0%BA:Davletshuna_Alexandra/%D0%9C%D0%B5%D1%82%D0%BE%D0%B4_%D0%AF%D0%BA%D0%BE%D0%B1%D0%B8_%D0%B2%D1%8B%D1%87%D0%B8%D1%81%D0%BB%D0%B5%D0%BD%D0%B8%D1%8F_%D1%81%D0%B8%D0%BD%D0%B3%D1%83%D0%BB%D1%8F%D1%80%D0%BD%D1%8B%D1%85_%D1%87%D0%B8%D1%81%D0%B5%D0%BB_%D0%B8_%D0%B2%D0%B5%D0%BA%D1%82%D0%BE%D1%80%D0%BE%D0%B2&amp;diff=9862</id>
		<title>Участник:Davletshuna Alexandra/Метод Якоби вычисления сингулярных чисел и векторов</title>
		<link rel="alternate" type="text/html" href="https://xn--80aecvaldz.xn--80ahdrnmvk.xn--p1ai/w/ru/index.php?title=%D0%A3%D1%87%D0%B0%D1%81%D1%82%D0%BD%D0%B8%D0%BA:Davletshuna_Alexandra/%D0%9C%D0%B5%D1%82%D0%BE%D0%B4_%D0%AF%D0%BA%D0%BE%D0%B1%D0%B8_%D0%B2%D1%8B%D1%87%D0%B8%D1%81%D0%BB%D0%B5%D0%BD%D0%B8%D1%8F_%D1%81%D0%B8%D0%BD%D0%B3%D1%83%D0%BB%D1%8F%D1%80%D0%BD%D1%8B%D1%85_%D1%87%D0%B8%D1%81%D0%B5%D0%BB_%D0%B8_%D0%B2%D0%B5%D0%BA%D1%82%D0%BE%D1%80%D0%BE%D0%B2&amp;diff=9862"/>
		<updated>2016-10-15T14:22:06Z</updated>

		<summary type="html">&lt;p&gt;Davletshuna Alexandra: /* Вычислительное ядро алгоритма */&lt;/p&gt;
&lt;hr /&gt;
&lt;div&gt;&lt;br /&gt;
{{algorithm&lt;br /&gt;
| name              = Метод Якоби вычисления сингулярных чисел и векторов&lt;br /&gt;
| serial_complexity = &amp;lt;math&amp;gt;O(n^3)&amp;lt;/math&amp;gt;&lt;br /&gt;
| pf_height         = &amp;lt;math&amp;gt;O(n^2)&amp;lt;/math&amp;gt;&lt;br /&gt;
| pf_width          = &amp;lt;math&amp;gt;O(n)&amp;lt;/math&amp;gt;&lt;br /&gt;
| input_data        = &amp;lt;math&amp;gt;n^2&amp;lt;/math&amp;gt;&lt;br /&gt;
| output_data       = &amp;lt;math&amp;gt;2n^2 + n&amp;lt;/math&amp;gt;&lt;br /&gt;
}}&lt;br /&gt;
&lt;br /&gt;
Авторы статьи: [[Участница:Davletshuna Alexandra|Давлетшина Александра]] (группа 619), [[Участница:Alek sandra|Зайцева Александра]] (группа 601)&lt;br /&gt;
&lt;br /&gt;
== Свойства и структура алгоритма ==&lt;br /&gt;
&lt;br /&gt;
=== Общее описание алгоритма ===&lt;br /&gt;
&#039;&#039;&#039;Сингулярным разложением&#039;&#039;&#039; называется разложение прямоугольной вещественной или комплексной матрицы, имеющее широкое применение, в силу своей наглядной геометрической интерпретации, при решении многих прикладных задач. Сингулярное разложение матрицы А позволяет вычислять сингулярные числа данной матрицы, а также, левые и правые сингулярные векторы матрицы А:&lt;br /&gt;
&lt;br /&gt;
•	левые сингулярные векторы матрицы А — это собственные векторы матрицы &amp;lt;math&amp;gt;AA^*&amp;lt;/math&amp;gt;;&lt;br /&gt;
&lt;br /&gt;
•	правые сингулярные векторы матрицы A — это собственные векторы матрицы &amp;lt;math&amp;gt;A^*A&amp;lt;/math&amp;gt;.&lt;br /&gt;
&lt;br /&gt;
Геометрическая интерпретация сингулярного разложения заключается в следующем факте из геометрии: &#039;&#039;Образом любого линейного преобразования, заданного с помощью матрицы &amp;lt;math&amp;gt;m&amp;lt;/math&amp;gt;x&amp;lt;math&amp;gt;n&amp;lt;/math&amp;gt;, примененного к единичной сфере является гиперэллипсоид&#039;&#039;.&lt;br /&gt;
&lt;br /&gt;
Из многочисленных разложений матриц, наиболее удобным является сингулярное разложение матрицы в виде: &amp;lt;math&amp;gt;A=U\Sigma V^*&amp;lt;/math&amp;gt;, где &amp;lt;math&amp;gt;U, V&amp;lt;/math&amp;gt; – унитарные матрицы, а &amp;lt;math&amp;gt;\Sigma&amp;lt;/math&amp;gt; – диагональная матрица с вещественными положительными числами на диагонали &amp;lt;ref&amp;gt;http://algorithms.parallel.ru/&amp;lt;/ref&amp;gt;.&lt;br /&gt;
&lt;br /&gt;
Диагональные элементы матрицы &amp;lt;math&amp;gt;\Sigma&amp;lt;/math&amp;gt; называются сингулярными числами матрицы &amp;lt;math&amp;gt;A&amp;lt;/math&amp;gt;, а столбцы матриц &amp;lt;math&amp;gt;U,V&amp;lt;/math&amp;gt; левыми и правыми сингулярными векторами соответственно.&lt;br /&gt;
&lt;br /&gt;
Алгоритм Якоби сингулярного разложения матрицы был предложен одним из первых в 1846 году. Он приводит прямоугольную матрицу к диагональной матрице с помощью последовательности элементарных вращений. Метод может найти все сингулярные значения с очень высокой точностью. Однако его производительность является довольно низкой, в сравнении с конкурирующими методами.&lt;br /&gt;
&lt;br /&gt;
&#039;&#039;Неявный&#039;&#039;&amp;lt;ref&amp;gt;Дж. Деммель «Вычислительная линейная алгебра» (стр. 261-264)&amp;lt;/ref&amp;gt; метод Якоби математически эквивалентен применению метода Якоби вычисления собственных значений к матрице &amp;lt;math&amp;gt;A = G^TG&amp;lt;/math&amp;gt;.&lt;br /&gt;
Это значит, что на каждом шаге вычисляется вращение Якоби &amp;lt;math&amp;gt;J&amp;lt;/math&amp;gt;, с помощью которого матрица &amp;lt;math&amp;gt;G^TG&amp;lt;/math&amp;gt; неявно пересчитывется в &amp;lt;math&amp;gt;J^TG^TGJ&amp;lt;/math&amp;gt;; вращение выбрано так, чтобы пара внедиагональных элементов из &amp;lt;math&amp;gt;G^TG&amp;lt;/math&amp;gt; обратилась в нули в матрице &amp;lt;math&amp;gt;J^TG^TGJ&amp;lt;/math&amp;gt;. При этом ни &amp;lt;math&amp;gt;G^TG&amp;lt;/math&amp;gt;, ни &amp;lt;math&amp;gt;J^TG^TGJ&amp;lt;/math&amp;gt; не вычисляются в явном виде; вместо них вычисляется матрица &amp;lt;math&amp;gt;GJ&amp;lt;/math&amp;gt;. Поэтому алгоритм называется &#039;&#039;методом односторонних вращений&#039;&#039;.&lt;br /&gt;
&lt;br /&gt;
=== Математическое описание алгоритма ===&lt;br /&gt;
Исходные данные: матрица &amp;lt;math&amp;gt;G&amp;lt;/math&amp;gt; (элементы &amp;lt;math&amp;gt;g_{ij}, i, j = 1, \ldots, n&amp;lt;/math&amp;gt;).&lt;br /&gt;
&lt;br /&gt;
Вычисляемые данные: матрица &amp;lt;math&amp;gt;\Sigma = diag(\sigma_{i})&amp;lt;/math&amp;gt;, где &amp;lt;math&amp;gt;\sigma_{i}&amp;lt;/math&amp;gt; - сингулярные числа, &amp;lt;math&amp;gt;U&amp;lt;/math&amp;gt; - матрица левых сингулярных векторов, &amp;lt;math&amp;gt;V&amp;lt;/math&amp;gt; - матрица правых сингулярных векторов.&lt;br /&gt;
&lt;br /&gt;
симметричную матрицу &amp;lt;math&amp;gt;A = (G^TG)&amp;lt;/math&amp;gt; можно привести к диагональному виду:&lt;br /&gt;
&amp;lt;math&amp;gt;RG^TGR^T&amp;lt;/math&amp;gt;, где&lt;br /&gt;
&lt;br /&gt;
&amp;lt;math&amp;gt;&lt;br /&gt;
\begin{matrix}&lt;br /&gt;
  &amp;amp;     &amp;amp;      &amp;amp;       &amp;amp; j &amp;amp;         &amp;amp; k &amp;amp;         &amp;amp;    &amp;amp;   \\&lt;br /&gt;
\end{matrix}&lt;br /&gt;
&amp;lt;/math&amp;gt;&lt;br /&gt;
&lt;br /&gt;
&amp;lt;math&amp;gt;&lt;br /&gt;
R(j,k,\theta) = &lt;br /&gt;
\begin{matrix}&lt;br /&gt;
  \\&lt;br /&gt;
  \\&lt;br /&gt;
  \\&lt;br /&gt;
j \\&lt;br /&gt;
  \\&lt;br /&gt;
k \\&lt;br /&gt;
  \\&lt;br /&gt;
  \\&lt;br /&gt;
  \\&lt;br /&gt;
\end{matrix}&lt;br /&gt;
&amp;lt;/math&amp;gt;  &lt;br /&gt;
&amp;lt;math&amp;gt;&lt;br /&gt;
\begin{bmatrix}&lt;br /&gt;
  &amp;amp; 1 &amp;amp;   &amp;amp;        &amp;amp;              &amp;amp;        &amp;amp;               &amp;amp;         &amp;amp;    &amp;amp;   \\&lt;br /&gt;
  &amp;amp;   &amp;amp; 1 &amp;amp;        &amp;amp;              &amp;amp;        &amp;amp;               &amp;amp;         &amp;amp;    &amp;amp;   \\&lt;br /&gt;
  &amp;amp;   &amp;amp;   &amp;amp; \ddots &amp;amp;              &amp;amp;        &amp;amp;               &amp;amp;         &amp;amp;    &amp;amp;   \\&lt;br /&gt;
  &amp;amp;   &amp;amp;   &amp;amp;        &amp;amp; \cos(\theta) &amp;amp;        &amp;amp; -\sin(\theta) &amp;amp;         &amp;amp;    &amp;amp;   \\&lt;br /&gt;
  &amp;amp;   &amp;amp;   &amp;amp;        &amp;amp;              &amp;amp; \ddots &amp;amp;               &amp;amp;         &amp;amp;    &amp;amp;   \\&lt;br /&gt;
  &amp;amp;   &amp;amp;   &amp;amp;        &amp;amp; \sin(\theta) &amp;amp;        &amp;amp; \cos(\theta)  &amp;amp;         &amp;amp;    &amp;amp;   \\&lt;br /&gt;
  &amp;amp;   &amp;amp;   &amp;amp;        &amp;amp;              &amp;amp;        &amp;amp;               &amp;amp; \ddots  &amp;amp;    &amp;amp;   \\&lt;br /&gt;
  &amp;amp;   &amp;amp;   &amp;amp;        &amp;amp;              &amp;amp;        &amp;amp;               &amp;amp;         &amp;amp; 1  &amp;amp;   \\&lt;br /&gt;
  &amp;amp;   &amp;amp;   &amp;amp;        &amp;amp;              &amp;amp;        &amp;amp;               &amp;amp;         &amp;amp;    &amp;amp; 1 \\&lt;br /&gt;
\end{bmatrix}&lt;br /&gt;
&amp;lt;/math&amp;gt;&lt;br /&gt;
&lt;br /&gt;
Обозначим &amp;lt;math&amp;gt;s = \sin \theta&amp;lt;/math&amp;gt; и &amp;lt;math&amp;gt;c = \cos \theta&amp;lt;/math&amp;gt;.&lt;br /&gt;
&lt;br /&gt;
Перемножив матрицы &amp;lt;math&amp;gt;RG^TGR^T&amp;lt;/math&amp;gt;, получим следующие выражения:&lt;br /&gt;
&lt;br /&gt;
&amp;lt;math&amp;gt;\begin{align}&lt;br /&gt;
 a_{jj}^{(i+1)} &amp;amp;= c^2\, a_{jj}^{(i)}  -  2\, s c \,a_{jk}^{(i)}  +  s^2\, a_{kk}^{(i)} \\&lt;br /&gt;
 a_{kk}^{(i+1)} &amp;amp;= s^2 \,a_{jj}^{(i)}  +  2 s c\, a_{jk}^{(i)}  +  c^2 \, a_{kk}^{(i)} \\&lt;br /&gt;
 a_{jk}^{(i+1)} &amp;amp;= a_{kj}^{(i+1)} = (c^2 - s^2 ) \, a_{jk}^{(i)}  +  s c \, (a_{kk}^{(i)} - a_{jj}^{(i)} ) \\&lt;br /&gt;
 a_{jm}^{(i+1)} &amp;amp;= a_{mj}^{(i+1)} = c \, a_{jm}^{(i)}  -  s \, a_{km}^{(i)} &amp;amp; m \ne j,k \\&lt;br /&gt;
 a_{km}^{(i+1)} &amp;amp;= a_{mk}^{(i+1)} = s \, a_{jm}^{(i)}  + c \, a_{km}^{(i)} &amp;amp; m \ne j,k \\&lt;br /&gt;
 a_{ml}^{(i+1)} &amp;amp;= a_{ml}^{(i)} &amp;amp;m,l \ne j,k&lt;br /&gt;
\end{align}&amp;lt;/math&amp;gt;&lt;br /&gt;
&lt;br /&gt;
Т.к внедиагональные элементы должны быть равны 0, то выбираем &amp;lt;math&amp;gt;\theta&amp;lt;/math&amp;gt; так, чтобы &amp;lt;math&amp;gt;a_{jk}^{(i+1)} = 0&amp;lt;/math&amp;gt; и &amp;lt;math&amp;gt;a_{kj}^{(i+1)} = 0&amp;lt;/math&amp;gt;.&lt;br /&gt;
&lt;br /&gt;
Тогда решая уравнение получаем, что&lt;br /&gt;
&lt;br /&gt;
&amp;lt;math&amp;gt;&lt;br /&gt;
         \begin{align}&lt;br /&gt;
         \tau &amp;amp;= {a_{jj} - a_{kk}}/{2a_{jk}} \\&lt;br /&gt;
         t &amp;amp;= {sign(\tau)}/(|\tau| + \sqrt{1 + \tau^2}) \\&lt;br /&gt;
         c &amp;amp;= 1/(\sqrt{1 + t^2}) \\&lt;br /&gt;
         s &amp;amp;= ct \\&lt;br /&gt;
         \end{align}&amp;lt;/math&amp;gt;&lt;br /&gt;
&lt;br /&gt;
Остановка вычислений алгоритма наступает, когда внедиагональные элементы становятся меньше некоторого наперед заданного числа &amp;lt;math&amp;gt;\varepsilon&amp;lt;/math&amp;gt;.&lt;br /&gt;
&lt;br /&gt;
=== Вычислительное ядро алгоритма ===&lt;br /&gt;
Вычислительное ядро алгоритма составляет непосредственно вычисление одностороннего вращения Якоби, т.е. вычисление элементов матрицы &amp;lt;math&amp;gt;g_{jm}^{(i+1)} = g_{mj}^{(i+1)}&amp;lt;/math&amp;gt; и &amp;lt;math&amp;gt;g_{km}^{(i+1)} = g_{mk}^{(i+1)}&amp;lt;/math&amp;gt;, &amp;lt;math&amp;gt;m \ne j,k&amp;lt;/math&amp;gt;, а также вычисления элементов &amp;lt;math&amp;gt;g_{jj}^{(i+1)} &amp;lt;/math&amp;gt; и &amp;lt;math&amp;gt;g_{kk}^{(i+1)} &amp;lt;/math&amp;gt;, получившихся после умножения промежуточной матрицы на матрицу вращений Якоби.&lt;br /&gt;
&lt;br /&gt;
=== Макроструктура алгоритма ===&lt;br /&gt;
Основную часть метода составляет процедура односторонних вращений матрицы, которая в свою очередь состоит из:&lt;br /&gt;
&lt;br /&gt;
#Вычисление &amp;lt;math&amp;gt;\tau, c, s, t&amp;lt;/math&amp;gt;.&lt;br /&gt;
#Одностороннее вращение матрицы. &lt;br /&gt;
&lt;br /&gt;
Что требует &amp;lt;math&amp;gt;O(n)&amp;lt;/math&amp;gt; операций.&lt;br /&gt;
&lt;br /&gt;
После этого необходимо:&lt;br /&gt;
&lt;br /&gt;
#Вычислить сингулярные числа &amp;lt;math&amp;gt;\sigma_i&amp;lt;/math&amp;gt;.  Что требует &amp;lt;math&amp;gt;O(n)&amp;lt;/math&amp;gt; операций.&lt;br /&gt;
#Вычислить &amp;lt;math&amp;gt;U&amp;lt;/math&amp;gt; и &amp;lt;math&amp;gt;V&amp;lt;/math&amp;gt;. Что требует &amp;lt;math&amp;gt;O(n^2)&amp;lt;/math&amp;gt; операций.&lt;br /&gt;
&lt;br /&gt;
=== Схема реализации последовательного алгоритма ===&lt;br /&gt;
Применение метода Якоби к матрице &amp;lt;math&amp;gt;A = (G^TG)&amp;lt;/math&amp;gt; можно описать следующим образом&amp;lt;ref&amp;gt;Дж. Деммель «Вычислительная линейная алгебра» (стр. 261-263)&amp;lt;/ref&amp;gt;:&lt;br /&gt;
&lt;br /&gt;
Если &amp;lt;math&amp;gt;G = U\Sigma V^T&amp;lt;/math&amp;gt; и &amp;lt;math&amp;gt;\Sigma = diag(\sigma_{i})&amp;lt;/math&amp;gt;, то алгоритм вычисляет сингулярные числа &amp;lt;math&amp;gt;\sigma_{i}&amp;lt;/math&amp;gt;, матрицу &amp;lt;math&amp;gt;U&amp;lt;/math&amp;gt; левых сингулярных векторов и матрицу &amp;lt;math&amp;gt;V&amp;lt;/math&amp;gt; правых сингулярных векторов по следующей схеме:&lt;br /&gt;
&lt;br /&gt;
 repeat&lt;br /&gt;
     for &amp;lt;math&amp;gt;j=1&amp;lt;/math&amp;gt; to &amp;lt;math&amp;gt;n-1&amp;lt;/math&amp;gt;&lt;br /&gt;
         for &amp;lt;math&amp;gt;k=j+1&amp;lt;/math&amp;gt; to &amp;lt;math&amp;gt;n&amp;lt;/math&amp;gt;&lt;br /&gt;
             обратиться к процедуре &#039;&#039;&#039;&#039;&#039;One-Sided-Jacobi-Rotation&amp;lt;math&amp;gt;(G,j,k)&amp;lt;/math&amp;gt;&#039;&#039;&#039;&#039;&#039;&lt;br /&gt;
         end for&lt;br /&gt;
     end for&lt;br /&gt;
 пока &amp;lt;math&amp;gt;G^TG&amp;lt;/math&amp;gt; не станет достаточно близка к диагональной матрице&lt;br /&gt;
 Положить &amp;lt;math&amp;gt;\sigma_{i} = ||G(:,i)||_2 &amp;lt;/math&amp;gt; (норма &amp;lt;math&amp;gt;i&amp;lt;/math&amp;gt;-го столбца в &amp;lt;math&amp;gt;G&amp;lt;/math&amp;gt;)&lt;br /&gt;
 Положить &amp;lt;math&amp;gt;U = [u_{1},\dots, u_{n}]&amp;lt;/math&amp;gt;, где &amp;lt;math&amp;gt;u_{i} = G(:,i)/\sigma_{i}&amp;lt;/math&amp;gt;&lt;br /&gt;
 Положить &amp;lt;math&amp;gt;V = J&amp;lt;/math&amp;gt;, где &amp;lt;math&amp;gt;J&amp;lt;/math&amp;gt; - накопленное произведение вращений Якоби.&lt;br /&gt;
&lt;br /&gt;
Где процедура &#039;&#039;&#039;&#039;&#039;One-Sided-Jacobi-Rotation&#039;&#039;&#039;&#039;&#039; является метод односторонних вращений Якоби:&lt;br /&gt;
&lt;br /&gt;
 proc &#039;&#039;&#039;&#039;&#039;One-Sided-Jacobi-Rotation&amp;lt;math&amp;gt;(G,j,k)&amp;lt;/math&amp;gt;&#039;&#039;&#039;&#039;&#039;&lt;br /&gt;
     вычислить &amp;lt;math&amp;gt;a_{jj} = (G^TG)_{jj}, a_{jk} = (G^TG)_{jk}&amp;lt;/math&amp;gt; и &amp;lt;math&amp;gt;a_{kk} = (G^TG)_{kk}&amp;lt;/math&amp;gt;&lt;br /&gt;
     if &amp;lt;math&amp;gt;|a_{jk}|&amp;lt;/math&amp;gt; не слишком мал&lt;br /&gt;
         &amp;lt;math&amp;gt;&lt;br /&gt;
         \begin{align}&lt;br /&gt;
         \tau &amp;amp;= {a_{jj} - a_{kk}}/{2a_{jk}} \\&lt;br /&gt;
         t &amp;amp;= {sign(\tau)}/(|\tau| + \sqrt{1 + \tau^2}) \\&lt;br /&gt;
         c &amp;amp;= 1/(\sqrt{1 + t^2}) \\&lt;br /&gt;
         s &amp;amp;= ct \\&lt;br /&gt;
         G &amp;amp;= GR(j,k,\theta) \  \dots c=cos\theta, s=sin\theta \end{align}&amp;lt;/math&amp;gt;&lt;br /&gt;
         if нужны правые сингулярные векторы &lt;br /&gt;
             &amp;lt;math&amp;gt;J = JR(j,k,\theta)&amp;lt;/math&amp;gt;&lt;br /&gt;
         end if&lt;br /&gt;
     end if&lt;br /&gt;
&lt;br /&gt;
=== Последовательная сложность алгоритма ===&lt;br /&gt;
&lt;br /&gt;
=== Информационный граф ===&lt;br /&gt;
&lt;br /&gt;
=== Ресурс параллелизма алгоритма ===&lt;br /&gt;
Для выполнения одной итерации метода Якоби требуется последовательно выполнить несколько ярусов:&lt;br /&gt;
# вычислить &amp;lt;math&amp;gt;\tau&amp;lt;/math&amp;gt; &lt;br /&gt;
# вычислить &amp;lt;math&amp;gt;t&amp;lt;/math&amp;gt; &lt;br /&gt;
# вычислить &amp;lt;math&amp;gt;c&amp;lt;/math&amp;gt; &lt;br /&gt;
# выполнить поворот к матрицы &amp;lt;math&amp;gt;G&amp;lt;/math&amp;gt; с параллельным выполнением &amp;lt;math&amp;gt;2(n-2)&amp;lt;/math&amp;gt; операций вычисления элементов матрицы &amp;lt;math&amp;gt;g_{jm}^{(i+1)} = g_{mj}^{(i+1)}&amp;lt;/math&amp;gt; и &amp;lt;math&amp;gt;g_{km}^{(i+1)} = g_{mk}^{(i+1)}&amp;lt;/math&amp;gt;, &amp;lt;math&amp;gt;m \ne j,k&amp;lt;/math&amp;gt;, а также вычисления элементов &amp;lt;math&amp;gt;g_{jj}^{(i+1)} &amp;lt;/math&amp;gt; и &amp;lt;math&amp;gt;g_{kk}^{(i+1)} &amp;lt;/math&amp;gt;. &lt;br /&gt;
&lt;br /&gt;
Суммарное количество итераций равно &amp;lt;math&amp;gt;\frac{n(n-1)}{2}&amp;lt;/math&amp;gt; (Различные варианты выбора &amp;lt;math&amp;gt;j&amp;lt;/math&amp;gt; и &amp;lt;math&amp;gt;k&amp;lt;/math&amp;gt;). &lt;br /&gt;
&lt;br /&gt;
Асимптотически метод сходится квадратично. &lt;br /&gt;
&lt;br /&gt;
Таким образом, при классификации по высоте ЯПФ метод Якоби относится к алгоритмам со сложностью &amp;lt;math&amp;gt;O(n^2)&amp;lt;/math&amp;gt;&amp;amp;nbsp;, а при классификации по ширине ЯПФ — к алгоритмам со сложностью &amp;lt;math&amp;gt;O(n)&amp;lt;/math&amp;gt;.&lt;br /&gt;
&lt;br /&gt;
=== Входные и выходные данные алгоритма ===&lt;br /&gt;
&#039;&#039;&#039;Входные данные&#039;&#039;&#039;: плотная матрица &amp;lt;math&amp;gt;G&amp;lt;/math&amp;gt; размера &amp;lt;math&amp;gt;n&amp;lt;/math&amp;gt;х&amp;lt;math&amp;gt;n&amp;lt;/math&amp;gt;, где &amp;lt;math&amp;gt;A= G^TG&amp;lt;/math&amp;gt; – симметрическая матрица.&lt;br /&gt;
&lt;br /&gt;
&#039;&#039;&#039;Объём входных данных&#039;&#039;&#039;: &amp;lt;math&amp;gt;n^2&amp;lt;/math&amp;gt; (т.к. для хранения матрицы &amp;lt;math&amp;gt;G&amp;lt;/math&amp;gt; используем двумерный массив размера &amp;lt;math&amp;gt;n&amp;lt;/math&amp;gt;х&amp;lt;math&amp;gt;n&amp;lt;/math&amp;gt;)&lt;br /&gt;
&lt;br /&gt;
&#039;&#039;&#039;Выходные данные&#039;&#039;&#039;: &amp;lt;math&amp;gt;\sigma_{i}&amp;lt;/math&amp;gt;  - сингулярные числа, матрица &amp;lt;math&amp;gt;U&amp;lt;/math&amp;gt; левых сингулярных векторов и матрица &amp;lt;math&amp;gt;V&amp;lt;/math&amp;gt; правых сингулярных векторов.&lt;br /&gt;
&lt;br /&gt;
&#039;&#039;&#039;Объём выходных данных&#039;&#039;&#039;: &amp;lt;math&amp;gt;2n^2 + n&amp;lt;/math&amp;gt; (т.к. необходимо хранить вектор сингулярных чисел длины &amp;lt;math&amp;gt;n&amp;lt;/math&amp;gt;, а также две матрицы &amp;lt;math&amp;gt;U, V&amp;lt;/math&amp;gt; левых и правых сингулярных векторов размера &amp;lt;math&amp;gt;n&amp;lt;/math&amp;gt;х&amp;lt;math&amp;gt;n&amp;lt;/math&amp;gt;).&lt;br /&gt;
&lt;br /&gt;
=== Свойства алгоритма ===&lt;br /&gt;
Метод Якоби является самым медленным из имеющихся алгоритмов вычисления сингулярных чисел и сингулярных векторов матрицы. Тем не менее, для  матриц &amp;lt;math&amp;gt;G&amp;lt;/math&amp;gt;, которые могут быть представлены в виде &amp;lt;math&amp;gt;G=DX&amp;lt;/math&amp;gt;, где &amp;lt;math&amp;gt;D&amp;lt;/math&amp;gt; - диагональная, а &amp;lt;math&amp;gt;X&amp;lt;/math&amp;gt; - хорошо обусловлена, он способен вычислять сингулярные числа и вектора намного точнее, чем другие методы&amp;lt;ref&amp;gt;Дж. Деммель «Вычислительная линейная алгебра» (стр. 261-264)&amp;lt;/ref&amp;gt;. &lt;br /&gt;
&lt;br /&gt;
Вычислительная мощность алгоритма, как отношение числа операций к суммарному объему входных и выходных данных является линейной.&lt;br /&gt;
&lt;br /&gt;
Метод Якоби не детерминирован, так как является итерационным алгоритмом с выходом по точности (число итераций зависит от входных данных и порогового значения).&lt;br /&gt;
&lt;br /&gt;
== Программная реализация алгоритма ==&lt;br /&gt;
&lt;br /&gt;
=== Особенности реализации последовательного алгоритма ===&lt;br /&gt;
&lt;br /&gt;
=== Локальность данных и вычислений ===&lt;br /&gt;
&lt;br /&gt;
=== Возможные способы и особенности параллельной реализации алгоритма ===&lt;br /&gt;
&lt;br /&gt;
=== Масштабируемость алгоритма и его реализации ===&lt;br /&gt;
&lt;br /&gt;
=== Динамические характеристики и эффективность реализации алгоритма ===&lt;br /&gt;
&lt;br /&gt;
=== Выводы для классов архитектур ===&lt;br /&gt;
&lt;br /&gt;
=== Существующие реализации алгоритма ===&lt;br /&gt;
Метод Якоби нахождения сингулярных значений и векторов реализован в таких пакетах, как LAPACK, LINPACK/EISPACK, Intel MKL &amp;lt;ref&amp;gt;http://www.alglib.net/matrixops/general/svd.php&amp;lt;/ref&amp;gt;.&lt;br /&gt;
&lt;br /&gt;
Так же функция Якоби реализована в пакете Matlab.&lt;br /&gt;
&lt;br /&gt;
Т. к. алгоритм считается медленным, он не включен во многие известные пакеты.&lt;br /&gt;
&lt;br /&gt;
== Литература ==&lt;br /&gt;
1. Дж. Деммель Вычислительная линейная алгебра. Изд. Мир, 2001.&lt;/div&gt;</summary>
		<author><name>Davletshuna Alexandra</name></author>
	</entry>
	<entry>
		<id>https://xn--80aecvaldz.xn--80ahdrnmvk.xn--p1ai/w/ru/index.php?title=%D0%A3%D1%87%D0%B0%D1%81%D1%82%D0%BD%D0%B8%D0%BA:Davletshuna_Alexandra/%D0%9C%D0%B5%D1%82%D0%BE%D0%B4_%D0%AF%D0%BA%D0%BE%D0%B1%D0%B8_%D0%B2%D1%8B%D1%87%D0%B8%D1%81%D0%BB%D0%B5%D0%BD%D0%B8%D1%8F_%D1%81%D0%B8%D0%BD%D0%B3%D1%83%D0%BB%D1%8F%D1%80%D0%BD%D1%8B%D1%85_%D1%87%D0%B8%D1%81%D0%B5%D0%BB_%D0%B8_%D0%B2%D0%B5%D0%BA%D1%82%D0%BE%D1%80%D0%BE%D0%B2&amp;diff=9752</id>
		<title>Участник:Davletshuna Alexandra/Метод Якоби вычисления сингулярных чисел и векторов</title>
		<link rel="alternate" type="text/html" href="https://xn--80aecvaldz.xn--80ahdrnmvk.xn--p1ai/w/ru/index.php?title=%D0%A3%D1%87%D0%B0%D1%81%D1%82%D0%BD%D0%B8%D0%BA:Davletshuna_Alexandra/%D0%9C%D0%B5%D1%82%D0%BE%D0%B4_%D0%AF%D0%BA%D0%BE%D0%B1%D0%B8_%D0%B2%D1%8B%D1%87%D0%B8%D1%81%D0%BB%D0%B5%D0%BD%D0%B8%D1%8F_%D1%81%D0%B8%D0%BD%D0%B3%D1%83%D0%BB%D1%8F%D1%80%D0%BD%D1%8B%D1%85_%D1%87%D0%B8%D1%81%D0%B5%D0%BB_%D0%B8_%D0%B2%D0%B5%D0%BA%D1%82%D0%BE%D1%80%D0%BE%D0%B2&amp;diff=9752"/>
		<updated>2016-10-15T13:43:43Z</updated>

		<summary type="html">&lt;p&gt;Davletshuna Alexandra: /* Математическое описание алгоритма */&lt;/p&gt;
&lt;hr /&gt;
&lt;div&gt;&lt;br /&gt;
{{algorithm&lt;br /&gt;
| name              = Метод Якоби вычисления сингулярных чисел и векторов&lt;br /&gt;
| serial_complexity = &amp;lt;math&amp;gt;O(n^3)&amp;lt;/math&amp;gt;&lt;br /&gt;
| pf_height         = &amp;lt;math&amp;gt;O(n^2)&amp;lt;/math&amp;gt;&lt;br /&gt;
| pf_width          = &amp;lt;math&amp;gt;O(n)&amp;lt;/math&amp;gt;&lt;br /&gt;
| input_data        = &amp;lt;math&amp;gt;n^2&amp;lt;/math&amp;gt;&lt;br /&gt;
| output_data       = &amp;lt;math&amp;gt;2n^2 + n&amp;lt;/math&amp;gt;&lt;br /&gt;
}}&lt;br /&gt;
&lt;br /&gt;
Авторы статьи: [[Участница:Davletshuna Alexandra|Давлетшина Александра]] (группа 619), [[Участница:Alek sandra|Зайцева Александра]] (группа 601)&lt;br /&gt;
&lt;br /&gt;
== Свойства и структура алгоритма ==&lt;br /&gt;
&lt;br /&gt;
=== Общее описание алгоритма ===&lt;br /&gt;
&#039;&#039;&#039;Сингулярным разложением&#039;&#039;&#039; называется разложение прямоугольной вещественной или комплексной матрицы, имеющее широкое применение, в силу своей наглядной геометрической интерпретации, при решении многих прикладных задач. Сингулярное разложение матрицы А позволяет вычислять сингулярные числа данной матрицы, а также, левые и правые сингулярные векторы матрицы А:&lt;br /&gt;
&lt;br /&gt;
•	левые сингулярные векторы матрицы А — это собственные векторы матрицы &amp;lt;math&amp;gt;AA^*&amp;lt;/math&amp;gt;;&lt;br /&gt;
&lt;br /&gt;
•	правые сингулярные векторы матрицы A — это собственные векторы матрицы &amp;lt;math&amp;gt;A^*A&amp;lt;/math&amp;gt;.&lt;br /&gt;
&lt;br /&gt;
Геометрическая интерпретация сингулярного разложения заключается в следующем факте из геометрии: &#039;&#039;Образом любого линейного преобразования, заданного с помощью матрицы &amp;lt;math&amp;gt;m&amp;lt;/math&amp;gt;x&amp;lt;math&amp;gt;n&amp;lt;/math&amp;gt;, примененного к единичной сфере является гиперэллипсоид&#039;&#039;.&lt;br /&gt;
&lt;br /&gt;
Из многочисленных разложений матриц, наиболее удобным является сингулярное разложение матрицы в виде: &amp;lt;math&amp;gt;A=U\Sigma V^*&amp;lt;/math&amp;gt;, где &amp;lt;math&amp;gt;U, V&amp;lt;/math&amp;gt; – унитарные матрицы, а &amp;lt;math&amp;gt;\Sigma&amp;lt;/math&amp;gt; – диагональная матрица с вещественными положительными числами на диагонали &amp;lt;ref&amp;gt;http://algorithms.parallel.ru/&amp;lt;/ref&amp;gt;.&lt;br /&gt;
&lt;br /&gt;
Диагональные элементы матрицы &amp;lt;math&amp;gt;\Sigma&amp;lt;/math&amp;gt; называются сингулярными числами матрицы &amp;lt;math&amp;gt;A&amp;lt;/math&amp;gt;, а столбцы матриц &amp;lt;math&amp;gt;U,V&amp;lt;/math&amp;gt; левыми и правыми сингулярными векторами соответственно.&lt;br /&gt;
&lt;br /&gt;
Алгоритм Якоби сингулярного разложения матрицы был предложен одним из первых в 1846 году. Он приводит прямоугольную матрицу к диагональной матрице с помощью последовательности элементарных вращений. Метод может найти все сингулярные значения с очень высокой точностью. Однако его производительность является довольно низкой, в сравнении с конкурирующими методами.&lt;br /&gt;
&lt;br /&gt;
&#039;&#039;Неявный&#039;&#039;&amp;lt;ref&amp;gt;Дж. Деммель «Вычислительная линейная алгебра» (стр. 261-264)&amp;lt;/ref&amp;gt; метод Якоби математически эквивалентен применению метода Якоби вычисления собственных значений к матрице &amp;lt;math&amp;gt;A = G^TG&amp;lt;/math&amp;gt;.&lt;br /&gt;
Это значит, что на каждом шаге вычисляется вращение Якоби &amp;lt;math&amp;gt;J&amp;lt;/math&amp;gt;, с помощью которого матрица &amp;lt;math&amp;gt;G^TG&amp;lt;/math&amp;gt; неявно пересчитывется в &amp;lt;math&amp;gt;J^TG^TGJ&amp;lt;/math&amp;gt;; вращение выбрано так, чтобы пара внедиагональных элементов из &amp;lt;math&amp;gt;G^TG&amp;lt;/math&amp;gt; обратилась в нули в матрице &amp;lt;math&amp;gt;J^TG^TGJ&amp;lt;/math&amp;gt;. При этом ни &amp;lt;math&amp;gt;G^TG&amp;lt;/math&amp;gt;, ни &amp;lt;math&amp;gt;J^TG^TGJ&amp;lt;/math&amp;gt; не вычисляются в явном виде; вместо них вычисляется матрица &amp;lt;math&amp;gt;GJ&amp;lt;/math&amp;gt;. Поэтому алгоритм называется &#039;&#039;методом односторонних вращений&#039;&#039;.&lt;br /&gt;
&lt;br /&gt;
=== Математическое описание алгоритма ===&lt;br /&gt;
Исходные данные: матрица &amp;lt;math&amp;gt;G&amp;lt;/math&amp;gt; (элементы &amp;lt;math&amp;gt;g_{ij}, i, j = 1, \ldots, n&amp;lt;/math&amp;gt;).&lt;br /&gt;
&lt;br /&gt;
Вычисляемые данные: матрица &amp;lt;math&amp;gt;\Sigma = diag(\sigma_{i})&amp;lt;/math&amp;gt;, где &amp;lt;math&amp;gt;\sigma_{i}&amp;lt;/math&amp;gt; - сингулярные числа, &amp;lt;math&amp;gt;U&amp;lt;/math&amp;gt; - матрица левых сингулярных векторов, &amp;lt;math&amp;gt;V&amp;lt;/math&amp;gt; - матрица правых сингулярных векторов.&lt;br /&gt;
&lt;br /&gt;
симметричную матрицу &amp;lt;math&amp;gt;A = (G^TG)&amp;lt;/math&amp;gt; можно привести к диагональному виду:&lt;br /&gt;
&amp;lt;math&amp;gt;RG^TGR^T&amp;lt;/math&amp;gt;, где&lt;br /&gt;
&lt;br /&gt;
&amp;lt;math&amp;gt;&lt;br /&gt;
\begin{matrix}&lt;br /&gt;
  &amp;amp;     &amp;amp;      &amp;amp;       &amp;amp; j &amp;amp;         &amp;amp; k &amp;amp;         &amp;amp;    &amp;amp;   \\&lt;br /&gt;
\end{matrix}&lt;br /&gt;
&amp;lt;/math&amp;gt;&lt;br /&gt;
&lt;br /&gt;
&amp;lt;math&amp;gt;&lt;br /&gt;
R(j,k,\theta) = &lt;br /&gt;
\begin{matrix}&lt;br /&gt;
  \\&lt;br /&gt;
  \\&lt;br /&gt;
  \\&lt;br /&gt;
j \\&lt;br /&gt;
  \\&lt;br /&gt;
k \\&lt;br /&gt;
  \\&lt;br /&gt;
  \\&lt;br /&gt;
  \\&lt;br /&gt;
\end{matrix}&lt;br /&gt;
&amp;lt;/math&amp;gt;  &lt;br /&gt;
&amp;lt;math&amp;gt;&lt;br /&gt;
\begin{bmatrix}&lt;br /&gt;
  &amp;amp; 1 &amp;amp;   &amp;amp;        &amp;amp;              &amp;amp;        &amp;amp;               &amp;amp;         &amp;amp;    &amp;amp;   \\&lt;br /&gt;
  &amp;amp;   &amp;amp; 1 &amp;amp;        &amp;amp;              &amp;amp;        &amp;amp;               &amp;amp;         &amp;amp;    &amp;amp;   \\&lt;br /&gt;
  &amp;amp;   &amp;amp;   &amp;amp; \ddots &amp;amp;              &amp;amp;        &amp;amp;               &amp;amp;         &amp;amp;    &amp;amp;   \\&lt;br /&gt;
  &amp;amp;   &amp;amp;   &amp;amp;        &amp;amp; \cos(\theta) &amp;amp;        &amp;amp; -\sin(\theta) &amp;amp;         &amp;amp;    &amp;amp;   \\&lt;br /&gt;
  &amp;amp;   &amp;amp;   &amp;amp;        &amp;amp;              &amp;amp; \ddots &amp;amp;               &amp;amp;         &amp;amp;    &amp;amp;   \\&lt;br /&gt;
  &amp;amp;   &amp;amp;   &amp;amp;        &amp;amp; \sin(\theta) &amp;amp;        &amp;amp; \cos(\theta)  &amp;amp;         &amp;amp;    &amp;amp;   \\&lt;br /&gt;
  &amp;amp;   &amp;amp;   &amp;amp;        &amp;amp;              &amp;amp;        &amp;amp;               &amp;amp; \ddots  &amp;amp;    &amp;amp;   \\&lt;br /&gt;
  &amp;amp;   &amp;amp;   &amp;amp;        &amp;amp;              &amp;amp;        &amp;amp;               &amp;amp;         &amp;amp; 1  &amp;amp;   \\&lt;br /&gt;
  &amp;amp;   &amp;amp;   &amp;amp;        &amp;amp;              &amp;amp;        &amp;amp;               &amp;amp;         &amp;amp;    &amp;amp; 1 \\&lt;br /&gt;
\end{bmatrix}&lt;br /&gt;
&amp;lt;/math&amp;gt;&lt;br /&gt;
&lt;br /&gt;
Обозначим &amp;lt;math&amp;gt;s = \sin \theta&amp;lt;/math&amp;gt; и &amp;lt;math&amp;gt;c = \cos \theta&amp;lt;/math&amp;gt;.&lt;br /&gt;
&lt;br /&gt;
Перемножив матрицы &amp;lt;math&amp;gt;RG^TGR^T&amp;lt;/math&amp;gt;, получим следующие выражения:&lt;br /&gt;
&lt;br /&gt;
&amp;lt;math&amp;gt;\begin{align}&lt;br /&gt;
 a_{jj}^{(i+1)} &amp;amp;= c^2\, a_{jj}^{(i)}  -  2\, s c \,a_{jk}^{(i)}  +  s^2\, a_{kk}^{(i)} \\&lt;br /&gt;
 a_{kk}^{(i+1)} &amp;amp;= s^2 \,a_{jj}^{(i)}  +  2 s c\, a_{jk}^{(i)}  +  c^2 \, a_{kk}^{(i)} \\&lt;br /&gt;
 a_{jk}^{(i+1)} &amp;amp;= a_{kj}^{(i+1)} = (c^2 - s^2 ) \, a_{jk}^{(i)}  +  s c \, (a_{kk}^{(i)} - a_{jj}^{(i)} ) \\&lt;br /&gt;
 a_{jm}^{(i+1)} &amp;amp;= a_{mj}^{(i+1)} = c \, a_{jm}^{(i)}  -  s \, a_{km}^{(i)} &amp;amp; m \ne j,k \\&lt;br /&gt;
 a_{km}^{(i+1)} &amp;amp;= a_{mk}^{(i+1)} = s \, a_{jm}^{(i)}  + c \, a_{km}^{(i)} &amp;amp; m \ne j,k \\&lt;br /&gt;
 a_{ml}^{(i+1)} &amp;amp;= a_{ml}^{(i)} &amp;amp;m,l \ne j,k&lt;br /&gt;
\end{align}&amp;lt;/math&amp;gt;&lt;br /&gt;
&lt;br /&gt;
Т.к внедиагональные элементы должны быть равны 0, то выбираем &amp;lt;math&amp;gt;\theta&amp;lt;/math&amp;gt; так, чтобы &amp;lt;math&amp;gt;a_{jk}^{(i+1)} = 0&amp;lt;/math&amp;gt; и &amp;lt;math&amp;gt;a_{kj}^{(i+1)} = 0&amp;lt;/math&amp;gt;.&lt;br /&gt;
&lt;br /&gt;
Тогда решая уравнение получаем, что&lt;br /&gt;
&lt;br /&gt;
&amp;lt;math&amp;gt;&lt;br /&gt;
         \begin{align}&lt;br /&gt;
         \tau &amp;amp;= {a_{jj} - a_{kk}}/{2a_{jk}} \\&lt;br /&gt;
         t &amp;amp;= {sign(\tau)}/(|\tau| + \sqrt{1 + \tau^2}) \\&lt;br /&gt;
         c &amp;amp;= 1/(\sqrt{1 + t^2}) \\&lt;br /&gt;
         s &amp;amp;= ct \\&lt;br /&gt;
         \end{align}&amp;lt;/math&amp;gt;&lt;br /&gt;
&lt;br /&gt;
Остановка вычислений алгоритма наступает, когда внедиагональные элементы становятся меньше некоторого наперед заданного числа &amp;lt;math&amp;gt;\varepsilon&amp;lt;/math&amp;gt;.&lt;br /&gt;
&lt;br /&gt;
=== Вычислительное ядро алгоритма ===&lt;br /&gt;
&lt;br /&gt;
=== Макроструктура алгоритма ===&lt;br /&gt;
Основную часть метода составляет процедура односторонних вращений матрицы, которая в свою очередь состоит из:&lt;br /&gt;
&lt;br /&gt;
#Вычисление &amp;lt;math&amp;gt;\tau, c, s, t&amp;lt;/math&amp;gt;.&lt;br /&gt;
#Одностороннее вращение матрицы. &lt;br /&gt;
&lt;br /&gt;
Что требует &amp;lt;math&amp;gt;O(n)&amp;lt;/math&amp;gt; операций.&lt;br /&gt;
&lt;br /&gt;
После этого необходимо:&lt;br /&gt;
&lt;br /&gt;
#Вычислить сингулярные числа &amp;lt;math&amp;gt;\sigma_i&amp;lt;/math&amp;gt;.  Что требует &amp;lt;math&amp;gt;O(n)&amp;lt;/math&amp;gt; операций.&lt;br /&gt;
#Вычислить &amp;lt;math&amp;gt;U&amp;lt;/math&amp;gt; и &amp;lt;math&amp;gt;V&amp;lt;/math&amp;gt;. Что требует &amp;lt;math&amp;gt;O(n^2)&amp;lt;/math&amp;gt; операций.&lt;br /&gt;
&lt;br /&gt;
=== Схема реализации последовательного алгоритма ===&lt;br /&gt;
Применение метода Якоби к матрице &amp;lt;math&amp;gt;A = (G^TG)&amp;lt;/math&amp;gt; можно описать следующим образом&amp;lt;ref&amp;gt;Дж. Деммель «Вычислительная линейная алгебра» (стр. 261-263)&amp;lt;/ref&amp;gt;:&lt;br /&gt;
&lt;br /&gt;
Если &amp;lt;math&amp;gt;G = U\Sigma V^T&amp;lt;/math&amp;gt; и &amp;lt;math&amp;gt;\Sigma = diag(\sigma_{i})&amp;lt;/math&amp;gt;, то алгоритм вычисляет сингулярные числа &amp;lt;math&amp;gt;\sigma_{i}&amp;lt;/math&amp;gt;, матрицу &amp;lt;math&amp;gt;U&amp;lt;/math&amp;gt; левых сингулярных векторов и матрицу &amp;lt;math&amp;gt;V&amp;lt;/math&amp;gt; правых сингулярных векторов по следующей схеме:&lt;br /&gt;
&lt;br /&gt;
 repeat&lt;br /&gt;
     for &amp;lt;math&amp;gt;j=1&amp;lt;/math&amp;gt; to &amp;lt;math&amp;gt;n-1&amp;lt;/math&amp;gt;&lt;br /&gt;
         for &amp;lt;math&amp;gt;k=j+1&amp;lt;/math&amp;gt; to &amp;lt;math&amp;gt;n&amp;lt;/math&amp;gt;&lt;br /&gt;
             обратиться к процедуре &#039;&#039;&#039;&#039;&#039;One-Sided-Jacobi-Rotation&amp;lt;math&amp;gt;(G,j,k)&amp;lt;/math&amp;gt;&#039;&#039;&#039;&#039;&#039;&lt;br /&gt;
         end for&lt;br /&gt;
     end for&lt;br /&gt;
 пока &amp;lt;math&amp;gt;G^TG&amp;lt;/math&amp;gt; не станет достаточно близка к диагональной матрице&lt;br /&gt;
 Положить &amp;lt;math&amp;gt;\sigma_{i} = ||G(:,i)||_2 &amp;lt;/math&amp;gt; (норма &amp;lt;math&amp;gt;i&amp;lt;/math&amp;gt;-го столбца в &amp;lt;math&amp;gt;G&amp;lt;/math&amp;gt;)&lt;br /&gt;
 Положить &amp;lt;math&amp;gt;U = [u_{1},\dots, u_{n}]&amp;lt;/math&amp;gt;, где &amp;lt;math&amp;gt;u_{i} = G(:,i)/\sigma_{i}&amp;lt;/math&amp;gt;&lt;br /&gt;
 Положить &amp;lt;math&amp;gt;V = J&amp;lt;/math&amp;gt;, где &amp;lt;math&amp;gt;J&amp;lt;/math&amp;gt; - накопленное произведение вращений Якоби.&lt;br /&gt;
&lt;br /&gt;
Где процедура &#039;&#039;&#039;&#039;&#039;One-Sided-Jacobi-Rotation&#039;&#039;&#039;&#039;&#039; является метод односторонних вращений Якоби:&lt;br /&gt;
&lt;br /&gt;
 proc &#039;&#039;&#039;&#039;&#039;One-Sided-Jacobi-Rotation&amp;lt;math&amp;gt;(G,j,k)&amp;lt;/math&amp;gt;&#039;&#039;&#039;&#039;&#039;&lt;br /&gt;
     вычислить &amp;lt;math&amp;gt;a_{jj} = (G^TG)_{jj}, a_{jk} = (G^TG)_{jk}&amp;lt;/math&amp;gt; и &amp;lt;math&amp;gt;a_{kk} = (G^TG)_{kk}&amp;lt;/math&amp;gt;&lt;br /&gt;
     if &amp;lt;math&amp;gt;|a_{jk}|&amp;lt;/math&amp;gt; не слишком мал&lt;br /&gt;
         &amp;lt;math&amp;gt;&lt;br /&gt;
         \begin{align}&lt;br /&gt;
         \tau &amp;amp;= {a_{jj} - a_{kk}}/{2a_{jk}} \\&lt;br /&gt;
         t &amp;amp;= {sign(\tau)}/(|\tau| + \sqrt{1 + \tau^2}) \\&lt;br /&gt;
         c &amp;amp;= 1/(\sqrt{1 + t^2}) \\&lt;br /&gt;
         s &amp;amp;= ct \\&lt;br /&gt;
         G &amp;amp;= GR(j,k,\theta) \  \dots c=cos\theta, s=sin\theta \end{align}&amp;lt;/math&amp;gt;&lt;br /&gt;
         if нужны правые сингулярные векторы &lt;br /&gt;
             &amp;lt;math&amp;gt;J = JR(j,k,\theta)&amp;lt;/math&amp;gt;&lt;br /&gt;
         end if&lt;br /&gt;
     end if&lt;br /&gt;
&lt;br /&gt;
=== Последовательная сложность алгоритма ===&lt;br /&gt;
&lt;br /&gt;
=== Информационный граф ===&lt;br /&gt;
&lt;br /&gt;
=== Ресурс параллелизма алгоритма ===&lt;br /&gt;
Для выполнения одной итерации метода Якоби требуется последовательно выполнить несколько ярусов:&lt;br /&gt;
# вычислить &amp;lt;math&amp;gt;\tau&amp;lt;/math&amp;gt; &lt;br /&gt;
# вычислить &amp;lt;math&amp;gt;t&amp;lt;/math&amp;gt; &lt;br /&gt;
# вычислить &amp;lt;math&amp;gt;c&amp;lt;/math&amp;gt; &lt;br /&gt;
# выполнить поворот к матрицы &amp;lt;math&amp;gt;G&amp;lt;/math&amp;gt; с параллельным выполнением &amp;lt;math&amp;gt;2(n-2)&amp;lt;/math&amp;gt; операций вычисления элементов матрицы &amp;lt;math&amp;gt;g_{jm}^{(i+1)} = g_{mj}^{(i+1)}&amp;lt;/math&amp;gt; и &amp;lt;math&amp;gt;g_{km}^{(i+1)} = g_{mk}^{(i+1)}&amp;lt;/math&amp;gt;, &amp;lt;math&amp;gt;m \ne j,k&amp;lt;/math&amp;gt;, а также вычисления элементов &amp;lt;math&amp;gt;g_{jj}^{(i+1)} &amp;lt;/math&amp;gt; и &amp;lt;math&amp;gt;g_{kk}^{(i+1)} &amp;lt;/math&amp;gt;. &lt;br /&gt;
&lt;br /&gt;
Суммарное количество итераций равно &amp;lt;math&amp;gt;\frac{n(n-1)}{2}&amp;lt;/math&amp;gt; (Различные варианты выбора &amp;lt;math&amp;gt;j&amp;lt;/math&amp;gt; и &amp;lt;math&amp;gt;k&amp;lt;/math&amp;gt;). &lt;br /&gt;
&lt;br /&gt;
Асимптотически метод сходится квадратично. &lt;br /&gt;
&lt;br /&gt;
Таким образом, при классификации по высоте ЯПФ метод Якоби относится к алгоритмам со сложностью &amp;lt;math&amp;gt;O(n^2)&amp;lt;/math&amp;gt;&amp;amp;nbsp;, а при классификации по ширине ЯПФ — к алгоритмам со сложностью &amp;lt;math&amp;gt;O(n)&amp;lt;/math&amp;gt;.&lt;br /&gt;
&lt;br /&gt;
=== Входные и выходные данные алгоритма ===&lt;br /&gt;
&#039;&#039;&#039;Входные данные&#039;&#039;&#039;: плотная матрица &amp;lt;math&amp;gt;G&amp;lt;/math&amp;gt; размера &amp;lt;math&amp;gt;n&amp;lt;/math&amp;gt;х&amp;lt;math&amp;gt;n&amp;lt;/math&amp;gt;, где &amp;lt;math&amp;gt;A= G^TG&amp;lt;/math&amp;gt; – симметрическая матрица.&lt;br /&gt;
&lt;br /&gt;
&#039;&#039;&#039;Объём входных данных&#039;&#039;&#039;: &amp;lt;math&amp;gt;n^2&amp;lt;/math&amp;gt; (т.к. для хранения матрицы &amp;lt;math&amp;gt;G&amp;lt;/math&amp;gt; используем двумерный массив размера &amp;lt;math&amp;gt;n&amp;lt;/math&amp;gt;х&amp;lt;math&amp;gt;n&amp;lt;/math&amp;gt;)&lt;br /&gt;
&lt;br /&gt;
&#039;&#039;&#039;Выходные данные&#039;&#039;&#039;: &amp;lt;math&amp;gt;\sigma_{i}&amp;lt;/math&amp;gt;  - сингулярные числа, матрица &amp;lt;math&amp;gt;U&amp;lt;/math&amp;gt; левых сингулярных векторов и матрица &amp;lt;math&amp;gt;V&amp;lt;/math&amp;gt; правых сингулярных векторов.&lt;br /&gt;
&lt;br /&gt;
&#039;&#039;&#039;Объём выходных данных&#039;&#039;&#039;: &amp;lt;math&amp;gt;2n^2 + n&amp;lt;/math&amp;gt; (т.к. необходимо хранить вектор сингулярных чисел длины &amp;lt;math&amp;gt;n&amp;lt;/math&amp;gt;, а также две матрицы &amp;lt;math&amp;gt;U, V&amp;lt;/math&amp;gt; левых и правых сингулярных векторов размера &amp;lt;math&amp;gt;n&amp;lt;/math&amp;gt;х&amp;lt;math&amp;gt;n&amp;lt;/math&amp;gt;).&lt;br /&gt;
&lt;br /&gt;
=== Свойства алгоритма ===&lt;br /&gt;
Метод Якоби является самым медленным из имеющихся алгоритмов вычисления сингулярных чисел и сингулярных векторов матрицы. Тем не менее, для  матриц &amp;lt;math&amp;gt;G&amp;lt;/math&amp;gt;, которые могут быть представлены в виде &amp;lt;math&amp;gt;G=DX&amp;lt;/math&amp;gt;, где &amp;lt;math&amp;gt;D&amp;lt;/math&amp;gt; - диагональная, а &amp;lt;math&amp;gt;X&amp;lt;/math&amp;gt; - хорошо обусловлена, он способен вычислять сингулярные числа и вектора намного точнее, чем другие методы&amp;lt;ref&amp;gt;Дж. Деммель «Вычислительная линейная алгебра» (стр. 261-264)&amp;lt;/ref&amp;gt;. &lt;br /&gt;
&lt;br /&gt;
Вычислительная мощность алгоритма, как отношение числа операций к суммарному объему входных и выходных данных является линейной.&lt;br /&gt;
&lt;br /&gt;
Метод Якоби не детерминирован, так как является итерационным алгоритмом с выходом по точности (число итераций зависит от входных данных и порогового значения).&lt;br /&gt;
&lt;br /&gt;
== Программная реализация алгоритма ==&lt;br /&gt;
&lt;br /&gt;
=== Особенности реализации последовательного алгоритма ===&lt;br /&gt;
&lt;br /&gt;
=== Локальность данных и вычислений ===&lt;br /&gt;
&lt;br /&gt;
=== Возможные способы и особенности параллельной реализации алгоритма ===&lt;br /&gt;
&lt;br /&gt;
=== Масштабируемость алгоритма и его реализации ===&lt;br /&gt;
&lt;br /&gt;
=== Динамические характеристики и эффективность реализации алгоритма ===&lt;br /&gt;
&lt;br /&gt;
=== Выводы для классов архитектур ===&lt;br /&gt;
&lt;br /&gt;
=== Существующие реализации алгоритма ===&lt;br /&gt;
Метод Якоби нахождения сингулярных значений и векторов реализован в таких пакетах, как LAPACK, LINPACK/EISPACK, Intel MKL &amp;lt;ref&amp;gt;http://www.alglib.net/matrixops/general/svd.php&amp;lt;/ref&amp;gt;.&lt;br /&gt;
&lt;br /&gt;
Так же функция Якоби реализована в пакете Matlab.&lt;br /&gt;
&lt;br /&gt;
Т. к. алгоритм считается медленным, он не включен во многие известные пакеты.&lt;br /&gt;
&lt;br /&gt;
== Литература ==&lt;br /&gt;
1. Дж. Деммель Вычислительная линейная алгебра. Изд. Мир, 2001.&lt;/div&gt;</summary>
		<author><name>Davletshuna Alexandra</name></author>
	</entry>
	<entry>
		<id>https://xn--80aecvaldz.xn--80ahdrnmvk.xn--p1ai/w/ru/index.php?title=%D0%A3%D1%87%D0%B0%D1%81%D1%82%D0%BD%D0%B8%D0%BA:Davletshuna_Alexandra/%D0%9C%D0%B5%D1%82%D0%BE%D0%B4_%D0%AF%D0%BA%D0%BE%D0%B1%D0%B8_%D0%B2%D1%8B%D1%87%D0%B8%D1%81%D0%BB%D0%B5%D0%BD%D0%B8%D1%8F_%D1%81%D0%B8%D0%BD%D0%B3%D1%83%D0%BB%D1%8F%D1%80%D0%BD%D1%8B%D1%85_%D1%87%D0%B8%D1%81%D0%B5%D0%BB_%D0%B8_%D0%B2%D0%B5%D0%BA%D1%82%D0%BE%D1%80%D0%BE%D0%B2&amp;diff=9722</id>
		<title>Участник:Davletshuna Alexandra/Метод Якоби вычисления сингулярных чисел и векторов</title>
		<link rel="alternate" type="text/html" href="https://xn--80aecvaldz.xn--80ahdrnmvk.xn--p1ai/w/ru/index.php?title=%D0%A3%D1%87%D0%B0%D1%81%D1%82%D0%BD%D0%B8%D0%BA:Davletshuna_Alexandra/%D0%9C%D0%B5%D1%82%D0%BE%D0%B4_%D0%AF%D0%BA%D0%BE%D0%B1%D0%B8_%D0%B2%D1%8B%D1%87%D0%B8%D1%81%D0%BB%D0%B5%D0%BD%D0%B8%D1%8F_%D1%81%D0%B8%D0%BD%D0%B3%D1%83%D0%BB%D1%8F%D1%80%D0%BD%D1%8B%D1%85_%D1%87%D0%B8%D1%81%D0%B5%D0%BB_%D0%B8_%D0%B2%D0%B5%D0%BA%D1%82%D0%BE%D1%80%D0%BE%D0%B2&amp;diff=9722"/>
		<updated>2016-10-15T13:34:16Z</updated>

		<summary type="html">&lt;p&gt;Davletshuna Alexandra: /* Существующие реализации алгоритма */&lt;/p&gt;
&lt;hr /&gt;
&lt;div&gt;&lt;br /&gt;
{{algorithm&lt;br /&gt;
| name              = Метод Якоби вычисления сингулярных чисел и векторов&lt;br /&gt;
| serial_complexity = &amp;lt;math&amp;gt;O(n^3)&amp;lt;/math&amp;gt;&lt;br /&gt;
| pf_height         = &amp;lt;math&amp;gt;O(n^2)&amp;lt;/math&amp;gt;&lt;br /&gt;
| pf_width          = &amp;lt;math&amp;gt;O(n)&amp;lt;/math&amp;gt;&lt;br /&gt;
| input_data        = &amp;lt;math&amp;gt;n^2&amp;lt;/math&amp;gt;&lt;br /&gt;
| output_data       = &amp;lt;math&amp;gt;2n^2 + n&amp;lt;/math&amp;gt;&lt;br /&gt;
}}&lt;br /&gt;
&lt;br /&gt;
Авторы статьи: [[Участница:Davletshuna Alexandra|Давлетшина Александра]] (группа 619), [[Участница:Alek sandra|Зайцева Александра]] (группа 601)&lt;br /&gt;
&lt;br /&gt;
== Свойства и структура алгоритма ==&lt;br /&gt;
&lt;br /&gt;
=== Общее описание алгоритма ===&lt;br /&gt;
&#039;&#039;&#039;Сингулярным разложением&#039;&#039;&#039; называется разложение прямоугольной вещественной или комплексной матрицы, имеющее широкое применение, в силу своей наглядной геометрической интерпретации, при решении многих прикладных задач. Сингулярное разложение матрицы А позволяет вычислять сингулярные числа данной матрицы, а также, левые и правые сингулярные векторы матрицы А:&lt;br /&gt;
&lt;br /&gt;
•	левые сингулярные векторы матрицы А — это собственные векторы матрицы &amp;lt;math&amp;gt;AA^*&amp;lt;/math&amp;gt;;&lt;br /&gt;
&lt;br /&gt;
•	правые сингулярные векторы матрицы A — это собственные векторы матрицы &amp;lt;math&amp;gt;A^*A&amp;lt;/math&amp;gt;.&lt;br /&gt;
&lt;br /&gt;
Геометрическая интерпретация сингулярного разложения заключается в следующем факте из геометрии: &#039;&#039;Образом любого линейного преобразования, заданного с помощью матрицы &amp;lt;math&amp;gt;m&amp;lt;/math&amp;gt;x&amp;lt;math&amp;gt;n&amp;lt;/math&amp;gt;, примененного к единичной сфере является гиперэллипсоид&#039;&#039;.&lt;br /&gt;
&lt;br /&gt;
Из многочисленных разложений матриц, наиболее удобным является сингулярное разложение матрицы в виде: &amp;lt;math&amp;gt;A=U\Sigma V^*&amp;lt;/math&amp;gt;, где &amp;lt;math&amp;gt;U, V&amp;lt;/math&amp;gt; – унитарные матрицы, а &amp;lt;math&amp;gt;\Sigma&amp;lt;/math&amp;gt; – диагональная матрица с вещественными положительными числами на диагонали &amp;lt;ref&amp;gt;http://algorithms.parallel.ru/&amp;lt;/ref&amp;gt;.&lt;br /&gt;
&lt;br /&gt;
Диагональные элементы матрицы &amp;lt;math&amp;gt;\Sigma&amp;lt;/math&amp;gt; называются сингулярными числами матрицы &amp;lt;math&amp;gt;A&amp;lt;/math&amp;gt;, а столбцы матриц &amp;lt;math&amp;gt;U,V&amp;lt;/math&amp;gt; левыми и правыми сингулярными векторами соответственно.&lt;br /&gt;
&lt;br /&gt;
Алгоритм Якоби сингулярного разложения матрицы был предложен одним из первых в 1846 году. Он приводит прямоугольную матрицу к диагональной матрице с помощью последовательности элементарных вращений. Метод может найти все сингулярные значения с очень высокой точностью. Однако его производительность является довольно низкой, в сравнении с конкурирующими методами.&lt;br /&gt;
&lt;br /&gt;
&#039;&#039;Неявный&#039;&#039;&amp;lt;ref&amp;gt;Дж. Деммель «Вычислительная линейная алгебра» (стр. 261-264)&amp;lt;/ref&amp;gt; метод Якоби математически эквивалентен применению метода Якоби вычисления собственных значений к матрице &amp;lt;math&amp;gt;A = G^TG&amp;lt;/math&amp;gt;.&lt;br /&gt;
Это значит, что на каждом шаге вычисляется вращение Якоби &amp;lt;math&amp;gt;J&amp;lt;/math&amp;gt;, с помощью которого матрица &amp;lt;math&amp;gt;G^TG&amp;lt;/math&amp;gt; неявно пересчитывется в &amp;lt;math&amp;gt;J^TG^TGJ&amp;lt;/math&amp;gt;; вращение выбрано так, чтобы пара внедиагональных элементов из &amp;lt;math&amp;gt;G^TG&amp;lt;/math&amp;gt; обратилась в нули в матрице &amp;lt;math&amp;gt;J^TG^TGJ&amp;lt;/math&amp;gt;. При этом ни &amp;lt;math&amp;gt;G^TG&amp;lt;/math&amp;gt;, ни &amp;lt;math&amp;gt;J^TG^TGJ&amp;lt;/math&amp;gt; не вычисляются в явном виде; вместо них вычисляется матрица &amp;lt;math&amp;gt;GJ&amp;lt;/math&amp;gt;. Поэтому алгоритм называется &#039;&#039;методом односторонних вращений&#039;&#039;.&lt;br /&gt;
&lt;br /&gt;
=== Математическое описание алгоритма ===&lt;br /&gt;
Исходные данные: матрица &amp;lt;math&amp;gt;G&amp;lt;/math&amp;gt; (элементы &amp;lt;math&amp;gt;g_{ij}, i, j = 1, \ldots, n&amp;lt;/math&amp;gt;).&lt;br /&gt;
&lt;br /&gt;
Вычисляемые данные: матрица &amp;lt;math&amp;gt;\Sigma = diag(\sigma_{i})&amp;lt;/math&amp;gt;, где &amp;lt;math&amp;gt;\sigma_{i}&amp;lt;/math&amp;gt; - сингулярные числа, &amp;lt;math&amp;gt;U&amp;lt;/math&amp;gt; - матрица левых сингулярных векторов, &amp;lt;math&amp;gt;V&amp;lt;/math&amp;gt; - матрица правых сингулярных векторов.&lt;br /&gt;
&lt;br /&gt;
симметричную матрицу &amp;lt;math&amp;gt;A = (G^TG)&amp;lt;/math&amp;gt; можно привести к диагональному виду:&lt;br /&gt;
&amp;lt;math&amp;gt;RG^TGR^T&amp;lt;/math&amp;gt;, где&lt;br /&gt;
&lt;br /&gt;
&amp;lt;math&amp;gt;&lt;br /&gt;
\begin{matrix}&lt;br /&gt;
  &amp;amp;     &amp;amp;      &amp;amp;       &amp;amp; j &amp;amp;         &amp;amp; k &amp;amp;         &amp;amp;    &amp;amp;   \\&lt;br /&gt;
\end{matrix}&lt;br /&gt;
&amp;lt;/math&amp;gt;&lt;br /&gt;
&lt;br /&gt;
&amp;lt;math&amp;gt;&lt;br /&gt;
R(j,k,\theta) = &lt;br /&gt;
\begin{matrix}&lt;br /&gt;
  \\&lt;br /&gt;
  \\&lt;br /&gt;
  \\&lt;br /&gt;
j \\&lt;br /&gt;
  \\&lt;br /&gt;
k \\&lt;br /&gt;
  \\&lt;br /&gt;
  \\&lt;br /&gt;
  \\&lt;br /&gt;
\end{matrix}&lt;br /&gt;
&amp;lt;/math&amp;gt;  &lt;br /&gt;
&amp;lt;math&amp;gt;&lt;br /&gt;
\begin{bmatrix}&lt;br /&gt;
  &amp;amp; 1 &amp;amp;   &amp;amp;        &amp;amp;              &amp;amp;        &amp;amp;               &amp;amp;         &amp;amp;    &amp;amp;   \\&lt;br /&gt;
  &amp;amp;   &amp;amp; 1 &amp;amp;        &amp;amp;              &amp;amp;        &amp;amp;               &amp;amp;         &amp;amp;    &amp;amp;   \\&lt;br /&gt;
  &amp;amp;   &amp;amp;   &amp;amp; \ddots &amp;amp;              &amp;amp;        &amp;amp;               &amp;amp;         &amp;amp;    &amp;amp;   \\&lt;br /&gt;
  &amp;amp;   &amp;amp;   &amp;amp;        &amp;amp; \cos(\theta) &amp;amp;        &amp;amp; -\sin(\theta) &amp;amp;         &amp;amp;    &amp;amp;   \\&lt;br /&gt;
  &amp;amp;   &amp;amp;   &amp;amp;        &amp;amp;              &amp;amp; \ddots &amp;amp;               &amp;amp;         &amp;amp;    &amp;amp;   \\&lt;br /&gt;
  &amp;amp;   &amp;amp;   &amp;amp;        &amp;amp; \sin(\theta) &amp;amp;        &amp;amp; \cos(\theta)  &amp;amp;         &amp;amp;    &amp;amp;   \\&lt;br /&gt;
  &amp;amp;   &amp;amp;   &amp;amp;        &amp;amp;              &amp;amp;        &amp;amp;               &amp;amp; \ddots  &amp;amp;    &amp;amp;   \\&lt;br /&gt;
  &amp;amp;   &amp;amp;   &amp;amp;        &amp;amp;              &amp;amp;        &amp;amp;               &amp;amp;         &amp;amp; 1  &amp;amp;   \\&lt;br /&gt;
  &amp;amp;   &amp;amp;   &amp;amp;        &amp;amp;              &amp;amp;        &amp;amp;               &amp;amp;         &amp;amp;    &amp;amp; 1 \\&lt;br /&gt;
\end{bmatrix}&lt;br /&gt;
&amp;lt;/math&amp;gt;&lt;br /&gt;
&lt;br /&gt;
Обозначим &amp;lt;math&amp;gt;s = \sin \theta&amp;lt;/math&amp;gt; и &amp;lt;math&amp;gt;c = \cos \theta&amp;lt;/math&amp;gt;.&lt;br /&gt;
&lt;br /&gt;
Перемножив матрицы &amp;lt;math&amp;gt;RG^TGR^T&amp;lt;/math&amp;gt;, получим следующие выражения:&lt;br /&gt;
&lt;br /&gt;
&amp;lt;math&amp;gt;\begin{align}&lt;br /&gt;
 a_{jj}^{(i+1)} &amp;amp;= c^2\, a_{jj}^{(i)}  -  2\, s c \,a_{jk}^{(i)}  +  s^2\, a_{kk}^{(i)} \\&lt;br /&gt;
 a_{kk}^{(i+1)} &amp;amp;= s^2 \,a_{jj}^{(i)}  +  2 s c\, a_{jk}^{(i)}  +  c^2 \, a_{kk}^{(i)} \\&lt;br /&gt;
 a_{jk}^{(i+1)} &amp;amp;= a_{kj}^{(i+1)} = (c^2 - s^2 ) \, a_{jk}^{(i)}  +  s c \, (a_{kk}^{(i)} - a_{jj}^{(i)} ) \\&lt;br /&gt;
 a_{jm}^{(i+1)} &amp;amp;= a_{mj}^{(i+1)} = c \, a_{jm}^{(i)}  -  s \, a_{km}^{(i)} &amp;amp; m \ne j,k \\&lt;br /&gt;
 a_{km}^{(i+1)} &amp;amp;= a_{mk}^{(i+1)} = s \, a_{jm}^{(i)}  + c \, a_{km}^{(i)} &amp;amp; m \ne j,k \\&lt;br /&gt;
 a_{ml}^{(i+1)} &amp;amp;= a_{ml}^{(i)} &amp;amp;m,l \ne j,k&lt;br /&gt;
\end{align}&amp;lt;/math&amp;gt;&lt;br /&gt;
&lt;br /&gt;
Т.к внедиагональные элементы должны быть равны 0, то выбираем &amp;lt;math&amp;gt;\theta&amp;lt;/math&amp;gt; так, чтобы &amp;lt;math&amp;gt;a_{jk}^{(i+1)} = 0&amp;lt;/math&amp;gt; и &amp;lt;math&amp;gt;a_{kj}^{(i+1)} = 0&amp;lt;/math&amp;gt;.&lt;br /&gt;
&lt;br /&gt;
Тогда решая уравнение получаем, что&lt;br /&gt;
&lt;br /&gt;
&amp;lt;math&amp;gt;&lt;br /&gt;
         \begin{align}&lt;br /&gt;
         \tau &amp;amp;= {a_{jj} - a_{kk}}/{2a_{jk}} \\&lt;br /&gt;
         t &amp;amp;= {sign(\tau)}/(|\tau| + \sqrt{1 + \tau^2}) \\&lt;br /&gt;
         c &amp;amp;= 1/(\sqrt{1 + t^2}) \\&lt;br /&gt;
         s &amp;amp;= ct \\&lt;br /&gt;
         \end{align}&amp;lt;/math&amp;gt;&lt;br /&gt;
&lt;br /&gt;
=== Вычислительное ядро алгоритма ===&lt;br /&gt;
&lt;br /&gt;
=== Макроструктура алгоритма ===&lt;br /&gt;
Основную часть метода составляет процедура односторонних вращений матрицы, которая в свою очередь состоит из:&lt;br /&gt;
&lt;br /&gt;
#Вычисление &amp;lt;math&amp;gt;\tau, c, s, t&amp;lt;/math&amp;gt;.&lt;br /&gt;
#Одностороннее вращение матрицы. &lt;br /&gt;
&lt;br /&gt;
Что требует &amp;lt;math&amp;gt;O(n)&amp;lt;/math&amp;gt; операций.&lt;br /&gt;
&lt;br /&gt;
После этого необходимо:&lt;br /&gt;
&lt;br /&gt;
#Вычислить сингулярные числа &amp;lt;math&amp;gt;\sigma_i&amp;lt;/math&amp;gt;.  Что требует &amp;lt;math&amp;gt;O(n)&amp;lt;/math&amp;gt; операций.&lt;br /&gt;
#Вычислить &amp;lt;math&amp;gt;U&amp;lt;/math&amp;gt; и &amp;lt;math&amp;gt;V&amp;lt;/math&amp;gt;. Что требует &amp;lt;math&amp;gt;O(n^2)&amp;lt;/math&amp;gt; операций.&lt;br /&gt;
&lt;br /&gt;
=== Схема реализации последовательного алгоритма ===&lt;br /&gt;
Применение метода Якоби к матрице &amp;lt;math&amp;gt;A = (G^TG)&amp;lt;/math&amp;gt; можно описать следующим образом&amp;lt;ref&amp;gt;Дж. Деммель «Вычислительная линейная алгебра» (стр. 261-263)&amp;lt;/ref&amp;gt;:&lt;br /&gt;
&lt;br /&gt;
Если &amp;lt;math&amp;gt;G = U\Sigma V^T&amp;lt;/math&amp;gt; и &amp;lt;math&amp;gt;\Sigma = diag(\sigma_{i})&amp;lt;/math&amp;gt;, то алгоритм вычисляет сингулярные числа &amp;lt;math&amp;gt;\sigma_{i}&amp;lt;/math&amp;gt;, матрицу &amp;lt;math&amp;gt;U&amp;lt;/math&amp;gt; левых сингулярных векторов и матрицу &amp;lt;math&amp;gt;V&amp;lt;/math&amp;gt; правых сингулярных векторов по следующей схеме:&lt;br /&gt;
&lt;br /&gt;
 repeat&lt;br /&gt;
     for &amp;lt;math&amp;gt;j=1&amp;lt;/math&amp;gt; to &amp;lt;math&amp;gt;n-1&amp;lt;/math&amp;gt;&lt;br /&gt;
         for &amp;lt;math&amp;gt;k=j+1&amp;lt;/math&amp;gt; to &amp;lt;math&amp;gt;n&amp;lt;/math&amp;gt;&lt;br /&gt;
             обратиться к процедуре &#039;&#039;&#039;&#039;&#039;One-Sided-Jacobi-Rotation&amp;lt;math&amp;gt;(G,j,k)&amp;lt;/math&amp;gt;&#039;&#039;&#039;&#039;&#039;&lt;br /&gt;
         end for&lt;br /&gt;
     end for&lt;br /&gt;
 пока &amp;lt;math&amp;gt;G^TG&amp;lt;/math&amp;gt; не станет достаточно близка к диагональной матрице&lt;br /&gt;
 Положить &amp;lt;math&amp;gt;\sigma_{i} = ||G(:,i)||_2 &amp;lt;/math&amp;gt; (норма &amp;lt;math&amp;gt;i&amp;lt;/math&amp;gt;-го столбца в &amp;lt;math&amp;gt;G&amp;lt;/math&amp;gt;)&lt;br /&gt;
 Положить &amp;lt;math&amp;gt;U = [u_{1},\dots, u_{n}]&amp;lt;/math&amp;gt;, где &amp;lt;math&amp;gt;u_{i} = G(:,i)/\sigma_{i}&amp;lt;/math&amp;gt;&lt;br /&gt;
 Положить &amp;lt;math&amp;gt;V = J&amp;lt;/math&amp;gt;, где &amp;lt;math&amp;gt;J&amp;lt;/math&amp;gt; - накопленное произведение вращений Якоби.&lt;br /&gt;
&lt;br /&gt;
Где процедура &#039;&#039;&#039;&#039;&#039;One-Sided-Jacobi-Rotation&#039;&#039;&#039;&#039;&#039; является метод односторонних вращений Якоби:&lt;br /&gt;
&lt;br /&gt;
 proc &#039;&#039;&#039;&#039;&#039;One-Sided-Jacobi-Rotation&amp;lt;math&amp;gt;(G,j,k)&amp;lt;/math&amp;gt;&#039;&#039;&#039;&#039;&#039;&lt;br /&gt;
     вычислить &amp;lt;math&amp;gt;a_{jj} = (G^TG)_{jj}, a_{jk} = (G^TG)_{jk}&amp;lt;/math&amp;gt; и &amp;lt;math&amp;gt;a_{kk} = (G^TG)_{kk}&amp;lt;/math&amp;gt;&lt;br /&gt;
     if &amp;lt;math&amp;gt;|a_{jk}|&amp;lt;/math&amp;gt; не слишком мал&lt;br /&gt;
         &amp;lt;math&amp;gt;&lt;br /&gt;
         \begin{align}&lt;br /&gt;
         \tau &amp;amp;= {a_{jj} - a_{kk}}/{2a_{jk}} \\&lt;br /&gt;
         t &amp;amp;= {sign(\tau)}/(|\tau| + \sqrt{1 + \tau^2}) \\&lt;br /&gt;
         c &amp;amp;= 1/(\sqrt{1 + t^2}) \\&lt;br /&gt;
         s &amp;amp;= ct \\&lt;br /&gt;
         G &amp;amp;= GR(j,k,\theta) \  \dots c=cos\theta, s=sin\theta \end{align}&amp;lt;/math&amp;gt;&lt;br /&gt;
         if нужны правые сингулярные векторы &lt;br /&gt;
             &amp;lt;math&amp;gt;J = JR(j,k,\theta)&amp;lt;/math&amp;gt;&lt;br /&gt;
         end if&lt;br /&gt;
     end if&lt;br /&gt;
&lt;br /&gt;
=== Последовательная сложность алгоритма ===&lt;br /&gt;
&lt;br /&gt;
=== Информационный граф ===&lt;br /&gt;
&lt;br /&gt;
=== Ресурс параллелизма алгоритма ===&lt;br /&gt;
Для выполнения одной итерации метода Якоби требуется последовательно выполнить несколько ярусов:&lt;br /&gt;
# вычислить &amp;lt;math&amp;gt;\tau&amp;lt;/math&amp;gt; &lt;br /&gt;
# вычислить &amp;lt;math&amp;gt;t&amp;lt;/math&amp;gt; &lt;br /&gt;
# вычислить &amp;lt;math&amp;gt;c&amp;lt;/math&amp;gt; &lt;br /&gt;
# выполнить поворот к матрицы &amp;lt;math&amp;gt;G&amp;lt;/math&amp;gt; с параллельным выполнением &amp;lt;math&amp;gt;2(n-2)&amp;lt;/math&amp;gt; операций вычисления элементов матрицы &amp;lt;math&amp;gt;g_{jm}^{(i+1)} = g_{mj}^{(i+1)}&amp;lt;/math&amp;gt; и &amp;lt;math&amp;gt;g_{km}^{(i+1)} = g_{mk}^{(i+1)}&amp;lt;/math&amp;gt;, &amp;lt;math&amp;gt;m \ne j,k&amp;lt;/math&amp;gt;, а также вычисления элементов &amp;lt;math&amp;gt;g_{jj}^{(i+1)} &amp;lt;/math&amp;gt; и &amp;lt;math&amp;gt;g_{kk}^{(i+1)} &amp;lt;/math&amp;gt;. &lt;br /&gt;
&lt;br /&gt;
Суммарное количество итераций равно &amp;lt;math&amp;gt;\frac{n(n-1)}{2}&amp;lt;/math&amp;gt; (Различные варианты выбора &amp;lt;math&amp;gt;j&amp;lt;/math&amp;gt; и &amp;lt;math&amp;gt;k&amp;lt;/math&amp;gt;). &lt;br /&gt;
&lt;br /&gt;
Асимптотически метод сходится квадратично. &lt;br /&gt;
&lt;br /&gt;
Таким образом, при классификации по высоте ЯПФ метод Якоби относится к алгоритмам со сложностью &amp;lt;math&amp;gt;O(n^2)&amp;lt;/math&amp;gt;&amp;amp;nbsp;, а при классификации по ширине ЯПФ — к алгоритмам со сложностью &amp;lt;math&amp;gt;O(n)&amp;lt;/math&amp;gt;.&lt;br /&gt;
&lt;br /&gt;
=== Входные и выходные данные алгоритма ===&lt;br /&gt;
&#039;&#039;&#039;Входные данные&#039;&#039;&#039;: плотная матрица &amp;lt;math&amp;gt;G&amp;lt;/math&amp;gt; размера &amp;lt;math&amp;gt;n&amp;lt;/math&amp;gt;х&amp;lt;math&amp;gt;n&amp;lt;/math&amp;gt;, где &amp;lt;math&amp;gt;A= G^TG&amp;lt;/math&amp;gt; – симметрическая матрица.&lt;br /&gt;
&lt;br /&gt;
&#039;&#039;&#039;Объём входных данных&#039;&#039;&#039;: &amp;lt;math&amp;gt;n^2&amp;lt;/math&amp;gt; (т.к. для хранения матрицы &amp;lt;math&amp;gt;G&amp;lt;/math&amp;gt; используем двумерный массив размера &amp;lt;math&amp;gt;n&amp;lt;/math&amp;gt;х&amp;lt;math&amp;gt;n&amp;lt;/math&amp;gt;)&lt;br /&gt;
&lt;br /&gt;
&#039;&#039;&#039;Выходные данные&#039;&#039;&#039;: &amp;lt;math&amp;gt;\sigma_{i}&amp;lt;/math&amp;gt;  - сингулярные числа, матрица &amp;lt;math&amp;gt;U&amp;lt;/math&amp;gt; левых сингулярных векторов и матрица &amp;lt;math&amp;gt;V&amp;lt;/math&amp;gt; правых сингулярных векторов.&lt;br /&gt;
&lt;br /&gt;
&#039;&#039;&#039;Объём выходных данных&#039;&#039;&#039;: &amp;lt;math&amp;gt;2n^2 + n&amp;lt;/math&amp;gt; (т.к. необходимо хранить вектор сингулярных чисел длины &amp;lt;math&amp;gt;n&amp;lt;/math&amp;gt;, а также две матрицы &amp;lt;math&amp;gt;U, V&amp;lt;/math&amp;gt; левых и правых сингулярных векторов размера &amp;lt;math&amp;gt;n&amp;lt;/math&amp;gt;х&amp;lt;math&amp;gt;n&amp;lt;/math&amp;gt;).&lt;br /&gt;
&lt;br /&gt;
=== Свойства алгоритма ===&lt;br /&gt;
Метод Якоби является самым медленным из имеющихся алгоритмов вычисления сингулярных чисел и сингулярных векторов матрицы. Тем не менее, для  матриц &amp;lt;math&amp;gt;G&amp;lt;/math&amp;gt;, которые могут быть представлены в виде &amp;lt;math&amp;gt;G=DX&amp;lt;/math&amp;gt;, где &amp;lt;math&amp;gt;D&amp;lt;/math&amp;gt; - диагональная, а &amp;lt;math&amp;gt;X&amp;lt;/math&amp;gt; - хорошо обусловлена, он способен вычислять сингулярные числа и вектора намного точнее, чем другие методы&amp;lt;ref&amp;gt;Дж. Деммель «Вычислительная линейная алгебра» (стр. 261-264)&amp;lt;/ref&amp;gt;. &lt;br /&gt;
&lt;br /&gt;
Вычислительная мощность алгоритма, как отношение числа операций к суммарному объему входных и выходных данных является линейной.&lt;br /&gt;
&lt;br /&gt;
Метод Якоби не детерминирован, так как является итерационным алгоритмом с выходом по точности (число итераций зависит от входных данных и порогового значения).&lt;br /&gt;
&lt;br /&gt;
== Программная реализация алгоритма ==&lt;br /&gt;
&lt;br /&gt;
=== Особенности реализации последовательного алгоритма ===&lt;br /&gt;
&lt;br /&gt;
=== Локальность данных и вычислений ===&lt;br /&gt;
&lt;br /&gt;
=== Возможные способы и особенности параллельной реализации алгоритма ===&lt;br /&gt;
&lt;br /&gt;
=== Масштабируемость алгоритма и его реализации ===&lt;br /&gt;
&lt;br /&gt;
=== Динамические характеристики и эффективность реализации алгоритма ===&lt;br /&gt;
&lt;br /&gt;
=== Выводы для классов архитектур ===&lt;br /&gt;
&lt;br /&gt;
=== Существующие реализации алгоритма ===&lt;br /&gt;
Метод Якоби нахождения сингулярных значений и векторов реализован в таких пакетах, как LAPACK, LINPACK/EISPACK, Intel MKL &amp;lt;ref&amp;gt;http://www.alglib.net/matrixops/general/svd.php&amp;lt;/ref&amp;gt;.&lt;br /&gt;
&lt;br /&gt;
Так же функция Якоби реализована в пакете Matlab.&lt;br /&gt;
&lt;br /&gt;
Т. к. алгоритм считается медленным, он не включен во многие известные пакеты.&lt;br /&gt;
&lt;br /&gt;
== Литература ==&lt;br /&gt;
1. Дж. Деммель Вычислительная линейная алгебра. Изд. Мир, 2001.&lt;/div&gt;</summary>
		<author><name>Davletshuna Alexandra</name></author>
	</entry>
	<entry>
		<id>https://xn--80aecvaldz.xn--80ahdrnmvk.xn--p1ai/w/ru/index.php?title=%D0%A3%D1%87%D0%B0%D1%81%D1%82%D0%BD%D0%B8%D0%BA:Alek_sandra&amp;diff=9542</id>
		<title>Участник:Alek sandra</title>
		<link rel="alternate" type="text/html" href="https://xn--80aecvaldz.xn--80ahdrnmvk.xn--p1ai/w/ru/index.php?title=%D0%A3%D1%87%D0%B0%D1%81%D1%82%D0%BD%D0%B8%D0%BA:Alek_sandra&amp;diff=9542"/>
		<updated>2016-10-15T12:51:22Z</updated>

		<summary type="html">&lt;p&gt;Davletshuna Alexandra: &lt;/p&gt;
&lt;hr /&gt;
&lt;div&gt;Студентка 601 группы ВМК МГУ Зайцева Александра&lt;/div&gt;</summary>
		<author><name>Davletshuna Alexandra</name></author>
	</entry>
	<entry>
		<id>https://xn--80aecvaldz.xn--80ahdrnmvk.xn--p1ai/w/ru/index.php?title=%D0%A3%D1%87%D0%B0%D1%81%D1%82%D0%BD%D0%B8%D0%BA:Alek_sandra&amp;diff=9541</id>
		<title>Участник:Alek sandra</title>
		<link rel="alternate" type="text/html" href="https://xn--80aecvaldz.xn--80ahdrnmvk.xn--p1ai/w/ru/index.php?title=%D0%A3%D1%87%D0%B0%D1%81%D1%82%D0%BD%D0%B8%D0%BA:Alek_sandra&amp;diff=9541"/>
		<updated>2016-10-15T12:50:38Z</updated>

		<summary type="html">&lt;p&gt;Davletshuna Alexandra: Новая страница: «Студентка 601 группы ВМК МГУ»&lt;/p&gt;
&lt;hr /&gt;
&lt;div&gt;Студентка 601 группы ВМК МГУ&lt;/div&gt;</summary>
		<author><name>Davletshuna Alexandra</name></author>
	</entry>
</feed>