<?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=BoldyrevVV+MSU</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=BoldyrevVV+MSU"/>
	<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/BoldyrevVV_MSU"/>
	<updated>2026-10-22T22:58:59Z</updated>
	<subtitle>Вклад</subtitle>
	<generator>MediaWiki 1.43.5</generator>
	<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:BoldyrevVV_MSU/%D0%9F%D0%B0%D1%80%D0%B0%D0%BB%D0%BB%D0%B5%D0%BB%D1%8C%D0%BD%D0%B0%D1%8F_%D1%80%D0%B5%D0%B0%D0%BB%D0%B8%D0%B7%D0%B0%D1%86%D0%B8%D1%8F_%D0%BC%D0%B0%D1%82%D1%80%D0%B8%D1%87%D0%BD%D0%BE%D0%B3%D0%BE_%D0%BA%D1%80%D0%B5%D1%81%D1%82%D0%BE%D0%B2%D0%BE%D0%B3%D0%BE_%D0%BC%D0%B5%D1%82%D0%BE%D0%B4%D0%B0&amp;diff=29955</id>
		<title>Участник:BoldyrevVV MSU/Параллельная реализация матричного крестового метода</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:BoldyrevVV_MSU/%D0%9F%D0%B0%D1%80%D0%B0%D0%BB%D0%BB%D0%B5%D0%BB%D1%8C%D0%BD%D0%B0%D1%8F_%D1%80%D0%B5%D0%B0%D0%BB%D0%B8%D0%B7%D0%B0%D1%86%D0%B8%D1%8F_%D0%BC%D0%B0%D1%82%D1%80%D0%B8%D1%87%D0%BD%D0%BE%D0%B3%D0%BE_%D0%BA%D1%80%D0%B5%D1%81%D1%82%D0%BE%D0%B2%D0%BE%D0%B3%D0%BE_%D0%BC%D0%B5%D1%82%D0%BE%D0%B4%D0%B0&amp;diff=29955"/>
		<updated>2025-11-04T19:13:19Z</updated>

		<summary type="html">&lt;p&gt;BoldyrevVV MSU: add references&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((m + n) r^2)&amp;lt;/math&amp;gt;&lt;br /&gt;
| pf_height = &amp;lt;math&amp;gt;O(r p)&amp;lt;/math&amp;gt;&lt;br /&gt;
| pf_width = &amp;lt;math&amp;gt;O\left(\left\lceil \frac{m}{p} \right\rceil + \left\lceil \frac{n}{p} \right\rceil\right) r&amp;lt;/math&amp;gt;&lt;br /&gt;
| input_data = &amp;lt;math&amp;gt;O((m + n) r)&amp;lt;/math&amp;gt; (вычисляются лишь отдельные элементы матрицы)&lt;br /&gt;
| output_data = &amp;lt;math&amp;gt;O((m + n) r)&amp;lt;/math&amp;gt; (факторы &amp;lt;math&amp;gt;U \in \mathbb{R}^{m \times r}&amp;lt;/math&amp;gt;, &amp;lt;math&amp;gt;V \in \mathbb{R}^{r \times n}&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;
&lt;br /&gt;
&#039;&#039;&#039;Матричный крестовой метод&#039;&#039;&#039; — это быстрый метод построения малорангового приближения матрицы, не требующий хранения или полного доступа ко всей матрице. Вместо этого он работает с отдельными элементами, выбор которых адаптивно определяется в ходе вычислений. Метод особенно эффективен в задачах, где матрица задана неявно — например, как функция расстояния между точками в пространстве (ядерные матрицы, ковариационные матрицы, интегральные операторы и т.п.).&lt;br /&gt;
&lt;br /&gt;
Ключевая идея основана на так называемом &#039;&#039;&#039;крестовом разложении&#039;&#039;&#039;&amp;lt;ref&amp;gt;S. A. Goreinov, E. E. Tyrtyshnikov, and N. L. Zamarashkin,“Pseudoskeleton Approximations of Matrices,”Dokl. Akad. Nauk343(2), 151–152 (1995) [Dokl. Math.52(1), 18–19 (1995)]&amp;lt;/ref&amp;gt;&amp;lt;ref&amp;gt;E. Tyrtyshnikov, “Incomplete Cross Approximation in theMosaic-Skeleton Method,” Computing64(4),367–380 (2000).&amp;lt;/ref&amp;gt;.: &#039;&#039;Если&#039;&#039; известны &amp;lt;math&amp;gt;r&amp;lt;/math&amp;gt; строк и &amp;lt;math&amp;gt;r&amp;lt;/math&amp;gt; столбцов матрицы, пересечение которых образует невырожденную подматрицу, &#039;&#039;то&#039;&#039; вся матрица может быть восстановлена через интерполяцию по этим строкам и столбцам. На практике используется &#039;&#039;&#039;адаптивная схема&#039;&#039;&#039; (ACA и ACA+)&amp;lt;ref&amp;gt;Zhao, Kezhong &amp;amp; Vouvakis, M.N. &amp;amp; Lee, Jin-Fa. (2005). The Adaptive Cross Approximation Algorithm for Accelerated Method of Moments Computations of EMC Problems. Electromagnetic Compatibility, IEEE Transactions on. 47. 763 - 773. 10.1109/TEMC.2005.857898.&amp;lt;/ref&amp;gt; с выбором элемента максимальной невязки на каждой итерации (аналог жадного алгоритма), что позволяет обойтись без поиска подматрицы максимального объёма.&lt;br /&gt;
&lt;br /&gt;
Важнейшее преимущество метода — малая вычислительная стоимость: для построения приближения ранга &amp;lt;math&amp;gt;r&amp;lt;/math&amp;gt; требуется &amp;lt;math&amp;gt;O((m + n) r)&amp;lt;/math&amp;gt; вычислений элементов матрицы и &amp;lt;math&amp;gt;O((m + n) r^2)&amp;lt;/math&amp;gt; арифметических операций.&lt;br /&gt;
&lt;br /&gt;
В условиях современных суперкомпьютеров и больших размерностей (&amp;lt;math&amp;gt;m, n \sim 10^5&amp;lt;/math&amp;gt; и выше) естественным шагом становится параллельная реализация, предложенная в работе Д. А. Желткова и Е. Е. Тыртышникова (2015)&amp;lt;ref&amp;gt;Желтков, Д.А. Параллельная реализация матричного крестового метода // Д.А. Желтков, Е.Е. Тыртышников // ВЫЧИСЛИТЕЛЬНЫЕ МЕТОДЫ И ПРОГРАММИРОВАНИЕ: НОВЫЕ ВЫЧИСЛИТЕЛЬНЫЕ ТЕХНОЛОГИИ. - 2015. № 3 16. - 369-375.&amp;lt;/ref&amp;gt;. Она распределяет строки и столбцы матрицы между процессорами и использует коллективные операции для глобального выбора доминирующего элемента невязки.&lt;br /&gt;
&lt;br /&gt;
==== Особенности параллельной реализации ====&lt;br /&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;. На каждой итерации:&lt;br /&gt;
&lt;br /&gt;
*процессоры совместно находят глобальный максимум невязки с помощью операций &amp;lt;math&amp;gt;\texttt{Gather}&amp;lt;/math&amp;gt; и &amp;lt;math&amp;gt;\texttt{Broadcast}&amp;lt;/math&amp;gt;;&lt;br /&gt;
*соответствующие строки и столбцы обновляются локально;&lt;br /&gt;
*норма Фробениуса текущего приближения пересчитывается распределённо, без полного сбора данных.&lt;br /&gt;
&amp;lt;br&amp;gt;&lt;br /&gt;
Эта стратегия позволяет сохранить низкую коммуникационную сложность: каждый процессор выполняет &amp;lt;math&amp;gt;O(r)&amp;lt;/math&amp;gt; обменов, а длина каждого сообщения не превышает &amp;lt;math&amp;gt;r&amp;lt;/math&amp;gt;. При этом трудоёмкость на один процессор снижается до &amp;lt;math&amp;gt;O\left(\left(\left\lceil \frac{m}{p} \right\rceil + \left\lceil \frac{n}{p} \right\rceil\right) r^2\right)&amp;lt;/math&amp;gt;, &amp;lt;br&amp;gt;а количество вычисляемых элементов — до &amp;lt;math&amp;gt;O\left(\left(\left\lceil \frac{m}{p} \right\rceil + \left\lceil \frac{n}{p} \right\rceil\right) r\right)&amp;lt;/math&amp;gt;.&lt;br /&gt;
&lt;br /&gt;
=== Математическое описание алгоритма ===&lt;br /&gt;
&lt;br /&gt;
Пусть задана матрица &amp;lt;math&amp;gt;A \in \mathbb{R}^{m \times n}&amp;lt;/math&amp;gt;. Цель — построить её малоранговое приближение вида &amp;lt;math&amp;gt;A \approx UV&amp;lt;/math&amp;gt;, где &amp;lt;math&amp;gt;U \in \mathbb{R}^{m \times r}&amp;lt;/math&amp;gt;, &amp;lt;math&amp;gt;V \in \mathbb{R}^{r \times n}&amp;lt;/math&amp;gt;, а ранг &amp;lt;math&amp;gt;r \ll \min(m,n)&amp;lt;/math&amp;gt;.&lt;br /&gt;
&lt;br /&gt;
Общая схема крестового метода основана на последовательном выделении строк и столбцов, содержащих подматрицу максимального (или достаточно большого) объёма. В обобщённом виде она выглядит следующим образом:&lt;br /&gt;
&lt;br /&gt;
&#039;&#039;&#039;Алгоритм 1. Схема крестового метода&#039;&#039;&#039;&amp;lt;br&amp;gt;&lt;br /&gt;
&lt;br /&gt;
&#039;&#039;Инициализация:&#039;&#039;&lt;br /&gt;
&amp;lt;math&amp;gt;I \gets {1,\dots,m}&amp;lt;/math&amp;gt;, &amp;lt;math&amp;gt;J \gets {1,\dots,n}&amp;lt;/math&amp;gt;, &amp;lt;math&amp;gt;r \gets 0&lt;br /&gt;
&amp;lt;/math&amp;gt;.&lt;br /&gt;
&amp;lt;br&amp;gt;&#039;&#039;Повторять:&#039;&#039;&amp;lt;br&amp;gt;&lt;br /&gt;
#&amp;lt;math&amp;gt;r \gets r + 1&amp;lt;/math&amp;gt;;&amp;lt;br&amp;gt;&lt;br /&gt;
#Найти подмножества индексов &amp;lt;math&amp;gt;I_* \subset I&amp;lt;/math&amp;gt;, &amp;lt;math&amp;gt;J_* \subset J&amp;lt;/math&amp;gt; (размера &amp;lt;math&amp;gt;k&amp;lt;/math&amp;gt;), такие что подматрица &amp;lt;math&amp;gt;A[I_*, J_*]&amp;lt;/math&amp;gt; имеет достаточно большой объём (процедура &amp;lt;math&amp;gt;\texttt{maxvol}&amp;lt;/math&amp;gt;);&amp;lt;br&amp;gt;&lt;br /&gt;
#Выбрать столбцы: &amp;lt;math&amp;gt;C_r \gets A[:, J_*]&amp;lt;/math&amp;gt;;&amp;lt;br&amp;gt;&lt;br /&gt;
#Выбрать строки: &amp;lt;math&amp;gt;R_r \gets A[I_*, :]&amp;lt;/math&amp;gt;;&amp;lt;br&amp;gt;&lt;br /&gt;
#Выделить ядро: &amp;lt;math&amp;gt;\hat{A_i} \gets A[:, I_* J_*]&amp;lt;/math&amp;gt;;&amp;lt;br&amp;gt;&lt;br /&gt;
#Обновить текущую невязку: &amp;lt;math&amp;gt;A \gets A - C_r \hat{A}_{r}^{-1} R_r&amp;lt;/math&amp;gt;;&amp;lt;br&amp;gt;&lt;br /&gt;
#Исключить использованные индексы: &amp;lt;math&amp;gt;I \gets I \setminus I_*&amp;lt;/math&amp;gt;, &amp;lt;math&amp;gt;J \gets J \setminus J_*&amp;lt;/math&amp;gt;;&amp;lt;br&amp;gt;&lt;br /&gt;
&#039;&#039;До выполнения критерия остановки.&#039;&#039;&lt;br /&gt;
&amp;lt;br&amp;gt;&amp;lt;br&amp;gt;&lt;br /&gt;
В результате работы этого алгоритма матрица &amp;lt;math&amp;gt;\sum_{i=1}^{r} C_i\hat{A}_{i}^{-1} R_i&amp;lt;/math&amp;gt; будет приближать матрицу &amp;lt;math&amp;gt;A&amp;lt;/math&amp;gt;.&lt;br /&gt;
В рассматриваемой работе используется частный случай этой схемы при &amp;lt;math&amp;gt;k = 1&amp;lt;/math&amp;gt;, &#039;&#039;то&#039;&#039; есть на каждой итерации выбирается один элемент с максимальной по модулю невязкой. В этом случае подматрица &amp;lt;math&amp;gt;\hat{A}_r&amp;lt;/math&amp;gt; — скаляр, а обновление факторов происходит по явным формулам.&lt;br /&gt;
&amp;lt;br&amp;gt;&amp;lt;br&amp;gt;&lt;br /&gt;
С учeтом данного выбора алгоритм выглядит следующим образом.&lt;br /&gt;
&lt;br /&gt;
&#039;&#039;&#039;Алгоритм 2. Крестовый метод (&amp;lt;math&amp;gt;k = 1&amp;lt;/math&amp;gt;)&#039;&#039;&#039;&lt;br /&gt;
&lt;br /&gt;
&#039;&#039;Инициализация:&#039;&#039;&lt;br /&gt;
&amp;lt;math&amp;gt;I \gets {1,\dots,m}&amp;lt;/math&amp;gt;, &amp;lt;math&amp;gt;J \gets {1,\dots,n}&amp;lt;/math&amp;gt;, &amp;lt;math&amp;gt;r \gets 0&amp;lt;/math&amp;gt;.&lt;br /&gt;
&amp;lt;br&amp;gt;&#039;&#039;Цикл:&#039;&#039;&lt;br /&gt;
&amp;lt;br&amp;gt;1. &amp;lt;math&amp;gt;r \gets r + 1&amp;lt;/math&amp;gt;;&lt;br /&gt;
&amp;lt;br&amp;gt;2. Найти строку с максимальной невязкой в первом доступном столбце:&lt;br /&gt;
&amp;lt;br&amp;gt;&lt;br /&gt;
:&amp;lt;math&amp;gt;i \gets \arg\max_{i \in I} |A_{i, J(1)} - [UV]{i, J(1)}|&amp;lt;/math&amp;gt;;&lt;br /&gt;
&amp;lt;br&amp;gt;3. Найти столбец с максимальной невязкой в найденной строке:&lt;br /&gt;
&amp;lt;br&amp;gt;&lt;br /&gt;
:&amp;lt;math&amp;gt;j \gets \arg\max{j \in J} |A_{ij} - [UV]{ij}|&amp;lt;/math&amp;gt;;&lt;br /&gt;
&amp;lt;br&amp;gt;4. Проверить критерий остановки:&lt;br /&gt;
&amp;lt;br&amp;gt;&lt;br /&gt;
:&#039;&#039;Если&#039;&#039; &lt;br /&gt;
:&amp;lt;math&amp;gt;|(A - UV){ij}| \cdot \sqrt{(m - r)(n - r)} &amp;lt; \varepsilon |UV|F&amp;lt;/math&amp;gt;, &amp;lt;br&amp;gt;&#039;&#039;то&#039;&#039;&lt;br /&gt;
::&amp;lt;math&amp;gt;r \gets r - 1&amp;lt;/math&amp;gt;, &lt;br /&gt;
::выйти из цикла;&lt;br /&gt;
&amp;lt;br&amp;gt;&amp;lt;br&amp;gt;5. Обновить факторы:&lt;br /&gt;
:&amp;lt;math&amp;gt;u \gets \dfrac{A^{j} - [UV]^{j}}{\sqrt{\vert A_{ij}\vert}}&amp;lt;/math&amp;gt;,&lt;br /&gt;
:&amp;lt;math&amp;gt;v \gets \dfrac{(A_{i} - [UV]_{i}) \cdot \sqrt{\vert A_{ij}\vert}}{A_{ij}}&amp;lt;/math&amp;gt;;&lt;br /&gt;
&amp;lt;br&amp;gt;&amp;lt;br&amp;gt;6. Расширить матрицы:&lt;br /&gt;
:&amp;lt;math&amp;gt;U \gets [Uu]&amp;lt;/math&amp;gt;,&lt;br /&gt;
:&amp;lt;math&amp;gt;V \gets \begin{bmatrix} V \\ v \end{bmatrix}&amp;lt;/math&amp;gt;;&lt;br /&gt;
&amp;lt;br&amp;gt;7. Исключить использованные индексы:&lt;br /&gt;
:&amp;lt;math&amp;gt;I \gets I \setminus  \left\{ {i} \right\}&amp;lt;/math&amp;gt;,&lt;br /&gt;
:&amp;lt;math&amp;gt;J \gets J \setminus \left\{ {j} \right\}&amp;lt;/math&amp;gt;;&lt;br /&gt;
&amp;lt;br&amp;gt;Вернуть &amp;lt;math&amp;gt;\left( U, V, r \right)&amp;lt;/math&amp;gt;.&lt;br /&gt;
&amp;lt;br&amp;gt;&lt;br /&gt;
&lt;br /&gt;
&amp;lt;br&amp;gt;Здесь &amp;lt;math&amp;gt;A^{(j)}&amp;lt;/math&amp;gt; обозначает &amp;lt;math&amp;gt;j&amp;lt;/math&amp;gt;-й столбец матрицы &amp;lt;math&amp;gt;A&amp;lt;/math&amp;gt;, а &amp;lt;math&amp;gt;A_{(i)}&amp;lt;/math&amp;gt; — &amp;lt;math&amp;gt;i&amp;lt;/math&amp;gt;-ю строку. Норма Фробениуса &amp;lt;math&amp;gt;|UV|_F&amp;lt;/math&amp;gt; пересчитывается инкрементально за &amp;lt;math&amp;gt;O((m + n) r)&amp;lt;/math&amp;gt; операций, что позволяет сохранить общую сложность алгоритма на уровне &amp;lt;math&amp;gt;O((m + n) r^2)&amp;lt;/math&amp;gt;.&lt;br /&gt;
&lt;br /&gt;
В параллельной реализации выбор индексов &amp;lt;math&amp;gt;i&amp;lt;/math&amp;gt; и &amp;lt;math&amp;gt;j&amp;lt;/math&amp;gt; выполняется совместно всеми процессорами с помощью коллективных операций (gather/broadcast), а обновление &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;
&lt;br /&gt;
&lt;br /&gt;
Входные параметры: &amp;lt;math&amp;gt;m&amp;lt;/math&amp;gt; — число строк матрицы, &amp;lt;math&amp;gt;n&amp;lt;/math&amp;gt; — число столбцов, &amp;lt;math&amp;gt;A(i,j)&amp;lt;/math&amp;gt; — функция вычисления элемента матрицы, &amp;lt;math&amp;gt;p&amp;lt;/math&amp;gt; — число процессоров, &amp;lt;math&amp;gt;rnk&amp;lt;/math&amp;gt; — номер текущего процессора (от 0 до &amp;lt;math&amp;gt;p-1&amp;lt;/math&amp;gt;).&lt;br /&gt;
&lt;br /&gt;
&#039;&#039;&#039;Алгоритм 3. Параллельный крестовый метод&#039;&#039;&#039;&lt;br /&gt;
&lt;br /&gt;
:&amp;lt;math&amp;gt;{b}_{m} \gets \frac{m}{p}&amp;lt;/math&amp;gt;&lt;br /&gt;
:&amp;lt;math&amp;gt;{b}_{n} \gets \frac{n}{p}&amp;lt;/math&amp;gt;&lt;br /&gt;
&lt;br /&gt;
&#039;&#039;Если&#039;&#039;&lt;br /&gt;
:&amp;lt;math&amp;gt;rnk = 0&amp;lt;/math&amp;gt;, &#039;&#039;то&#039;&#039; &lt;br /&gt;
::&amp;lt;math&amp;gt;J_* \gets {1, \dots, n}&amp;lt;/math&amp;gt;&lt;br /&gt;
&#039;&#039;КонецЕсли&#039;&#039;&lt;br /&gt;
&lt;br /&gt;
:&amp;lt;math&amp;gt;I \gets { bm \cdot rnk + 1, \dots, bm \cdot (rnk + 1) }&amp;lt;/math&amp;gt;&lt;br /&gt;
:&amp;lt;math&amp;gt;J \gets { bn \cdot rnk + 1, \dots, bn \cdot (rnk + 1) }&amp;lt;/math&amp;gt;&lt;br /&gt;
:&amp;lt;math&amp;gt;r \gets 0&amp;lt;/math&amp;gt;&lt;br /&gt;
&lt;br /&gt;
&#039;&#039;повторять&#039;&#039;&lt;br /&gt;
:&amp;lt;math&amp;gt;r \gets r + 1&amp;lt;/math&amp;gt;&lt;br /&gt;
&lt;br /&gt;
&#039;&#039;Eсли&#039;&#039; &amp;lt;math&amp;gt;rnk = 0&amp;lt;/math&amp;gt;, &#039;&#039;то&#039;&#039; &lt;br /&gt;
::&amp;lt;math&amp;gt;j \gets J^*(1)&amp;lt;/math&amp;gt;&lt;br /&gt;
&#039;&#039;КонецЕсли&#039;&#039;&lt;br /&gt;
:&amp;lt;math&amp;gt;\texttt{Broadcast}(0, j, j)&amp;lt;/math&amp;gt;&lt;br /&gt;
&lt;br /&gt;
:&amp;lt;math&amp;gt;\texttt{Broadcast}\left(\left\lfloor \frac{j - 1}{p} \right\rfloor, V^j, v\right)&amp;lt;/math&amp;gt;&lt;br /&gt;
&lt;br /&gt;
:&amp;lt;math&amp;gt;i \gets \arg\max_{i \in I} \left| A_{ij} - [U v]_i \right|&amp;lt;/math&amp;gt;&lt;br /&gt;
&lt;br /&gt;
:&amp;lt;math&amp;gt;\texttt{Gather}\left( 0, \left\{ i, \vert A_{ij} - [U v]_i \vert \right\}, max_i \right)&amp;lt;/math&amp;gt;&lt;br /&gt;
&lt;br /&gt;
&#039;&#039;Eсли&#039;&#039; &amp;lt;math&amp;gt;rnk = 0&amp;lt;/math&amp;gt;, &#039;&#039;то&#039;&#039;&lt;br /&gt;
::&amp;lt;math&amp;gt;{i, column_maximum} \gets \max_{k \in [1; p]} (max_i[k])&amp;lt;/math&amp;gt;&lt;br /&gt;
&#039;&#039;КонецЕсли&#039;&#039;&lt;br /&gt;
&lt;br /&gt;
&lt;br /&gt;
:&amp;lt;math&amp;gt;\texttt{Broadcast}(0, i, i)&amp;lt;/math&amp;gt;&lt;br /&gt;
&lt;br /&gt;
:&amp;lt;math&amp;gt;\texttt{Broadcast}\left(\left\lfloor \frac{i - 1}{p} \right\rfloor, U_i, u\right)&amp;lt;/math&amp;gt;&lt;br /&gt;
&lt;br /&gt;
:&amp;lt;math&amp;gt;j \gets \arg\max_{j \in J} \left| A_{ij} - [u V]_j \right|&amp;lt;/math&amp;gt;&lt;br /&gt;
&lt;br /&gt;
:&amp;lt;math&amp;gt;\texttt{Gather}(0, \left\{j, \vert A_{ij} - [u V]_j \vert \right\}, max_j)&amp;lt;/math&amp;gt;&lt;br /&gt;
&lt;br /&gt;
&#039;&#039;Eсли&#039;&#039; &amp;lt;math&amp;gt;rnk = 0&amp;lt;/math&amp;gt;, &#039;&#039;то&#039;&#039;&lt;br /&gt;
::&amp;lt;math&amp;gt;{j, maximum} \gets \max_{k \in [1; p]} (maxj[k])&amp;lt;/math&amp;gt;&lt;br /&gt;
&#039;&#039;КонецЕсли&#039;&#039;&lt;br /&gt;
&lt;br /&gt;
:&amp;lt;math&amp;gt;\texttt{Broadcast}(0, \left\{j, maximum\right\}, \left\{j, maximum\right\})&amp;lt;/math&amp;gt;&lt;br /&gt;
&lt;br /&gt;
:&amp;lt;math&amp;gt;\texttt{Broadcast}\left(\left\lfloor \frac{j - 1}{p} \right\rfloor, V^j, v\right)&amp;lt;/math&amp;gt;&lt;br /&gt;
&lt;br /&gt;
:&amp;lt;math&amp;gt;u_{upd} \gets \dfrac{(A^j - U v)[b_m \cdot rnk + 1 : b_m \cdot (rnk + 1)]}{\sqrt{ \vert maximum \vert }}&amp;lt;/math&amp;gt;&lt;br /&gt;
:&amp;lt;math&amp;gt;v_{upd} \gets \dfrac{(A_i - u V)[b_n \cdot rnk + 1 : b_n \cdot (rnk + 1)] \cdot \sqrt{ \vert maximum \vert }}{maximum}&amp;lt;/math&amp;gt;&lt;br /&gt;
&lt;br /&gt;
:&amp;lt;math&amp;gt;U \gets [U u_{upd}]&amp;lt;/math&amp;gt;&lt;br /&gt;
:&amp;lt;math&amp;gt;V \gets \begin{bmatrix} V \\ v_{upd} \end{bmatrix}&amp;lt;/math&amp;gt;&lt;br /&gt;
&lt;br /&gt;
:&amp;lt;math&amp;gt;I \gets I \setminus \left\{ i \right\}&amp;lt;/math&amp;gt;&lt;br /&gt;
:&amp;lt;math&amp;gt;J \gets J \setminus \left\{ j \right\}&amp;lt;/math&amp;gt;&lt;br /&gt;
&lt;br /&gt;
&#039;&#039;Eсли&#039;&#039; &amp;lt;math&amp;gt;rnk = 0&amp;lt;/math&amp;gt;, &#039;&#039;то&#039;&#039; &lt;br /&gt;
::&amp;lt;math&amp;gt;J_* \gets J_* \setminus \left\{ j \right\}&amp;lt;/math&amp;gt;&lt;br /&gt;
&#039;&#039;КонецЕсли&#039;&#039;&lt;br /&gt;
&lt;br /&gt;
&#039;&#039;до тех пор, пока&#039;&#039; &lt;br /&gt;
:&amp;lt;math&amp;gt;\operatorname{tol} \vert \vert UV \vert \vert _F &amp;lt; |maximum| \cdot \sqrt{(m - r)(n - r)}&amp;lt;/math&amp;gt;&lt;br /&gt;
&lt;br /&gt;
&#039;&#039;&#039;Вернуть&#039;&#039;&#039; &amp;lt;math&amp;gt;(U, V, r)&amp;lt;/math&amp;gt;&lt;br /&gt;
&amp;lt;br&amp;gt;&lt;br /&gt;
&amp;lt;br&amp;gt;&lt;br /&gt;
Функция &amp;lt;math&amp;gt;\texttt{Broadcast}\left( i,a,b \right)&amp;lt;/math&amp;gt; рассылает переменную a с процессора &amp;lt;math&amp;gt;i&amp;lt;/math&amp;gt; в переменную &amp;lt;math&amp;gt;b&amp;lt;/math&amp;gt; всех процессоров; функция &amp;lt;math&amp;gt;\texttt{Gather}\left( i,a,b \right)&amp;lt;/math&amp;gt; собирает переменную &amp;lt;math&amp;gt;a&amp;lt;/math&amp;gt; всех процессоров в переменную &amp;lt;math&amp;gt;b&amp;lt;/math&amp;gt; (таким образом, &amp;lt;math&amp;gt;b&amp;lt;/math&amp;gt; массив из переменных &amp;lt;math&amp;gt;a&amp;lt;/math&amp;gt; процессора &amp;lt;math&amp;gt;i&amp;lt;/math&amp;gt;.&lt;br /&gt;
&amp;lt;br&amp;gt;&amp;lt;br&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;. Каждый процессор может вычислять векторы&lt;br /&gt;
:&amp;lt;math&amp;gt;x_{rnk} = u^T[b_m \cdot rnk + 1 : b_m \cdot (rnk + 1)] \cdot U[b_m \cdot rnk + 1 : b_m \cdot (rnk + 1), :]&amp;lt;/math&amp;gt;,&lt;br /&gt;
:&amp;lt;math&amp;gt;y_{rnk} = v^T[b_n \cdot rnk + 1 : b_n \cdot (rnk + 1)] \cdot V[:, b_n \cdot rnk + 1 : b_n \cdot (rnk + 1)]&amp;lt;/math&amp;gt;.&lt;br /&gt;
&lt;br /&gt;
Находим суммы&lt;br /&gt;
&amp;lt;math&amp;gt;x = \sum_{rnk=0}^{p} x_{rnk}&amp;lt;/math&amp;gt;, &amp;lt;math&amp;gt;y = \sum_{rnk=0}^{p} y_{rnk}&amp;lt;/math&amp;gt;,&lt;br /&gt;
каждую с помощью одной операции коллективного взаимодействия процессоров. Вычисляем их скалярное произведение &amp;lt;math&amp;gt;(x, y)&amp;lt;/math&amp;gt;. Очевидно, что &amp;lt;math&amp;gt;(x, y) = (U^T u, V v^T)&amp;lt;/math&amp;gt;.&lt;br /&gt;
&lt;br /&gt;
Слагаемые &amp;lt;math&amp;gt;(V v^T, U^T u)&amp;lt;/math&amp;gt; и &amp;lt;math&amp;gt;||u||_2^2 ||v||_2^2&amp;lt;/math&amp;gt;, требуемые для пересчёта нормы, вычисляются аналогично.&lt;br /&gt;
&lt;br /&gt;
Для систем с общей памятью алгоритм аналогичен, но не требует пересылок данных и распределения матриц между процессорами. Для гибридных систем легко получить комбинацию алгоритмов.&lt;br /&gt;
&lt;br /&gt;
Каждый процессор, кроме первого, в данном алгоритме выполняет &amp;lt;math&amp;gt;O\left(\left(\left\lceil \frac{m}{p} \right\rceil + \left\lceil \frac{n}{p} \right\rceil\right) r^2\right)&amp;lt;/math&amp;gt; операций и вычисляет &amp;lt;math&amp;gt;O\left(\left(\left\lceil \frac{m}{p} \right\rceil + \left\lceil \frac{n}{p} \right\rceil\right) r\right)&amp;lt;/math&amp;gt; элементов матрицы. Первый процессор дополнительно выполняет &amp;lt;math&amp;gt;O(rp)&amp;lt;/math&amp;gt; операций.&lt;br /&gt;
&lt;br /&gt;
== Литература ==&lt;br /&gt;
&lt;br /&gt;
&amp;lt;references /&amp;gt;&lt;/div&gt;</summary>
		<author><name>BoldyrevVV MSU</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:BoldyrevVV_MSU/%D0%9F%D0%B0%D1%80%D0%B0%D0%BB%D0%BB%D0%B5%D0%BB%D1%8C%D0%BD%D0%B0%D1%8F_%D1%80%D0%B5%D0%B0%D0%BB%D0%B8%D0%B7%D0%B0%D1%86%D0%B8%D1%8F_%D0%BC%D0%B0%D1%82%D1%80%D0%B8%D1%87%D0%BD%D0%BE%D0%B3%D0%BE_%D0%BA%D1%80%D0%B5%D1%81%D1%82%D0%BE%D0%B2%D0%BE%D0%B3%D0%BE_%D0%BC%D0%B5%D1%82%D0%BE%D0%B4%D0%B0&amp;diff=29954</id>
		<title>Участник:BoldyrevVV MSU/Параллельная реализация матричного крестового метода</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:BoldyrevVV_MSU/%D0%9F%D0%B0%D1%80%D0%B0%D0%BB%D0%BB%D0%B5%D0%BB%D1%8C%D0%BD%D0%B0%D1%8F_%D1%80%D0%B5%D0%B0%D0%BB%D0%B8%D0%B7%D0%B0%D1%86%D0%B8%D1%8F_%D0%BC%D0%B0%D1%82%D1%80%D0%B8%D1%87%D0%BD%D0%BE%D0%B3%D0%BE_%D0%BA%D1%80%D0%B5%D1%81%D1%82%D0%BE%D0%B2%D0%BE%D0%B3%D0%BE_%D0%BC%D0%B5%D1%82%D0%BE%D0%B4%D0%B0&amp;diff=29954"/>
		<updated>2025-11-04T18:48:11Z</updated>

		<summary type="html">&lt;p&gt;BoldyrevVV MSU: add comments&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((m + n) r^2)&amp;lt;/math&amp;gt;&lt;br /&gt;
| pf_height = &amp;lt;math&amp;gt;O(r p)&amp;lt;/math&amp;gt;&lt;br /&gt;
| pf_width = &amp;lt;math&amp;gt;O\left(\left\lceil \frac{m}{p} \right\rceil + \left\lceil \frac{n}{p} \right\rceil\right) r&amp;lt;/math&amp;gt;&lt;br /&gt;
| input_data = &amp;lt;math&amp;gt;O((m + n) r)&amp;lt;/math&amp;gt; (вычисляются лишь отдельные элементы матрицы)&lt;br /&gt;
| output_data = &amp;lt;math&amp;gt;O((m + n) r)&amp;lt;/math&amp;gt; (факторы &amp;lt;math&amp;gt;U \in \mathbb{R}^{m \times r}&amp;lt;/math&amp;gt;, &amp;lt;math&amp;gt;V \in \mathbb{R}^{r \times n}&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;
&lt;br /&gt;
&#039;&#039;&#039;Матричный крестовой метод&#039;&#039;&#039; — это быстрый метод построения малорангового приближения матрицы, не требующий хранения или полного доступа ко всей матрице. Вместо этого он работает с отдельными элементами, выбор которых адаптивно определяется в ходе вычислений. Метод особенно эффективен в задачах, где матрица задана неявно — например, как функция расстояния между точками в пространстве (ядерные матрицы, ковариационные матрицы, интегральные операторы и т.п.).&lt;br /&gt;
&lt;br /&gt;
Ключевая идея основана на так называемом &#039;&#039;&#039;крестовом разложении&#039;&#039;&#039;: если известны &amp;lt;math&amp;gt;r&amp;lt;/math&amp;gt; строк и &amp;lt;math&amp;gt;r&amp;lt;/math&amp;gt; столбцов матрицы, пересечение которых образует невырожденную подматрицу, то вся матрица может быть восстановлена через интерполяцию по этим строкам и столбцам. На практике используется &#039;&#039;&#039;адаптивная схема&#039;&#039;&#039; с выбором элемента максимальной невязки на каждой итерации (аналог жадного алгоритма), что позволяет обойтись без поиска подматрицы максимального объёма.&lt;br /&gt;
&lt;br /&gt;
Важнейшее преимущество метода — малая вычислительная стоимость: для построения приближения ранга &amp;lt;math&amp;gt;r&amp;lt;/math&amp;gt; требуется &amp;lt;math&amp;gt;O((m + n) r)&amp;lt;/math&amp;gt; вычислений элементов матрицы и &amp;lt;math&amp;gt;O((m + n) r^2)&amp;lt;/math&amp;gt; арифметических операций.&lt;br /&gt;
&lt;br /&gt;
В условиях современных суперкомпьютеров и больших размерностей (&amp;lt;math&amp;gt;m, n \sim 10^5&amp;lt;/math&amp;gt; и выше) естественным шагом становится параллельная реализация, предложенная в работе Д. А. Желткова и Е. Е. Тыртышникова (2015). Она распределяет строки и столбцы матрицы между процессорами и использует коллективные операции для глобального выбора доминирующего элемента невязки.&lt;br /&gt;
&lt;br /&gt;
==== Особенности параллельной реализации ====&lt;br /&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;. На каждой итерации:&lt;br /&gt;
&lt;br /&gt;
*процессоры совместно находят глобальный максимум невязки с помощью операций &amp;lt;math&amp;gt;\texttt{Gather}&amp;lt;/math&amp;gt; и &amp;lt;math&amp;gt;\texttt{Broadcast}&amp;lt;/math&amp;gt;;&lt;br /&gt;
*соответствующие строки и столбцы обновляются локально;&lt;br /&gt;
*норма Фробениуса текущего приближения пересчитывается распределённо, без полного сбора данных.&lt;br /&gt;
&amp;lt;br&amp;gt;&lt;br /&gt;
Эта стратегия позволяет сохранить низкую коммуникационную сложность: каждый процессор выполняет &amp;lt;math&amp;gt;O(r)&amp;lt;/math&amp;gt; обменов, а длина каждого сообщения не превышает &amp;lt;math&amp;gt;r&amp;lt;/math&amp;gt;. При этом трудоёмкость на один процессор снижается до &amp;lt;math&amp;gt;O\left(\left(\left\lceil \frac{m}{p} \right\rceil + \left\lceil \frac{n}{p} \right\rceil\right) r^2\right)&amp;lt;/math&amp;gt;, &amp;lt;br&amp;gt;а количество вычисляемых элементов — до &amp;lt;math&amp;gt;O\left(\left(\left\lceil \frac{m}{p} \right\rceil + \left\lceil \frac{n}{p} \right\rceil\right) r\right)&amp;lt;/math&amp;gt;.&lt;br /&gt;
&lt;br /&gt;
=== Математическое описание алгоритма ===&lt;br /&gt;
&lt;br /&gt;
Пусть задана матрица &amp;lt;math&amp;gt;A \in \mathbb{R}^{m \times n}&amp;lt;/math&amp;gt;. Цель — построить её малоранговое приближение вида &amp;lt;math&amp;gt;A \approx UV&amp;lt;/math&amp;gt;, где &amp;lt;math&amp;gt;U \in \mathbb{R}^{m \times r}&amp;lt;/math&amp;gt;, &amp;lt;math&amp;gt;V \in \mathbb{R}^{r \times n}&amp;lt;/math&amp;gt;, а ранг &amp;lt;math&amp;gt;r \ll \min(m,n)&amp;lt;/math&amp;gt;.&lt;br /&gt;
&lt;br /&gt;
Общая схема крестового метода основана на последовательном выделении строк и столбцов, содержащих подматрицу максимального (или достаточно большого) объёма. В обобщённом виде она выглядит следующим образом:&lt;br /&gt;
&lt;br /&gt;
&#039;&#039;&#039;Алгоритм 1. Схема крестового метода&#039;&#039;&#039;&amp;lt;br&amp;gt;&lt;br /&gt;
&lt;br /&gt;
&#039;&#039;Инициализация:&#039;&#039;&lt;br /&gt;
&amp;lt;math&amp;gt;I \gets {1,\dots,m}&amp;lt;/math&amp;gt;,&amp;lt;math&amp;gt;J \gets {1,\dots,n}&amp;lt;/math&amp;gt;,&amp;lt;math&amp;gt;r \gets 0&lt;br /&gt;
&amp;lt;/math&amp;gt;.&lt;br /&gt;
&amp;lt;br&amp;gt;&#039;&#039;Повторять:&#039;&#039;&amp;lt;br&amp;gt;&lt;br /&gt;
#&amp;lt;math&amp;gt;r \gets r + 1&amp;lt;/math&amp;gt;;&amp;lt;br&amp;gt;&lt;br /&gt;
#Найти подмножества индексов &amp;lt;math&amp;gt;I_* \subset I&amp;lt;/math&amp;gt;, &amp;lt;math&amp;gt;J_* \subset J&amp;lt;/math&amp;gt; (размера &amp;lt;math&amp;gt;k&amp;lt;/math&amp;gt;), такие что подматрица &amp;lt;math&amp;gt;A[I_*, J_*]&amp;lt;/math&amp;gt; имеет достаточно большой объём (процедура &amp;lt;math&amp;gt;\texttt{maxvol}&amp;lt;/math&amp;gt;);&amp;lt;br&amp;gt;&lt;br /&gt;
#Выбрать столбцы: &amp;lt;math&amp;gt;C_r \gets A[:, J_*]&amp;lt;/math&amp;gt;;&amp;lt;br&amp;gt;&lt;br /&gt;
#Выбрать строки: &amp;lt;math&amp;gt;R_r \gets A[I_*, :]&amp;lt;/math&amp;gt;;&amp;lt;br&amp;gt;&lt;br /&gt;
#Выделить ядро: &amp;lt;math&amp;gt;\hat{A_i} \gets A[:, I_* J_*]&amp;lt;/math&amp;gt;;&amp;lt;br&amp;gt;&lt;br /&gt;
#Обновить текущую невязку: &amp;lt;math&amp;gt;A \gets A - C_r \hat{A}_{r}^{-1} R_r&amp;lt;/math&amp;gt;;&amp;lt;br&amp;gt;&lt;br /&gt;
#Исключить использованные индексы: &amp;lt;math&amp;gt;I \gets I \setminus I_*&amp;lt;/math&amp;gt;, &amp;lt;math&amp;gt;J \gets J \setminus J_*&amp;lt;/math&amp;gt;;&amp;lt;br&amp;gt;&lt;br /&gt;
&#039;&#039;До выполнения критерия остановки.&#039;&#039;&lt;br /&gt;
&amp;lt;br&amp;gt;&amp;lt;br&amp;gt;&lt;br /&gt;
В результате работы этого алгоритма матрица &amp;lt;math&amp;gt;\sum_{i=1}^{r} C_i\hat{A}_{i}^{-1} R_i&amp;lt;/math&amp;gt; будет приближать матрицу &amp;lt;math&amp;gt;A&amp;lt;/math&amp;gt;.&lt;br /&gt;
В рассматриваемой работе используется частный случай этой схемы при &amp;lt;math&amp;gt;k = 1&amp;lt;/math&amp;gt;, то есть на каждой итерации выбирается один элемент с максимальной по модулю невязкой. В этом случае подматрица &amp;lt;math&amp;gt;\hat{A}_r&amp;lt;/math&amp;gt; — скаляр, а обновление факторов происходит по явным формулам.&lt;br /&gt;
&amp;lt;br&amp;gt;&lt;br /&gt;
С учeтом данного выбора алгоритм выглядит следующим образом.&lt;br /&gt;
&lt;br /&gt;
&#039;&#039;&#039;Алгоритм 2. Крестовый метод (&amp;lt;math&amp;gt;k = 1&amp;lt;/math&amp;gt;)&#039;&#039;&#039;&lt;br /&gt;
&lt;br /&gt;
&#039;&#039;Инициализация:&#039;&#039;&lt;br /&gt;
&amp;lt;math&amp;gt;I \gets {1,\dots,m}&amp;lt;/math&amp;gt;, &amp;lt;math&amp;gt;J \gets {1,\dots,n}&amp;lt;/math&amp;gt;, &amp;lt;math&amp;gt;r \gets 0&amp;lt;/math&amp;gt;.&lt;br /&gt;
&amp;lt;br&amp;gt;&#039;&#039;Цикл:&#039;&#039;&lt;br /&gt;
&amp;lt;br&amp;gt;а. &lt;br /&gt;
:&amp;lt;math&amp;gt;r \gets r + 1&amp;lt;/math&amp;gt;;&lt;br /&gt;
&amp;lt;br&amp;gt;б. Найти строку с максимальной невязкой в первом доступном столбце:&lt;br /&gt;
&amp;lt;br&amp;gt;&lt;br /&gt;
:&amp;lt;math&amp;gt;i \gets \arg\max_{i \in I} |A_{i, J(1)} - [UV]{i, J(1)}|&amp;lt;/math&amp;gt;;&lt;br /&gt;
&amp;lt;br&amp;gt;в. Найти столбец с максимальной невязкой в найденной строке:&lt;br /&gt;
&amp;lt;br&amp;gt;&lt;br /&gt;
:&amp;lt;math&amp;gt;j \gets \arg\max{j \in J} |A_{ij} - [UV]{ij}|&amp;lt;/math&amp;gt;;&lt;br /&gt;
&amp;lt;br&amp;gt;г. Проверить критерий остановки:&lt;br /&gt;
&amp;lt;br&amp;gt;&lt;br /&gt;
:если &lt;br /&gt;
:&amp;lt;math&amp;gt;|(A - UV){ij}| \cdot \sqrt{(m - r)(n - r)} &amp;lt; \varepsilon |UV|F&amp;lt;/math&amp;gt;, &amp;lt;br&amp;gt;то&lt;br /&gt;
::&amp;lt;math&amp;gt;r \gets r - 1&amp;lt;/math&amp;gt;, &lt;br /&gt;
::выйти из цикла;&lt;br /&gt;
&amp;lt;br&amp;gt;&amp;lt;br&amp;gt;д. Обновить факторы:&lt;br /&gt;
:&amp;lt;math&amp;gt;u \gets \dfrac{A^{j} - [UV]^{j}}{\sqrt{\vert A_{ij}\vert}}&amp;lt;/math&amp;gt;,&lt;br /&gt;
:&amp;lt;math&amp;gt;v \gets \dfrac{(A_{i} - [UV]_{i}) \cdot \sqrt{\vert A_{ij}\vert}}{A_{ij}}&amp;lt;/math&amp;gt;;&lt;br /&gt;
&amp;lt;br&amp;gt;&amp;lt;br&amp;gt;е. Расширить матрицы:&lt;br /&gt;
:&amp;lt;math&amp;gt;U \gets [Uu]&amp;lt;/math&amp;gt;,&lt;br /&gt;
:&amp;lt;math&amp;gt;V \gets \begin{bmatrix} V \\ v \end{bmatrix}&amp;lt;/math&amp;gt;;&lt;br /&gt;
&amp;lt;br&amp;gt;ж. Исключить использованные индексы:&lt;br /&gt;
:&amp;lt;math&amp;gt;I \gets I \setminus  \left\{ {i} \right\}&amp;lt;/math&amp;gt;,&lt;br /&gt;
:&amp;lt;math&amp;gt;J \gets J \setminus \left\{ {j} \right\}&amp;lt;/math&amp;gt;;&lt;br /&gt;
&amp;lt;br&amp;gt;Вернуть &amp;lt;math&amp;gt;\left( U, V, r \right)&amp;lt;/math&amp;gt;.&lt;br /&gt;
&amp;lt;br&amp;gt;&lt;br /&gt;
&lt;br /&gt;
&amp;lt;br&amp;gt;Здесь &amp;lt;math&amp;gt;A^{(j)}&amp;lt;/math&amp;gt; обозначает &amp;lt;math&amp;gt;j&amp;lt;/math&amp;gt;-й столбец матрицы &amp;lt;math&amp;gt;A&amp;lt;/math&amp;gt;, а &amp;lt;math&amp;gt;A_{(i)}&amp;lt;/math&amp;gt; — &amp;lt;math&amp;gt;i&amp;lt;/math&amp;gt;-ю строку. Норма Фробениуса &amp;lt;math&amp;gt;|UV|_F&amp;lt;/math&amp;gt; пересчитывается инкрементально за &amp;lt;math&amp;gt;O((m + n) r)&amp;lt;/math&amp;gt; операций, что позволяет сохранить общую сложность алгоритма на уровне &amp;lt;math&amp;gt;O((m + n) r^2)&amp;lt;/math&amp;gt;.&lt;br /&gt;
&lt;br /&gt;
В параллельной реализации выбор индексов &amp;lt;math&amp;gt;i&amp;lt;/math&amp;gt; и &amp;lt;math&amp;gt;j&amp;lt;/math&amp;gt; выполняется совместно всеми процессорами с помощью коллективных операций (gather/broadcast), а обновление &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;
&lt;br /&gt;
&lt;br /&gt;
Входные параметры: &amp;lt;math&amp;gt;m&amp;lt;/math&amp;gt; — число строк матрицы, &amp;lt;math&amp;gt;n&amp;lt;/math&amp;gt; — число столбцов, &amp;lt;math&amp;gt;A(i,j)&amp;lt;/math&amp;gt; — функция вычисления элемента матрицы, &amp;lt;math&amp;gt;p&amp;lt;/math&amp;gt; — число процессоров, &amp;lt;math&amp;gt;rnk&amp;lt;/math&amp;gt; — номер текущего процессора (от 0 до &amp;lt;math&amp;gt;p-1&amp;lt;/math&amp;gt;).&lt;br /&gt;
&lt;br /&gt;
&#039;&#039;&#039;Алгоритм 3. Параллельный крестовый метод&#039;&#039;&#039;&lt;br /&gt;
&lt;br /&gt;
:&amp;lt;math&amp;gt;{b}_{m} \gets \frac{m}{p}&amp;lt;/math&amp;gt;&lt;br /&gt;
:&amp;lt;math&amp;gt;{b}_{n} \gets \frac{n}{p}&amp;lt;/math&amp;gt;&lt;br /&gt;
&lt;br /&gt;
:&amp;lt;math&amp;gt;\color{Red}\text{если}&amp;lt;/math&amp;gt;&lt;br /&gt;
:&amp;lt;math&amp;gt;rnk = 0&amp;lt;/math&amp;gt;, то &lt;br /&gt;
::&amp;lt;math&amp;gt;J_* \gets {1, \dots, n}&amp;lt;/math&amp;gt;&lt;br /&gt;
&lt;br /&gt;
:&amp;lt;math&amp;gt;I \gets { bm \cdot rnk + 1, \dots, bm \cdot (rnk + 1) }&amp;lt;/math&amp;gt;&lt;br /&gt;
:&amp;lt;math&amp;gt;J \gets { bn \cdot rnk + 1, \dots, bn \cdot (rnk + 1) }&amp;lt;/math&amp;gt;&lt;br /&gt;
:&amp;lt;math&amp;gt;r \gets 0&amp;lt;/math&amp;gt;&lt;br /&gt;
&lt;br /&gt;
&#039;&#039;повторять&#039;&#039;&lt;br /&gt;
:&amp;lt;math&amp;gt;r \gets r + 1&amp;lt;/math&amp;gt;&lt;br /&gt;
&lt;br /&gt;
&#039;&#039;&#039;Eсли&#039;&#039;&#039; &amp;lt;math&amp;gt;rnk = 0&amp;lt;/math&amp;gt;, то &lt;br /&gt;
::&amp;lt;math&amp;gt;j \gets J^*(1)&amp;lt;/math&amp;gt;&lt;br /&gt;
&#039;&#039;&#039;КонецЕсли&#039;&#039;&#039;&lt;br /&gt;
:&amp;lt;math&amp;gt;\texttt{Broadcast}(0, j, j)&amp;lt;/math&amp;gt;&lt;br /&gt;
&lt;br /&gt;
:&amp;lt;math&amp;gt;\texttt{Broadcast}\left(\left\lfloor \frac{j - 1}{p} \right\rfloor, V^j, v\right)&amp;lt;/math&amp;gt;&lt;br /&gt;
&lt;br /&gt;
:&amp;lt;math&amp;gt;i \gets \arg\max_{i \in I} \left| A_{ij} - [U v]_i \right|&amp;lt;/math&amp;gt;&lt;br /&gt;
&lt;br /&gt;
:&amp;lt;math&amp;gt;\texttt{Gather}\left( 0, \left\{ i, \vert A_{ij} - [U v]_i \vert \right\}, max_i \right)&amp;lt;/math&amp;gt;&lt;br /&gt;
&lt;br /&gt;
&#039;&#039;&#039;Eсли&#039;&#039;&#039; &amp;lt;math&amp;gt;rnk = 0&amp;lt;/math&amp;gt;, то&lt;br /&gt;
::&amp;lt;math&amp;gt;{i, column_maximum} \gets \max_{k \in [1; p]} (max_i[k])&amp;lt;/math&amp;gt;&lt;br /&gt;
&#039;&#039;&#039;КонецЕсли&#039;&#039;&#039;&lt;br /&gt;
&lt;br /&gt;
&lt;br /&gt;
:&amp;lt;math&amp;gt;\texttt{Broadcast}(0, i, i)&amp;lt;/math&amp;gt;&lt;br /&gt;
&lt;br /&gt;
:&amp;lt;math&amp;gt;\texttt{Broadcast}\left(\left\lfloor \frac{i - 1}{p} \right\rfloor, U_i, u\right)&amp;lt;/math&amp;gt;&lt;br /&gt;
&lt;br /&gt;
:&amp;lt;math&amp;gt;j \gets \arg\max_{j \in J} \left| A_{ij} - [u V]_j \right|&amp;lt;/math&amp;gt;&lt;br /&gt;
&lt;br /&gt;
:&amp;lt;math&amp;gt;\texttt{Gather}(0, \left\{j, \vert A_{ij} - [u V]_j \vert \right\}, max_j)&amp;lt;/math&amp;gt;&lt;br /&gt;
&lt;br /&gt;
&#039;&#039;&#039;Eсли&#039;&#039;&#039; &amp;lt;math&amp;gt;rnk = 0&amp;lt;/math&amp;gt;, то&lt;br /&gt;
::&amp;lt;math&amp;gt;{j, maximum} \gets \max_{k \in [1; p]} (maxj[k])&amp;lt;/math&amp;gt;&lt;br /&gt;
&#039;&#039;&#039;КонецЕсли&#039;&#039;&#039;&lt;br /&gt;
&lt;br /&gt;
:&amp;lt;math&amp;gt;\texttt{Broadcast}(0, \left\{j, maximum\right\}, \left\{j, maximum\right\})&amp;lt;/math&amp;gt;&lt;br /&gt;
&lt;br /&gt;
:&amp;lt;math&amp;gt;\texttt{Broadcast}\left(\left\lfloor \frac{j - 1}{p} \right\rfloor, V^j, v\right)&amp;lt;/math&amp;gt;&lt;br /&gt;
&lt;br /&gt;
:&amp;lt;math&amp;gt;u_{upd} \gets \dfrac{(A^j - U v)[b_m \cdot rnk + 1 : b_m \cdot (rnk + 1)]}{\sqrt{ \vert maximum \vert }}&amp;lt;/math&amp;gt;&lt;br /&gt;
:&amp;lt;math&amp;gt;v_{upd} \gets \dfrac{(A_i - u V)[b_n \cdot rnk + 1 : b_n \cdot (rnk + 1)] \cdot \sqrt{ \vert maximum \vert }}{maximum}&amp;lt;/math&amp;gt;&lt;br /&gt;
&lt;br /&gt;
:&amp;lt;math&amp;gt;U \gets [U u_{upd}]&amp;lt;/math&amp;gt;&lt;br /&gt;
:&amp;lt;math&amp;gt;V \gets \begin{bmatrix} V \\ v_{upd} \end{bmatrix}&amp;lt;/math&amp;gt;&lt;br /&gt;
&lt;br /&gt;
:&amp;lt;math&amp;gt;I \gets I \setminus \left\{ i \right\}&amp;lt;/math&amp;gt;&lt;br /&gt;
:&amp;lt;math&amp;gt;J \gets J \setminus \left\{ j \right\}&amp;lt;/math&amp;gt;&lt;br /&gt;
&lt;br /&gt;
&#039;&#039;&#039;Eсли&#039;&#039;&#039; &amp;lt;math&amp;gt;rnk = 0&amp;lt;/math&amp;gt;, то &lt;br /&gt;
::&amp;lt;math&amp;gt;J_* \gets J_* \setminus \left\{ j \right\}&amp;lt;/math&amp;gt;&lt;br /&gt;
&#039;&#039;&#039;КонецЕсли&#039;&#039;&#039;&lt;br /&gt;
&lt;br /&gt;
&#039;&#039;до тех пор, пока&#039;&#039; &lt;br /&gt;
:&amp;lt;math&amp;gt;\operatorname{tol} \vert \vert UV \vert \vert _F &amp;lt; |maximum| \cdot \sqrt{(m - r)(n - r)}&amp;lt;/math&amp;gt;&lt;br /&gt;
&lt;br /&gt;
&#039;&#039;&#039;вернуть&#039;&#039;&#039; &amp;lt;math&amp;gt;(U, V, r)&amp;lt;/math&amp;gt;&lt;br /&gt;
&amp;lt;br&amp;gt;&lt;br /&gt;
&amp;lt;br&amp;gt;&lt;br /&gt;
Функция &amp;lt;math&amp;gt;\texttt{Broadcast}\left( i,a,b \right)&amp;lt;/math&amp;gt; рассылает переменную a спроцессора &amp;lt;math&amp;gt;i&amp;lt;/math&amp;gt; в переменную &amp;lt;math&amp;gt;b&amp;lt;/math&amp;gt; всех процессоров; функция &amp;lt;math&amp;gt;\texttt{Gather}\left( i,a,b \right)&amp;lt;/math&amp;gt; собирает переменную &amp;lt;math&amp;gt;a&amp;lt;/math&amp;gt; всех процессоров в переменную &amp;lt;math&amp;gt;b&amp;lt;/math&amp;gt; (таким образом, &amp;lt;math&amp;gt;b&amp;lt;/math&amp;gt; массив из переменных &amp;lt;math&amp;gt;a&amp;lt;/math&amp;gt; процессора &amp;lt;math&amp;gt;i&amp;lt;/math&amp;gt;.&lt;br /&gt;
&amp;lt;br&amp;gt;&amp;lt;br&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;. Каждый процессор может вычислять векторы&lt;br /&gt;
:&amp;lt;math&amp;gt;x_{rnk} = u^T[b_m \cdot rnk + 1 : b_m \cdot (rnk + 1)] \cdot U[b_m \cdot rnk + 1 : b_m \cdot (rnk + 1), :]&amp;lt;/math&amp;gt;,&lt;br /&gt;
:&amp;lt;math&amp;gt;y_{rnk} = v^T[b_n \cdot rnk + 1 : b_n \cdot (rnk + 1)] \cdot V[:, b_n \cdot rnk + 1 : b_n \cdot (rnk + 1)]&amp;lt;/math&amp;gt;.&lt;br /&gt;
&lt;br /&gt;
Находим суммы&lt;br /&gt;
&amp;lt;math&amp;gt;x = \sum_{rnk=0}^{p} x_{rnk}&amp;lt;/math&amp;gt;, &amp;lt;math&amp;gt;y = \sum_{rnk=0}^{p} y_{rnk}&amp;lt;/math&amp;gt;,&lt;br /&gt;
каждую с помощью одной операции коллективного взаимодействия процессоров. Вычисляем их скалярное произведение &amp;lt;math&amp;gt;(x, y)&amp;lt;/math&amp;gt;. Очевидно, что &amp;lt;math&amp;gt;(x, y) = (U^T u, V v^T)&amp;lt;/math&amp;gt;.&lt;br /&gt;
&lt;br /&gt;
Слагаемые &amp;lt;math&amp;gt;(V v^T, U^T u)&amp;lt;/math&amp;gt; и &amp;lt;math&amp;gt;||u||_2^2 ||v||_2^2&amp;lt;/math&amp;gt;, требуемые для пересчёта нормы, вычисляются аналогично.&lt;br /&gt;
&lt;br /&gt;
Для систем с общей памятью алгоритм аналогичен, но не требует пересылок данных и распределения матриц между процессорами. Для гибридных систем легко получить комбинацию алгоритмов.&lt;br /&gt;
&lt;br /&gt;
Каждый процессор, кроме первого, в данном алгоритме выполняет &amp;lt;math&amp;gt;O\left(\left(\left\lceil \frac{m}{p} \right\rceil + \left\lceil \frac{n}{p} \right\rceil\right) r^2\right)&amp;lt;/math&amp;gt; операций и вычисляет &amp;lt;math&amp;gt;O\left(\left(\left\lceil \frac{m}{p} \right\rceil + \left\lceil \frac{n}{p} \right\rceil\right) r\right)&amp;lt;/math&amp;gt; элементов матрицы. Первый процессор дополнительно выполняет &amp;lt;math&amp;gt;O(rp)&amp;lt;/math&amp;gt; операций.&lt;/div&gt;</summary>
		<author><name>BoldyrevVV MSU</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:BoldyrevVV_MSU/%D0%9F%D0%B0%D1%80%D0%B0%D0%BB%D0%BB%D0%B5%D0%BB%D1%8C%D0%BD%D0%B0%D1%8F_%D1%80%D0%B5%D0%B0%D0%BB%D0%B8%D0%B7%D0%B0%D1%86%D0%B8%D1%8F_%D0%BC%D0%B0%D1%82%D1%80%D0%B8%D1%87%D0%BD%D0%BE%D0%B3%D0%BE_%D0%BA%D1%80%D0%B5%D1%81%D1%82%D0%BE%D0%B2%D0%BE%D0%B3%D0%BE_%D0%BC%D0%B5%D1%82%D0%BE%D0%B4%D0%B0&amp;diff=29953</id>
		<title>Участник:BoldyrevVV MSU/Параллельная реализация матричного крестового метода</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:BoldyrevVV_MSU/%D0%9F%D0%B0%D1%80%D0%B0%D0%BB%D0%BB%D0%B5%D0%BB%D1%8C%D0%BD%D0%B0%D1%8F_%D1%80%D0%B5%D0%B0%D0%BB%D0%B8%D0%B7%D0%B0%D1%86%D0%B8%D1%8F_%D0%BC%D0%B0%D1%82%D1%80%D0%B8%D1%87%D0%BD%D0%BE%D0%B3%D0%BE_%D0%BA%D1%80%D0%B5%D1%81%D1%82%D0%BE%D0%B2%D0%BE%D0%B3%D0%BE_%D0%BC%D0%B5%D1%82%D0%BE%D0%B4%D0%B0&amp;diff=29953"/>
		<updated>2025-11-04T18:37:30Z</updated>

		<summary type="html">&lt;p&gt;BoldyrevVV MSU: upd parallel impl&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((m + n) r^2)&amp;lt;/math&amp;gt;&lt;br /&gt;
| pf_height = &amp;lt;math&amp;gt;O(r p)&amp;lt;/math&amp;gt;&lt;br /&gt;
| pf_width = &amp;lt;math&amp;gt;O\left(\left\lceil \frac{m}{p} \right\rceil + \left\lceil \frac{n}{p} \right\rceil\right) r&amp;lt;/math&amp;gt;&lt;br /&gt;
| input_data = &amp;lt;math&amp;gt;O((m + n) r)&amp;lt;/math&amp;gt; (вычисляются лишь отдельные элементы матрицы)&lt;br /&gt;
| output_data = &amp;lt;math&amp;gt;O((m + n) r)&amp;lt;/math&amp;gt; (факторы &amp;lt;math&amp;gt;U \in \mathbb{R}^{m \times r}&amp;lt;/math&amp;gt;, &amp;lt;math&amp;gt;V \in \mathbb{R}^{r \times n}&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;
&lt;br /&gt;
&#039;&#039;&#039;Матричный крестовой метод&#039;&#039;&#039; — это быстрый метод построения малорангового приближения матрицы, не требующий хранения или полного доступа ко всей матрице. Вместо этого он работает с отдельными элементами, выбор которых адаптивно определяется в ходе вычислений. Метод особенно эффективен в задачах, где матрица задана неявно — например, как функция расстояния между точками в пространстве (ядерные матрицы, ковариационные матрицы, интегральные операторы и т.п.).&lt;br /&gt;
&lt;br /&gt;
Ключевая идея основана на так называемом &#039;&#039;&#039;крестовом разложении&#039;&#039;&#039;: если известны &amp;lt;math&amp;gt;r&amp;lt;/math&amp;gt; строк и &amp;lt;math&amp;gt;r&amp;lt;/math&amp;gt; столбцов матрицы, пересечение которых образует невырожденную подматрицу, то вся матрица может быть восстановлена через интерполяцию по этим строкам и столбцам. На практике используется &#039;&#039;&#039;адаптивная схема&#039;&#039;&#039; с выбором элемента максимальной невязки на каждой итерации (аналог жадного алгоритма), что позволяет обойтись без поиска подматрицы максимального объёма.&lt;br /&gt;
&lt;br /&gt;
Важнейшее преимущество метода — малая вычислительная стоимость: для построения приближения ранга &amp;lt;math&amp;gt;r&amp;lt;/math&amp;gt; требуется &amp;lt;math&amp;gt;O((m + n) r)&amp;lt;/math&amp;gt; вычислений элементов матрицы и &amp;lt;math&amp;gt;O((m + n) r^2)&amp;lt;/math&amp;gt; арифметических операций.&lt;br /&gt;
&lt;br /&gt;
В условиях современных суперкомпьютеров и больших размерностей (&amp;lt;math&amp;gt;m, n \sim 10^5&amp;lt;/math&amp;gt; и выше) естественным шагом становится параллельная реализация, предложенная в работе Д. А. Желткова и Е. Е. Тыртышникова (2015). Она распределяет строки и столбцы матрицы между процессорами и использует коллективные операции для глобального выбора доминирующего элемента невязки.&lt;br /&gt;
&lt;br /&gt;
==== Особенности параллельной реализации ====&lt;br /&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;. На каждой итерации:&lt;br /&gt;
&lt;br /&gt;
*процессоры совместно находят глобальный максимум невязки с помощью операций &amp;lt;math&amp;gt;\texttt{Gather}&amp;lt;/math&amp;gt; и &amp;lt;math&amp;gt;\texttt{Broadcast}&amp;lt;/math&amp;gt;;&lt;br /&gt;
*соответствующие строки и столбцы обновляются локально;&lt;br /&gt;
*норма Фробениуса текущего приближения пересчитывается распределённо, без полного сбора данных.&lt;br /&gt;
&amp;lt;br&amp;gt;&lt;br /&gt;
Эта стратегия позволяет сохранить низкую коммуникационную сложность: каждый процессор выполняет &amp;lt;math&amp;gt;O(r)&amp;lt;/math&amp;gt; обменов, а длина каждого сообщения не превышает &amp;lt;math&amp;gt;r&amp;lt;/math&amp;gt;. При этом трудоёмкость на один процессор снижается до &amp;lt;math&amp;gt;O\left(\left(\left\lceil \frac{m}{p} \right\rceil + \left\lceil \frac{n}{p} \right\rceil\right) r^2\right)&amp;lt;/math&amp;gt;, &amp;lt;br&amp;gt;а количество вычисляемых элементов — до &amp;lt;math&amp;gt;O\left(\left(\left\lceil \frac{m}{p} \right\rceil + \left\lceil \frac{n}{p} \right\rceil\right) r\right)&amp;lt;/math&amp;gt;.&lt;br /&gt;
&lt;br /&gt;
=== Математическое описание алгоритма ===&lt;br /&gt;
&lt;br /&gt;
Пусть задана матрица &amp;lt;math&amp;gt;A \in \mathbb{R}^{m \times n}&amp;lt;/math&amp;gt;. Цель — построить её малоранговое приближение вида &amp;lt;math&amp;gt;A \approx UV&amp;lt;/math&amp;gt;, где &amp;lt;math&amp;gt;U \in \mathbb{R}^{m \times r}&amp;lt;/math&amp;gt;, &amp;lt;math&amp;gt;V \in \mathbb{R}^{r \times n}&amp;lt;/math&amp;gt;, а ранг &amp;lt;math&amp;gt;r \ll \min(m,n)&amp;lt;/math&amp;gt;.&lt;br /&gt;
&lt;br /&gt;
Общая схема крестового метода основана на последовательном выделении строк и столбцов, содержащих подматрицу максимального (или достаточно большого) объёма. В обобщённом виде она выглядит следующим образом:&lt;br /&gt;
&lt;br /&gt;
&#039;&#039;&#039;Алгоритм 1. Схема крестового метода&#039;&#039;&#039;&amp;lt;br&amp;gt;&lt;br /&gt;
&lt;br /&gt;
&#039;&#039;Инициализация:&#039;&#039;&lt;br /&gt;
&amp;lt;math&amp;gt;I \gets {1,\dots,m}&amp;lt;/math&amp;gt;,&amp;lt;math&amp;gt;J \gets {1,\dots,n}&amp;lt;/math&amp;gt;,&amp;lt;math&amp;gt;r \gets 0&lt;br /&gt;
&amp;lt;/math&amp;gt;.&lt;br /&gt;
&amp;lt;br&amp;gt;&#039;&#039;Повторять:&#039;&#039;&amp;lt;br&amp;gt;&lt;br /&gt;
#&amp;lt;math&amp;gt;r \gets r + 1&amp;lt;/math&amp;gt;;&amp;lt;br&amp;gt;&lt;br /&gt;
#Найти подмножества индексов &amp;lt;math&amp;gt;I_* \subset I&amp;lt;/math&amp;gt;, &amp;lt;math&amp;gt;J_* \subset J&amp;lt;/math&amp;gt; (размера &amp;lt;math&amp;gt;k&amp;lt;/math&amp;gt;), такие что подматрица &amp;lt;math&amp;gt;A[I_*, J_*]&amp;lt;/math&amp;gt; имеет достаточно большой объём (процедура &amp;lt;math&amp;gt;\texttt{maxvol}&amp;lt;/math&amp;gt;);&amp;lt;br&amp;gt;&lt;br /&gt;
#Выбрать столбцы: &amp;lt;math&amp;gt;C_r \gets A[:, J_*]&amp;lt;/math&amp;gt;;&amp;lt;br&amp;gt;&lt;br /&gt;
#Выбрать строки: &amp;lt;math&amp;gt;R_r \gets A[I_*, :]&amp;lt;/math&amp;gt;;&amp;lt;br&amp;gt;&lt;br /&gt;
#Выделить ядро: &amp;lt;math&amp;gt;\hat{A_i} \gets A[:, I_* J_*]&amp;lt;/math&amp;gt;;&amp;lt;br&amp;gt;&lt;br /&gt;
#Обновить текущую невязку: &amp;lt;math&amp;gt;A \gets A - C_r \hat{A}_{r}^{-1} R_r&amp;lt;/math&amp;gt;;&amp;lt;br&amp;gt;&lt;br /&gt;
#Исключить использованные индексы: &amp;lt;math&amp;gt;I \gets I \setminus I_*&amp;lt;/math&amp;gt;, &amp;lt;math&amp;gt;J \gets J \setminus J_*&amp;lt;/math&amp;gt;;&amp;lt;br&amp;gt;&lt;br /&gt;
&#039;&#039;До выполнения критерия остановки.&#039;&#039;&lt;br /&gt;
&amp;lt;br&amp;gt;&amp;lt;br&amp;gt;&lt;br /&gt;
В результате работы этого алгоритма матрица &amp;lt;math&amp;gt;\sum_{i=1}^{r} C_i\hat{A}_{i}^{-1} R_i&amp;lt;/math&amp;gt; будет приближать матрицу &amp;lt;math&amp;gt;A&amp;lt;/math&amp;gt;.&lt;br /&gt;
В рассматриваемой работе используется частный случай этой схемы при &amp;lt;math&amp;gt;k = 1&amp;lt;/math&amp;gt;, то есть на каждой итерации выбирается один элемент с максимальной по модулю невязкой. В этом случае подматрица &amp;lt;math&amp;gt;\hat{A}_r&amp;lt;/math&amp;gt; — скаляр, а обновление факторов происходит по явным формулам.&lt;br /&gt;
&amp;lt;br&amp;gt;&lt;br /&gt;
С учeтом данного выбора алгоритм выглядит следующим образом.&lt;br /&gt;
&lt;br /&gt;
&#039;&#039;&#039;Алгоритм 2. Крестовый метод (&amp;lt;math&amp;gt;k = 1&amp;lt;/math&amp;gt;)&#039;&#039;&#039;&lt;br /&gt;
&lt;br /&gt;
&#039;&#039;Инициализация:&#039;&#039;&lt;br /&gt;
&amp;lt;math&amp;gt;I \gets {1,\dots,m}&amp;lt;/math&amp;gt;, &amp;lt;math&amp;gt;J \gets {1,\dots,n}&amp;lt;/math&amp;gt;, &amp;lt;math&amp;gt;r \gets 0&amp;lt;/math&amp;gt;.&lt;br /&gt;
&amp;lt;br&amp;gt;&#039;&#039;Цикл:&#039;&#039;&lt;br /&gt;
&amp;lt;br&amp;gt;а. &lt;br /&gt;
:&amp;lt;math&amp;gt;r \gets r + 1&amp;lt;/math&amp;gt;;&lt;br /&gt;
&amp;lt;br&amp;gt;б. Найти строку с максимальной невязкой в первом доступном столбце:&lt;br /&gt;
&amp;lt;br&amp;gt;&lt;br /&gt;
:&amp;lt;math&amp;gt;i \gets \arg\max_{i \in I} |A_{i, J(1)} - [UV]{i, J(1)}|&amp;lt;/math&amp;gt;;&lt;br /&gt;
&amp;lt;br&amp;gt;в. Найти столбец с максимальной невязкой в найденной строке:&lt;br /&gt;
&amp;lt;br&amp;gt;&lt;br /&gt;
:&amp;lt;math&amp;gt;j \gets \arg\max{j \in J} |A_{ij} - [UV]{ij}|&amp;lt;/math&amp;gt;;&lt;br /&gt;
&amp;lt;br&amp;gt;г. Проверить критерий остановки:&lt;br /&gt;
&amp;lt;br&amp;gt;&lt;br /&gt;
:если &lt;br /&gt;
:&amp;lt;math&amp;gt;|(A - UV){ij}| \cdot \sqrt{(m - r)(n - r)} &amp;lt; \varepsilon |UV|F&amp;lt;/math&amp;gt;, &amp;lt;br&amp;gt;то&lt;br /&gt;
::&amp;lt;math&amp;gt;r \gets r - 1&amp;lt;/math&amp;gt;, &lt;br /&gt;
::выйти из цикла;&lt;br /&gt;
&amp;lt;br&amp;gt;&amp;lt;br&amp;gt;д. Обновить факторы:&lt;br /&gt;
:&amp;lt;math&amp;gt;u \gets \dfrac{A^{j} - [UV]^{j}}{\sqrt{\vert A_{ij}\vert}}&amp;lt;/math&amp;gt;,&lt;br /&gt;
:&amp;lt;math&amp;gt;v \gets \dfrac{(A_{i} - [UV]_{i}) \cdot \sqrt{\vert A_{ij}\vert}}{A_{ij}}&amp;lt;/math&amp;gt;;&lt;br /&gt;
&amp;lt;br&amp;gt;&amp;lt;br&amp;gt;е. Расширить матрицы:&lt;br /&gt;
:&amp;lt;math&amp;gt;U \gets [Uu]&amp;lt;/math&amp;gt;,&lt;br /&gt;
:&amp;lt;math&amp;gt;V \gets \begin{bmatrix} V \\ v \end{bmatrix}&amp;lt;/math&amp;gt;;&lt;br /&gt;
&amp;lt;br&amp;gt;ж. Исключить использованные индексы:&lt;br /&gt;
:&amp;lt;math&amp;gt;I \gets I \setminus  \left\{ {i} \right\}&amp;lt;/math&amp;gt;,&lt;br /&gt;
:&amp;lt;math&amp;gt;J \gets J \setminus \left\{ {j} \right\}&amp;lt;/math&amp;gt;;&lt;br /&gt;
&amp;lt;br&amp;gt;Вернуть &amp;lt;math&amp;gt;\left( U, V, r \right)&amp;lt;/math&amp;gt;.&lt;br /&gt;
&amp;lt;br&amp;gt;&lt;br /&gt;
&lt;br /&gt;
&amp;lt;br&amp;gt;Здесь &amp;lt;math&amp;gt;A^{(j)}&amp;lt;/math&amp;gt; обозначает &amp;lt;math&amp;gt;j&amp;lt;/math&amp;gt;-й столбец матрицы &amp;lt;math&amp;gt;A&amp;lt;/math&amp;gt;, а &amp;lt;math&amp;gt;A_{(i)}&amp;lt;/math&amp;gt; — &amp;lt;math&amp;gt;i&amp;lt;/math&amp;gt;-ю строку. Норма Фробениуса &amp;lt;math&amp;gt;|UV|_F&amp;lt;/math&amp;gt; пересчитывается инкрементально за &amp;lt;math&amp;gt;O((m + n) r)&amp;lt;/math&amp;gt; операций, что позволяет сохранить общую сложность алгоритма на уровне &amp;lt;math&amp;gt;O((m + n) r^2)&amp;lt;/math&amp;gt;.&lt;br /&gt;
&lt;br /&gt;
В параллельной реализации выбор индексов &amp;lt;math&amp;gt;i&amp;lt;/math&amp;gt; и &amp;lt;math&amp;gt;j&amp;lt;/math&amp;gt; выполняется совместно всеми процессорами с помощью коллективных операций (gather/broadcast), а обновление &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;
&lt;br /&gt;
&lt;br /&gt;
Входные параметры: &amp;lt;math&amp;gt;m&amp;lt;/math&amp;gt; — число строк матрицы, &amp;lt;math&amp;gt;n&amp;lt;/math&amp;gt; — число столбцов, &amp;lt;math&amp;gt;A(i,j)&amp;lt;/math&amp;gt; — функция вычисления элемента матрицы, &amp;lt;math&amp;gt;p&amp;lt;/math&amp;gt; — число процессоров, &amp;lt;math&amp;gt;rnk&amp;lt;/math&amp;gt; — номер текущего процессора (от 0 до &amp;lt;math&amp;gt;p-1&amp;lt;/math&amp;gt;).&lt;br /&gt;
&lt;br /&gt;
&#039;&#039;&#039;Алгоритм 3. Параллельный крестовый метод&#039;&#039;&#039;&lt;br /&gt;
&lt;br /&gt;
:&amp;lt;math&amp;gt;{b}_{m} \gets \frac{m}{p}&amp;lt;/math&amp;gt;&lt;br /&gt;
:&amp;lt;math&amp;gt;{b}_{n} \gets \frac{n}{p}&amp;lt;/math&amp;gt;&lt;br /&gt;
&lt;br /&gt;
:&amp;lt;math&amp;gt;\color{Red}\text{если}&amp;lt;/math&amp;gt;&lt;br /&gt;
:&amp;lt;math&amp;gt;rnk = 0&amp;lt;/math&amp;gt;, то &lt;br /&gt;
::&amp;lt;math&amp;gt;J_* \gets {1, \dots, n}&amp;lt;/math&amp;gt;&lt;br /&gt;
&lt;br /&gt;
:&amp;lt;math&amp;gt;I \gets { bm \cdot rnk + 1, \dots, bm \cdot (rnk + 1) }&amp;lt;/math&amp;gt;&lt;br /&gt;
:&amp;lt;math&amp;gt;J \gets { bn \cdot rnk + 1, \dots, bn \cdot (rnk + 1) }&amp;lt;/math&amp;gt;&lt;br /&gt;
:&amp;lt;math&amp;gt;r \gets 0&amp;lt;/math&amp;gt;&lt;br /&gt;
&lt;br /&gt;
&#039;&#039;повторять&#039;&#039;&lt;br /&gt;
:&amp;lt;math&amp;gt;r \gets r + 1&amp;lt;/math&amp;gt;&lt;br /&gt;
&lt;br /&gt;
:&#039;&#039;&#039;если&#039;&#039;&#039;&lt;br /&gt;
:&amp;lt;math&amp;gt;rnk = 0&amp;lt;/math&amp;gt;, то &lt;br /&gt;
::&amp;lt;math&amp;gt;j \gets J^*(1)&amp;lt;/math&amp;gt;&lt;br /&gt;
:&amp;lt;math&amp;gt;\texttt{Broadcast}(0, j, j)&amp;lt;/math&amp;gt;&lt;br /&gt;
&lt;br /&gt;
:&amp;lt;math&amp;gt;\texttt{Broadcast}\left(\left\lfloor \frac{j - 1}{p} \right\rfloor, V^j, v\right)&amp;lt;/math&amp;gt;&lt;br /&gt;
&lt;br /&gt;
:&amp;lt;math&amp;gt;i \gets \arg\max_{i \in I} \left| A_{ij} - [U v]_i \right|&amp;lt;/math&amp;gt;&lt;br /&gt;
&lt;br /&gt;
:&amp;lt;math&amp;gt;\texttt{Gather}\left( 0, \left\{ i, \vert A_{ij} - [U v]_i \vert \right\}, max_i \right)&amp;lt;/math&amp;gt;&lt;br /&gt;
&lt;br /&gt;
:&#039;&#039;&#039;если&#039;&#039;&#039;&lt;br /&gt;
:&amp;lt;math&amp;gt;rnk = 0&amp;lt;/math&amp;gt;, то&lt;br /&gt;
::&amp;lt;math&amp;gt;{i, column_maximum} \gets \max_{k \in [1; p]} (max_i[k])&amp;lt;/math&amp;gt;&lt;br /&gt;
&lt;br /&gt;
:&amp;lt;math&amp;gt;\texttt{Broadcast}(0, i, i)&amp;lt;/math&amp;gt;&lt;br /&gt;
&lt;br /&gt;
:&amp;lt;math&amp;gt;\texttt{Broadcast}\left(\left\lfloor \frac{i - 1}{p} \right\rfloor, U_i, u\right)&amp;lt;/math&amp;gt;&lt;br /&gt;
&lt;br /&gt;
:&amp;lt;math&amp;gt;j \gets \arg\max_{j \in J} \left| A_{ij} - [u V]_j \right|&amp;lt;/math&amp;gt;&lt;br /&gt;
&lt;br /&gt;
:&amp;lt;math&amp;gt;\texttt{Gather}(0, \left\{j, \vert A_{ij} - [u V]_j \vert \right\}, max_j)&amp;lt;/math&amp;gt;&lt;br /&gt;
&lt;br /&gt;
:&#039;&#039;&#039;если&#039;&#039;&#039; &lt;br /&gt;
:&amp;lt;math&amp;gt;rnk = 0&amp;lt;/math&amp;gt;, то&lt;br /&gt;
::&amp;lt;math&amp;gt;{j, maximum} \gets \max_{k \in [1; p]} (maxj[k])&amp;lt;/math&amp;gt;&lt;br /&gt;
:&amp;lt;math&amp;gt;\texttt{Broadcast}(0, \left\{j, maximum\right\}, \left\{j, maximum\right\})&amp;lt;/math&amp;gt;&lt;br /&gt;
&lt;br /&gt;
:&amp;lt;math&amp;gt;\texttt{Broadcast}\left(\left\lfloor \frac{j - 1}{p} \right\rfloor, V^j, v\right)&amp;lt;/math&amp;gt;&lt;br /&gt;
&lt;br /&gt;
:&amp;lt;math&amp;gt;u_{upd} \gets \dfrac{(A^j - U v)[b_m \cdot rnk + 1 : b_m \cdot (rnk + 1)]}{\sqrt{ \vert maximum \vert }}&amp;lt;/math&amp;gt;&lt;br /&gt;
:&amp;lt;math&amp;gt;v_{upd} \gets \dfrac{(A_i - u V)[b_n \cdot rnk + 1 : b_n \cdot (rnk + 1)] \cdot \sqrt{ \vert maximum \vert }}{maximum}&amp;lt;/math&amp;gt;&lt;br /&gt;
&lt;br /&gt;
:&amp;lt;math&amp;gt;U \gets [U u_{upd}]&amp;lt;/math&amp;gt;&lt;br /&gt;
:&amp;lt;math&amp;gt;V \gets \begin{bmatrix} V \\ v_{upd} \end{bmatrix}&amp;lt;/math&amp;gt;&lt;br /&gt;
&lt;br /&gt;
:&amp;lt;math&amp;gt;I \gets I \setminus \left\{ i \right\}&amp;lt;/math&amp;gt;&lt;br /&gt;
:&amp;lt;math&amp;gt;J \gets J \setminus \left\{ j \right\}&amp;lt;/math&amp;gt;&lt;br /&gt;
&lt;br /&gt;
:&#039;&#039;&#039;если&#039;&#039;&#039; &amp;lt;math&amp;gt;rnk = 0&amp;lt;/math&amp;gt;, то &lt;br /&gt;
::&amp;lt;math&amp;gt;J_* \gets J_* \setminus \left\{ j \right\}&amp;lt;/math&amp;gt;&lt;br /&gt;
&lt;br /&gt;
&#039;&#039;до тех пор, пока&#039;&#039; &lt;br /&gt;
:&amp;lt;math&amp;gt;\operatorname{tol} \vert \vert UV \vert \vert _F &amp;lt; |maximum| \cdot \sqrt{(m - r)(n - r)}&amp;lt;/math&amp;gt;&lt;br /&gt;
&lt;br /&gt;
&#039;&#039;&#039;вернуть&#039;&#039;&#039; &amp;lt;math&amp;gt;(U, V, r)&amp;lt;/math&amp;gt;&lt;br /&gt;
&amp;lt;br&amp;gt;&lt;br /&gt;
Функция &amp;lt;math&amp;gt;\texttt{Broadcast}\left( i,a,b \right)&amp;lt;/math&amp;gt; рассылает переменную a спроцессора &amp;lt;math&amp;gt;i&amp;lt;/math&amp;gt; в переменную &amp;lt;math&amp;gt;b&amp;lt;/math&amp;gt; всех процессоров; функция &amp;lt;math&amp;gt;\texttt{Gather}\left( i,a,b \right)&amp;lt;/math&amp;gt; собирает переменную &amp;lt;math&amp;gt;a&amp;lt;/math&amp;gt; всех процессоров в переменную &amp;lt;math&amp;gt;b&amp;lt;/math&amp;gt; (таким образом, &amp;lt;math&amp;gt;b&amp;lt;/math&amp;gt; массив из переменных &amp;lt;math&amp;gt;a&amp;lt;/math&amp;gt; процессора &amp;lt;math&amp;gt;i&amp;lt;/math&amp;gt;.&lt;/div&gt;</summary>
		<author><name>BoldyrevVV MSU</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:BoldyrevVV_MSU/%D0%9F%D0%B0%D1%80%D0%B0%D0%BB%D0%BB%D0%B5%D0%BB%D1%8C%D0%BD%D0%B0%D1%8F_%D1%80%D0%B5%D0%B0%D0%BB%D0%B8%D0%B7%D0%B0%D1%86%D0%B8%D1%8F_%D0%BC%D0%B0%D1%82%D1%80%D0%B8%D1%87%D0%BD%D0%BE%D0%B3%D0%BE_%D0%BA%D1%80%D0%B5%D1%81%D1%82%D0%BE%D0%B2%D0%BE%D0%B3%D0%BE_%D0%BC%D0%B5%D1%82%D0%BE%D0%B4%D0%B0&amp;diff=29929</id>
		<title>Участник:BoldyrevVV MSU/Параллельная реализация матричного крестового метода</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:BoldyrevVV_MSU/%D0%9F%D0%B0%D1%80%D0%B0%D0%BB%D0%BB%D0%B5%D0%BB%D1%8C%D0%BD%D0%B0%D1%8F_%D1%80%D0%B5%D0%B0%D0%BB%D0%B8%D0%B7%D0%B0%D1%86%D0%B8%D1%8F_%D0%BC%D0%B0%D1%82%D1%80%D0%B8%D1%87%D0%BD%D0%BE%D0%B3%D0%BE_%D0%BA%D1%80%D0%B5%D1%81%D1%82%D0%BE%D0%B2%D0%BE%D0%B3%D0%BE_%D0%BC%D0%B5%D1%82%D0%BE%D0%B4%D0%B0&amp;diff=29929"/>
		<updated>2025-11-04T16:46:23Z</updated>

		<summary type="html">&lt;p&gt;BoldyrevVV MSU: fix&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((m + n) r^2)&amp;lt;/math&amp;gt;&lt;br /&gt;
| pf_height = &amp;lt;math&amp;gt;O(r p)&amp;lt;/math&amp;gt;&lt;br /&gt;
| pf_width = &amp;lt;math&amp;gt;O\left(\left\lceil \frac{m}{p} \right\rceil + \left\lceil \frac{n}{p} \right\rceil\right) r&amp;lt;/math&amp;gt;&lt;br /&gt;
| input_data = &amp;lt;math&amp;gt;O((m + n) r)&amp;lt;/math&amp;gt; (вычисляются лишь отдельные элементы матрицы)&lt;br /&gt;
| output_data = &amp;lt;math&amp;gt;O((m + n) r)&amp;lt;/math&amp;gt; (факторы &amp;lt;math&amp;gt;U \in \mathbb{R}^{m \times r}&amp;lt;/math&amp;gt;, &amp;lt;math&amp;gt;V \in \mathbb{R}^{r \times n}&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;
&lt;br /&gt;
&#039;&#039;&#039;Матричный крестовой метод&#039;&#039;&#039; — это быстрый метод построения малорангового приближения матрицы, не требующий хранения или полного доступа ко всей матрице. Вместо этого он работает с отдельными элементами, выбор которых адаптивно определяется в ходе вычислений. Метод особенно эффективен в задачах, где матрица задана неявно — например, как функция расстояния между точками в пространстве (ядерные матрицы, ковариационные матрицы, интегральные операторы и т.п.).&lt;br /&gt;
&lt;br /&gt;
Ключевая идея основана на так называемом &#039;&#039;&#039;крестовом разложении&#039;&#039;&#039;: если известны &amp;lt;math&amp;gt;r&amp;lt;/math&amp;gt; строк и &amp;lt;math&amp;gt;r&amp;lt;/math&amp;gt; столбцов матрицы, пересечение которых образует невырожденную подматрицу, то вся матрица может быть восстановлена через интерполяцию по этим строкам и столбцам. На практике используется &#039;&#039;&#039;адаптивная схема&#039;&#039;&#039; с выбором элемента максимальной невязки на каждой итерации (аналог жадного алгоритма), что позволяет обойтись без поиска подматрицы максимального объёма.&lt;br /&gt;
&lt;br /&gt;
Важнейшее преимущество метода — малая вычислительная стоимость: для построения приближения ранга &amp;lt;math&amp;gt;r&amp;lt;/math&amp;gt; требуется &amp;lt;math&amp;gt;O((m + n) r)&amp;lt;/math&amp;gt; вычислений элементов матрицы и &amp;lt;math&amp;gt;O((m + n) r^2)&amp;lt;/math&amp;gt; арифметических операций.&lt;br /&gt;
&lt;br /&gt;
В условиях современных суперкомпьютеров и больших размерностей (&amp;lt;math&amp;gt;m, n \sim 10^5&amp;lt;/math&amp;gt; и выше) естественным шагом становится параллельная реализация, предложенная в работе Желткова и Тыртышникова (2015). Она распределяет строки и столбцы матрицы между процессорами и использует коллективные операции для глобального выбора доминирующего элемента невязки.&lt;br /&gt;
&lt;br /&gt;
==== Особенности параллельной реализации ====&lt;br /&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;. На каждой итерации:&lt;br /&gt;
&lt;br /&gt;
процессоры совместно находят глобальный максимум невязки с помощью операций &amp;lt;math&amp;gt;\texttt{Gather}&amp;lt;/math&amp;gt; и &amp;lt;math&amp;gt;\texttt{Broadcast}&amp;lt;/math&amp;gt;;&lt;br /&gt;
соответствующие строки и столбцы обновляются локально;&lt;br /&gt;
норма Фробениуса текущего приближения пересчитывается распределённо, без полного сбора данных.&lt;br /&gt;
Эта стратегия позволяет сохранить низкую коммуникационную сложность: каждый процессор выполняет &amp;lt;math&amp;gt;O(r)&amp;lt;/math&amp;gt; обменов, а длина каждого сообщения не превышает &amp;lt;math&amp;gt;r&amp;lt;/math&amp;gt;. При этом трудоёмкость на один процессор снижается до &amp;lt;math&amp;gt;O\left(\left(\left\lceil \frac{m}{p} \right\rceil + \left\lceil \frac{n}{p} \right\rceil\right) r^2\right)&amp;lt;/math&amp;gt;, а количество вычисляемых элементов — до &amp;lt;math&amp;gt;O\left(\left(\left\lceil \frac{m}{p} \right\rceil + \left\lceil \frac{n}{p} \right\rceil\right) r\right)&amp;lt;/math&amp;gt;.&lt;br /&gt;
&lt;br /&gt;
=== Математическое описание алгоритма ===&lt;br /&gt;
&lt;br /&gt;
Пусть задана матрица &amp;lt;math&amp;gt;A \in \mathbb{R}^{m \times n}&amp;lt;/math&amp;gt;. Цель — построить её малоранговое приближение вида &amp;lt;math&amp;gt;A \approx UV&amp;lt;/math&amp;gt;, где &amp;lt;math&amp;gt;U \in \mathbb{R}^{m \times r}&amp;lt;/math&amp;gt;, &amp;lt;math&amp;gt;V \in \mathbb{R}^{r \times n}&amp;lt;/math&amp;gt;, а ранг &amp;lt;math&amp;gt;r \ll \min(m,n)&amp;lt;/math&amp;gt;.&lt;br /&gt;
&lt;br /&gt;
Общая схема крестового метода основана на последовательном выделении строк и столбцов, содержащих подматрицу максимального (или достаточно большого) объёма. В обобщённом виде она выглядит следующим образом:&lt;br /&gt;
&lt;br /&gt;
&#039;&#039;&#039;Алгоритм 1. Схема крестового метода&#039;&#039;&#039;&amp;lt;br&amp;gt;&lt;br /&gt;
&lt;br /&gt;
&#039;&#039;Инициализация:&#039;&#039;&lt;br /&gt;
 &amp;lt;math&amp;gt;I \gets {1,\dots,m}&amp;lt;/math&amp;gt;, &amp;lt;math&amp;gt;J \gets {1,\dots,n}&amp;lt;/math&amp;gt;, &amp;lt;math&amp;gt;r \gets 0&lt;br /&gt;
&amp;lt;/math&amp;gt;.&lt;br /&gt;
&amp;lt;br&amp;gt;&#039;&#039;Повторять:&#039;&#039;&amp;lt;br&amp;gt;&lt;br /&gt;
 а. &amp;lt;math&amp;gt;r \gets r + 1&amp;lt;/math&amp;gt;;&amp;lt;br&amp;gt;&lt;br /&gt;
 б. Найти подмножества индексов &amp;lt;math&amp;gt;I_* \subset I&amp;lt;/math&amp;gt;, &amp;lt;math&amp;gt;J_* \subset J&amp;lt;/math&amp;gt; (размера &amp;lt;math&amp;gt;k&amp;lt;/math&amp;gt;), такие что подматрица &amp;lt;math&amp;gt;A[I_*, J_*]&amp;lt;/math&amp;gt; имеет достаточно большой объём (процедура &amp;lt;math&amp;gt;\texttt{maxvol}&amp;lt;/math&amp;gt;);&amp;lt;br&amp;gt;&lt;br /&gt;
 в. Выбрать столбцы: &amp;lt;math&amp;gt;C_r \gets A[:, J_*]&amp;lt;/math&amp;gt;;&amp;lt;br&amp;gt;&lt;br /&gt;
 г. Выбрать строки: &amp;lt;math&amp;gt;R_r \gets A[I_*, :]&amp;lt;/math&amp;gt;;&amp;lt;br&amp;gt;&lt;br /&gt;
 д. Выделить ядро: &amp;lt;math&amp;gt;\hat{A}r \gets A[I, J_]&amp;lt;/math&amp;gt;;&amp;lt;br&amp;gt;&lt;br /&gt;
 е. Обновить текущую невязку: &amp;lt;math&amp;gt;A \gets A - C_r \hat{A}r^{-1} R_r&amp;lt;/math&amp;gt;;&amp;lt;br&amp;gt;&lt;br /&gt;
 ж. Исключить использованные индексы: &amp;lt;math&amp;gt;I \gets I \setminus I_*&amp;lt;/math&amp;gt;, &amp;lt;math&amp;gt;J \gets J \setminus J_*&amp;lt;/math&amp;gt;;&amp;lt;br&amp;gt;&lt;br /&gt;
&#039;&#039;До выполнения критерия остановки.&#039;&#039;&amp;lt;br&amp;gt;&amp;lt;br&amp;gt;&lt;br /&gt;
В рассматриваемой работе используется частный случай этой схемы при &amp;lt;math&amp;gt;k = 1&amp;lt;/math&amp;gt;, то есть на каждой итерации выбирается один элемент с максимальной по модулю невязкой. В этом случае подматрица &amp;lt;math&amp;gt;\hat{A}_r&amp;lt;/math&amp;gt; — скаляр, а обновление факторов происходит по явным формулам.&lt;br /&gt;
&lt;br /&gt;
&#039;&#039;&#039;Алгоритм 2. Крестовый метод (&amp;lt;math&amp;gt;k = 1&amp;lt;/math&amp;gt;)&#039;&#039;&#039;&lt;br /&gt;
&lt;br /&gt;
&#039;&#039;Инициализация:&#039;&#039;&lt;br /&gt;
 &amp;lt;math&amp;gt;I \gets {1,\dots,m}&amp;lt;/math&amp;gt;, &amp;lt;math&amp;gt;J \gets {1,\dots,n}&amp;lt;/math&amp;gt;, &amp;lt;math&amp;gt;r \gets 0&amp;lt;/math&amp;gt;, &amp;lt;math&amp;gt;U \gets []&amp;lt;/math&amp;gt;, &amp;lt;math&amp;gt;V \gets []&amp;lt;/math&amp;gt;.&lt;br /&gt;
&amp;lt;br&amp;gt;&#039;&#039;Цикл:&#039;&#039;&lt;br /&gt;
 &amp;lt;br&amp;gt;а. &amp;lt;math&amp;gt;r \gets r + 1&amp;lt;/math&amp;gt;;&lt;br /&gt;
 &amp;lt;br&amp;gt;б. Найти строку с максимальной невязкой в первом доступном столбце:&lt;br /&gt;
  &amp;lt;math&amp;gt;i \gets \arg\max_{i \in I} |A_{i, J(1)} - [UV]{i, J(1)}|&amp;lt;/math&amp;gt;;&lt;br /&gt;
 &amp;lt;br&amp;gt;в. Найти столбец с максимальной невязкой в найденной строке:&lt;br /&gt;
  &amp;lt;math&amp;gt;j \gets \arg\max{j \in J} |A_{ij} - [UV]{ij}|&amp;lt;/math&amp;gt;;&lt;br /&gt;
 &amp;lt;br&amp;gt;&amp;lt;br&amp;gt;г. Проверить критерий остановки:&lt;br /&gt;
  &amp;lt;br&amp;gt;  если &amp;lt;math&amp;gt;|(A - UV){ij}| \cdot \sqrt{(m - r)(n - r)} &amp;lt; \varepsilon |UV|F&amp;lt;/math&amp;gt;, &amp;lt;br&amp;gt;  то&lt;br /&gt;
   &amp;lt;math&amp;gt;r \gets r - 1&amp;lt;/math&amp;gt;, &amp;lt;br&amp;gt;    выйти из цикла;&lt;br /&gt;
 &amp;lt;br&amp;gt;&amp;lt;br&amp;gt;д. Обновить факторы:&lt;br /&gt;
  &amp;lt;math&amp;gt;u \gets \dfrac{A^{(j)} - [UV]^{(j)}}{\sqrt{|(A - UV){ij}|}}&amp;lt;/math&amp;gt;,&lt;br /&gt;
  &amp;lt;math&amp;gt;v \gets \dfrac{(A_{(i)} - [UV]{(i)}) \cdot \sqrt{|(A - UV){ij}|}}{(A - UV)_{ij}}&amp;lt;/math&amp;gt;;&lt;br /&gt;
 &amp;lt;br&amp;gt;&amp;lt;br&amp;gt;е. Расширить матрицы:&lt;br /&gt;
  &amp;lt;math&amp;gt;U \gets [U ; u]&amp;lt;/math&amp;gt;, &amp;lt;math&amp;gt;V \gets \begin{bmatrix} V \ v \end{bmatrix}&amp;lt;/math&amp;gt;;&lt;br /&gt;
 &amp;lt;br&amp;gt;ж. Исключить использованные индексы:&lt;br /&gt;
  &amp;lt;math&amp;gt;I \gets I \setminus {i}&amp;lt;/math&amp;gt;, &amp;lt;math&amp;gt;J \gets J \setminus {j}&amp;lt;/math&amp;gt;;&lt;br /&gt;
&amp;lt;br&amp;gt;Вернуть &amp;lt;math&amp;gt;U, V, r&amp;lt;/math&amp;gt;.&lt;br /&gt;
&amp;lt;br&amp;gt;&#039;&#039;Конец&#039;&#039;&lt;br /&gt;
&amp;lt;br&amp;gt;&lt;br /&gt;
&lt;br /&gt;
&amp;lt;br&amp;gt;Здесь &amp;lt;math&amp;gt;A^{(j)}&amp;lt;/math&amp;gt; обозначает &amp;lt;math&amp;gt;j&amp;lt;/math&amp;gt;-й столбец матрицы &amp;lt;math&amp;gt;A&amp;lt;/math&amp;gt;, а &amp;lt;math&amp;gt;A_{(i)}&amp;lt;/math&amp;gt; — &amp;lt;math&amp;gt;i&amp;lt;/math&amp;gt;-ю строку. Норма Фробениуса &amp;lt;math&amp;gt;|UV|_F&amp;lt;/math&amp;gt; пересчитывается инкрементально за &amp;lt;math&amp;gt;O((m + n) r)&amp;lt;/math&amp;gt; операций, что позволяет сохранить общую сложность алгоритма на уровне &amp;lt;math&amp;gt;O((m + n) r^2)&amp;lt;/math&amp;gt;.&lt;br /&gt;
&lt;br /&gt;
В параллельной реализации выбор индексов &amp;lt;math&amp;gt;i&amp;lt;/math&amp;gt; и &amp;lt;math&amp;gt;j&amp;lt;/math&amp;gt; выполняется совместно всеми процессорами с помощью коллективных операций (gather/broadcast), а обновление &amp;lt;math&amp;gt;U&amp;lt;/math&amp;gt; и &amp;lt;math&amp;gt;V&amp;lt;/math&amp;gt; — локально на каждом процессоре для его части строк/столбцов.&lt;/div&gt;</summary>
		<author><name>BoldyrevVV MSU</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:BoldyrevVV_MSU/%D0%9F%D0%B0%D1%80%D0%B0%D0%BB%D0%BB%D0%B5%D0%BB%D1%8C%D0%BD%D0%B0%D1%8F_%D1%80%D0%B5%D0%B0%D0%BB%D0%B8%D0%B7%D0%B0%D1%86%D0%B8%D1%8F_%D0%BC%D0%B0%D1%82%D1%80%D0%B8%D1%87%D0%BD%D0%BE%D0%B3%D0%BE_%D0%BA%D1%80%D0%B5%D1%81%D1%82%D0%BE%D0%B2%D0%BE%D0%B3%D0%BE_%D0%BC%D0%B5%D1%82%D0%BE%D0%B4%D0%B0&amp;diff=29926</id>
		<title>Участник:BoldyrevVV MSU/Параллельная реализация матричного крестового метода</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:BoldyrevVV_MSU/%D0%9F%D0%B0%D1%80%D0%B0%D0%BB%D0%BB%D0%B5%D0%BB%D1%8C%D0%BD%D0%B0%D1%8F_%D1%80%D0%B5%D0%B0%D0%BB%D0%B8%D0%B7%D0%B0%D1%86%D0%B8%D1%8F_%D0%BC%D0%B0%D1%82%D1%80%D0%B8%D1%87%D0%BD%D0%BE%D0%B3%D0%BE_%D0%BA%D1%80%D0%B5%D1%81%D1%82%D0%BE%D0%B2%D0%BE%D0%B3%D0%BE_%D0%BC%D0%B5%D1%82%D0%BE%D0%B4%D0%B0&amp;diff=29926"/>
		<updated>2025-11-04T16:39:08Z</updated>

		<summary type="html">&lt;p&gt;BoldyrevVV MSU: fix formula&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((m + n) r^2)&amp;lt;/math&amp;gt;&lt;br /&gt;
| pf_height = &amp;lt;math&amp;gt;O(r p)&amp;lt;/math&amp;gt;&lt;br /&gt;
| pf_width = &amp;lt;math&amp;gt;O\left(\left\lceil \frac{m}{p} \right\rceil + \left\lceil \frac{n}{p} \right\rceil\right) r&amp;lt;/math&amp;gt;&lt;br /&gt;
| input_data = &amp;lt;math&amp;gt;O((m + n) r)&amp;lt;/math&amp;gt; (вычисляются лишь отдельные элементы матрицы)&lt;br /&gt;
| output_data = &amp;lt;math&amp;gt;O((m + n) r)&amp;lt;/math&amp;gt; (факторы &amp;lt;math&amp;gt;U \in \mathbb{R}^{m \times r}&amp;lt;/math&amp;gt;, &amp;lt;math&amp;gt;V \in \mathbb{R}^{r \times n}&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;
&lt;br /&gt;
&#039;&#039;&#039;Матричный крестовой метод&#039;&#039;&#039; — это быстрый метод построения малорангового приближения матрицы, не требующий хранения или полного доступа ко всей матрице. Вместо этого он работает с отдельными элементами, выбор которых адаптивно определяется в ходе вычислений. Метод особенно эффективен в задачах, где матрица задана неявно — например, как функция расстояния между точками в пространстве (ядерные матрицы, ковариационные матрицы, интегральные операторы и т.п.).&lt;br /&gt;
&lt;br /&gt;
Ключевая идея основана на так называемом &#039;&#039;&#039;крестовом разложении&#039;&#039;&#039;: если известны &amp;lt;math&amp;gt;r&amp;lt;/math&amp;gt; строк и &amp;lt;math&amp;gt;r&amp;lt;/math&amp;gt; столбцов матрицы, пересечение которых образует невырожденную подматрицу, то вся матрица может быть восстановлена через интерполяцию по этим строкам и столбцам. На практике используется &#039;&#039;&#039;адаптивная схема&#039;&#039;&#039; с выбором элемента максимальной невязки на каждой итерации (аналог жадного алгоритма), что позволяет обойтись без поиска подматрицы максимального объёма.&lt;br /&gt;
&lt;br /&gt;
Важнейшее преимущество метода — малая вычислительная стоимость: для построения приближения ранга &amp;lt;math&amp;gt;r&amp;lt;/math&amp;gt; требуется &amp;lt;math&amp;gt;O((m + n) r)&amp;lt;/math&amp;gt; вычислений элементов матрицы и &amp;lt;math&amp;gt;O((m + n) r^2)&amp;lt;/math&amp;gt; арифметических операций.&lt;br /&gt;
&lt;br /&gt;
В условиях современных суперкомпьютеров и больших размерностей (&amp;lt;math&amp;gt;m, n \sim 10^5&amp;lt;/math&amp;gt; и выше) естественным шагом становится параллельная реализация, предложенная в работе Желткова и Тыртышникова (2015). Она распределяет строки и столбцы матрицы между процессорами и использует коллективные операции для глобального выбора доминирующего элемента невязки.&lt;br /&gt;
&lt;br /&gt;
==== Особенности параллельной реализации ====&lt;br /&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;. На каждой итерации:&lt;br /&gt;
&lt;br /&gt;
процессоры совместно находят глобальный максимум невязки с помощью операций &amp;lt;math&amp;gt;\texttt{Gather}&amp;lt;/math&amp;gt; и &amp;lt;math&amp;gt;\texttt{Broadcast}&amp;lt;/math&amp;gt;;&lt;br /&gt;
соответствующие строки и столбцы обновляются локально;&lt;br /&gt;
норма Фробениуса текущего приближения пересчитывается распределённо, без полного сбора данных.&lt;br /&gt;
Эта стратегия позволяет сохранить низкую коммуникационную сложность: каждый процессор выполняет &amp;lt;math&amp;gt;O(r)&amp;lt;/math&amp;gt; обменов, а длина каждого сообщения не превышает &amp;lt;math&amp;gt;r&amp;lt;/math&amp;gt;. При этом трудоёмкость на один процессор снижается до &amp;lt;math&amp;gt;O\left(\left(\left\lceil \frac{m}{p} \right\rceil + \left\lceil \frac{n}{p} \right\rceil\right) r^2\right)&amp;lt;/math&amp;gt;, а количество вычисляемых элементов — до &amp;lt;math&amp;gt;O\left(\left(\left\lceil \frac{m}{p} \right\rceil + \left\lceil \frac{n}{p} \right\rceil\right) r\right)&amp;lt;/math&amp;gt;.&lt;br /&gt;
&lt;br /&gt;
=== Математическое описание алгоритма ===&lt;br /&gt;
&lt;br /&gt;
Пусть задана матрица &amp;lt;math&amp;gt;A \in \mathbb{R}^{m \times n}&amp;lt;/math&amp;gt;. Цель — построить её малоранговое приближение вида &amp;lt;math&amp;gt;A \approx UV&amp;lt;/math&amp;gt;, где &amp;lt;math&amp;gt;U \in \mathbb{R}^{m \times r}&amp;lt;/math&amp;gt;, &amp;lt;math&amp;gt;V \in \mathbb{R}^{r \times n}&amp;lt;/math&amp;gt;, а ранг &amp;lt;math&amp;gt;r \ll \min(m,n)&amp;lt;/math&amp;gt;.&lt;br /&gt;
&lt;br /&gt;
Общая схема крестового метода основана на последовательном выделении строк и столбцов, содержащих подматрицу максимального (или достаточно большого) объёма. В обобщённом виде она выглядит следующим образом:&lt;br /&gt;
&lt;br /&gt;
&#039;&#039;&#039;Алгоритм 1. Схема крестового метода&#039;&#039;&#039;&amp;lt;br&amp;gt;&lt;br /&gt;
&lt;br /&gt;
&#039;&#039;Инициализация:&#039;&#039;&lt;br /&gt;
 &amp;lt;math&amp;gt;I \gets {1,\dots,m}&amp;lt;/math&amp;gt;, &amp;lt;math&amp;gt;J \gets {1,\dots,n}&amp;lt;/math&amp;gt;, &amp;lt;math&amp;gt;r \gets 0&lt;br /&gt;
&amp;lt;/math&amp;gt;.&lt;br /&gt;
&amp;lt;br&amp;gt;&#039;&#039;Повторять:&#039;&#039;&amp;lt;br&amp;gt;&lt;br /&gt;
 а. &amp;lt;math&amp;gt;r \gets r + 1&amp;lt;/math&amp;gt;;&amp;lt;br&amp;gt;&lt;br /&gt;
 б. Найти подмножества индексов &amp;lt;math&amp;gt;I_* \subset I&amp;lt;/math&amp;gt;, &amp;lt;math&amp;gt;J_* \subset J&amp;lt;/math&amp;gt; (размера &amp;lt;math&amp;gt;k&amp;lt;/math&amp;gt;), такие что подматрица &amp;lt;math&amp;gt;A[I_*, J_*]&amp;lt;/math&amp;gt; имеет достаточно большой объём (процедура &amp;lt;math&amp;gt;\texttt{maxvol}&amp;lt;/math&amp;gt;);&amp;lt;br&amp;gt;&lt;br /&gt;
 в. Выбрать столбцы: &amp;lt;math&amp;gt;C_r \gets A[:, J_*]&amp;lt;/math&amp;gt;;&amp;lt;br&amp;gt;&lt;br /&gt;
 г. Выбрать строки: &amp;lt;math&amp;gt;R_r \gets A[I_*, :]&amp;lt;/math&amp;gt;;&amp;lt;br&amp;gt;&lt;br /&gt;
 д. Выделить ядро: &amp;lt;math&amp;gt;\hat{A}r \gets A[I, J_]&amp;lt;/math&amp;gt;;&amp;lt;br&amp;gt;&lt;br /&gt;
 е. Обновить текущую невязку: &amp;lt;math&amp;gt;A \gets A - C_r \hat{A}r^{-1} R_r&amp;lt;/math&amp;gt;;&amp;lt;br&amp;gt;&lt;br /&gt;
 ж. Исключить использованные индексы: &amp;lt;math&amp;gt;I \gets I \setminus I_*&amp;lt;/math&amp;gt;, &amp;lt;math&amp;gt;J \gets J \setminus J_*&amp;lt;/math&amp;gt;;&amp;lt;br&amp;gt;&lt;br /&gt;
До выполнения критерия остановки.&amp;lt;br&amp;gt;&lt;br /&gt;
В рассматриваемой работе используется частный случай этой схемы при &amp;lt;math&amp;gt;k = 1&amp;lt;/math&amp;gt;, то есть на каждой итерации выбирается один элемент с максимальной по модулю невязкой. В этом случае подматрица &amp;lt;math&amp;gt;\hat{A}_r&amp;lt;/math&amp;gt; — скаляр, а обновление факторов происходит по явным формулам.&lt;br /&gt;
&lt;br /&gt;
&#039;&#039;&#039;Алгоритм 2. Крестовый метод (&amp;lt;math&amp;gt;k = 1&amp;lt;/math&amp;gt;)&#039;&#039;&#039;&lt;br /&gt;
&lt;br /&gt;
&#039;&#039;Инициализация:&#039;&#039;&lt;br /&gt;
 &amp;lt;math&amp;gt;I \gets {1,\dots,m}&amp;lt;/math&amp;gt;, &amp;lt;math&amp;gt;J \gets {1,\dots,n}&amp;lt;/math&amp;gt;, &amp;lt;math&amp;gt;r \gets 0&amp;lt;/math&amp;gt;, &amp;lt;math&amp;gt;U \gets []&amp;lt;/math&amp;gt;, &amp;lt;math&amp;gt;V \gets []&amp;lt;/math&amp;gt;.&lt;br /&gt;
&amp;lt;br&amp;gt;&#039;&#039;Цикл:&#039;&#039;&lt;br /&gt;
 &amp;lt;br&amp;gt;а. &amp;lt;math&amp;gt;r \gets r + 1&amp;lt;/math&amp;gt;;&lt;br /&gt;
 &amp;lt;br&amp;gt;б. Найти строку с максимальной невязкой в первом доступном столбце:&lt;br /&gt;
  &amp;lt;math&amp;gt;i \gets \arg\max_{i \in I} |A_{i, J(1)} - [UV]{i, J(1)}|&amp;lt;/math&amp;gt;;&lt;br /&gt;
 &amp;lt;br&amp;gt;в. Найти столбец с максимальной невязкой в найденной строке:&lt;br /&gt;
  &amp;lt;math&amp;gt;j \gets \arg\max{j \in J} |A_{ij} - [UV]{ij}|&amp;lt;/math&amp;gt;;&lt;br /&gt;
 &amp;lt;br&amp;gt;&amp;lt;br&amp;gt;г. Проверить критерий остановки:&lt;br /&gt;
  &amp;lt;br&amp;gt;  если &amp;lt;math&amp;gt;|(A - UV){ij}| \cdot \sqrt{(m - r)(n - r)} &amp;lt; \varepsilon |UV|F&amp;lt;/math&amp;gt;, &amp;lt;br&amp;gt;  то&lt;br /&gt;
   &amp;lt;math&amp;gt;r \gets r - 1&amp;lt;/math&amp;gt;, &amp;lt;br&amp;gt;    выйти из цикла;&lt;br /&gt;
 &amp;lt;br&amp;gt;&amp;lt;br&amp;gt;д. Обновить факторы:&lt;br /&gt;
  &amp;lt;math&amp;gt;u \gets \dfrac{A^{(j)} - [UV]^{(j)}}{\sqrt{|(A - UV){ij}|}}&amp;lt;/math&amp;gt;,&lt;br /&gt;
  &amp;lt;math&amp;gt;v \gets \dfrac{(A_{(i)} - [UV]{(i)}) \cdot \sqrt{|(A - UV){ij}|}}{(A - UV)_{ij}}&amp;lt;/math&amp;gt;;&lt;br /&gt;
 &amp;lt;br&amp;gt;&amp;lt;br&amp;gt;е. Расширить матрицы:&lt;br /&gt;
  &amp;lt;math&amp;gt;U \gets [U ; u]&amp;lt;/math&amp;gt;, &amp;lt;math&amp;gt;V \gets \begin{bmatrix} V \ v \end{bmatrix}&amp;lt;/math&amp;gt;;&lt;br /&gt;
 &amp;lt;br&amp;gt;ж. Исключить использованные индексы:&lt;br /&gt;
  &amp;lt;math&amp;gt;I \gets I \setminus {i}&amp;lt;/math&amp;gt;, &amp;lt;math&amp;gt;J \gets J \setminus {j}&amp;lt;/math&amp;gt;;&lt;br /&gt;
&amp;lt;br&amp;gt;Вернуть &amp;lt;math&amp;gt;U, V, r&amp;lt;/math&amp;gt;.&lt;br /&gt;
&amp;lt;br&amp;gt;&#039;Конец&#039;&lt;br /&gt;
&amp;lt;br&amp;gt;&lt;br /&gt;
&lt;br /&gt;
&amp;lt;br&amp;gt;Здесь &amp;lt;math&amp;gt;A^{(j)}&amp;lt;/math&amp;gt; обозначает &amp;lt;math&amp;gt;j&amp;lt;/math&amp;gt;-й столбец матрицы &amp;lt;math&amp;gt;A&amp;lt;/math&amp;gt;, а &amp;lt;math&amp;gt;A_{(i)}&amp;lt;/math&amp;gt; — &amp;lt;math&amp;gt;i&amp;lt;/math&amp;gt;-ю строку. Норма Фробениуса &amp;lt;math&amp;gt;|UV|_F&amp;lt;/math&amp;gt; пересчитывается инкрементально за &amp;lt;math&amp;gt;O((m + n) r)&amp;lt;/math&amp;gt; операций, что позволяет сохранить общую сложность алгоритма на уровне &amp;lt;math&amp;gt;O((m + n) r^2)&amp;lt;/math&amp;gt;.&lt;br /&gt;
&lt;br /&gt;
В параллельной реализации выбор индексов &amp;lt;math&amp;gt;i&amp;lt;/math&amp;gt; и &amp;lt;math&amp;gt;j&amp;lt;/math&amp;gt; выполняется совместно всеми процессорами с помощью коллективных операций (gather/broadcast), а обновление &amp;lt;math&amp;gt;U&amp;lt;/math&amp;gt; и &amp;lt;math&amp;gt;V&amp;lt;/math&amp;gt; — локально на каждом процессоре для его части строк/столбцов.&lt;/div&gt;</summary>
		<author><name>BoldyrevVV MSU</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:BoldyrevVV_MSU/%D0%9F%D0%B0%D1%80%D0%B0%D0%BB%D0%BB%D0%B5%D0%BB%D1%8C%D0%BD%D0%B0%D1%8F_%D1%80%D0%B5%D0%B0%D0%BB%D0%B8%D0%B7%D0%B0%D1%86%D0%B8%D1%8F_%D0%BC%D0%B0%D1%82%D1%80%D0%B8%D1%87%D0%BD%D0%BE%D0%B3%D0%BE_%D0%BA%D1%80%D0%B5%D1%81%D1%82%D0%BE%D0%B2%D0%BE%D0%B3%D0%BE_%D0%BC%D0%B5%D1%82%D0%BE%D0%B4%D0%B0&amp;diff=29925</id>
		<title>Участник:BoldyrevVV MSU/Параллельная реализация матричного крестового метода</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:BoldyrevVV_MSU/%D0%9F%D0%B0%D1%80%D0%B0%D0%BB%D0%BB%D0%B5%D0%BB%D1%8C%D0%BD%D0%B0%D1%8F_%D1%80%D0%B5%D0%B0%D0%BB%D0%B8%D0%B7%D0%B0%D1%86%D0%B8%D1%8F_%D0%BC%D0%B0%D1%82%D1%80%D0%B8%D1%87%D0%BD%D0%BE%D0%B3%D0%BE_%D0%BA%D1%80%D0%B5%D1%81%D1%82%D0%BE%D0%B2%D0%BE%D0%B3%D0%BE_%D0%BC%D0%B5%D1%82%D0%BE%D0%B4%D0%B0&amp;diff=29925"/>
		<updated>2025-11-04T16:32:37Z</updated>

		<summary type="html">&lt;p&gt;BoldyrevVV MSU: fix formula&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((m + n) r^2)&amp;lt;/math&amp;gt;&lt;br /&gt;
| pf_height = &amp;lt;math&amp;gt;O(r p)&amp;lt;/math&amp;gt;&lt;br /&gt;
| pf_width = &amp;lt;math&amp;gt;O\left(\left\lceil \frac{m}{p} \right\rceil + \left\lceil \frac{n}{p} \right\rceil\right) r&amp;lt;/math&amp;gt;&lt;br /&gt;
| input_data = &amp;lt;math&amp;gt;O((m + n) r)&amp;lt;/math&amp;gt; (вычисляются лишь отдельные элементы матрицы)&lt;br /&gt;
| output_data = &amp;lt;math&amp;gt;O((m + n) r)&amp;lt;/math&amp;gt; (факторы &amp;lt;math&amp;gt;U \in \mathbb{R}^{m \times r}&amp;lt;/math&amp;gt;, &amp;lt;math&amp;gt;V \in \mathbb{R}^{r \times n}&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;
&lt;br /&gt;
&#039;&#039;&#039;Матричный крестовой метод&#039;&#039;&#039; — это быстрый метод построения малорангового приближения матрицы, не требующий хранения или полного доступа ко всей матрице. Вместо этого он работает с отдельными элементами, выбор которых адаптивно определяется в ходе вычислений. Метод особенно эффективен в задачах, где матрица задана неявно — например, как функция расстояния между точками в пространстве (ядерные матрицы, ковариационные матрицы, интегральные операторы и т.п.).&lt;br /&gt;
&lt;br /&gt;
Ключевая идея основана на так называемом &#039;&#039;&#039;крестовом разложении&#039;&#039;&#039;: если известны &amp;lt;math&amp;gt;r&amp;lt;/math&amp;gt; строк и &amp;lt;math&amp;gt;r&amp;lt;/math&amp;gt; столбцов матрицы, пересечение которых образует невырожденную подматрицу, то вся матрица может быть восстановлена через интерполяцию по этим строкам и столбцам. На практике используется &#039;&#039;&#039;адаптивная схема&#039;&#039;&#039; с выбором элемента максимальной невязки на каждой итерации (аналог жадного алгоритма), что позволяет обойтись без поиска подматрицы максимального объёма.&lt;br /&gt;
&lt;br /&gt;
Важнейшее преимущество метода — малая вычислительная стоимость: для построения приближения ранга &amp;lt;math&amp;gt;r&amp;lt;/math&amp;gt; требуется &amp;lt;math&amp;gt;O((m + n) r)&amp;lt;/math&amp;gt; вычислений элементов матрицы и &amp;lt;math&amp;gt;O((m + n) r^2)&amp;lt;/math&amp;gt; арифметических операций.&lt;br /&gt;
&lt;br /&gt;
В условиях современных суперкомпьютеров и больших размерностей (&amp;lt;math&amp;gt;m, n \sim 10^5&amp;lt;/math&amp;gt; и выше) естественным шагом становится параллельная реализация, предложенная в работе Желткова и Тыртышникова (2015). Она распределяет строки и столбцы матрицы между процессорами и использует коллективные операции для глобального выбора доминирующего элемента невязки.&lt;br /&gt;
&lt;br /&gt;
==== Особенности параллельной реализации ====&lt;br /&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;. На каждой итерации:&lt;br /&gt;
&lt;br /&gt;
процессоры совместно находят глобальный максимум невязки с помощью операций &amp;lt;math&amp;gt;\texttt{Gather}&amp;lt;/math&amp;gt; и &amp;lt;math&amp;gt;\texttt{Broadcast}&amp;lt;/math&amp;gt;;&lt;br /&gt;
соответствующие строки и столбцы обновляются локально;&lt;br /&gt;
норма Фробениуса текущего приближения пересчитывается распределённо, без полного сбора данных.&lt;br /&gt;
Эта стратегия позволяет сохранить низкую коммуникационную сложность: каждый процессор выполняет &amp;lt;math&amp;gt;O(r)&amp;lt;/math&amp;gt; обменов, а длина каждого сообщения не превышает &amp;lt;math&amp;gt;r&amp;lt;/math&amp;gt;. При этом трудоёмкость на один процессор снижается до &amp;lt;math&amp;gt;O\left(\left(\left\lceil \frac{m}{p} \right\rceil + \left\lceil \frac{n}{p} \right\rceil\right) r^2\right)&amp;lt;/math&amp;gt;, а количество вычисляемых элементов — до &amp;lt;math&amp;gt;O\left(\left(\left\lceil \frac{m}{p} \right\rceil + \left\lceil \frac{n}{p} \right\rceil\right) r\right)&amp;lt;/math&amp;gt;.&lt;br /&gt;
&lt;br /&gt;
=== Математическое описание алгоритма ===&lt;br /&gt;
&lt;br /&gt;
Пусть задана матрица &amp;lt;math&amp;gt;A \in \mathbb{R}^{m \times n}&amp;lt;/math&amp;gt;. Цель — построить её малоранговое приближение вида &amp;lt;math&amp;gt;A \approx UV&amp;lt;/math&amp;gt;, где &amp;lt;math&amp;gt;U \in \mathbb{R}^{m \times r}&amp;lt;/math&amp;gt;, &amp;lt;math&amp;gt;V \in \mathbb{R}^{r \times n}&amp;lt;/math&amp;gt;, а ранг &amp;lt;math&amp;gt;r \ll \min(m,n)&amp;lt;/math&amp;gt;.&lt;br /&gt;
&lt;br /&gt;
Общая схема крестового метода основана на последовательном выделении строк и столбцов, содержащих подматрицу максимального (или достаточно большого) объёма. В обобщённом виде она выглядит следующим образом:&lt;br /&gt;
&lt;br /&gt;
&#039;&#039;&#039;Алгоритм 1. Схема крестового метода&#039;&#039;&#039;&amp;lt;br&amp;gt;&lt;br /&gt;
&lt;br /&gt;
&#039;&#039;Инициализация:&#039;&#039;&lt;br /&gt;
 &amp;lt;math&amp;gt;I \gets {1,\dots,m}&amp;lt;/math&amp;gt;, &amp;lt;math&amp;gt;J \gets {1,\dots,n}&amp;lt;/math&amp;gt;, &amp;lt;math&amp;gt;r \gets 0&lt;br /&gt;
&amp;lt;/math&amp;gt;.&lt;br /&gt;
&amp;lt;br&amp;gt;&#039;&#039;Повторять:&#039;&#039;&amp;lt;br&amp;gt;&lt;br /&gt;
 а. &amp;lt;math&amp;gt;r \gets r + 1&amp;lt;/math&amp;gt;;&amp;lt;br&amp;gt;&lt;br /&gt;
 б. Найти подмножества индексов &amp;lt;math&amp;gt;I_* \subset I&amp;lt;/math&amp;gt;, &amp;lt;math&amp;gt;J_* \subset J&amp;lt;/math&amp;gt; (размера &amp;lt;math&amp;gt;k&amp;lt;/math&amp;gt;), такие что подматрица &amp;lt;math&amp;gt;A[I_*, J_*]&amp;lt;/math&amp;gt; имеет достаточно большой объём (процедура &amp;lt;math&amp;gt;\texttt{maxvol}&amp;lt;/math&amp;gt;);&amp;lt;br&amp;gt;&lt;br /&gt;
 в. Выбрать столбцы: &amp;lt;math&amp;gt;C_r \gets A[:, J_*]&amp;lt;/math&amp;gt;;&amp;lt;br&amp;gt;&lt;br /&gt;
 г. Выбрать строки: &amp;lt;math&amp;gt;R_r \gets A[I_*, :]&amp;lt;/math&amp;gt;;&amp;lt;br&amp;gt;&lt;br /&gt;
 д. Выделить ядро: &amp;lt;math&amp;gt;\hat{A}r \gets A[I, J_]&amp;lt;/math&amp;gt;;&amp;lt;br&amp;gt;&lt;br /&gt;
 е. Обновить текущую невязку: &amp;lt;math&amp;gt;A \gets A - C_r \hat{A}r^{-1} R_r&amp;lt;/math&amp;gt;;&amp;lt;br&amp;gt;&lt;br /&gt;
 ж. Исключить использованные индексы: &amp;lt;math&amp;gt;I \gets I \setminus I_*&amp;lt;/math&amp;gt;, &amp;lt;math&amp;gt;J \gets J \setminus J_*&amp;lt;/math&amp;gt;;&amp;lt;br&amp;gt;&lt;br /&gt;
До выполнения критерия остановки.&amp;lt;br&amp;gt;&lt;br /&gt;
В рассматриваемой работе используется частный случай этой схемы при &amp;lt;math&amp;gt;k = 1&amp;lt;/math&amp;gt;, то есть на каждой итерации выбирается один элемент с максимальной по модулю невязкой. В этом случае подматрица &amp;lt;math&amp;gt;\hat{A}_r&amp;lt;/math&amp;gt; — скаляр, а обновление факторов происходит по явным формулам.&lt;br /&gt;
&lt;br /&gt;
&#039;&#039;&#039;Алгоритм 2. Крестовый метод (&amp;lt;math&amp;gt;k = 1&amp;lt;/math&amp;gt;)&#039;&#039;&#039;&lt;br /&gt;
&lt;br /&gt;
&#039;&#039;Инициализация:&#039;&#039;&lt;br /&gt;
 &amp;lt;math&amp;gt;I \gets {1,\dots,m}&amp;lt;/math&amp;gt;, &amp;lt;math&amp;gt;J \gets {1,\dots,n}&amp;lt;/math&amp;gt;, &amp;lt;math&amp;gt;r \gets 0&amp;lt;/math&amp;gt;, &amp;lt;math&amp;gt;U \gets []&amp;lt;/math&amp;gt;, &amp;lt;math&amp;gt;V \gets []&amp;lt;/math&amp;gt;.&lt;br /&gt;
&#039;&#039;Цикл:&#039;&#039;&lt;br /&gt;
 &amp;lt;br&amp;gt;а. &amp;lt;math&amp;gt;r \gets r + 1&amp;lt;/math&amp;gt;;&lt;br /&gt;
 &amp;lt;br&amp;gt;б. Найти строку с максимальной невязкой в первом доступном столбце:&lt;br /&gt;
  &amp;lt;math&amp;gt;i \gets \arg\max_{i \in I} |A_{i, J(1)} - [UV]{i, J(1)}|&amp;lt;/math&amp;gt;;&lt;br /&gt;
 &amp;lt;br&amp;gt;в. Найти столбец с максимальной невязкой в найденной строке:&lt;br /&gt;
  &amp;lt;math&amp;gt;j \gets \arg\max{j \in J} |A_{ij} - [UV]{ij}|&amp;lt;/math&amp;gt;;&lt;br /&gt;
 &amp;lt;br&amp;gt;&amp;lt;br&amp;gt;г. Проверить критерий остановки:&lt;br /&gt;
  если &amp;lt;math&amp;gt;|(A - UV){ij}| \cdot \sqrt{(m - r)(n - r)} &amp;lt; \varepsilon |UV|F&amp;lt;/math&amp;gt;, то&lt;br /&gt;
   &amp;lt;math&amp;gt;r \gets r - 1&amp;lt;/math&amp;gt;, выйти из цикла;&lt;br /&gt;
 &amp;lt;br&amp;gt;&amp;lt;br&amp;gt;д. Обновить факторы:&lt;br /&gt;
  &amp;lt;math&amp;gt;u \gets \dfrac{A^{(j)} - [UV]^{(j)}}{\sqrt{|(A - UV){ij}|}}&amp;lt;/math&amp;gt;,&lt;br /&gt;
  &amp;lt;math&amp;gt;v \gets \dfrac{(A_{(i)} - [UV]{(i)}) \cdot \sqrt{|(A - UV){ij}|}}{(A - UV)_{ij}}&amp;lt;/math&amp;gt;;&lt;br /&gt;
 &amp;lt;br&amp;gt;&amp;lt;br&amp;gt;е. Расширить матрицы:&lt;br /&gt;
  &amp;lt;math&amp;gt;U \gets [U ; u]&amp;lt;/math&amp;gt;, &amp;lt;math&amp;gt;V \gets \begin{bmatrix} V \ v \end{bmatrix}&amp;lt;/math&amp;gt;;&lt;br /&gt;
 &amp;lt;br&amp;gt;ж. Исключить использованные индексы:&lt;br /&gt;
  &amp;lt;math&amp;gt;I \gets I \setminus {i}&amp;lt;/math&amp;gt;, &amp;lt;math&amp;gt;J \gets J \setminus {j}&amp;lt;/math&amp;gt;;&lt;br /&gt;
&amp;lt;br&amp;gt;Вернуть &amp;lt;math&amp;gt;U, V, r&amp;lt;/math&amp;gt;.&lt;br /&gt;
&amp;lt;br&amp;gt;Здесь &amp;lt;math&amp;gt;A^{(j)}&amp;lt;/math&amp;gt; обозначает &amp;lt;math&amp;gt;j&amp;lt;/math&amp;gt;-й столбец матрицы &amp;lt;math&amp;gt;A&amp;lt;/math&amp;gt;, а &amp;lt;math&amp;gt;A_{(i)}&amp;lt;/math&amp;gt; — &amp;lt;math&amp;gt;i&amp;lt;/math&amp;gt;-ю строку. Норма Фробениуса &amp;lt;math&amp;gt;|UV|_F&amp;lt;/math&amp;gt; пересчитывается инкрементально за &amp;lt;math&amp;gt;O((m + n) r)&amp;lt;/math&amp;gt; операций, что позволяет сохранить общую сложность алгоритма на уровне &amp;lt;math&amp;gt;O((m + n) r^2)&amp;lt;/math&amp;gt;.&lt;br /&gt;
&lt;br /&gt;
В параллельной реализации выбор индексов &amp;lt;math&amp;gt;i&amp;lt;/math&amp;gt; и &amp;lt;math&amp;gt;j&amp;lt;/math&amp;gt; выполняется совместно всеми процессорами с помощью коллективных операций (gather/broadcast), а обновление &amp;lt;math&amp;gt;U&amp;lt;/math&amp;gt; и &amp;lt;math&amp;gt;V&amp;lt;/math&amp;gt; — локально на каждом процессоре для его части строк/столбцов.&lt;/div&gt;</summary>
		<author><name>BoldyrevVV MSU</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:BoldyrevVV_MSU/%D0%9F%D0%B0%D1%80%D0%B0%D0%BB%D0%BB%D0%B5%D0%BB%D1%8C%D0%BD%D0%B0%D1%8F_%D1%80%D0%B5%D0%B0%D0%BB%D0%B8%D0%B7%D0%B0%D1%86%D0%B8%D1%8F_%D0%BC%D0%B0%D1%82%D1%80%D0%B8%D1%87%D0%BD%D0%BE%D0%B3%D0%BE_%D0%BA%D1%80%D0%B5%D1%81%D1%82%D0%BE%D0%B2%D0%BE%D0%B3%D0%BE_%D0%BC%D0%B5%D1%82%D0%BE%D0%B4%D0%B0&amp;diff=29924</id>
		<title>Участник:BoldyrevVV MSU/Параллельная реализация матричного крестового метода</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:BoldyrevVV_MSU/%D0%9F%D0%B0%D1%80%D0%B0%D0%BB%D0%BB%D0%B5%D0%BB%D1%8C%D0%BD%D0%B0%D1%8F_%D1%80%D0%B5%D0%B0%D0%BB%D0%B8%D0%B7%D0%B0%D1%86%D0%B8%D1%8F_%D0%BC%D0%B0%D1%82%D1%80%D0%B8%D1%87%D0%BD%D0%BE%D0%B3%D0%BE_%D0%BA%D1%80%D0%B5%D1%81%D1%82%D0%BE%D0%B2%D0%BE%D0%B3%D0%BE_%D0%BC%D0%B5%D1%82%D0%BE%D0%B4%D0%B0&amp;diff=29924"/>
		<updated>2025-11-04T16:29:47Z</updated>

		<summary type="html">&lt;p&gt;BoldyrevVV MSU: fix formula&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((m + n) r^2)&amp;lt;/math&amp;gt;&lt;br /&gt;
| pf_height = &amp;lt;math&amp;gt;O(r p)&amp;lt;/math&amp;gt;&lt;br /&gt;
| pf_width = &amp;lt;math&amp;gt;O\left(\left\lceil \frac{m}{p} \right\rceil + \left\lceil \frac{n}{p} \right\rceil\right) r&amp;lt;/math&amp;gt;&lt;br /&gt;
| input_data = &amp;lt;math&amp;gt;O((m + n) r)&amp;lt;/math&amp;gt; (вычисляются лишь отдельные элементы матрицы)&lt;br /&gt;
| output_data = &amp;lt;math&amp;gt;O((m + n) r)&amp;lt;/math&amp;gt; (факторы &amp;lt;math&amp;gt;U \in \mathbb{R}^{m \times r}&amp;lt;/math&amp;gt;, &amp;lt;math&amp;gt;V \in \mathbb{R}^{r \times n}&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;
&lt;br /&gt;
&#039;&#039;&#039;Матричный крестовой метод&#039;&#039;&#039; — это быстрый метод построения малорангового приближения матрицы, не требующий хранения или полного доступа ко всей матрице. Вместо этого он работает с отдельными элементами, выбор которых адаптивно определяется в ходе вычислений. Метод особенно эффективен в задачах, где матрица задана неявно — например, как функция расстояния между точками в пространстве (ядерные матрицы, ковариационные матрицы, интегральные операторы и т.п.).&lt;br /&gt;
&lt;br /&gt;
Ключевая идея основана на так называемом &#039;&#039;&#039;крестовом разложении&#039;&#039;&#039;: если известны &amp;lt;math&amp;gt;r&amp;lt;/math&amp;gt; строк и &amp;lt;math&amp;gt;r&amp;lt;/math&amp;gt; столбцов матрицы, пересечение которых образует невырожденную подматрицу, то вся матрица может быть восстановлена через интерполяцию по этим строкам и столбцам. На практике используется &#039;&#039;&#039;адаптивная схема&#039;&#039;&#039; с выбором элемента максимальной невязки на каждой итерации (аналог жадного алгоритма), что позволяет обойтись без поиска подматрицы максимального объёма.&lt;br /&gt;
&lt;br /&gt;
Важнейшее преимущество метода — малая вычислительная стоимость: для построения приближения ранга &amp;lt;math&amp;gt;r&amp;lt;/math&amp;gt; требуется &amp;lt;math&amp;gt;O((m + n) r)&amp;lt;/math&amp;gt; вычислений элементов матрицы и &amp;lt;math&amp;gt;O((m + n) r^2)&amp;lt;/math&amp;gt; арифметических операций.&lt;br /&gt;
&lt;br /&gt;
В условиях современных суперкомпьютеров и больших размерностей (&amp;lt;math&amp;gt;m, n \sim 10^5&amp;lt;/math&amp;gt; и выше) естественным шагом становится параллельная реализация, предложенная в работе Желткова и Тыртышникова (2015). Она распределяет строки и столбцы матрицы между процессорами и использует коллективные операции для глобального выбора доминирующего элемента невязки.&lt;br /&gt;
&lt;br /&gt;
==== Особенности параллельной реализации ====&lt;br /&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;. На каждой итерации:&lt;br /&gt;
&lt;br /&gt;
процессоры совместно находят глобальный максимум невязки с помощью операций &amp;lt;math&amp;gt;\texttt{Gather}&amp;lt;/math&amp;gt; и &amp;lt;math&amp;gt;\texttt{Broadcast}&amp;lt;/math&amp;gt;;&lt;br /&gt;
соответствующие строки и столбцы обновляются локально;&lt;br /&gt;
норма Фробениуса текущего приближения пересчитывается распределённо, без полного сбора данных.&lt;br /&gt;
Эта стратегия позволяет сохранить низкую коммуникационную сложность: каждый процессор выполняет &amp;lt;math&amp;gt;O(r)&amp;lt;/math&amp;gt; обменов, а длина каждого сообщения не превышает &amp;lt;math&amp;gt;r&amp;lt;/math&amp;gt;. При этом трудоёмкость на один процессор снижается до &amp;lt;math&amp;gt;O\left(\left(\left\lceil \frac{m}{p} \right\rceil + \left\lceil \frac{n}{p} \right\rceil\right) r^2\right)&amp;lt;/math&amp;gt;, а количество вычисляемых элементов — до &amp;lt;math&amp;gt;O\left(\left(\left\lceil \frac{m}{p} \right\rceil + \left\lceil \frac{n}{p} \right\rceil\right) r\right)&amp;lt;/math&amp;gt;.&lt;br /&gt;
&lt;br /&gt;
=== Математическое описание алгоритма ===&lt;br /&gt;
&lt;br /&gt;
Пусть задана матрица &amp;lt;math&amp;gt;A \in \mathbb{R}^{m \times n}&amp;lt;/math&amp;gt;. Цель — построить её малоранговое приближение вида &amp;lt;math&amp;gt;A \approx UV&amp;lt;/math&amp;gt;, где &amp;lt;math&amp;gt;U \in \mathbb{R}^{m \times r}&amp;lt;/math&amp;gt;, &amp;lt;math&amp;gt;V \in \mathbb{R}^{r \times n}&amp;lt;/math&amp;gt;, а ранг &amp;lt;math&amp;gt;r \ll \min(m,n)&amp;lt;/math&amp;gt;.&lt;br /&gt;
&lt;br /&gt;
Общая схема крестового метода основана на последовательном выделении строк и столбцов, содержащих подматрицу максимального (или достаточно большого) объёма. В обобщённом виде она выглядит следующим образом:&lt;br /&gt;
&lt;br /&gt;
&#039;&#039;&#039;Алгоритм 1. Схема крестового метода&#039;&#039;&#039;&amp;lt;br&amp;gt;&lt;br /&gt;
&lt;br /&gt;
&#039;&#039;Инициализация:&#039;&#039;&lt;br /&gt;
 &amp;lt;math&amp;gt;I \gets {1,\dots,m}&amp;lt;/math&amp;gt;, &amp;lt;math&amp;gt;J \gets {1,\dots,n}&amp;lt;/math&amp;gt;, &amp;lt;math&amp;gt;r \gets 0&lt;br /&gt;
&amp;lt;/math&amp;gt;.&lt;br /&gt;
&amp;lt;br&amp;gt;&#039;&#039;Повторять:&#039;&#039;&amp;lt;br&amp;gt;&lt;br /&gt;
 а. &amp;lt;math&amp;gt;r \gets r + 1&amp;lt;/math&amp;gt;;&amp;lt;br&amp;gt;&lt;br /&gt;
 б. Найти подмножества индексов &amp;lt;math&amp;gt;I_* \subset I&amp;lt;/math&amp;gt;, &amp;lt;math&amp;gt;J_* \subset J&amp;lt;/math&amp;gt; (размера &amp;lt;math&amp;gt;k&amp;lt;/math&amp;gt;), такие что подматрица &amp;lt;math&amp;gt;A[I_*, J_*]&amp;lt;/math&amp;gt; имеет достаточно большой объём (процедура &amp;lt;math&amp;gt;\texttt{maxvol}&amp;lt;/math&amp;gt;);&amp;lt;br&amp;gt;&lt;br /&gt;
 в. Выбрать столбцы: &amp;lt;math&amp;gt;C_r \gets A[:, J_*]&amp;lt;/math&amp;gt;;&amp;lt;br&amp;gt;&lt;br /&gt;
 г. Выбрать строки: &amp;lt;math&amp;gt;R_r \gets A[I_*, :]&amp;lt;/math&amp;gt;;&amp;lt;br&amp;gt;&lt;br /&gt;
 д. Выделить ядро: &amp;lt;math&amp;gt;\hat{A}r \gets A[I, J_]&amp;lt;/math&amp;gt;;&amp;lt;br&amp;gt;&lt;br /&gt;
 е. Обновить текущую невязку: &amp;lt;math&amp;gt;A \gets A - C_r \hat{A}r^{-1} R_r&amp;lt;/math&amp;gt;;&amp;lt;br&amp;gt;&lt;br /&gt;
 ж. Исключить использованные индексы: &amp;lt;math&amp;gt;I \gets I \setminus I&amp;lt;/math&amp;gt;, &amp;lt;math&amp;gt;J \gets J \setminus J_&amp;lt;/math&amp;gt;;&amp;lt;br&amp;gt;&lt;br /&gt;
До выполнения критерия остановки.&amp;lt;br&amp;gt;&lt;br /&gt;
В рассматриваемой работе используется частный случай этой схемы при &amp;lt;math&amp;gt;k = 1&amp;lt;/math&amp;gt;, то есть на каждой итерации выбирается один элемент с максимальной по модулю невязкой. В этом случае подматрица &amp;lt;math&amp;gt;\hat{A}_r&amp;lt;/math&amp;gt; — скаляр, а обновление факторов происходит по явным формулам.&lt;br /&gt;
&lt;br /&gt;
&#039;&#039;&#039;Алгоритм 2. Крестовый метод (&amp;lt;math&amp;gt;k = 1&amp;lt;/math&amp;gt;)&#039;&#039;&#039;&lt;br /&gt;
&lt;br /&gt;
&#039;&#039;Инициализация:&#039;&#039;&lt;br /&gt;
 &amp;lt;math&amp;gt;I \gets {1,\dots,m}&amp;lt;/math&amp;gt;, &amp;lt;math&amp;gt;J \gets {1,\dots,n}&amp;lt;/math&amp;gt;, &amp;lt;math&amp;gt;r \gets 0&amp;lt;/math&amp;gt;, &amp;lt;math&amp;gt;U \gets []&amp;lt;/math&amp;gt;, &amp;lt;math&amp;gt;V \gets []&amp;lt;/math&amp;gt;.&lt;br /&gt;
&#039;&#039;Цикл:&#039;&#039;&lt;br /&gt;
 &amp;lt;br&amp;gt;а. &amp;lt;math&amp;gt;r \gets r + 1&amp;lt;/math&amp;gt;;&lt;br /&gt;
 &amp;lt;br&amp;gt;б. Найти строку с максимальной невязкой в первом доступном столбце:&lt;br /&gt;
  &amp;lt;math&amp;gt;i \gets \arg\max_{i \in I} |A_{i, J(1)} - [UV]{i, J(1)}|&amp;lt;/math&amp;gt;;&lt;br /&gt;
 &amp;lt;br&amp;gt;в. Найти столбец с максимальной невязкой в найденной строке:&lt;br /&gt;
  &amp;lt;math&amp;gt;j \gets \arg\max{j \in J} |A_{ij} - [UV]{ij}|&amp;lt;/math&amp;gt;;&lt;br /&gt;
 &amp;lt;br&amp;gt;г. Проверить критерий остановки:&lt;br /&gt;
  если &amp;lt;math&amp;gt;|(A - UV){ij}| \cdot \sqrt{(m - r)(n - r)} &amp;lt; \varepsilon |UV|F&amp;lt;/math&amp;gt;, то&lt;br /&gt;
   &amp;lt;math&amp;gt;r \gets r - 1&amp;lt;/math&amp;gt;, выйти из цикла;&lt;br /&gt;
 &amp;lt;br&amp;gt;д. Обновить факторы:&lt;br /&gt;
  &amp;lt;math&amp;gt;u \gets \dfrac{A^{(j)} - [UV]^{(j)}}{\sqrt{|(A - UV){ij}|}}&amp;lt;/math&amp;gt;,&lt;br /&gt;
  &amp;lt;math&amp;gt;v \gets \dfrac{(A_{(i)} - [UV]{(i)}) \cdot \sqrt{|(A - UV){ij}|}}{(A - UV)_{ij}}&amp;lt;/math&amp;gt;;&lt;br /&gt;
 &amp;lt;br&amp;gt;е. Расширить матрицы:&lt;br /&gt;
  &amp;lt;math&amp;gt;U \gets [U ; u]&amp;lt;/math&amp;gt;, &amp;lt;math&amp;gt;V \gets \begin{bmatrix} V \ v \end{bmatrix}&amp;lt;/math&amp;gt;;&lt;br /&gt;
 &amp;lt;br&amp;gt;ж. Исключить использованные индексы:&lt;br /&gt;
  &amp;lt;math&amp;gt;I \gets I \setminus {i}&amp;lt;/math&amp;gt;, &amp;lt;math&amp;gt;J \gets J \setminus {j}&amp;lt;/math&amp;gt;;&lt;br /&gt;
&amp;lt;br&amp;gt;Вернуть &amp;lt;math&amp;gt;U, V, r&amp;lt;/math&amp;gt;.&lt;br /&gt;
&amp;lt;br&amp;gt;Здесь &amp;lt;math&amp;gt;A^{(j)}&amp;lt;/math&amp;gt; обозначает &amp;lt;math&amp;gt;j&amp;lt;/math&amp;gt;-й столбец матрицы &amp;lt;math&amp;gt;A&amp;lt;/math&amp;gt;, а &amp;lt;math&amp;gt;A_{(i)}&amp;lt;/math&amp;gt; — &amp;lt;math&amp;gt;i&amp;lt;/math&amp;gt;-ю строку. Норма Фробениуса &amp;lt;math&amp;gt;|UV|_F&amp;lt;/math&amp;gt; пересчитывается инкрементально за &amp;lt;math&amp;gt;O((m + n) r)&amp;lt;/math&amp;gt; операций, что позволяет сохранить общую сложность алгоритма на уровне &amp;lt;math&amp;gt;O((m + n) r^2)&amp;lt;/math&amp;gt;.&lt;br /&gt;
&lt;br /&gt;
В параллельной реализации выбор индексов &amp;lt;math&amp;gt;i&amp;lt;/math&amp;gt; и &amp;lt;math&amp;gt;j&amp;lt;/math&amp;gt; выполняется совместно всеми процессорами с помощью коллективных операций (gather/broadcast), а обновление &amp;lt;math&amp;gt;U&amp;lt;/math&amp;gt; и &amp;lt;math&amp;gt;V&amp;lt;/math&amp;gt; — локально на каждом процессоре для его части строк/столбцов.&lt;/div&gt;</summary>
		<author><name>BoldyrevVV MSU</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:BoldyrevVV_MSU/%D0%9F%D0%B0%D1%80%D0%B0%D0%BB%D0%BB%D0%B5%D0%BB%D1%8C%D0%BD%D0%B0%D1%8F_%D1%80%D0%B5%D0%B0%D0%BB%D0%B8%D0%B7%D0%B0%D1%86%D0%B8%D1%8F_%D0%BC%D0%B0%D1%82%D1%80%D0%B8%D1%87%D0%BD%D0%BE%D0%B3%D0%BE_%D0%BA%D1%80%D0%B5%D1%81%D1%82%D0%BE%D0%B2%D0%BE%D0%B3%D0%BE_%D0%BC%D0%B5%D1%82%D0%BE%D0%B4%D0%B0&amp;diff=29920</id>
		<title>Участник:BoldyrevVV MSU/Параллельная реализация матричного крестового метода</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:BoldyrevVV_MSU/%D0%9F%D0%B0%D1%80%D0%B0%D0%BB%D0%BB%D0%B5%D0%BB%D1%8C%D0%BD%D0%B0%D1%8F_%D1%80%D0%B5%D0%B0%D0%BB%D0%B8%D0%B7%D0%B0%D1%86%D0%B8%D1%8F_%D0%BC%D0%B0%D1%82%D1%80%D0%B8%D1%87%D0%BD%D0%BE%D0%B3%D0%BE_%D0%BA%D1%80%D0%B5%D1%81%D1%82%D0%BE%D0%B2%D0%BE%D0%B3%D0%BE_%D0%BC%D0%B5%D1%82%D0%BE%D0%B4%D0%B0&amp;diff=29920"/>
		<updated>2025-11-04T16:23:11Z</updated>

		<summary type="html">&lt;p&gt;BoldyrevVV MSU: add description&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((m + n) r^2)&amp;lt;/math&amp;gt;&lt;br /&gt;
| pf_height = &amp;lt;math&amp;gt;O(r p)&amp;lt;/math&amp;gt;&lt;br /&gt;
| pf_width = &amp;lt;math&amp;gt;O\left(\left\lceil \frac{m}{p} \right\rceil + \left\lceil \frac{n}{p} \right\rceil\right) r&amp;lt;/math&amp;gt;&lt;br /&gt;
| input_data = &amp;lt;math&amp;gt;O((m + n) r)&amp;lt;/math&amp;gt; (вычисляются лишь отдельные элементы матрицы)&lt;br /&gt;
| output_data = &amp;lt;math&amp;gt;O((m + n) r)&amp;lt;/math&amp;gt; (факторы &amp;lt;math&amp;gt;U \in \mathbb{R}^{m \times r}&amp;lt;/math&amp;gt;, &amp;lt;math&amp;gt;V \in \mathbb{R}^{r \times n}&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;
&lt;br /&gt;
&#039;&#039;&#039;Матричный крестовой метод&#039;&#039;&#039; — это быстрый метод построения малорангового приближения матрицы, не требующий хранения или полного доступа ко всей матрице. Вместо этого он работает с отдельными элементами, выбор которых адаптивно определяется в ходе вычислений. Метод особенно эффективен в задачах, где матрица задана неявно — например, как функция расстояния между точками в пространстве (ядерные матрицы, ковариационные матрицы, интегральные операторы и т.п.).&lt;br /&gt;
&lt;br /&gt;
Ключевая идея основана на так называемом &#039;&#039;&#039;крестовом разложении&#039;&#039;&#039;: если известны &amp;lt;math&amp;gt;r&amp;lt;/math&amp;gt; строк и &amp;lt;math&amp;gt;r&amp;lt;/math&amp;gt; столбцов матрицы, пересечение которых образует невырожденную подматрицу, то вся матрица может быть восстановлена через интерполяцию по этим строкам и столбцам. На практике используется &#039;&#039;&#039;адаптивная схема&#039;&#039;&#039; с выбором элемента максимальной невязки на каждой итерации (аналог жадного алгоритма), что позволяет обойтись без поиска подматрицы максимального объёма.&lt;br /&gt;
&lt;br /&gt;
Важнейшее преимущество метода — малая вычислительная стоимость: для построения приближения ранга &amp;lt;math&amp;gt;r&amp;lt;/math&amp;gt; требуется &amp;lt;math&amp;gt;O((m + n) r)&amp;lt;/math&amp;gt; вычислений элементов матрицы и &amp;lt;math&amp;gt;O((m + n) r^2)&amp;lt;/math&amp;gt; арифметических операций.&lt;br /&gt;
&lt;br /&gt;
В условиях современных суперкомпьютеров и больших размерностей (&amp;lt;math&amp;gt;m, n \sim 10^5&amp;lt;/math&amp;gt; и выше) естественным шагом становится параллельная реализация, предложенная в работе Желткова и Тыртышникова (2015). Она распределяет строки и столбцы матрицы между процессорами и использует коллективные операции для глобального выбора доминирующего элемента невязки.&lt;br /&gt;
&lt;br /&gt;
==== Особенности параллельной реализации ====&lt;br /&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;. На каждой итерации:&lt;br /&gt;
&lt;br /&gt;
процессоры совместно находят глобальный максимум невязки с помощью операций &amp;lt;math&amp;gt;\texttt{Gather}&amp;lt;/math&amp;gt; и &amp;lt;math&amp;gt;\texttt{Broadcast}&amp;lt;/math&amp;gt;;&lt;br /&gt;
соответствующие строки и столбцы обновляются локально;&lt;br /&gt;
норма Фробениуса текущего приближения пересчитывается распределённо, без полного сбора данных.&lt;br /&gt;
Эта стратегия позволяет сохранить низкую коммуникационную сложность: каждый процессор выполняет &amp;lt;math&amp;gt;O(r)&amp;lt;/math&amp;gt; обменов, а длина каждого сообщения не превышает &amp;lt;math&amp;gt;r&amp;lt;/math&amp;gt;. При этом трудоёмкость на один процессор снижается до &amp;lt;math&amp;gt;O\left(\left(\left\lceil \frac{m}{p} \right\rceil + \left\lceil \frac{n}{p} \right\rceil\right) r^2\right)&amp;lt;/math&amp;gt;, а количество вычисляемых элементов — до &amp;lt;math&amp;gt;O\left(\left(\left\lceil \frac{m}{p} \right\rceil + \left\lceil \frac{n}{p} \right\rceil\right) r\right)&amp;lt;/math&amp;gt;.&lt;br /&gt;
&lt;br /&gt;
=== Математическое описание алгоритма ===&lt;br /&gt;
&lt;br /&gt;
Пусть задана матрица &amp;lt;math&amp;gt;A \in \mathbb{R}^{m \times n}&amp;lt;/math&amp;gt;. Цель — построить её малоранговое приближение вида &amp;lt;math&amp;gt;A \approx UV&amp;lt;/math&amp;gt;, где &amp;lt;math&amp;gt;U \in \mathbb{R}^{m \times r}&amp;lt;/math&amp;gt;, &amp;lt;math&amp;gt;V \in \mathbb{R}^{r \times n}&amp;lt;/math&amp;gt;, а ранг &amp;lt;math&amp;gt;r \ll \min(m,n)&amp;lt;/math&amp;gt;.&lt;br /&gt;
&lt;br /&gt;
Общая схема крестового метода основана на последовательном выделении строк и столбцов, содержащих подматрицу максимального (или достаточно большого) объёма. В обобщённом виде она выглядит следующим образом:&lt;br /&gt;
&lt;br /&gt;
Алгоритм 1. Схема крестового метода&amp;lt;br&amp;gt;&lt;br /&gt;
&lt;br /&gt;
&lt;br /&gt;
Инициализация:&lt;br /&gt;
 &amp;lt;math&amp;gt;I \gets {1,\dots,m}&amp;lt;/math&amp;gt;, &amp;lt;math&amp;gt;J \gets {1,\dots,n}&amp;lt;/math&amp;gt;, &amp;lt;math&amp;gt;r \gets 0&lt;br /&gt;
&amp;lt;/math&amp;gt;.&lt;br /&gt;
&amp;lt;br&amp;gt;Повторять:&amp;lt;br&amp;gt;&lt;br /&gt;
 а. &amp;lt;math&amp;gt;r \gets r + 1&amp;lt;/math&amp;gt;;&amp;lt;br&amp;gt;&lt;br /&gt;
 б. Найти подмножества индексов &amp;lt;math&amp;gt;I_* \subset I&amp;lt;/math&amp;gt;, &amp;lt;math&amp;gt;J_* \subset J&amp;lt;/math&amp;gt; (размера &amp;lt;math&amp;gt;k&amp;lt;/math&amp;gt;), такие что подматрица &amp;lt;math&amp;gt;A[I_*, J_*]&amp;lt;/math&amp;gt; имеет достаточно большой объём (процедура &amp;lt;math&amp;gt;\texttt{maxvol}&amp;lt;/math&amp;gt;);&amp;lt;br&amp;gt;&lt;br /&gt;
 в. Выбрать столбцы: &amp;lt;math&amp;gt;C_r \gets A[:, J_*]&amp;lt;/math&amp;gt;;&amp;lt;br&amp;gt;&lt;br /&gt;
 г. Выбрать строки: &amp;lt;math&amp;gt;R_r \gets A[I_*, :]&amp;lt;/math&amp;gt;;&amp;lt;br&amp;gt;&lt;br /&gt;
 д. Выделить ядро: &amp;lt;math&amp;gt;\hat{A}r \gets A[I, J_]&amp;lt;/math&amp;gt;;&amp;lt;br&amp;gt;&lt;br /&gt;
 е. Обновить текущую невязку: &amp;lt;math&amp;gt;A \gets A - C_r \hat{A}r^{-1} R_r&amp;lt;/math&amp;gt;;&amp;lt;br&amp;gt;&lt;br /&gt;
 ж. Исключить использованные индексы: &amp;lt;math&amp;gt;I \gets I \setminus I&amp;lt;/math&amp;gt;, &amp;lt;math&amp;gt;J \gets J \setminus J_&amp;lt;/math&amp;gt;;&amp;lt;br&amp;gt;&lt;br /&gt;
До выполнения критерия остановки.&amp;lt;br&amp;gt;&lt;br /&gt;
В рассматриваемой работе используется частный случай этой схемы при &amp;lt;math&amp;gt;k = 1&amp;lt;/math&amp;gt;, то есть на каждой итерации выбирается один элемент с максимальной по модулю невязкой. В этом случае подматрица &amp;lt;math&amp;gt;\hat{A}_r&amp;lt;/math&amp;gt; — скаляр, а обновление факторов происходит по явным формулам.&lt;br /&gt;
&lt;br /&gt;
Алгоритм 2. Крестовый метод (&amp;lt;math&amp;gt;k = 1&amp;lt;/math&amp;gt;)&lt;br /&gt;
&lt;br /&gt;
Инициализация:&lt;br /&gt;
 &amp;lt;math&amp;gt;I \gets {1,\dots,m}&amp;lt;/math&amp;gt;, &amp;lt;math&amp;gt;J \gets {1,\dots,n}&amp;lt;/math&amp;gt;, &amp;lt;math&amp;gt;r \gets 0&amp;lt;/math&amp;gt;, &amp;lt;math&amp;gt;U \gets []&amp;lt;/math&amp;gt;, &amp;lt;math&amp;gt;V \gets []&amp;lt;/math&amp;gt;.&lt;br /&gt;
Цикл:&lt;br /&gt;
 &amp;lt;br&amp;gt;а. &amp;lt;math&amp;gt;r \gets r + 1&amp;lt;/math&amp;gt;;&lt;br /&gt;
 &amp;lt;br&amp;gt;б. Найти строку с максимальной невязкой в первом доступном столбце:&lt;br /&gt;
  &amp;lt;math&amp;gt;i \gets \arg\max_{i \in I} |A_{i, J(1)} - [UV]{i, J(1)}|&amp;lt;/math&amp;gt;;&lt;br /&gt;
 &amp;lt;br&amp;gt;в. Найти столбец с максимальной невязкой в найденной строке:&lt;br /&gt;
  &amp;lt;math&amp;gt;j \gets \arg\max{j \in J} |A_{ij} - [UV]{ij}|&amp;lt;/math&amp;gt;;&lt;br /&gt;
 &amp;lt;br&amp;gt;г. Проверить критерий остановки:&lt;br /&gt;
  если &amp;lt;math&amp;gt;|(A - UV){ij}| \cdot \sqrt{(m - r)(n - r)} &amp;lt; \varepsilon |UV|F&amp;lt;/math&amp;gt;, то&lt;br /&gt;
   &amp;lt;math&amp;gt;r \gets r - 1&amp;lt;/math&amp;gt;, выйти из цикла;&lt;br /&gt;
 &amp;lt;br&amp;gt;д. Обновить факторы:&lt;br /&gt;
  &amp;lt;math&amp;gt;u \gets \dfrac{A^{(j)} - [UV]^{(j)}}{\sqrt{|(A - UV){ij}|}}&amp;lt;/math&amp;gt;,&lt;br /&gt;
  &amp;lt;math&amp;gt;v \gets \dfrac{(A_{(i)} - [UV]{(i)}) \cdot \sqrt{|(A - UV){ij}|}}{(A - UV)_{ij}}&amp;lt;/math&amp;gt;;&lt;br /&gt;
 &amp;lt;br&amp;gt;е. Расширить матрицы:&lt;br /&gt;
  &amp;lt;math&amp;gt;U \gets [U ; u]&amp;lt;/math&amp;gt;, &amp;lt;math&amp;gt;V \gets \begin{bmatrix} V \ v \end{bmatrix}&amp;lt;/math&amp;gt;;&lt;br /&gt;
 &amp;lt;br&amp;gt;ж. Исключить использованные индексы:&lt;br /&gt;
  &amp;lt;math&amp;gt;I \gets I \setminus {i}&amp;lt;/math&amp;gt;, &amp;lt;math&amp;gt;J \gets J \setminus {j}&amp;lt;/math&amp;gt;;&lt;br /&gt;
&amp;lt;br&amp;gt;Вернуть &amp;lt;math&amp;gt;U, V, r&amp;lt;/math&amp;gt;.&lt;br /&gt;
&amp;lt;br&amp;gt;Здесь &amp;lt;math&amp;gt;A^{(j)}&amp;lt;/math&amp;gt; обозначает &amp;lt;math&amp;gt;j&amp;lt;/math&amp;gt;-й столбец матрицы &amp;lt;math&amp;gt;A&amp;lt;/math&amp;gt;, а &amp;lt;math&amp;gt;A_{(i)}&amp;lt;/math&amp;gt; — &amp;lt;math&amp;gt;i&amp;lt;/math&amp;gt;-ю строку. Норма Фробениуса &amp;lt;math&amp;gt;|UV|_F&amp;lt;/math&amp;gt; пересчитывается инкрементально за &amp;lt;math&amp;gt;O((m + n) r)&amp;lt;/math&amp;gt; операций, что позволяет сохранить общую сложность алгоритма на уровне &amp;lt;math&amp;gt;O((m + n) r^2)&amp;lt;/math&amp;gt;.&lt;br /&gt;
&lt;br /&gt;
В параллельной реализации выбор индексов &amp;lt;math&amp;gt;i&amp;lt;/math&amp;gt; и &amp;lt;math&amp;gt;j&amp;lt;/math&amp;gt; выполняется совместно всеми процессорами с помощью коллективных операций (gather/broadcast), а обновление &amp;lt;math&amp;gt;U&amp;lt;/math&amp;gt; и &amp;lt;math&amp;gt;V&amp;lt;/math&amp;gt; — локально на каждом процессоре для его части строк/столбцов.&lt;/div&gt;</summary>
		<author><name>BoldyrevVV MSU</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:BoldyrevVV_MSU/%D0%9F%D0%B0%D1%80%D0%B0%D0%BB%D0%BB%D0%B5%D0%BB%D1%8C%D0%BD%D0%B0%D1%8F_%D1%80%D0%B5%D0%B0%D0%BB%D0%B8%D0%B7%D0%B0%D1%86%D0%B8%D1%8F_%D0%BC%D0%B0%D1%82%D1%80%D0%B8%D1%87%D0%BD%D0%BE%D0%B3%D0%BE_%D0%BA%D1%80%D0%B5%D1%81%D1%82%D0%BE%D0%B2%D0%BE%D0%B3%D0%BE_%D0%BC%D0%B5%D1%82%D0%BE%D0%B4%D0%B0&amp;diff=29865</id>
		<title>Участник:BoldyrevVV MSU/Параллельная реализация матричного крестового метода</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:BoldyrevVV_MSU/%D0%9F%D0%B0%D1%80%D0%B0%D0%BB%D0%BB%D0%B5%D0%BB%D1%8C%D0%BD%D0%B0%D1%8F_%D1%80%D0%B5%D0%B0%D0%BB%D0%B8%D0%B7%D0%B0%D1%86%D0%B8%D1%8F_%D0%BC%D0%B0%D1%82%D1%80%D0%B8%D1%87%D0%BD%D0%BE%D0%B3%D0%BE_%D0%BA%D1%80%D0%B5%D1%81%D1%82%D0%BE%D0%B2%D0%BE%D0%B3%D0%BE_%D0%BC%D0%B5%D1%82%D0%BE%D0%B4%D0%B0&amp;diff=29865"/>
		<updated>2025-11-03T17:53:52Z</updated>

		<summary type="html">&lt;p&gt;BoldyrevVV MSU: init&lt;/p&gt;
&lt;hr /&gt;
&lt;div&gt;init&lt;/div&gt;</summary>
		<author><name>BoldyrevVV MSU</name></author>
	</entry>
</feed>