<?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=BDA</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=BDA"/>
	<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/BDA"/>
	<updated>2026-10-22T18:03:00Z</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:BDA/%D0%9E%D1%80%D1%82%D0%BE%D0%B3%D0%BE%D0%BD%D0%B0%D0%BB%D0%B8%D0%B7%D0%B0%D1%86%D0%B8%D1%8F_%D0%93%D1%80%D0%B0%D0%BC%D0%B0-%D0%A8%D0%BC%D0%B8%D0%B4%D1%82%D0%B0&amp;diff=18477</id>
		<title>Участник:BDA/Ортогонализация Грама-Шмидта</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:BDA/%D0%9E%D1%80%D1%82%D0%BE%D0%B3%D0%BE%D0%BD%D0%B0%D0%BB%D0%B8%D0%B7%D0%B0%D1%86%D0%B8%D1%8F_%D0%93%D1%80%D0%B0%D0%BC%D0%B0-%D0%A8%D0%BC%D0%B8%D0%B4%D1%82%D0%B0&amp;diff=18477"/>
		<updated>2016-11-19T14:44:58Z</updated>

		<summary type="html">&lt;p&gt;BDA: /* Свойства и структура алгоритма */&lt;/p&gt;
&lt;hr /&gt;
&lt;div&gt;{{Assignment}}&lt;br /&gt;
&lt;br /&gt;
{{algorithm&lt;br /&gt;
| name              = Ортогонализация Грама-Шмидта&lt;br /&gt;
| serial_complexity = &amp;lt;math&amp;gt;O(nm^2)&amp;lt;/math&amp;gt;&lt;br /&gt;
| pf_height         = &amp;lt;math&amp;gt;O(nm)&amp;lt;/math&amp;gt;&lt;br /&gt;
| pf_width          = &amp;lt;math&amp;gt;O(m)&amp;lt;/math&amp;gt;&lt;br /&gt;
| input_data        = &amp;lt;math&amp;gt;nm&amp;lt;/math&amp;gt;&lt;br /&gt;
| output_data       = &amp;lt;math&amp;gt;nm&amp;lt;/math&amp;gt;&lt;br /&gt;
}}&lt;br /&gt;
&lt;br /&gt;
Основные авторы описания: [[Участник:Zodiac|Белов Н. А.]] (пункты 1.3, 1.4, 1.5, 1.6, 1.9, 1.10, 2.4, 2.7, 3), [[Участник:BDA|Богомолов Д. А.]] (пункты 1.1, 1.2, 1.6, 1.7, 1.8, 2.4, 3).&lt;br /&gt;
&lt;br /&gt;
== Свойства и структура алгоритма ==&lt;br /&gt;
=== Общее описание алгоритма ===&lt;br /&gt;
&lt;br /&gt;
Ортогонализация ― алгоритм построения для данной линейно независимой системы векторов евклидова или эрмитова пространства V ортогональной системы ненулевых векторов, порождающих то же самое подпространство в V.&lt;br /&gt;
&lt;br /&gt;
Ортогонализация Грама–Шмидта&amp;lt;ref&amp;gt;Канатников А.Н., Крищенко А.П. Линейная алгебра. ― 3-е изд., стер. ― М.: Изд-во МГТУ им. Н.Э. Баумана, 2002&amp;lt;/ref&amp;gt; (процесс Грама–Шмидта) ― наиболее известный алгоритм ортогонализации. Назван в честь Йоргена Педерсена Грама&amp;lt;ref&amp;gt;O&#039;Connor, John J., Robertson, Edmund F. Jørgen Pedersen Gram ― MacTutor History of Mathematics archive, University of St Andrews.&amp;lt;/ref&amp;gt; и Эрхарда Шмидта&amp;lt;ref&amp;gt;O&#039;Connor, John J., Robertson, Edmund F. Erhard Schmidt ― MacTutor History of Mathematics archive, University of St Andrews.&amp;lt;/ref&amp;gt;, однако ранее уже появлялся в работах Лапласа и Коши. Является частным случаем разложения Ивасавы, так как может быть представлен как разложение невырожденной квадратной матрицы в произведение ортогональной (или унитарной матрицы в случае эрмитова пространства) и верхнетреугольной матрицы с положительными диагональными элементами.&lt;br /&gt;
&lt;br /&gt;
Рассматриваемый алгоритм применяется для борьбы с помехами в адаптивной системе селекции движущихся целей&amp;lt;ref&amp;gt;Орешкин Б.Н., Бакулев П.А. Быстрая процедура ортогонализации Грамма-Шмидта и ее применение для борьбы с помехами в адаптивной системе селекции движущихся целей ― Радиотехника / №12 за 2007 г.&amp;lt;/ref&amp;gt;, в протоколах безопасности&amp;lt;ref&amp;gt;Пискова А.В., Менщиков А.А., Коробейников А.Г. Использование ортогонализации Грама-Шмидта в алгоритме приведения базиса решетки для протоколов безопасности ― Вопросы кибербезопасности №1(14) 2016&amp;lt;/ref&amp;gt;, для повышения экономичности алгоритмов оценивания параметров моделей объектов управления&amp;lt;ref&amp;gt;Карелин А.Е., Светлаков А.А. Использование ортогонализации Грама-Шмидта для повышения экономичности многоточечных алгоритмов рекуррентного оценивания параметров моделей объектов управления ― Известия Томского политехнического университета [Известия ТПУ]. — 2006. — Т. 309, № 8. — [С. 15-19].&amp;lt;/ref&amp;gt; и в других областях.&lt;br /&gt;
&lt;br /&gt;
=== Математическое описание алгоритма ===&lt;br /&gt;
&#039;&#039;&#039;Входные данные.&#039;&#039;&#039; &amp;lt;math&amp;gt;m&amp;lt;/math&amp;gt; линейно независимых векторов &amp;lt;math&amp;gt;\mathbf{a}_1,...,\mathbf{a}_m&amp;lt;/math&amp;gt; c размерностью пространства &amp;lt;math&amp;gt;n&amp;lt;/math&amp;gt;, записанных в матрице &amp;lt;math&amp;gt;A&amp;lt;/math&amp;gt; с элементами &amp;lt;math&amp;gt;\alpha_{ij}&amp;lt;/math&amp;gt;.&lt;br /&gt;
&lt;br /&gt;
&#039;&#039;&#039;Выходные данные.&#039;&#039;&#039; &amp;lt;math&amp;gt;m&amp;lt;/math&amp;gt; ортогональных векторов &amp;lt;math&amp;gt;\mathbf{b}_1,...,\mathbf{b}_m&amp;lt;/math&amp;gt; c размерностью пространства &amp;lt;math&amp;gt;n&amp;lt;/math&amp;gt;, записанных в матрице &amp;lt;math&amp;gt;B&amp;lt;/math&amp;gt; с элементами &amp;lt;math&amp;gt;\beta_{ij}&amp;lt;/math&amp;gt;.&lt;br /&gt;
&lt;br /&gt;
Определим оператор проекции (проецирует вектор &amp;lt;math&amp;gt;\mathbf{a}&amp;lt;/math&amp;gt; коллинеарно вектору &amp;lt;math&amp;gt;\mathbf{b}&amp;lt;/math&amp;gt;) &amp;lt;math&amp;gt;\mathbf{proj_b a = \frac{\left \langle a,b \right \rangle}{\left \langle b,b \right \rangle }b}&amp;lt;/math&amp;gt;, где &amp;lt;math&amp;gt;\mathbf{\left \langle a,b \right \rangle}&amp;lt;/math&amp;gt; ― скалярное произведение векторов &amp;lt;math&amp;gt;\mathbf{a}&amp;lt;/math&amp;gt; и &amp;lt;math&amp;gt;\mathbf{b}&amp;lt;/math&amp;gt;.&lt;br /&gt;
&lt;br /&gt;
Тогда ортогональные векторы вычисляются следующим образом:&lt;br /&gt;
&lt;br /&gt;
&amp;lt;math&amp;gt;\mathbf{b}_1 = \mathbf{a}_1&amp;lt;/math&amp;gt;&lt;br /&gt;
&lt;br /&gt;
&amp;lt;math&amp;gt;\mathbf{b}_2 = \mathbf{a}_2 - \mathbf{proj}_{\mathbf{b}_1} \mathbf{a}_2 &amp;lt;/math&amp;gt;&lt;br /&gt;
&lt;br /&gt;
&amp;lt;math&amp;gt;\mathbf{b}_3 = \mathbf{a}_3 - \mathbf{proj}_{\mathbf{b}_1} \mathbf{a}_3 - \mathbf{proj}_{\mathbf{b}_2} \mathbf{a}_3 &amp;lt;/math&amp;gt;&lt;br /&gt;
&lt;br /&gt;
&amp;lt;math&amp;gt;\vdots&amp;lt;/math&amp;gt;&lt;br /&gt;
&lt;br /&gt;
&amp;lt;math&amp;gt;\mathbf{b}_m = \mathbf{a}_m - \sum_{j=1}^{m-1} \mathbf{proj}_{\mathbf{b}_j} \mathbf{a}_m&amp;lt;/math&amp;gt;&lt;br /&gt;
&lt;br /&gt;
Или поэлементно:&lt;br /&gt;
&lt;br /&gt;
&amp;lt;math&amp;gt;\beta_{1j} = \alpha_{1j}&amp;lt;/math&amp;gt;&lt;br /&gt;
&lt;br /&gt;
&amp;lt;math&amp;gt;\beta_{ij} = \alpha_{ij} - (\sum_{k=1}^{i-1} \mathbf{proj}_{\mathbf{b}_k} \mathbf{a}_i)_j = \alpha_{ij} - \sum_{k=1}^{i-1}\frac{\sum_{s=1}^{n}\alpha_{is}\beta_{ks}}{\sum_{s=1}^{n}\beta_{ks}\beta_{ks}}\beta_{kj} &amp;lt;/math&amp;gt;&lt;br /&gt;
&lt;br /&gt;
=== Вычислительное ядро алгоритма ===&lt;br /&gt;
Основное время работы алгоритма приходится на вычисление сумм &amp;lt;math&amp;gt;\sum_{i=1}^{j-1} \mathbf{proj}_{\mathbf{b}_i} \mathbf{a}_k \forall j: j=\overline{1, m}&amp;lt;/math&amp;gt;.&lt;br /&gt;
&lt;br /&gt;
=== Макроструктура алгоритма ===&lt;br /&gt;
Из [[#Математическое описание алгоритма|математического описания алгоритма]] и [[#Вычислительное ядро алгоритма|описания ядра алгоритма]] в предыдущих разделах следует, что основную часть данного метода составляют операции вычисления проекций векторов, а также их сумм. Таким образом, в алгоритме можно выделить следующие макрооперации: скалярное произведение векторов в количестве &amp;lt;math&amp;gt;(m-1)m&amp;lt;/math&amp;gt;, а также множественные (всего &amp;lt;math&amp;gt;m-1&amp;lt;/math&amp;gt;) вычисления сумм &amp;lt;math&amp;gt;\mathbf{a}_i - \sum_{j=1}^{i-1} \frac{\left \langle a_i,b_j \right \rangle}{\left \langle b_j,b_j \right \rangle }b_j&amp;lt;/math&amp;gt;.&lt;br /&gt;
&lt;br /&gt;
Макроструктура может быть представлена в следующем виде:	&lt;br /&gt;
# Вычисление проекций &amp;lt;math&amp;gt;\mathbf{proj}_{\mathbf{b}_j} \mathbf{a}_i \forall j: j=\overline{1, i - 1}&amp;lt;/math&amp;gt; для текущего шага &amp;lt;math&amp;gt;i&amp;lt;/math&amp;gt;.	&lt;br /&gt;
# Вычисление суммы &amp;lt;math&amp;gt;\mathbf{a}_i - \sum_{j=1}^{i-1} \frac{\left \langle a_i,b_j \right \rangle}{\left \langle b_j,b_j \right \rangle }b_j&amp;lt;/math&amp;gt; для текущего шага &amp;lt;math&amp;gt;i&amp;lt;/math&amp;gt;.&lt;br /&gt;
# Переход на следующий шаг.&lt;br /&gt;
&lt;br /&gt;
=== Схема реализации последовательного алгоритма ===&lt;br /&gt;
Рассмотрим алгоритм, написанный в виде функции для математической системы MATLAB.&lt;br /&gt;
&lt;br /&gt;
&#039;&#039;&#039;Входные данные.&#039;&#039;&#039;&lt;br /&gt;
&lt;br /&gt;
Матрица &amp;lt;math&amp;gt;A&amp;lt;/math&amp;gt; с линейно-независимыми векторами в столбцах.&lt;br /&gt;
&lt;br /&gt;
&#039;&#039;&#039;Выходные данные.&#039;&#039;&#039;&lt;br /&gt;
&lt;br /&gt;
Матрица &amp;lt;math&amp;gt;Q&amp;lt;/math&amp;gt; с ортонормированным базисом &amp;lt;math&amp;gt;A&amp;lt;/math&amp;gt;.&lt;br /&gt;
&lt;br /&gt;
&#039;&#039;&#039;Использование.&#039;&#039;&#039;&lt;br /&gt;
&amp;lt;source lang=&amp;quot;matlab&amp;quot;&amp;gt;&lt;br /&gt;
Q = gramschmidt( A );&lt;br /&gt;
&amp;lt;/source&amp;gt;&lt;br /&gt;
&lt;br /&gt;
&#039;&#039;&#039;Реализация.&#039;&#039;&#039;&lt;br /&gt;
&amp;lt;source lang=&amp;quot;matlab&amp;quot;&amp;gt;&lt;br /&gt;
function Q = gramschmidt( A )&lt;br /&gt;
% Число векторов.&lt;br /&gt;
n = size( A, 2 );&lt;br /&gt;
 &lt;br /&gt;
% Инициализируем выходную матрицу.&lt;br /&gt;
Q = zeros( n );&lt;br /&gt;
 &lt;br /&gt;
% Преобразуем каждый вектор в базисный:&lt;br /&gt;
% (1) j-ый базисный вектор будет ортогонален каждому из предыдущих 1..j-1 векторов;&lt;br /&gt;
% (2) будет единичной длины.&lt;br /&gt;
for j = 1 : n&lt;br /&gt;
    % Выбираем j-ый вектор&lt;br /&gt;
    u = A( :, j );&lt;br /&gt;
    &lt;br /&gt;
    % Специальный случай для j = 1: просто нормируем этот вектор и помещаем&lt;br /&gt;
    % первым в найденный базис, так как нет векторов, относительно которых&lt;br /&gt;
    % нужно было бы делать его ортогональным.&lt;br /&gt;
&lt;br /&gt;
    % Удаляем из оригинального вектора &amp;quot;u&amp;quot; все компоненты натянутые на базис&lt;br /&gt;
    % из векторов 1..j-1, их вклад будет удален.&lt;br /&gt;
    % =&amp;gt; j-ый вектор ортогонален остальным.&lt;br /&gt;
    % Предыдущие базисные вектора были найдены на предыдуших шагах.&lt;br /&gt;
    % =&amp;gt; соблюдаем принцип ортогональности, но не ортонормированности.&lt;br /&gt;
    for i = 1 : j - 1&lt;br /&gt;
        u = u - proj( Q(:,i), A(:,j) );&lt;br /&gt;
    end&lt;br /&gt;
     &lt;br /&gt;
    % Нормируем вектор&lt;br /&gt;
    Q(:,j) = u ./ norm( u );&lt;br /&gt;
end&lt;br /&gt;
end&lt;br /&gt;
 &lt;br /&gt;
% Проекция вектора &amp;quot;a&amp;quot; коллинеарно вектору &amp;quot;e&amp;quot;.&lt;br /&gt;
function p = proj( e, a )&lt;br /&gt;
p = (e&#039; * a) / (e&#039; * e) .* e;&lt;br /&gt;
end&lt;br /&gt;
&amp;lt;/source&amp;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;.&lt;br /&gt;
&lt;br /&gt;
# Скалярное произведение векторов требует &amp;lt;math&amp;gt;n-1&amp;lt;/math&amp;gt; сложение и &amp;lt;math&amp;gt;n&amp;lt;/math&amp;gt; произведений.&lt;br /&gt;
# Вычитание проекции вектора требует &amp;lt;math&amp;gt;2&amp;lt;/math&amp;gt; скалярных произведения, &amp;lt;math&amp;gt;1&amp;lt;/math&amp;gt; деление, &amp;lt;math&amp;gt;n&amp;lt;/math&amp;gt; произведений и &amp;lt;math&amp;gt;n&amp;lt;/math&amp;gt; сложений, то есть:&lt;br /&gt;
## &amp;lt;math&amp;gt;3n-2&amp;lt;/math&amp;gt; (&amp;lt;math&amp;gt;+&amp;lt;/math&amp;gt;);&lt;br /&gt;
## &amp;lt;math&amp;gt;3n&amp;lt;/math&amp;gt; (&amp;lt;math&amp;gt;\times&amp;lt;/math&amp;gt;);&lt;br /&gt;
## &amp;lt;math&amp;gt;1&amp;lt;/math&amp;gt; (&amp;lt;math&amp;gt;\div&amp;lt;/math&amp;gt;).&lt;br /&gt;
# Вычисление &amp;lt;math&amp;gt;i&amp;lt;/math&amp;gt;-го вектора требует &amp;lt;math&amp;gt;i-1&amp;lt;/math&amp;gt; вычитаний проекций, то есть:&lt;br /&gt;
## &amp;lt;math&amp;gt;(3n-2)(i-1)&amp;lt;/math&amp;gt; (&amp;lt;math&amp;gt;+&amp;lt;/math&amp;gt;);&lt;br /&gt;
## &amp;lt;math&amp;gt;3n(i-1)&amp;lt;/math&amp;gt; (&amp;lt;math&amp;gt;\times&amp;lt;/math&amp;gt;);&lt;br /&gt;
## &amp;lt;math&amp;gt;i-1&amp;lt;/math&amp;gt; (&amp;lt;math&amp;gt;\div&amp;lt;/math&amp;gt;).&lt;br /&gt;
# Мы вычисляем вектора от &amp;lt;math&amp;gt;i=1&amp;lt;/math&amp;gt; до &amp;lt;math&amp;gt;m&amp;lt;/math&amp;gt;, поэтому множители &amp;lt;math&amp;gt;(i-1)&amp;lt;/math&amp;gt; выражаются &#039;&#039;треугольным числом&#039;&#039; &amp;lt;math&amp;gt;(m-1)\frac{m}{2}&amp;lt;/math&amp;gt;.&lt;br /&gt;
## &amp;lt;math&amp;gt;(3n-2)(m-1)\frac{m}{2}&amp;lt;/math&amp;gt; (&amp;lt;math&amp;gt;+&amp;lt;/math&amp;gt;);&lt;br /&gt;
## &amp;lt;math&amp;gt;3n(m-1)\frac{m}{2}&amp;lt;/math&amp;gt; (&amp;lt;math&amp;gt;\times&amp;lt;/math&amp;gt;);&lt;br /&gt;
## &amp;lt;math&amp;gt;(m-1)\frac{m}{2}&amp;lt;/math&amp;gt; (&amp;lt;math&amp;gt;\div&amp;lt;/math&amp;gt;).&lt;br /&gt;
&lt;br /&gt;
Таким образом, cложность алгоритма &amp;lt;math&amp;gt;O(nm^2)&amp;lt;/math&amp;gt;.&lt;br /&gt;
&lt;br /&gt;
=== Информационный граф ===&lt;br /&gt;
Граф состоит из элементов 2 видов: прямоугольников и овалов. Прямоугольниками обозначаются данные, причем красному цвету соответствуют входные данные, а зеленому ― выходные. Овалы означают операции над переданными данными. Голубым цветом обозначены более сложно организованные операции, а синим ― менее. Для нахождения &amp;lt;math&amp;gt;\mathbf{b}_i&amp;lt;/math&amp;gt; вектора требуются значения всех векторов с номерами, меньшими &amp;lt;math&amp;gt;i&amp;lt;/math&amp;gt;, однако, расчеты проекций можно начинать, не дожидаясь вычисления всех векторов, а производить сразу, как только соответствующий ортогональный вектор будет рассчитан. Эта зависимость и отражена на графе ниже.&lt;br /&gt;
[[Файл:Gram_schmidt_graph.png|thumb|800px|center|frame|Рисунок 1. Информационный граф алгоритма Грама-Шмидта.]]&lt;br /&gt;
&lt;br /&gt;
=== Ресурс параллелизма алгоритма ===&lt;br /&gt;
Для построения базиса методом Грама–Шмидта в параллельном случае, имея в распоряжении &amp;lt;math&amp;gt;m&amp;lt;/math&amp;gt; и более потоков, необходимо выполнить следующие ярусы:&lt;br /&gt;
#&amp;lt;math&amp;gt;m-1&amp;lt;/math&amp;gt; ярус вычисления проекций;&lt;br /&gt;
#&amp;lt;math&amp;gt;m-1&amp;lt;/math&amp;gt; ярус вычитания векторов.&lt;br /&gt;
&lt;br /&gt;
Эти ярусы чередуются. Количество операций проекции и вычитания векторов уменьшается на единицу в каждом следующем ярусе. Вычисление проекции вектора требует 2 скалярных произведения, 1 деление и &amp;lt;math&amp;gt;n&amp;lt;/math&amp;gt; произведений, то есть:&lt;br /&gt;
#&amp;lt;math&amp;gt;2n-2&amp;lt;/math&amp;gt; (&amp;lt;math&amp;gt;+&amp;lt;/math&amp;gt;);&lt;br /&gt;
#&amp;lt;math&amp;gt;3n&amp;lt;/math&amp;gt; (&amp;lt;math&amp;gt;\times&amp;lt;/math&amp;gt;);&lt;br /&gt;
#&amp;lt;math&amp;gt;1&amp;lt;/math&amp;gt; (&amp;lt;math&amp;gt;\div&amp;lt;/math&amp;gt;).&lt;br /&gt;
&lt;br /&gt;
Если считать, что вычисление проекции происходит последовательно, то сложность по высоте &amp;lt;math&amp;gt;O(n)&amp;lt;/math&amp;gt;, по ширине &amp;lt;math&amp;gt;O(1)&amp;lt;/math&amp;gt; (то есть одна операция проекции в ярусе представляется набором ярусов с простыми последовательными операциями). В самом первом ярусе находится &amp;lt;math&amp;gt;m-1&amp;lt;/math&amp;gt; проекций и это наибольшее количество операций проекций, тогда сложность по высоте будет &amp;lt;math&amp;gt;O(n)&amp;lt;/math&amp;gt;, по ширине ― &amp;lt;math&amp;gt;O(m)&amp;lt;/math&amp;gt;.&lt;br /&gt;
&lt;br /&gt;
Вычисление вычитания векторов требует &amp;lt;math&amp;gt;n&amp;lt;/math&amp;gt; вычитаний, и если считать, что операция происходит последовательно, то сложность по высоте &amp;lt;math&amp;gt;O(n)&amp;lt;/math&amp;gt;, по ширине &amp;lt;math&amp;gt;O(1)&amp;lt;/math&amp;gt;. Во втором ярусе находится &amp;lt;math&amp;gt;m-1&amp;lt;/math&amp;gt; вычитаний и это наибольшее количество операций вычитаний, тогда сложность по высоте будет &amp;lt;math&amp;gt;O(n)&amp;lt;/math&amp;gt;, по ширине ― &amp;lt;math&amp;gt;O(m)&amp;lt;/math&amp;gt;.&lt;br /&gt;
&lt;br /&gt;
Из вышеизложенного следует, что при классификации по ширине ЯПФ алгоритм имеет сложность &amp;lt;math&amp;gt;O(m)&amp;lt;/math&amp;gt;, а по высоте ― &amp;lt;math&amp;gt;O(nm)&amp;lt;/math&amp;gt;.&lt;br /&gt;
&lt;br /&gt;
=== Входные и выходные данные алгоритма ===&lt;br /&gt;
&#039;&#039;&#039;Входные данные.&#039;&#039;&#039; Матрица &amp;lt;math&amp;gt;A&amp;lt;/math&amp;gt; с элементами &amp;lt;math&amp;gt;\alpha_{ij}&amp;lt;/math&amp;gt;, где &amp;lt;math&amp;gt;i = \overline{1, m}&amp;lt;/math&amp;gt; (количество линейно независимых векторов) и &amp;lt;math&amp;gt;j = \overline{1, n}&amp;lt;/math&amp;gt; (размерность пространства), при этом &amp;lt;math&amp;gt;m \leqslant n&amp;lt;/math&amp;gt;.&lt;br /&gt;
&lt;br /&gt;
&#039;&#039;&#039;Объем входных данных.&#039;&#039;&#039; &amp;lt;math&amp;gt;mn&amp;lt;/math&amp;gt;&lt;br /&gt;
&lt;br /&gt;
&#039;&#039;&#039;Выходные данные.&#039;&#039;&#039; Матрица &amp;lt;math&amp;gt;B&amp;lt;/math&amp;gt; с элементами &amp;lt;math&amp;gt;\beta_{ij}&amp;lt;/math&amp;gt;, где &amp;lt;math&amp;gt;i = \overline{1, m}&amp;lt;/math&amp;gt; и &amp;lt;math&amp;gt;j = \overline{1, n}&amp;lt;/math&amp;gt;, тогда &amp;lt;math&amp;gt;b_{1}, \dots, b_{m}&amp;lt;/math&amp;gt; — система ортогональных векторов.&lt;br /&gt;
&lt;br /&gt;
&#039;&#039;&#039;Объем выходных данных.&#039;&#039;&#039; &amp;lt;math&amp;gt;mn&amp;lt;/math&amp;gt;&lt;br /&gt;
&lt;br /&gt;
=== Свойства алгоритма ===&lt;br /&gt;
&amp;lt;ol&amp;gt;&lt;br /&gt;
&amp;lt;li&amp;gt;Отношение последовательной и параллельной сложности в предположении доступности неограниченного числа необходимых ресурсов — &amp;lt;math&amp;gt;m&amp;lt;/math&amp;gt;. При этом необходимо отметить, что отношение числа операций к суммарному объему входных и выходных данных (вычислительная мощность алгоритма) — линейное.&amp;lt;/li&amp;gt;&lt;br /&gt;
&lt;br /&gt;
&amp;lt;li&amp;gt;Алгоритм почти полностью детерминирован, то есть гарантирована единственность результата выполнения. Это означает, что возможно накопление ошибок округления, то есть векторы выходной матрицы часто не точно ортогональны. Из-за потери ортогональности в процессе вычислений классический процесс Грама-Шмидта называют численно неустойчивым. Однако, процесс Грама-Шмидта может быть сделан более вычислительно устойчивым путём небольшой модификации. Такой алгоритм называется модифицированным процессом Грама-Шмидта. Рассмотрим его отличие подробнее.&lt;br /&gt;
&amp;lt;br /&amp;gt;&lt;br /&gt;
&amp;lt;math&amp;gt; &lt;br /&gt;
\begin{array}{l}&lt;br /&gt;
\mathbf{b}_j\\&lt;br /&gt;
  \\&lt;br /&gt;
\mathbf{b}_j&lt;br /&gt;
\end{array}&lt;br /&gt;
&lt;br /&gt;
\begin{array}{c}&lt;br /&gt;
= \\&lt;br /&gt;
  \\&lt;br /&gt;
=&lt;br /&gt;
\end{array}&lt;br /&gt;
&lt;br /&gt;
\underbrace{&lt;br /&gt;
\underbrace{&lt;br /&gt;
\underbrace{&lt;br /&gt;
&lt;br /&gt;
\begin{array}{c}&lt;br /&gt;
\mathbf{a}_j \\&lt;br /&gt;
   \\&lt;br /&gt;
\mathbf{a}_j&lt;br /&gt;
\end{array}&lt;br /&gt;
&lt;br /&gt;
\begin{array}{c}&lt;br /&gt;
- \\&lt;br /&gt;
  \\&lt;br /&gt;
-&lt;br /&gt;
\end{array}&lt;br /&gt;
&lt;br /&gt;
\begin{array}{c}&lt;br /&gt;
\mathbf{proj}_{\mathbf{b}_1}\,\mathbf{a}_j \\&lt;br /&gt;
   ||                                      \\&lt;br /&gt;
\mathbf{proj}_{\mathbf{b}_1}\,\mathbf{a}_j&lt;br /&gt;
\end{array}&lt;br /&gt;
&lt;br /&gt;
}_{\mathbf{a}_j^{(1)}}&lt;br /&gt;
&lt;br /&gt;
\begin{array}{c}&lt;br /&gt;
- \\&lt;br /&gt;
  \\&lt;br /&gt;
-&lt;br /&gt;
\end{array}&lt;br /&gt;
&lt;br /&gt;
\begin{array}{c}&lt;br /&gt;
\mathbf{proj}_{\mathbf{b}_2}\,\mathbf{a}_j       \\&lt;br /&gt;
   ||                                            \\&lt;br /&gt;
\mathbf{proj}_{\mathbf{b}_2}\,\mathbf{a}_j^{(1)}&lt;br /&gt;
\end{array}&lt;br /&gt;
&lt;br /&gt;
}_{\mathbf{a}_j^{(2)}}&lt;br /&gt;
&lt;br /&gt;
\begin{array}{c}&lt;br /&gt;
- \\&lt;br /&gt;
  \\&lt;br /&gt;
-&lt;br /&gt;
\end{array}&lt;br /&gt;
&lt;br /&gt;
\begin{array}{c}&lt;br /&gt;
\mathbf{proj}_{\mathbf{b}_3}\,\mathbf{a}_j       \\&lt;br /&gt;
   ||                                            \\&lt;br /&gt;
\mathbf{proj}_{\mathbf{b}_3}\,\mathbf{a}_j^{(2)}&lt;br /&gt;
\end{array}&lt;br /&gt;
&lt;br /&gt;
}_{\mathbf{a}_j^{(3)}}&lt;br /&gt;
&lt;br /&gt;
\begin{array}{ccc}&lt;br /&gt;
- &amp;amp; \ldots &amp;amp; - \\&lt;br /&gt;
               \\&lt;br /&gt;
- &amp;amp; \ldots &amp;amp; - &lt;br /&gt;
\end{array}&lt;br /&gt;
&lt;br /&gt;
\begin{array}{cc}&lt;br /&gt;
\mathbf{proj}_{\mathbf{b}_{j-1}}\,\mathbf{a}_j         &amp;amp; (1) \\&lt;br /&gt;
   ||                                                  &amp;amp;      \\&lt;br /&gt;
\mathbf{proj}_{\mathbf{b}_{j-1}}\,\mathbf{a}_j^{(j-2)} &amp;amp; (2)&lt;br /&gt;
\end{array}&lt;br /&gt;
&lt;br /&gt;
&amp;lt;/math&amp;gt;&lt;br /&gt;
&amp;lt;br /&amp;gt;&lt;br /&gt;
Формула (1) показывает вычисление &amp;lt;math&amp;gt;\mathbf{b}_j&amp;lt;/math&amp;gt; в классическом процессе, а формула (2) — в модифицированном.&lt;br /&gt;
&amp;lt;br /&amp;gt;&lt;br /&gt;
Разница между ними заключается в том, от каких векторов вычисляются компоненты: от &amp;lt;math&amp;gt;\mathbf{a}_j&amp;lt;/math&amp;gt; в классическом процессе или от результата предыдущего вычитания, то есть от &amp;lt;math&amp;gt;\mathbf{a}_j^{(k)}&amp;lt;/math&amp;gt; в модифицированном процессе. Таким образом, &amp;lt;math&amp;gt;\mathbf{a}_j^{(k)}&amp;lt;/math&amp;gt; представляет собой &amp;lt;math&amp;gt;\mathbf{a}_j&amp;lt;/math&amp;gt;, из которого удалены компоненты в направлениях &amp;lt;math&amp;gt;\mathbf{b}_1,\,\;\ldots,\;\mathbf{b}_{k}&amp;lt;/math&amp;gt;. Компонента вектора &amp;lt;math&amp;gt;\mathbf{a}_j&amp;lt;/math&amp;gt; в направлении &amp;lt;math&amp;gt;\mathbf{b}_{k+1}&amp;lt;/math&amp;gt; при этом удалении не затрагивается и поэтому она в &amp;lt;math&amp;gt;\mathbf{a}_j^{(k)}&amp;lt;/math&amp;gt; такая же, как в &amp;lt;math&amp;gt;\mathbf{a}_j&amp;lt;/math&amp;gt;.&amp;lt;/li&amp;gt;&lt;br /&gt;
&lt;br /&gt;
&amp;lt;li&amp;gt;Процесс Грама-Шмидта может применяться к бесконечной последовательности линейно независимых векторов, а также к линейно зависимым векторам. В этом случае он выдаёт &amp;lt;math&amp;gt;\mathbf{0}&amp;lt;/math&amp;gt; (нулевой вектор) на шаге &amp;lt;math&amp;gt;j&amp;lt;/math&amp;gt;, если &amp;lt;math&amp;gt;\mathbf{a}_j&amp;lt;/math&amp;gt; является линейной комбинацией векторов &amp;lt;math&amp;gt;\mathbf{a}_1,\;\ldots,\;\mathbf{a}_{j-1}&amp;lt;/math&amp;gt;. Если это может случиться, то для сохранения ортогональности выходных векторов и для предотвращения деления на ноль при ортонормировании алгоритм должен делать проверку на нулевые векторы и отбрасывать их. Количество векторов, выдаваемых алгоритмом, будет равно размерности подпространства, порождённого векторами (то есть количеству линейно независимых векторов, которые можно выделить среди исходных векторов).&amp;lt;/li&amp;gt;&lt;br /&gt;
&lt;br /&gt;
&amp;lt;li&amp;gt;Процесс Грама-Шмидта может быть истолкован как разложение невырожденной квадратной матрицы в произведение ортогональной (или унитарной матрицы в случае эрмитова пространства) и верхнетреугольной матрицы с положительными диагональными элементами — QR-разложение.&amp;lt;/li&amp;gt;&lt;br /&gt;
&amp;lt;/ol&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;
В рамках статьи была написана своя параллельная реализация процесса ортогонализации Грама-Шмидта с использованием OpenMPI. Реализация вместе с данными и вспомогательными скриптами доступна в репозитории [https://github.com/zodinyac/GramSchmidt GramSchmidt].&lt;br /&gt;
&lt;br /&gt;
Основная идея реализации: Нулевой вычислительный узел является управляющим, остальные ― подчиненными. Подчиненные узлы запрашивают &amp;quot;задание&amp;quot; у управляющего узла ― номер вектора, который требуется расчитать. Когда подчиненный узел заканчивает расчет, то пересылает готовый вектор на управляющий узел и запрашивает следующее задание. Если заданий больше нет, то подчиненный узел заканчивает свою работу. Каждый узел имеет список уже готовых векторов. Если при расчете требуется вектор, которого нет в списке, то он запрашивается у управляющего узла.&lt;br /&gt;
&lt;br /&gt;
Испытания реализованного алгоритма проводились на [http://parallel.ru/cluster/lomonosov.html суперкомпьютере &amp;quot;Ломоносов&amp;quot;] Суперкомпьютерного комплекса Московского университета со следующими значениями параметров:&lt;br /&gt;
* размер матрицы по одному измерению: 100, 500 и далее с шагом 500 до 10000 элементов,&lt;br /&gt;
* число процессов: 1, 2, 4, 8 и далее с шагом 8 до 128. Тестирование с использованием 1, 2, 4 и 8 процессов не использовалось для данных, где размер превышал 5000.&lt;br /&gt;
&lt;br /&gt;
На следующем рисунке приведен график времени работы алгоритма в зависимости от числа процессов и размерности матриц. &lt;br /&gt;
[[File:Plot3d-gs-belov-bogomolov-1.png|thumb|center|720px|Рисунок 2. График производительности реализации алгоритма в зависимости от числа процессоров и размерности матриц.]]&lt;br /&gt;
На следующем рисунке приведен график времени работы алгоритма в зависимости от числа процессов и размерности матриц, при этом часть данных с самым долгим временем работы отброшена, чтобы более наглядно продемонстрировать зависимость.&lt;br /&gt;
[[File:Plot3d-gs-belov-bogomolov-2.png|thumb|center|720px|Рисунок 3. График производительности реализации алгоритма в зависимости от числа процессоров и размерности матриц.]]&lt;br /&gt;
На следующем рисунке приведен график эффективности распараллеливания алгоритма в зависимости от числа процессов и размерности матриц.&lt;br /&gt;
[[File:Gs-parallel_efficiency.png|thumb|center|720px|Рисунок 4. График эффективности распараллеливания алгоритма в зависимости от числа процессоров и размерности матриц.]]&lt;br /&gt;
Минимальная эффективность распараллеливания 0.12%. Максимальная ― 95%.&lt;br /&gt;
&lt;br /&gt;
{| class=&amp;quot;wikitable&amp;quot;&lt;br /&gt;
|-&lt;br /&gt;
! Размер матрицы&lt;br /&gt;
! 100&lt;br /&gt;
! 500&lt;br /&gt;
! 1000&lt;br /&gt;
! 1500&lt;br /&gt;
! 2000&lt;br /&gt;
! 2500&lt;br /&gt;
! 3000&lt;br /&gt;
! 3500&lt;br /&gt;
! 4000&lt;br /&gt;
! 4500&lt;br /&gt;
! 5000&lt;br /&gt;
! 5500&lt;br /&gt;
! 6000&lt;br /&gt;
! 6500&lt;br /&gt;
! 7000&lt;br /&gt;
! 7500&lt;br /&gt;
! 8000&lt;br /&gt;
! 8500&lt;br /&gt;
! 9000&lt;br /&gt;
! 9500&lt;br /&gt;
! 10000&lt;br /&gt;
|-&lt;br /&gt;
| Число узлов, на которых время работы минимально&lt;br /&gt;
| 1&lt;br /&gt;
| 32&lt;br /&gt;
| 48&lt;br /&gt;
| 56&lt;br /&gt;
| 24&lt;br /&gt;
| 32&lt;br /&gt;
| 32&lt;br /&gt;
| 40&lt;br /&gt;
| 40&lt;br /&gt;
| 40&lt;br /&gt;
| 48&lt;br /&gt;
| 56&lt;br /&gt;
| 56&lt;br /&gt;
| 56&lt;br /&gt;
| 64&lt;br /&gt;
| 64&lt;br /&gt;
| 72&lt;br /&gt;
| 72&lt;br /&gt;
| 72&lt;br /&gt;
| 80&lt;br /&gt;
| 80&lt;br /&gt;
|}&lt;br /&gt;
&lt;br /&gt;
=== Динамические характеристики и эффективность реализации алгоритма ===&lt;br /&gt;
=== Выводы для классов архитектур ===&lt;br /&gt;
=== Существующие реализации алгоритма ===&lt;br /&gt;
Данный алгоритм реализован во множестве библиотек и математических программных пакетах.&lt;br /&gt;
&lt;br /&gt;
# Библиотека [https://github.com/open-epicycle/Epicycle.Math-cs Epicycle] (C#).&lt;br /&gt;
# Библиотека [http://www.spectralpython.net/ Spectral Python (SPy)].&lt;br /&gt;
# Библиотека [https://hackage.haskell.org/package/vect-0.4.7/docs/Data-Vect-Float-GramSchmidt.html vect] (Haskell).&lt;br /&gt;
&lt;br /&gt;
==== Пакет Mathematica ====&lt;br /&gt;
Приведем пример скрипта, предназначенного для пакета Mathematica, который проводит процесс ортогонализации Грама-Шмидта над векторами, заданными в фигурных скобках последней строки. Количество векторов и их координат могут быть произвольными. В данном случае для примера взяты векторы &amp;lt;math&amp;gt;\{-2,\;1,\;0\}&amp;lt;/math&amp;gt;, &amp;lt;math&amp;gt;\{-2,\;0,\;1\}&amp;lt;/math&amp;gt;, &amp;lt;math&amp;gt;\{-0{.}5,\;-1,\;1\}&amp;lt;/math&amp;gt;.&lt;br /&gt;
&amp;lt;source lang=&#039;mathematica&#039;&amp;gt;Projection[v1_, v2_] := (v1.v2*v2)/v2.v2&lt;br /&gt;
MultipleProjection[v1_, vecs_] := Plus @@ (Projection[v1, #1] &amp;amp;) /@ vecs&lt;br /&gt;
GramSchmidt[mat_] := Fold[Join[#1, {#2 - MultipleProjection[#2, #1]}] &amp;amp;, {}, mat]&lt;br /&gt;
GramSchmidt[{{-2, 1, 0}, {-2, 0, 1}, {-0.5, -1, 1}}]&amp;lt;/source&amp;gt;&lt;br /&gt;
&lt;br /&gt;
==== Пакет Maxima ====&lt;br /&gt;
Приведем пример скрипта, предназначенного для пакета Maxima, который проводит процесс ортогонализации Грама-Шмидта над векторами, заданными в фигурных скобках последней строки. Количество векторов и их координат могут быть произвольными. В данном случае для примера взяты векторы &amp;lt;math&amp;gt;\{-2,\;1,\;0\}&amp;lt;/math&amp;gt;, &amp;lt;math&amp;gt;\{-2,\;0,\;1\}&amp;lt;/math&amp;gt;, &amp;lt;math&amp;gt;\{-0{.}5,\;-1,\;1\}&amp;lt;/math&amp;gt;.&lt;br /&gt;
&amp;lt;source lang=&#039;maxima&#039;&amp;gt;&lt;br /&gt;
load(eigen);&lt;br /&gt;
x: matrix ([-2,1,0],[-2,0,1],[-0.5,-1,1]);&lt;br /&gt;
y: gramschmidt(x);&lt;br /&gt;
&amp;lt;/source&amp;gt;&lt;br /&gt;
&lt;br /&gt;
==== Пакет MATLAB ====&lt;br /&gt;
Приведем пример скрипта, предназначенного для пакета MATLAB, который проводит процесс ортогонализации Грама-Шмидта над векторами, заданными в фигурных скобках последней строки. В данном пакете уже существует функция, которая осуществляет данный процесс. Столбцы входной матрицы предполагаются линейно-независимыми, количество векторов и их координат могут быть произвольными. Функция возращает матрицу X с ортонормированными столбцами и обратимую верхне-треугольную матрицу Y.&lt;br /&gt;
&lt;br /&gt;
В данном случае для примера взяты векторы &amp;lt;math&amp;gt;\{-2,\;1,\;0\}&amp;lt;/math&amp;gt;, &amp;lt;math&amp;gt;\{-2,\;0,\;1\}&amp;lt;/math&amp;gt;, &amp;lt;math&amp;gt;\{-0{.}5,\;-1,\;1\}&amp;lt;/math&amp;gt;.&lt;br /&gt;
&amp;lt;source lang=&#039;matlab&#039;&amp;gt;&lt;br /&gt;
[x y]=gschmidt([-2 1 0; -2 0 1; -0.5 -1 1])&lt;br /&gt;
&amp;lt;/source&amp;gt;&lt;br /&gt;
&lt;br /&gt;
== Литература ==&lt;/div&gt;</summary>
		<author><name>BDA</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:BDA/%D0%9E%D1%80%D1%82%D0%BE%D0%B3%D0%BE%D0%BD%D0%B0%D0%BB%D0%B8%D0%B7%D0%B0%D1%86%D0%B8%D1%8F_%D0%93%D1%80%D0%B0%D0%BC%D0%B0-%D0%A8%D0%BC%D0%B8%D0%B4%D1%82%D0%B0&amp;diff=18470</id>
		<title>Участник:BDA/Ортогонализация Грама-Шмидта</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:BDA/%D0%9E%D1%80%D1%82%D0%BE%D0%B3%D0%BE%D0%BD%D0%B0%D0%BB%D0%B8%D0%B7%D0%B0%D1%86%D0%B8%D1%8F_%D0%93%D1%80%D0%B0%D0%BC%D0%B0-%D0%A8%D0%BC%D0%B8%D0%B4%D1%82%D0%B0&amp;diff=18470"/>
		<updated>2016-11-19T13:03:26Z</updated>

		<summary type="html">&lt;p&gt;BDA: /* Масштабируемость алгоритма и его реализации */&lt;/p&gt;
&lt;hr /&gt;
&lt;div&gt;{{Assignment}}&lt;br /&gt;
&lt;br /&gt;
{{algorithm&lt;br /&gt;
| name              = Ортогонализация Грама-Шмидта&lt;br /&gt;
| serial_complexity = &amp;lt;math&amp;gt;O(nm^2)&amp;lt;/math&amp;gt;&lt;br /&gt;
| pf_height         = &amp;lt;math&amp;gt;O(nm)&amp;lt;/math&amp;gt;&lt;br /&gt;
| pf_width          = &amp;lt;math&amp;gt;O(m)&amp;lt;/math&amp;gt;&lt;br /&gt;
| input_data        = &amp;lt;math&amp;gt;nm&amp;lt;/math&amp;gt;&lt;br /&gt;
| output_data       = &amp;lt;math&amp;gt;nm&amp;lt;/math&amp;gt;&lt;br /&gt;
}}&lt;br /&gt;
&lt;br /&gt;
Основные авторы описания: [[Участник:Zodiac|Белов Н. А.]] (пункты 1.3, 1.4, 1.5, 1.6, 1.9, 1.10, 2.4, 2.7, 3), [[Участник:BDA|Богомолов Д. А.]] (пункты 1.1, 1.2, 1.6, 1.7, 1.8, 2.4, 3).&lt;br /&gt;
&lt;br /&gt;
== Свойства и структура алгоритма ==&lt;br /&gt;
=== Общее описание алгоритма ===&lt;br /&gt;
&lt;br /&gt;
Ортогонализация ― алгоритм построения для данной линейно независимой системы векторов евклидова или эрмитова пространства V ортогональной системы ненулевых векторов, порождающих то же самое подпространство в V.&lt;br /&gt;
&lt;br /&gt;
Ортогонализация Грама–Шмидта&amp;lt;ref&amp;gt;Канатников А.Н., Крищенко А.П. &amp;quot;Линейная алгебра.&amp;quot; ― 3-е изд., стер. ― М.: Изд-во МГТУ им. Н.Э. Баумана, 2002&amp;lt;/ref&amp;gt; (процесс Грама–Шмидта) ― наиболее известный алгоритм ортогонализации. Назван в честь Йоргена Педерсена Грама&amp;lt;ref&amp;gt;O&#039;Connor, John J.; Robertson, Edmund F., &amp;quot;Jørgen Pedersen Gram&amp;quot;, MacTutor History of Mathematics archive, University of St Andrews.&amp;lt;/ref&amp;gt; и Эрхарда Шмидта&amp;lt;ref&amp;gt;O&#039;Connor, John J.; Robertson, Edmund F., &amp;quot;Erhard Schmidt&amp;quot;, MacTutor History of Mathematics archive, University of St Andrews.&amp;lt;/ref&amp;gt;, однако ранее уже появлялся в работах Лапласа и Коши. Является частным случаем разложения Ивасавы, так как может быть представлен как разложение невырожденной квадратной матрицы в произведение ортогональной (или унитарной матрицы в случае эрмитова пространства) и верхнетреугольной матрицы с положительными диагональными элементами.&lt;br /&gt;
&lt;br /&gt;
Рассматриваемый алгоритм применяется для борьбы с помехами в адаптивной системе селекции движущихся целей&amp;lt;ref&amp;gt;Орешкин Б.Н., Бакулев П.А. &amp;quot;Быстрая процедура ортогонализации Грамма–Шмидта и ее применение для борьбы с помехами в адаптивной системе селекции движущихся целей&amp;quot; ― Радиотехника / №12 за 2007 г.&amp;lt;/ref&amp;gt;, в протоколах безопасности&amp;lt;ref&amp;gt;Пискова А.В., Менщиков А.А., Коробейников А.Г. &amp;quot;Использование ортогонализации Грама-Шмидта в алгоритме приведения базиса решетки для протоколов безопасности&amp;quot; ― Вопросы кибербезопасности №1(14) 2016&amp;lt;/ref&amp;gt;, для повышения экономичности алгоритмов оценивания параметров моделей объектов управления&amp;lt;ref&amp;gt;Карелин А.Е., Светлаков А.А. &amp;quot;Использование ортогонализации Грама-Шмидта для повышения экономичности многоточечных алгоритмов рекуррентного оценивания параметров моделей объектов управления&amp;quot; ― Известия Томского политехнического университета [Известия ТПУ]. — 2006. — Т. 309, № 8. — [С. 15-19].&amp;lt;/ref&amp;gt; и в других областях.&lt;br /&gt;
&lt;br /&gt;
=== Математическое описание алгоритма ===&lt;br /&gt;
&#039;&#039;&#039;Входные данные.&#039;&#039;&#039; &amp;lt;math&amp;gt;m&amp;lt;/math&amp;gt; линейно независимых векторов &amp;lt;math&amp;gt;\mathbf{a}_1,...,\mathbf{a}_m&amp;lt;/math&amp;gt; c размерностью пространства &amp;lt;math&amp;gt;n&amp;lt;/math&amp;gt;, записанных в матрице &amp;lt;math&amp;gt;A&amp;lt;/math&amp;gt; с элементами &amp;lt;math&amp;gt;\alpha_{ij}&amp;lt;/math&amp;gt;.&lt;br /&gt;
&lt;br /&gt;
&#039;&#039;&#039;Выходные данные.&#039;&#039;&#039; &amp;lt;math&amp;gt;m&amp;lt;/math&amp;gt; ортогональных векторов &amp;lt;math&amp;gt;\mathbf{b}_1,...,\mathbf{b}_m&amp;lt;/math&amp;gt; c размерностью пространства &amp;lt;math&amp;gt;n&amp;lt;/math&amp;gt;, записанных в матрице &amp;lt;math&amp;gt;B&amp;lt;/math&amp;gt; с элементами &amp;lt;math&amp;gt;\beta_{ij}&amp;lt;/math&amp;gt;.&lt;br /&gt;
&lt;br /&gt;
Определим оператор проекции (проецирует вектор &amp;lt;math&amp;gt;\mathbf{a}&amp;lt;/math&amp;gt; коллинеарно вектору &amp;lt;math&amp;gt;\mathbf{b}&amp;lt;/math&amp;gt;) &amp;lt;math&amp;gt;\mathbf{proj_b a = \frac{\left \langle a,b \right \rangle}{\left \langle b,b \right \rangle }b}&amp;lt;/math&amp;gt;, где &amp;lt;math&amp;gt;\mathbf{\left \langle a,b \right \rangle}&amp;lt;/math&amp;gt; ― скалярное произведение векторов &amp;lt;math&amp;gt;\mathbf{a}&amp;lt;/math&amp;gt; и &amp;lt;math&amp;gt;\mathbf{b}&amp;lt;/math&amp;gt;.&lt;br /&gt;
&lt;br /&gt;
Тогда ортогональные векторы вычисляются следующим образом:&lt;br /&gt;
&lt;br /&gt;
&amp;lt;math&amp;gt;\mathbf{b}_1 = \mathbf{a}_1&amp;lt;/math&amp;gt;&lt;br /&gt;
&lt;br /&gt;
&amp;lt;math&amp;gt;\mathbf{b}_2 = \mathbf{a}_2 - \mathbf{proj}_{\mathbf{b}_1} \mathbf{a}_2 &amp;lt;/math&amp;gt;&lt;br /&gt;
&lt;br /&gt;
&amp;lt;math&amp;gt;\mathbf{b}_3 = \mathbf{a}_3 - \mathbf{proj}_{\mathbf{b}_1} \mathbf{a}_3 - \mathbf{proj}_{\mathbf{b}_2} \mathbf{a}_3 &amp;lt;/math&amp;gt;&lt;br /&gt;
&lt;br /&gt;
&amp;lt;math&amp;gt;\vdots&amp;lt;/math&amp;gt;&lt;br /&gt;
&lt;br /&gt;
&amp;lt;math&amp;gt;\mathbf{b}_m = \mathbf{a}_m - \sum_{j=1}^{m-1} \mathbf{proj}_{\mathbf{b}_j} \mathbf{a}_m&amp;lt;/math&amp;gt;&lt;br /&gt;
&lt;br /&gt;
Или поэлементно:&lt;br /&gt;
&lt;br /&gt;
&amp;lt;math&amp;gt;\beta_{1j} = \alpha_{1j}&amp;lt;/math&amp;gt;&lt;br /&gt;
&lt;br /&gt;
&amp;lt;math&amp;gt;\beta_{ij} = \alpha_{ij} - (\sum_{k=1}^{i-1} \mathbf{proj}_{\mathbf{b}_k} \mathbf{a}_i)_j = \alpha_{ij} - \sum_{k=1}^{i-1}\frac{\sum_{s=1}^{n}\alpha_{is}\beta_{ks}}{\sum_{s=1}^{n}\beta_{ks}\beta_{ks}}\beta_{kj} &amp;lt;/math&amp;gt;&lt;br /&gt;
&lt;br /&gt;
=== Вычислительное ядро алгоритма ===&lt;br /&gt;
Основное время работы алгоритма приходится на вычисление сумм &amp;lt;math&amp;gt;\sum_{i=1}^{j-1} \mathbf{proj}_{\mathbf{b}_i} \mathbf{a}_k \forall j: j=\overline{1, m}&amp;lt;/math&amp;gt;.&lt;br /&gt;
&lt;br /&gt;
=== Макроструктура алгоритма ===&lt;br /&gt;
Из [[#Математическое описание алгоритма|математического описания алгоритма]] и [[#Вычислительное ядро алгоритма|описания ядра алгоритма]] в предыдущих разделах следует, что основную часть данного метода составляют операции вычисления проекций векторов, а также их сумм. Таким образом, в алгоритме можно выделить следующие макрооперации: скалярное произведение векторов в количестве &amp;lt;math&amp;gt;(m-1)m&amp;lt;/math&amp;gt;, а также множественные (всего &amp;lt;math&amp;gt;m-1&amp;lt;/math&amp;gt;) вычисления сумм &amp;lt;math&amp;gt;\mathbf{a}_i - \sum_{j=1}^{i-1} \frac{\left \langle a_i,b_j \right \rangle}{\left \langle b_j,b_j \right \rangle }b_j&amp;lt;/math&amp;gt;.&lt;br /&gt;
&lt;br /&gt;
Макроструктура может быть представлена в следующем виде:	&lt;br /&gt;
# Вычисление проекций &amp;lt;math&amp;gt;\mathbf{proj}_{\mathbf{b}_j} \mathbf{a}_i \forall j: j=\overline{1, i - 1}&amp;lt;/math&amp;gt; для текущего шага &amp;lt;math&amp;gt;i&amp;lt;/math&amp;gt;.	&lt;br /&gt;
# Вычисление суммы &amp;lt;math&amp;gt;\mathbf{a}_i - \sum_{j=1}^{i-1} \frac{\left \langle a_i,b_j \right \rangle}{\left \langle b_j,b_j \right \rangle }b_j&amp;lt;/math&amp;gt; для текущего шага &amp;lt;math&amp;gt;i&amp;lt;/math&amp;gt;.&lt;br /&gt;
# Переход на следующий шаг.&lt;br /&gt;
&lt;br /&gt;
=== Схема реализации последовательного алгоритма ===&lt;br /&gt;
Рассмотрим алгоритм, написанный в виде функции для математической системы MATLAB.&lt;br /&gt;
&lt;br /&gt;
&#039;&#039;&#039;Входные данные.&#039;&#039;&#039;&lt;br /&gt;
&lt;br /&gt;
Матрица &amp;lt;math&amp;gt;A&amp;lt;/math&amp;gt; с линейно-независимыми векторами в столбцах.&lt;br /&gt;
&lt;br /&gt;
&#039;&#039;&#039;Выходные данные.&#039;&#039;&#039;&lt;br /&gt;
&lt;br /&gt;
Матрица &amp;lt;math&amp;gt;Q&amp;lt;/math&amp;gt; с ортонормированным базисом &amp;lt;math&amp;gt;A&amp;lt;/math&amp;gt;.&lt;br /&gt;
&lt;br /&gt;
&#039;&#039;&#039;Использование.&#039;&#039;&#039;&lt;br /&gt;
&amp;lt;source lang=&amp;quot;matlab&amp;quot;&amp;gt;&lt;br /&gt;
Q = gramschmidt( A );&lt;br /&gt;
&amp;lt;/source&amp;gt;&lt;br /&gt;
&lt;br /&gt;
&#039;&#039;&#039;Реализация.&#039;&#039;&#039;&lt;br /&gt;
&amp;lt;source lang=&amp;quot;matlab&amp;quot;&amp;gt;&lt;br /&gt;
function Q = gramschmidt( A )&lt;br /&gt;
% Число векторов.&lt;br /&gt;
n = size( A, 2 );&lt;br /&gt;
 &lt;br /&gt;
% Инициализируем выходную матрицу.&lt;br /&gt;
Q = zeros( n );&lt;br /&gt;
 &lt;br /&gt;
% Преобразуем каждый вектор в базисный:&lt;br /&gt;
% (1) j-ый базисный вектор будет ортогонален каждому из предыдущих 1..j-1 векторов;&lt;br /&gt;
% (2) будет единичной длины.&lt;br /&gt;
for j = 1 : n&lt;br /&gt;
    % Выбираем j-ый вектор&lt;br /&gt;
    u = A( :, j );&lt;br /&gt;
    &lt;br /&gt;
    % Специальный случай для j = 1: просто нормируем этот вектор и помещаем&lt;br /&gt;
    % первым в найденный базис, так как нет векторов, относительно которых&lt;br /&gt;
    % нужно было бы делать его ортогональным.&lt;br /&gt;
&lt;br /&gt;
    % Удаляем из оригинального вектора &amp;quot;u&amp;quot; все компоненты натянутые на базис&lt;br /&gt;
    % из векторов 1..j-1, их вклад будет удален.&lt;br /&gt;
    % =&amp;gt; j-ый вектор ортогонален остальным.&lt;br /&gt;
    % Предыдущие базисные вектора были найдены на предыдуших шагах.&lt;br /&gt;
    % =&amp;gt; соблюдаем принцип ортогональности, но не ортонормированности.&lt;br /&gt;
    for i = 1 : j - 1&lt;br /&gt;
        u = u - proj( Q(:,i), A(:,j) );&lt;br /&gt;
    end&lt;br /&gt;
     &lt;br /&gt;
    % Нормируем вектор&lt;br /&gt;
    Q(:,j) = u ./ norm( u );&lt;br /&gt;
end&lt;br /&gt;
end&lt;br /&gt;
 &lt;br /&gt;
% Проекция вектора &amp;quot;a&amp;quot; коллинеарно вектору &amp;quot;e&amp;quot;.&lt;br /&gt;
function p = proj( e, a )&lt;br /&gt;
p = (e&#039; * a) / (e&#039; * e) .* e;&lt;br /&gt;
end&lt;br /&gt;
&amp;lt;/source&amp;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;.&lt;br /&gt;
&lt;br /&gt;
# Скалярное произведение векторов требует &amp;lt;math&amp;gt;n-1&amp;lt;/math&amp;gt; сложение и &amp;lt;math&amp;gt;n&amp;lt;/math&amp;gt; произведений.&lt;br /&gt;
# Вычитание проекции вектора требует &amp;lt;math&amp;gt;2&amp;lt;/math&amp;gt; скалярных произведения, &amp;lt;math&amp;gt;1&amp;lt;/math&amp;gt; деление, &amp;lt;math&amp;gt;n&amp;lt;/math&amp;gt; произведений и &amp;lt;math&amp;gt;n&amp;lt;/math&amp;gt; сложений, то есть:&lt;br /&gt;
## &amp;lt;math&amp;gt;3n-2&amp;lt;/math&amp;gt; (&amp;lt;math&amp;gt;+&amp;lt;/math&amp;gt;);&lt;br /&gt;
## &amp;lt;math&amp;gt;3n&amp;lt;/math&amp;gt; (&amp;lt;math&amp;gt;\times&amp;lt;/math&amp;gt;);&lt;br /&gt;
## &amp;lt;math&amp;gt;1&amp;lt;/math&amp;gt; (&amp;lt;math&amp;gt;\div&amp;lt;/math&amp;gt;).&lt;br /&gt;
# Вычисление &amp;lt;math&amp;gt;i&amp;lt;/math&amp;gt;-го вектора требует &amp;lt;math&amp;gt;i-1&amp;lt;/math&amp;gt; вычитаний проекций, то есть:&lt;br /&gt;
## &amp;lt;math&amp;gt;(3n-2)(i-1)&amp;lt;/math&amp;gt; (&amp;lt;math&amp;gt;+&amp;lt;/math&amp;gt;);&lt;br /&gt;
## &amp;lt;math&amp;gt;3n(i-1)&amp;lt;/math&amp;gt; (&amp;lt;math&amp;gt;\times&amp;lt;/math&amp;gt;);&lt;br /&gt;
## &amp;lt;math&amp;gt;i-1&amp;lt;/math&amp;gt; (&amp;lt;math&amp;gt;\div&amp;lt;/math&amp;gt;).&lt;br /&gt;
# Мы вычисляем вектора от &amp;lt;math&amp;gt;i=1&amp;lt;/math&amp;gt; до &amp;lt;math&amp;gt;m&amp;lt;/math&amp;gt;, поэтому множители &amp;lt;math&amp;gt;(i-1)&amp;lt;/math&amp;gt; выражаются &#039;&#039;треугольным числом&#039;&#039; &amp;lt;math&amp;gt;(m-1)\frac{m}{2}&amp;lt;/math&amp;gt;.&lt;br /&gt;
## &amp;lt;math&amp;gt;(3n-2)(m-1)\frac{m}{2}&amp;lt;/math&amp;gt; (&amp;lt;math&amp;gt;+&amp;lt;/math&amp;gt;);&lt;br /&gt;
## &amp;lt;math&amp;gt;3n(m-1)\frac{m}{2}&amp;lt;/math&amp;gt; (&amp;lt;math&amp;gt;\times&amp;lt;/math&amp;gt;);&lt;br /&gt;
## &amp;lt;math&amp;gt;(m-1)\frac{m}{2}&amp;lt;/math&amp;gt; (&amp;lt;math&amp;gt;\div&amp;lt;/math&amp;gt;).&lt;br /&gt;
&lt;br /&gt;
Таким образом, cложность алгоритма &amp;lt;math&amp;gt;O(nm^2)&amp;lt;/math&amp;gt;.&lt;br /&gt;
&lt;br /&gt;
=== Информационный граф ===&lt;br /&gt;
Граф состоит из элементов 2 видов: прямоугольников и овалов. Прямоугольниками обозначаются данные, причем красному цвету соответствуют входные данные, а зеленому ― выходные. Овалы означают операции над переданными данными. Голубым цветом обозначены более сложно организованные операции, а синим ― менее. Для нахождения &amp;lt;math&amp;gt;\mathbf{b}_i&amp;lt;/math&amp;gt; вектора требуются значения всех векторов с номерами, меньшими &amp;lt;math&amp;gt;i&amp;lt;/math&amp;gt;, однако, расчеты проекций можно начинать, не дожидаясь вычисления всех векторов, а производить сразу, как только соответствующий ортогональный вектор будет рассчитан. Эта зависимость и отражена на графе ниже.&lt;br /&gt;
[[Файл:Gram_schmidt_graph.png|thumb|800px|center|frame|Рисунок 1. Информационный граф алгоритма Грама-Шмидта.]]&lt;br /&gt;
&lt;br /&gt;
=== Ресурс параллелизма алгоритма ===&lt;br /&gt;
Для построения базиса методом Грама–Шмидта в параллельном случае, имея в распоряжении &amp;lt;math&amp;gt;m&amp;lt;/math&amp;gt; и более потоков, необходимо выполнить следующие ярусы:&lt;br /&gt;
#&amp;lt;math&amp;gt;m-1&amp;lt;/math&amp;gt; ярус вычисления проекций;&lt;br /&gt;
#&amp;lt;math&amp;gt;m-1&amp;lt;/math&amp;gt; ярус вычитания векторов.&lt;br /&gt;
&lt;br /&gt;
Эти ярусы чередуются. Количество операций проекции и вычитания векторов уменьшается на единицу в каждом следующем ярусе. Вычисление проекции вектора требует 2 скалярных произведения, 1 деление и &amp;lt;math&amp;gt;n&amp;lt;/math&amp;gt; произведений, то есть:&lt;br /&gt;
#&amp;lt;math&amp;gt;2n-2&amp;lt;/math&amp;gt; (&amp;lt;math&amp;gt;+&amp;lt;/math&amp;gt;);&lt;br /&gt;
#&amp;lt;math&amp;gt;3n&amp;lt;/math&amp;gt; (&amp;lt;math&amp;gt;\times&amp;lt;/math&amp;gt;);&lt;br /&gt;
#&amp;lt;math&amp;gt;1&amp;lt;/math&amp;gt; (&amp;lt;math&amp;gt;\div&amp;lt;/math&amp;gt;).&lt;br /&gt;
&lt;br /&gt;
Если считать, что вычисление проекции происходит последовательно, то сложность по высоте &amp;lt;math&amp;gt;O(n)&amp;lt;/math&amp;gt;, по ширине &amp;lt;math&amp;gt;O(1)&amp;lt;/math&amp;gt; (то есть одна операция проекции в ярусе представляется набором ярусов с простыми последовательными операциями). В самом первом ярусе находится &amp;lt;math&amp;gt;m-1&amp;lt;/math&amp;gt; проекций и это наибольшее количество операций проекций, тогда сложность по высоте будет &amp;lt;math&amp;gt;O(n)&amp;lt;/math&amp;gt;, по ширине ― &amp;lt;math&amp;gt;O(m)&amp;lt;/math&amp;gt;.&lt;br /&gt;
&lt;br /&gt;
Вычисление вычитания векторов требует &amp;lt;math&amp;gt;n&amp;lt;/math&amp;gt; вычитаний, и если считать, что операция происходит последовательно, то сложность по высоте &amp;lt;math&amp;gt;O(n)&amp;lt;/math&amp;gt;, по ширине &amp;lt;math&amp;gt;O(1)&amp;lt;/math&amp;gt;. Во втором ярусе находится &amp;lt;math&amp;gt;m-1&amp;lt;/math&amp;gt; вычитаний и это наибольшее количество операций вычитаний, тогда сложность по высоте будет &amp;lt;math&amp;gt;O(n)&amp;lt;/math&amp;gt;, по ширине ― &amp;lt;math&amp;gt;O(m)&amp;lt;/math&amp;gt;.&lt;br /&gt;
&lt;br /&gt;
Из вышеизложенного следует, что при классификации по ширине ЯПФ алгоритм имеет сложность &amp;lt;math&amp;gt;O(m)&amp;lt;/math&amp;gt;, а по высоте ― &amp;lt;math&amp;gt;O(nm)&amp;lt;/math&amp;gt;.&lt;br /&gt;
&lt;br /&gt;
=== Входные и выходные данные алгоритма ===&lt;br /&gt;
&#039;&#039;&#039;Входные данные.&#039;&#039;&#039; Матрица &amp;lt;math&amp;gt;A&amp;lt;/math&amp;gt; с элементами &amp;lt;math&amp;gt;\alpha_{ij}&amp;lt;/math&amp;gt;, где &amp;lt;math&amp;gt;i = \overline{1, m}&amp;lt;/math&amp;gt; (количество линейно независимых векторов) и &amp;lt;math&amp;gt;j = \overline{1, n}&amp;lt;/math&amp;gt; (размерность пространства), при этом &amp;lt;math&amp;gt;m \leqslant n&amp;lt;/math&amp;gt;.&lt;br /&gt;
&lt;br /&gt;
&#039;&#039;&#039;Объем входных данных.&#039;&#039;&#039; &amp;lt;math&amp;gt;mn&amp;lt;/math&amp;gt;&lt;br /&gt;
&lt;br /&gt;
&#039;&#039;&#039;Выходные данные.&#039;&#039;&#039; Матрица &amp;lt;math&amp;gt;B&amp;lt;/math&amp;gt; с элементами &amp;lt;math&amp;gt;\beta_{ij}&amp;lt;/math&amp;gt;, где &amp;lt;math&amp;gt;i = \overline{1, m}&amp;lt;/math&amp;gt; и &amp;lt;math&amp;gt;j = \overline{1, n}&amp;lt;/math&amp;gt;, тогда &amp;lt;math&amp;gt;b_{1}, \dots, b_{m}&amp;lt;/math&amp;gt; — система ортогональных векторов.&lt;br /&gt;
&lt;br /&gt;
&#039;&#039;&#039;Объем выходных данных.&#039;&#039;&#039; &amp;lt;math&amp;gt;mn&amp;lt;/math&amp;gt;&lt;br /&gt;
&lt;br /&gt;
=== Свойства алгоритма ===&lt;br /&gt;
&amp;lt;ol&amp;gt;&lt;br /&gt;
&amp;lt;li&amp;gt;Отношение последовательной и параллельной сложности в предположении доступности неограниченного числа необходимых ресурсов — &amp;lt;math&amp;gt;m&amp;lt;/math&amp;gt;. При этом необходимо отметить, что отношение числа операций к суммарному объему входных и выходных данных (вычислительная мощность алгоритма) — линейное.&amp;lt;/li&amp;gt;&lt;br /&gt;
&lt;br /&gt;
&amp;lt;li&amp;gt;Алгоритм почти полностью детерминирован, то есть гарантирована единственность результата выполнения. Это означает, что возможно накопление ошибок округления, то есть векторы выходной матрицы часто не точно ортогональны. Из-за потери ортогональности в процессе вычислений классический процесс Грама-Шмидта называют численно неустойчивым. Однако, процесс Грама-Шмидта может быть сделан более вычислительно устойчивым путём небольшой модификации. Такой алгоритм называется модифицированным процессом Грама-Шмидта. Рассмотрим его отличие подробнее.&lt;br /&gt;
&amp;lt;br /&amp;gt;&lt;br /&gt;
&amp;lt;math&amp;gt; &lt;br /&gt;
\begin{array}{l}&lt;br /&gt;
\mathbf{b}_j\\&lt;br /&gt;
  \\&lt;br /&gt;
\mathbf{b}_j&lt;br /&gt;
\end{array}&lt;br /&gt;
&lt;br /&gt;
\begin{array}{c}&lt;br /&gt;
= \\&lt;br /&gt;
  \\&lt;br /&gt;
=&lt;br /&gt;
\end{array}&lt;br /&gt;
&lt;br /&gt;
\underbrace{&lt;br /&gt;
\underbrace{&lt;br /&gt;
\underbrace{&lt;br /&gt;
&lt;br /&gt;
\begin{array}{c}&lt;br /&gt;
\mathbf{a}_j \\&lt;br /&gt;
   \\&lt;br /&gt;
\mathbf{a}_j&lt;br /&gt;
\end{array}&lt;br /&gt;
&lt;br /&gt;
\begin{array}{c}&lt;br /&gt;
- \\&lt;br /&gt;
  \\&lt;br /&gt;
-&lt;br /&gt;
\end{array}&lt;br /&gt;
&lt;br /&gt;
\begin{array}{c}&lt;br /&gt;
\mathbf{proj}_{\mathbf{b}_1}\,\mathbf{a}_j \\&lt;br /&gt;
   ||                                      \\&lt;br /&gt;
\mathbf{proj}_{\mathbf{b}_1}\,\mathbf{a}_j&lt;br /&gt;
\end{array}&lt;br /&gt;
&lt;br /&gt;
}_{\mathbf{a}_j^{(1)}}&lt;br /&gt;
&lt;br /&gt;
\begin{array}{c}&lt;br /&gt;
- \\&lt;br /&gt;
  \\&lt;br /&gt;
-&lt;br /&gt;
\end{array}&lt;br /&gt;
&lt;br /&gt;
\begin{array}{c}&lt;br /&gt;
\mathbf{proj}_{\mathbf{b}_2}\,\mathbf{a}_j       \\&lt;br /&gt;
   ||                                            \\&lt;br /&gt;
\mathbf{proj}_{\mathbf{b}_2}\,\mathbf{a}_j^{(1)}&lt;br /&gt;
\end{array}&lt;br /&gt;
&lt;br /&gt;
}_{\mathbf{a}_j^{(2)}}&lt;br /&gt;
&lt;br /&gt;
\begin{array}{c}&lt;br /&gt;
- \\&lt;br /&gt;
  \\&lt;br /&gt;
-&lt;br /&gt;
\end{array}&lt;br /&gt;
&lt;br /&gt;
\begin{array}{c}&lt;br /&gt;
\mathbf{proj}_{\mathbf{b}_3}\,\mathbf{a}_j       \\&lt;br /&gt;
   ||                                            \\&lt;br /&gt;
\mathbf{proj}_{\mathbf{b}_3}\,\mathbf{a}_j^{(2)}&lt;br /&gt;
\end{array}&lt;br /&gt;
&lt;br /&gt;
}_{\mathbf{a}_j^{(3)}}&lt;br /&gt;
&lt;br /&gt;
\begin{array}{ccc}&lt;br /&gt;
- &amp;amp; \ldots &amp;amp; - \\&lt;br /&gt;
               \\&lt;br /&gt;
- &amp;amp; \ldots &amp;amp; - &lt;br /&gt;
\end{array}&lt;br /&gt;
&lt;br /&gt;
\begin{array}{cc}&lt;br /&gt;
\mathbf{proj}_{\mathbf{b}_{j-1}}\,\mathbf{a}_j         &amp;amp; (1) \\&lt;br /&gt;
   ||                                                  &amp;amp;      \\&lt;br /&gt;
\mathbf{proj}_{\mathbf{b}_{j-1}}\,\mathbf{a}_j^{(j-2)} &amp;amp; (2)&lt;br /&gt;
\end{array}&lt;br /&gt;
&lt;br /&gt;
&amp;lt;/math&amp;gt;&lt;br /&gt;
&amp;lt;br /&amp;gt;&lt;br /&gt;
Формула (1) показывает вычисление &amp;lt;math&amp;gt;\mathbf{b}_j&amp;lt;/math&amp;gt; в классическом процессе, а формула (2) — в модифицированном.&lt;br /&gt;
&amp;lt;br /&amp;gt;&lt;br /&gt;
Разница между ними заключается в том, от каких векторов вычисляются компоненты: от &amp;lt;math&amp;gt;\mathbf{a}_j&amp;lt;/math&amp;gt; в классическом процессе или от результата предыдущего вычитания, то есть от &amp;lt;math&amp;gt;\mathbf{a}_j^{(k)}&amp;lt;/math&amp;gt; в модифицированном процессе. Таким образом, &amp;lt;math&amp;gt;\mathbf{a}_j^{(k)}&amp;lt;/math&amp;gt; представляет собой &amp;lt;math&amp;gt;\mathbf{a}_j&amp;lt;/math&amp;gt;, из которого удалены компоненты в направлениях &amp;lt;math&amp;gt;\mathbf{b}_1,\,\;\ldots,\;\mathbf{b}_{k}&amp;lt;/math&amp;gt;. Компонента вектора &amp;lt;math&amp;gt;\mathbf{a}_j&amp;lt;/math&amp;gt; в направлении &amp;lt;math&amp;gt;\mathbf{b}_{k+1}&amp;lt;/math&amp;gt; при этом удалении не затрагивается и поэтому она в &amp;lt;math&amp;gt;\mathbf{a}_j^{(k)}&amp;lt;/math&amp;gt; такая же, как в &amp;lt;math&amp;gt;\mathbf{a}_j&amp;lt;/math&amp;gt;.&amp;lt;/li&amp;gt;&lt;br /&gt;
&lt;br /&gt;
&amp;lt;li&amp;gt;Процесс Грама-Шмидта может применяться к бесконечной последовательности линейно независимых векторов, а также к линейно зависимым векторам. В этом случае он выдаёт &amp;lt;math&amp;gt;\mathbf{0}&amp;lt;/math&amp;gt; (нулевой вектор) на шаге &amp;lt;math&amp;gt;j&amp;lt;/math&amp;gt;, если &amp;lt;math&amp;gt;\mathbf{a}_j&amp;lt;/math&amp;gt; является линейной комбинацией векторов &amp;lt;math&amp;gt;\mathbf{a}_1,\;\ldots,\;\mathbf{a}_{j-1}&amp;lt;/math&amp;gt;. Если это может случиться, то для сохранения ортогональности выходных векторов и для предотвращения деления на ноль при ортонормировании алгоритм должен делать проверку на нулевые векторы и отбрасывать их. Количество векторов, выдаваемых алгоритмом, будет равно размерности подпространства, порождённого векторами (то есть количеству линейно независимых векторов, которые можно выделить среди исходных векторов).&amp;lt;/li&amp;gt;&lt;br /&gt;
&lt;br /&gt;
&amp;lt;li&amp;gt;Процесс Грама-Шмидта может быть истолкован как разложение невырожденной квадратной матрицы в произведение ортогональной (или унитарной матрицы в случае эрмитова пространства) и верхнетреугольной матрицы с положительными диагональными элементами — QR-разложение.&amp;lt;/li&amp;gt;&lt;br /&gt;
&amp;lt;/ol&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;
В рамках статьи была написана своя параллельная реализация процесса ортогонализации Грама-Шмидта с использованием OpenMPI. Реализация вместе с данными и вспомогательными скриптами доступна в репозитории [https://github.com/zodinyac/GramSchmidt GramSchmidt].&lt;br /&gt;
&lt;br /&gt;
Основная идея реализации: Нулевой вычислительный узел является управляющим, остальные ― подчиненными. Подчиненные узлы запрашивают &amp;quot;задание&amp;quot; у управляющего узла ― номер вектора, который требуется расчитать. Когда подчиненный узел заканчивает расчет, то пересылает готовый вектор на управляющий узел и запрашивает следующее задание. Если заданий больше нет, то подчиненный узел заканчивает свою работу. Каждый узел имеет список уже готовых векторов. Если при расчете требуется вектор, которого нет в списке, то он запрашивается у управляющего узла.&lt;br /&gt;
&lt;br /&gt;
Испытания реализованного алгоритма проводились на [http://parallel.ru/cluster/lomonosov.html суперкомпьютере &amp;quot;Ломоносов&amp;quot;] Суперкомпьютерного комплекса Московского университета со следующими значениями параметров:&lt;br /&gt;
* размер матрицы по одному измерению: 100, 500 и далее с шагом 500 до 10000 элементов,&lt;br /&gt;
* число процессов: 1, 2, 4, 8 и далее с шагом 8 до 128. Тестирование с использованием 1, 2, 4 и 8 процессов не использовалось для данных, где размер превышал 5000.&lt;br /&gt;
&lt;br /&gt;
На следующем рисунке приведен график времени работы алгоритма в зависимости от числа процессов и размерности матриц. &lt;br /&gt;
[[File:Plot3d-gs-belov-bogomolov-1.png|thumb|center|720px|Рисунок 2. График производительности реализации алгоритма в зависимости от числа процессоров и размерности матриц.]]&lt;br /&gt;
На следующем рисунке приведен график времени работы алгоритма в зависимости от числа процессов и размерности матриц, при этом часть данных с самым долгим временем работы отброшена, чтобы более наглядно продемонстрировать зависимость.&lt;br /&gt;
[[File:Plot3d-gs-belov-bogomolov-2.png|thumb|center|720px|Рисунок 3. График производительности реализации алгоритма в зависимости от числа процессоров и размерности матриц.]]&lt;br /&gt;
На следующем рисунке приведен график эффективности распараллеливания алгоритма в зависимости от числа процессов и размерности матриц.&lt;br /&gt;
[[File:Gs-parallel_efficiency.png|thumb|center|720px|Рисунок 4. График эффективности распараллеливания алгоритма в зависимости от числа процессоров и размерности матриц.]]&lt;br /&gt;
Минимальная эффективность распараллеливания 0.12%. Максимальная ― 95%.&lt;br /&gt;
&lt;br /&gt;
{| class=&amp;quot;wikitable&amp;quot;&lt;br /&gt;
|-&lt;br /&gt;
! Размер матрицы&lt;br /&gt;
! 100&lt;br /&gt;
! 500&lt;br /&gt;
! 1000&lt;br /&gt;
! 1500&lt;br /&gt;
! 2000&lt;br /&gt;
! 2500&lt;br /&gt;
! 3000&lt;br /&gt;
! 3500&lt;br /&gt;
! 4000&lt;br /&gt;
! 4500&lt;br /&gt;
! 5000&lt;br /&gt;
! 5500&lt;br /&gt;
! 6000&lt;br /&gt;
! 6500&lt;br /&gt;
! 7000&lt;br /&gt;
! 7500&lt;br /&gt;
! 8000&lt;br /&gt;
! 8500&lt;br /&gt;
! 9000&lt;br /&gt;
! 9500&lt;br /&gt;
! 10000&lt;br /&gt;
|-&lt;br /&gt;
| Число узлов, на которых время работы минимально&lt;br /&gt;
| 1&lt;br /&gt;
| 32&lt;br /&gt;
| 48&lt;br /&gt;
| 56&lt;br /&gt;
| 24&lt;br /&gt;
| 32&lt;br /&gt;
| 32&lt;br /&gt;
| 40&lt;br /&gt;
| 40&lt;br /&gt;
| 40&lt;br /&gt;
| 48&lt;br /&gt;
| 56&lt;br /&gt;
| 56&lt;br /&gt;
| 56&lt;br /&gt;
| 64&lt;br /&gt;
| 64&lt;br /&gt;
| 72&lt;br /&gt;
| 72&lt;br /&gt;
| 72&lt;br /&gt;
| 80&lt;br /&gt;
| 80&lt;br /&gt;
|}&lt;br /&gt;
&lt;br /&gt;
=== Динамические характеристики и эффективность реализации алгоритма ===&lt;br /&gt;
=== Выводы для классов архитектур ===&lt;br /&gt;
=== Существующие реализации алгоритма ===&lt;br /&gt;
Данный алгоритм реализован во множестве библиотек и математических программных пакетах.&lt;br /&gt;
&lt;br /&gt;
# Библиотека [https://github.com/open-epicycle/Epicycle.Math-cs Epicycle] (C#).&lt;br /&gt;
# Библиотека [http://www.spectralpython.net/ Spectral Python (SPy)].&lt;br /&gt;
# Библиотека [https://hackage.haskell.org/package/vect-0.4.7/docs/Data-Vect-Float-GramSchmidt.html vect] (Haskell).&lt;br /&gt;
&lt;br /&gt;
==== Пакет Mathematica ====&lt;br /&gt;
Приведем пример скрипта, предназначенного для пакета Mathematica, который проводит процесс ортогонализации Грама-Шмидта над векторами, заданными в фигурных скобках последней строки. Количество векторов и их координат могут быть произвольными. В данном случае для примера взяты векторы &amp;lt;math&amp;gt;\{-2,\;1,\;0\}&amp;lt;/math&amp;gt;, &amp;lt;math&amp;gt;\{-2,\;0,\;1\}&amp;lt;/math&amp;gt;, &amp;lt;math&amp;gt;\{-0{.}5,\;-1,\;1\}&amp;lt;/math&amp;gt;.&lt;br /&gt;
&amp;lt;source lang=&#039;mathematica&#039;&amp;gt;Projection[v1_, v2_] := (v1.v2*v2)/v2.v2&lt;br /&gt;
MultipleProjection[v1_, vecs_] := Plus @@ (Projection[v1, #1] &amp;amp;) /@ vecs&lt;br /&gt;
GramSchmidt[mat_] := Fold[Join[#1, {#2 - MultipleProjection[#2, #1]}] &amp;amp;, {}, mat]&lt;br /&gt;
GramSchmidt[{{-2, 1, 0}, {-2, 0, 1}, {-0.5, -1, 1}}]&amp;lt;/source&amp;gt;&lt;br /&gt;
&lt;br /&gt;
==== Пакет Maxima ====&lt;br /&gt;
Приведем пример скрипта, предназначенного для пакета Maxima, который проводит процесс ортогонализации Грама-Шмидта над векторами, заданными в фигурных скобках последней строки. Количество векторов и их координат могут быть произвольными. В данном случае для примера взяты векторы &amp;lt;math&amp;gt;\{-2,\;1,\;0\}&amp;lt;/math&amp;gt;, &amp;lt;math&amp;gt;\{-2,\;0,\;1\}&amp;lt;/math&amp;gt;, &amp;lt;math&amp;gt;\{-0{.}5,\;-1,\;1\}&amp;lt;/math&amp;gt;.&lt;br /&gt;
&amp;lt;source lang=&#039;maxima&#039;&amp;gt;&lt;br /&gt;
load(eigen);&lt;br /&gt;
x: matrix ([-2,1,0],[-2,0,1],[-0.5,-1,1]);&lt;br /&gt;
y: gramschmidt(x);&lt;br /&gt;
&amp;lt;/source&amp;gt;&lt;br /&gt;
&lt;br /&gt;
==== Пакет MATLAB ====&lt;br /&gt;
Приведем пример скрипта, предназначенного для пакета MATLAB, который проводит процесс ортогонализации Грама-Шмидта над векторами, заданными в фигурных скобках последней строки. В данном пакете уже существует функция, которая осуществляет данный процесс. Столбцы входной матрицы предполагаются линейно-независимыми, количество векторов и их координат могут быть произвольными. Функция возращает матрицу X с ортонормированными столбцами и обратимую верхне-треугольную матрицу Y.&lt;br /&gt;
&lt;br /&gt;
В данном случае для примера взяты векторы &amp;lt;math&amp;gt;\{-2,\;1,\;0\}&amp;lt;/math&amp;gt;, &amp;lt;math&amp;gt;\{-2,\;0,\;1\}&amp;lt;/math&amp;gt;, &amp;lt;math&amp;gt;\{-0{.}5,\;-1,\;1\}&amp;lt;/math&amp;gt;.&lt;br /&gt;
&amp;lt;source lang=&#039;matlab&#039;&amp;gt;&lt;br /&gt;
[x y]=gschmidt([-2 1 0; -2 0 1; -0.5 -1 1])&lt;br /&gt;
&amp;lt;/source&amp;gt;&lt;br /&gt;
&lt;br /&gt;
== Литература ==&lt;/div&gt;</summary>
		<author><name>BDA</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:BDA/%D0%9E%D1%80%D1%82%D0%BE%D0%B3%D0%BE%D0%BD%D0%B0%D0%BB%D0%B8%D0%B7%D0%B0%D1%86%D0%B8%D1%8F_%D0%93%D1%80%D0%B0%D0%BC%D0%B0-%D0%A8%D0%BC%D0%B8%D0%B4%D1%82%D0%B0&amp;diff=18440</id>
		<title>Участник:BDA/Ортогонализация Грама-Шмидта</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:BDA/%D0%9E%D1%80%D1%82%D0%BE%D0%B3%D0%BE%D0%BD%D0%B0%D0%BB%D0%B8%D0%B7%D0%B0%D1%86%D0%B8%D1%8F_%D0%93%D1%80%D0%B0%D0%BC%D0%B0-%D0%A8%D0%BC%D0%B8%D0%B4%D1%82%D0%B0&amp;diff=18440"/>
		<updated>2016-11-19T03:05:35Z</updated>

		<summary type="html">&lt;p&gt;BDA: /* Масштабируемость алгоритма и его реализации */&lt;/p&gt;
&lt;hr /&gt;
&lt;div&gt;{{Assignment}}&lt;br /&gt;
&lt;br /&gt;
{{algorithm&lt;br /&gt;
| name              = Ортогонализация Грама-Шмидта&lt;br /&gt;
| serial_complexity = &amp;lt;math&amp;gt;O(nm^2)&amp;lt;/math&amp;gt;&lt;br /&gt;
| pf_height         = &amp;lt;math&amp;gt;O(nm)&amp;lt;/math&amp;gt;&lt;br /&gt;
| pf_width          = &amp;lt;math&amp;gt;O(m)&amp;lt;/math&amp;gt;&lt;br /&gt;
| input_data        = &amp;lt;math&amp;gt;nm&amp;lt;/math&amp;gt;&lt;br /&gt;
| output_data       = &amp;lt;math&amp;gt;nm&amp;lt;/math&amp;gt;&lt;br /&gt;
}}&lt;br /&gt;
&lt;br /&gt;
Основные авторы описания: [[Участник:Zodiac|Белов Н. А.]] (пункты 1.3, 1.4, 1.5, 1.6, 1.9, 1.10, 2.4, 2.7, 3), [[Участник:BDA|Богомолов Д. А.]] (пункты 1.1, 1.2, 1.6, 1.7, 1.8, 2.4, 3).&lt;br /&gt;
&lt;br /&gt;
== Свойства и структура алгоритма ==&lt;br /&gt;
=== Общее описание алгоритма ===&lt;br /&gt;
&lt;br /&gt;
Ортогонализация ― алгоритм построения для данной линейно независимой системы векторов евклидова или эрмитова пространства V ортогональной системы ненулевых векторов, порождающих то же самое подпространство в V.&lt;br /&gt;
&lt;br /&gt;
Ортогонализация Грама–Шмидта&amp;lt;ref&amp;gt;Канатников А.Н., Крищенко А.П. &amp;quot;Линейная алгебра.&amp;quot; ― 3-е изд., стер. ― М.: Изд-во МГТУ им. Н.Э. Баумана, 2002&amp;lt;/ref&amp;gt; (процесс Грама–Шмидта) ― наиболее известный алгоритм ортогонализации. Назван в честь Йоргена Педерсена Грама&amp;lt;ref&amp;gt;O&#039;Connor, John J.; Robertson, Edmund F., &amp;quot;Jørgen Pedersen Gram&amp;quot;, MacTutor History of Mathematics archive, University of St Andrews.&amp;lt;/ref&amp;gt; и Эрхарда Шмидта&amp;lt;ref&amp;gt;O&#039;Connor, John J.; Robertson, Edmund F., &amp;quot;Erhard Schmidt&amp;quot;, MacTutor History of Mathematics archive, University of St Andrews.&amp;lt;/ref&amp;gt;, однако ранее уже появлялся в работах Лапласа и Коши. Является частным случаем разложения Ивасавы, так как может быть представлен как разложение невырожденной квадратной матрицы в произведение ортогональной (или унитарной матрицы в случае эрмитова пространства) и верхнетреугольной матрицы с положительными диагональными элементами.&lt;br /&gt;
&lt;br /&gt;
Рассматриваемый алгоритм применяется для борьбы с помехами в адаптивной системе селекции движущихся целей&amp;lt;ref&amp;gt;Орешкин Б.Н., Бакулев П.А. &amp;quot;Быстрая процедура ортогонализации Грамма–Шмидта и ее применение для борьбы с помехами в адаптивной системе селекции движущихся целей&amp;quot; ― Радиотехника / №12 за 2007 г.&amp;lt;/ref&amp;gt;, в протоколах безопасности&amp;lt;ref&amp;gt;Пискова А.В., Менщиков А.А., Коробейников А.Г. &amp;quot;Использование ортогонализации Грама-Шмидта в алгоритме приведения базиса решетки для протоколов безопасности&amp;quot; ― Вопросы кибербезопасности №1(14) 2016&amp;lt;/ref&amp;gt;, для повышения экономичности алгоритмов оценивания параметров моделей объектов управления&amp;lt;ref&amp;gt;Карелин А.Е., Светлаков А.А. &amp;quot;Использование ортогонализации Грама-Шмидта для повышения экономичности многоточечных алгоритмов рекуррентного оценивания параметров моделей объектов управления&amp;quot; ― Известия Томского политехнического университета [Известия ТПУ]. — 2006. — Т. 309, № 8. — [С. 15-19].&amp;lt;/ref&amp;gt; и в других областях.&lt;br /&gt;
&lt;br /&gt;
=== Математическое описание алгоритма ===&lt;br /&gt;
&#039;&#039;&#039;Входные данные.&#039;&#039;&#039; &amp;lt;math&amp;gt;m&amp;lt;/math&amp;gt; линейно независимых векторов &amp;lt;math&amp;gt;\mathbf{a}_1,...,\mathbf{a}_m&amp;lt;/math&amp;gt; c размерностью пространства &amp;lt;math&amp;gt;n&amp;lt;/math&amp;gt;, записанных в матрице &amp;lt;math&amp;gt;A&amp;lt;/math&amp;gt; с элементами &amp;lt;math&amp;gt;\alpha_{ij}&amp;lt;/math&amp;gt;.&lt;br /&gt;
&lt;br /&gt;
&#039;&#039;&#039;Выходные данные.&#039;&#039;&#039; &amp;lt;math&amp;gt;m&amp;lt;/math&amp;gt; ортогональных векторов &amp;lt;math&amp;gt;\mathbf{b}_1,...,\mathbf{b}_m&amp;lt;/math&amp;gt; c размерностью пространства &amp;lt;math&amp;gt;n&amp;lt;/math&amp;gt;, записанных в матрице &amp;lt;math&amp;gt;B&amp;lt;/math&amp;gt; с элементами &amp;lt;math&amp;gt;\beta_{ij}&amp;lt;/math&amp;gt;.&lt;br /&gt;
&lt;br /&gt;
Определим оператор проекции (проецирует вектор &amp;lt;math&amp;gt;\mathbf{a}&amp;lt;/math&amp;gt; коллинеарно вектору &amp;lt;math&amp;gt;\mathbf{b}&amp;lt;/math&amp;gt;) &amp;lt;math&amp;gt;\mathbf{proj_b a = \frac{\left \langle a,b \right \rangle}{\left \langle b,b \right \rangle }b}&amp;lt;/math&amp;gt;, где &amp;lt;math&amp;gt;\mathbf{\left \langle a,b \right \rangle}&amp;lt;/math&amp;gt; ― скалярное произведение векторов &amp;lt;math&amp;gt;\mathbf{a}&amp;lt;/math&amp;gt; и &amp;lt;math&amp;gt;\mathbf{b}&amp;lt;/math&amp;gt;.&lt;br /&gt;
&lt;br /&gt;
Тогда ортогональные векторы вычисляются следующим образом:&lt;br /&gt;
&lt;br /&gt;
&amp;lt;math&amp;gt;\mathbf{b}_1 = \mathbf{a}_1&amp;lt;/math&amp;gt;&lt;br /&gt;
&lt;br /&gt;
&amp;lt;math&amp;gt;\mathbf{b}_2 = \mathbf{a}_2 - \mathbf{proj}_{\mathbf{b}_1} \mathbf{a}_2 &amp;lt;/math&amp;gt;&lt;br /&gt;
&lt;br /&gt;
&amp;lt;math&amp;gt;\mathbf{b}_3 = \mathbf{a}_3 - \mathbf{proj}_{\mathbf{b}_1} \mathbf{a}_3 - \mathbf{proj}_{\mathbf{b}_2} \mathbf{a}_3 &amp;lt;/math&amp;gt;&lt;br /&gt;
&lt;br /&gt;
&amp;lt;math&amp;gt;\vdots&amp;lt;/math&amp;gt;&lt;br /&gt;
&lt;br /&gt;
&amp;lt;math&amp;gt;\mathbf{b}_m = \mathbf{a}_m - \sum_{j=1}^{m-1} \mathbf{proj}_{\mathbf{b}_j} \mathbf{a}_m&amp;lt;/math&amp;gt;&lt;br /&gt;
&lt;br /&gt;
Или поэлементно:&lt;br /&gt;
&lt;br /&gt;
&amp;lt;math&amp;gt;\beta_{1j} = \alpha_{1j}&amp;lt;/math&amp;gt;&lt;br /&gt;
&lt;br /&gt;
&amp;lt;math&amp;gt;\beta_{ij} = \alpha_{ij} - (\sum_{k=1}^{i-1} \mathbf{proj}_{\mathbf{b}_k} \mathbf{a}_i)_j = \alpha_{ij} - \sum_{k=1}^{i-1}\frac{\sum_{s=1}^{n}\alpha_{is}\beta_{ks}}{\sum_{s=1}^{n}\beta_{ks}\beta_{ks}}\beta_{kj} &amp;lt;/math&amp;gt;&lt;br /&gt;
&lt;br /&gt;
=== Вычислительное ядро алгоритма ===&lt;br /&gt;
Основное время работы алгоритма приходится на вычисление сумм &amp;lt;math&amp;gt;\sum_{i=1}^{j-1} \mathbf{proj}_{\mathbf{b}_i} \mathbf{a}_k \forall j: j=\overline{1, m}&amp;lt;/math&amp;gt;.&lt;br /&gt;
&lt;br /&gt;
=== Макроструктура алгоритма ===&lt;br /&gt;
Из [[#Математическое описание алгоритма|математического описания алгоритма]] и [[#Вычислительное ядро алгоритма|описания ядра алгоритма]] в предыдущих разделах следует, что основную часть данного метода составляют операции вычисления проекций векторов, а также их сумм. Таким образом, в алгоритме можно выделить следующие макрооперации: скалярное произведение векторов в количестве &amp;lt;math&amp;gt;(m-1)m&amp;lt;/math&amp;gt;, а также множественные (всего &amp;lt;math&amp;gt;m-1&amp;lt;/math&amp;gt;) вычисления сумм &amp;lt;math&amp;gt;\mathbf{a}_i - \sum_{j=1}^{i-1} \frac{\left \langle a_i,b_j \right \rangle}{\left \langle b_j,b_j \right \rangle }b_j&amp;lt;/math&amp;gt;.&lt;br /&gt;
&lt;br /&gt;
Макроструктура может быть представлена в следующем виде:	&lt;br /&gt;
# Вычисление проекций &amp;lt;math&amp;gt;\mathbf{proj}_{\mathbf{b}_j} \mathbf{a}_i \forall j: j=\overline{1, i - 1}&amp;lt;/math&amp;gt; для текущего шага &amp;lt;math&amp;gt;i&amp;lt;/math&amp;gt;.	&lt;br /&gt;
# Вычисление суммы &amp;lt;math&amp;gt;\mathbf{a}_i - \sum_{j=1}^{i-1} \frac{\left \langle a_i,b_j \right \rangle}{\left \langle b_j,b_j \right \rangle }b_j&amp;lt;/math&amp;gt; для текущего шага &amp;lt;math&amp;gt;i&amp;lt;/math&amp;gt;.&lt;br /&gt;
# Переход на следующий шаг.&lt;br /&gt;
&lt;br /&gt;
=== Схема реализации последовательного алгоритма ===&lt;br /&gt;
Рассмотрим алгоритм, написанный в виде функции для математической системы MATLAB.&lt;br /&gt;
&lt;br /&gt;
&#039;&#039;&#039;Входные данные.&#039;&#039;&#039;&lt;br /&gt;
&lt;br /&gt;
Матрица &amp;lt;math&amp;gt;A&amp;lt;/math&amp;gt; с линейно-независимыми векторами в столбцах.&lt;br /&gt;
&lt;br /&gt;
&#039;&#039;&#039;Выходные данные.&#039;&#039;&#039;&lt;br /&gt;
&lt;br /&gt;
Матрица &amp;lt;math&amp;gt;Q&amp;lt;/math&amp;gt; с ортонормированным базисом &amp;lt;math&amp;gt;A&amp;lt;/math&amp;gt;.&lt;br /&gt;
&lt;br /&gt;
&#039;&#039;&#039;Использование.&#039;&#039;&#039;&lt;br /&gt;
&amp;lt;source lang=&amp;quot;matlab&amp;quot;&amp;gt;&lt;br /&gt;
Q = gramschmidt( A );&lt;br /&gt;
&amp;lt;/source&amp;gt;&lt;br /&gt;
&lt;br /&gt;
&#039;&#039;&#039;Реализация.&#039;&#039;&#039;&lt;br /&gt;
&amp;lt;source lang=&amp;quot;matlab&amp;quot;&amp;gt;&lt;br /&gt;
function Q = gramschmidt( A )&lt;br /&gt;
% Число векторов.&lt;br /&gt;
n = size( A, 2 );&lt;br /&gt;
 &lt;br /&gt;
% Инициализируем выходную матрицу.&lt;br /&gt;
Q = zeros( n );&lt;br /&gt;
 &lt;br /&gt;
% Преобразуем каждый вектор в базисный:&lt;br /&gt;
% (1) j-ый базисный вектор будет ортогонален каждому из предыдущих 1..j-1 векторов;&lt;br /&gt;
% (2) будет единичной длины.&lt;br /&gt;
for j = 1 : n&lt;br /&gt;
    % Выбираем j-ый вектор&lt;br /&gt;
    u = A( :, j );&lt;br /&gt;
    &lt;br /&gt;
    % Специальный случай для j = 1: просто нормируем этот вектор и помещаем&lt;br /&gt;
    % первым в найденный базис, так как нет векторов, относительно которых&lt;br /&gt;
    % нужно было бы делать его ортогональным.&lt;br /&gt;
&lt;br /&gt;
    % Удаляем из оригинального вектора &amp;quot;u&amp;quot; все компоненты натянутые на базис&lt;br /&gt;
    % из векторов 1..j-1, их вклад будет удален.&lt;br /&gt;
    % =&amp;gt; j-ый вектор ортогонален остальным.&lt;br /&gt;
    % Предыдущие базисные вектора были найдены на предыдуших шагах.&lt;br /&gt;
    % =&amp;gt; соблюдаем принцип ортогональности, но не ортонормированности.&lt;br /&gt;
    for i = 1 : j - 1&lt;br /&gt;
        u = u - proj( Q(:,i), A(:,j) );&lt;br /&gt;
    end&lt;br /&gt;
     &lt;br /&gt;
    % Нормируем вектор&lt;br /&gt;
    Q(:,j) = u ./ norm( u );&lt;br /&gt;
end&lt;br /&gt;
end&lt;br /&gt;
 &lt;br /&gt;
% Проекция вектора &amp;quot;a&amp;quot; коллинеарно вектору &amp;quot;e&amp;quot;.&lt;br /&gt;
function p = proj( e, a )&lt;br /&gt;
p = (e&#039; * a) / (e&#039; * e) .* e;&lt;br /&gt;
end&lt;br /&gt;
&amp;lt;/source&amp;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;.&lt;br /&gt;
&lt;br /&gt;
# Скалярное произведение векторов требует &amp;lt;math&amp;gt;n-1&amp;lt;/math&amp;gt; сложение и &amp;lt;math&amp;gt;n&amp;lt;/math&amp;gt; произведений.&lt;br /&gt;
# Вычитание проекции вектора требует &amp;lt;math&amp;gt;2&amp;lt;/math&amp;gt; скалярных произведения, &amp;lt;math&amp;gt;1&amp;lt;/math&amp;gt; деление, &amp;lt;math&amp;gt;n&amp;lt;/math&amp;gt; произведений и &amp;lt;math&amp;gt;n&amp;lt;/math&amp;gt; сложений, то есть:&lt;br /&gt;
## &amp;lt;math&amp;gt;3n-2&amp;lt;/math&amp;gt; (&amp;lt;math&amp;gt;+&amp;lt;/math&amp;gt;);&lt;br /&gt;
## &amp;lt;math&amp;gt;3n&amp;lt;/math&amp;gt; (&amp;lt;math&amp;gt;\times&amp;lt;/math&amp;gt;);&lt;br /&gt;
## &amp;lt;math&amp;gt;1&amp;lt;/math&amp;gt; (&amp;lt;math&amp;gt;\div&amp;lt;/math&amp;gt;).&lt;br /&gt;
# Вычисление &amp;lt;math&amp;gt;i&amp;lt;/math&amp;gt;-го вектора требует &amp;lt;math&amp;gt;i-1&amp;lt;/math&amp;gt; вычитаний проекций, то есть:&lt;br /&gt;
## &amp;lt;math&amp;gt;(3n-2)(i-1)&amp;lt;/math&amp;gt; (&amp;lt;math&amp;gt;+&amp;lt;/math&amp;gt;);&lt;br /&gt;
## &amp;lt;math&amp;gt;3n(i-1)&amp;lt;/math&amp;gt; (&amp;lt;math&amp;gt;\times&amp;lt;/math&amp;gt;);&lt;br /&gt;
## &amp;lt;math&amp;gt;i-1&amp;lt;/math&amp;gt; (&amp;lt;math&amp;gt;\div&amp;lt;/math&amp;gt;).&lt;br /&gt;
# Мы вычисляем вектора от &amp;lt;math&amp;gt;i=1&amp;lt;/math&amp;gt; до &amp;lt;math&amp;gt;m&amp;lt;/math&amp;gt;, поэтому множители &amp;lt;math&amp;gt;(i-1)&amp;lt;/math&amp;gt; выражаются &#039;&#039;треугольным числом&#039;&#039; &amp;lt;math&amp;gt;(m-1)\frac{m}{2}&amp;lt;/math&amp;gt;.&lt;br /&gt;
## &amp;lt;math&amp;gt;(3n-2)(m-1)\frac{m}{2}&amp;lt;/math&amp;gt; (&amp;lt;math&amp;gt;+&amp;lt;/math&amp;gt;);&lt;br /&gt;
## &amp;lt;math&amp;gt;3n(m-1)\frac{m}{2}&amp;lt;/math&amp;gt; (&amp;lt;math&amp;gt;\times&amp;lt;/math&amp;gt;);&lt;br /&gt;
## &amp;lt;math&amp;gt;(m-1)\frac{m}{2}&amp;lt;/math&amp;gt; (&amp;lt;math&amp;gt;\div&amp;lt;/math&amp;gt;).&lt;br /&gt;
&lt;br /&gt;
Таким образом, cложность алгоритма &amp;lt;math&amp;gt;O(nm^2)&amp;lt;/math&amp;gt;.&lt;br /&gt;
&lt;br /&gt;
=== Информационный граф ===&lt;br /&gt;
Граф состоит из элементов 2 видов: прямоугольников и овалов. Прямоугольниками обозначаются данные, причем красному цвету соответствуют входные данные, а зеленому ― выходные. Овалы означают операции над переданными данными. Голубым цветом обозначены более сложно организованные операции, а синим ― менее. Для нахождения &amp;lt;math&amp;gt;\mathbf{b}_i&amp;lt;/math&amp;gt; вектора требуются значения всех векторов с номерами, меньшими &amp;lt;math&amp;gt;i&amp;lt;/math&amp;gt;, однако, расчеты проекций можно начинать, не дожидаясь вычисления всех векторов, а производить сразу, как только соответствующий ортогональный вектор будет рассчитан. Эта зависимость и отражена на графе ниже.&lt;br /&gt;
[[Файл:Gram_schmidt_graph.png|thumb|800px|center|frame|Рисунок 1. Информационный граф алгоритма Грама-Шмидта.]]&lt;br /&gt;
&lt;br /&gt;
=== Ресурс параллелизма алгоритма ===&lt;br /&gt;
Для построения базиса методом Грама–Шмидта в параллельном случае, имея в распоряжении &amp;lt;math&amp;gt;m&amp;lt;/math&amp;gt; и более потоков, необходимо выполнить следующие ярусы:&lt;br /&gt;
#&amp;lt;math&amp;gt;m-1&amp;lt;/math&amp;gt; ярус вычисления проекций;&lt;br /&gt;
#&amp;lt;math&amp;gt;m-1&amp;lt;/math&amp;gt; ярус вычитания векторов.&lt;br /&gt;
&lt;br /&gt;
Эти ярусы чередуются. Количество операций проекции и вычитания векторов уменьшается на единицу в каждом следующем ярусе. Вычисление проекции вектора требует 2 скалярных произведения, 1 деление и &amp;lt;math&amp;gt;n&amp;lt;/math&amp;gt; произведений, то есть:&lt;br /&gt;
#&amp;lt;math&amp;gt;2n-2&amp;lt;/math&amp;gt; (&amp;lt;math&amp;gt;+&amp;lt;/math&amp;gt;);&lt;br /&gt;
#&amp;lt;math&amp;gt;3n&amp;lt;/math&amp;gt; (&amp;lt;math&amp;gt;\times&amp;lt;/math&amp;gt;);&lt;br /&gt;
#&amp;lt;math&amp;gt;1&amp;lt;/math&amp;gt; (&amp;lt;math&amp;gt;\div&amp;lt;/math&amp;gt;).&lt;br /&gt;
&lt;br /&gt;
Если считать, что вычисление проекции происходит последовательно, то сложность по высоте &amp;lt;math&amp;gt;O(n)&amp;lt;/math&amp;gt;, по ширине &amp;lt;math&amp;gt;O(1)&amp;lt;/math&amp;gt; (то есть одна операция проекции в ярусе представляется набором ярусов с простыми последовательными операциями). В самом первом ярусе находится &amp;lt;math&amp;gt;m-1&amp;lt;/math&amp;gt; проекций и это наибольшее количество операций проекций, тогда сложность по высоте будет &amp;lt;math&amp;gt;O(n)&amp;lt;/math&amp;gt;, по ширине ― &amp;lt;math&amp;gt;O(m)&amp;lt;/math&amp;gt;.&lt;br /&gt;
&lt;br /&gt;
Вычисление вычитания векторов требует &amp;lt;math&amp;gt;n&amp;lt;/math&amp;gt; вычитаний, и если считать, что операция происходит последовательно, то сложность по высоте &amp;lt;math&amp;gt;O(n)&amp;lt;/math&amp;gt;, по ширине &amp;lt;math&amp;gt;O(1)&amp;lt;/math&amp;gt;. Во втором ярусе находится &amp;lt;math&amp;gt;m-1&amp;lt;/math&amp;gt; вычитаний и это наибольшее количество операций вычитаний, тогда сложность по высоте будет &amp;lt;math&amp;gt;O(n)&amp;lt;/math&amp;gt;, по ширине ― &amp;lt;math&amp;gt;O(m)&amp;lt;/math&amp;gt;.&lt;br /&gt;
&lt;br /&gt;
Из вышеизложенного следует, что при классификации по ширине ЯПФ алгоритм имеет сложность &amp;lt;math&amp;gt;O(m)&amp;lt;/math&amp;gt;, а по высоте ― &amp;lt;math&amp;gt;O(nm)&amp;lt;/math&amp;gt;.&lt;br /&gt;
&lt;br /&gt;
=== Входные и выходные данные алгоритма ===&lt;br /&gt;
&#039;&#039;&#039;Входные данные.&#039;&#039;&#039; Матрица &amp;lt;math&amp;gt;A&amp;lt;/math&amp;gt; с элементами &amp;lt;math&amp;gt;\alpha_{ij}&amp;lt;/math&amp;gt;, где &amp;lt;math&amp;gt;i = \overline{1, m}&amp;lt;/math&amp;gt; (количество линейно независимых векторов) и &amp;lt;math&amp;gt;j = \overline{1, n}&amp;lt;/math&amp;gt; (размерность пространства), при этом &amp;lt;math&amp;gt;m \leqslant n&amp;lt;/math&amp;gt;.&lt;br /&gt;
&lt;br /&gt;
&#039;&#039;&#039;Объем входных данных.&#039;&#039;&#039; &amp;lt;math&amp;gt;mn&amp;lt;/math&amp;gt;&lt;br /&gt;
&lt;br /&gt;
&#039;&#039;&#039;Выходные данные.&#039;&#039;&#039; Матрица &amp;lt;math&amp;gt;B&amp;lt;/math&amp;gt; с элементами &amp;lt;math&amp;gt;\beta_{ij}&amp;lt;/math&amp;gt;, где &amp;lt;math&amp;gt;i = \overline{1, m}&amp;lt;/math&amp;gt; и &amp;lt;math&amp;gt;j = \overline{1, n}&amp;lt;/math&amp;gt;, тогда &amp;lt;math&amp;gt;b_{1}, \dots, b_{m}&amp;lt;/math&amp;gt; — система ортогональных векторов.&lt;br /&gt;
&lt;br /&gt;
&#039;&#039;&#039;Объем выходных данных.&#039;&#039;&#039; &amp;lt;math&amp;gt;mn&amp;lt;/math&amp;gt;&lt;br /&gt;
&lt;br /&gt;
=== Свойства алгоритма ===&lt;br /&gt;
&amp;lt;ol&amp;gt;&lt;br /&gt;
&amp;lt;li&amp;gt;Отношение последовательной и параллельной сложности в предположении доступности неограниченного числа необходимых ресурсов — &amp;lt;math&amp;gt;m&amp;lt;/math&amp;gt;. При этом необходимо отметить, что отношение числа операций к суммарному объему входных и выходных данных (вычислительная мощность алгоритма) — линейное.&amp;lt;/li&amp;gt;&lt;br /&gt;
&lt;br /&gt;
&amp;lt;li&amp;gt;Алгоритм почти полностью детерминирован, то есть гарантирована единственность результата выполнения. Это означает, что возможно накопление ошибок округления, то есть векторы выходной матрицы часто не точно ортогональны. Из-за потери ортогональности в процессе вычислений классический процесс Грама-Шмидта называют численно неустойчивым. Однако, процесс Грама-Шмидта может быть сделан более вычислительно устойчивым путём небольшой модификации. Такой алгоритм называется модифицированным процессом Грама-Шмидта. Рассмотрим его отличие подробнее.&lt;br /&gt;
&amp;lt;br /&amp;gt;&lt;br /&gt;
&amp;lt;math&amp;gt; &lt;br /&gt;
\begin{array}{l}&lt;br /&gt;
\mathbf{b}_j\\&lt;br /&gt;
  \\&lt;br /&gt;
\mathbf{b}_j&lt;br /&gt;
\end{array}&lt;br /&gt;
&lt;br /&gt;
\begin{array}{c}&lt;br /&gt;
= \\&lt;br /&gt;
  \\&lt;br /&gt;
=&lt;br /&gt;
\end{array}&lt;br /&gt;
&lt;br /&gt;
\underbrace{&lt;br /&gt;
\underbrace{&lt;br /&gt;
\underbrace{&lt;br /&gt;
&lt;br /&gt;
\begin{array}{c}&lt;br /&gt;
\mathbf{a}_j \\&lt;br /&gt;
   \\&lt;br /&gt;
\mathbf{a}_j&lt;br /&gt;
\end{array}&lt;br /&gt;
&lt;br /&gt;
\begin{array}{c}&lt;br /&gt;
- \\&lt;br /&gt;
  \\&lt;br /&gt;
-&lt;br /&gt;
\end{array}&lt;br /&gt;
&lt;br /&gt;
\begin{array}{c}&lt;br /&gt;
\mathbf{proj}_{\mathbf{b}_1}\,\mathbf{a}_j \\&lt;br /&gt;
   ||                                      \\&lt;br /&gt;
\mathbf{proj}_{\mathbf{b}_1}\,\mathbf{a}_j&lt;br /&gt;
\end{array}&lt;br /&gt;
&lt;br /&gt;
}_{\mathbf{a}_j^{(1)}}&lt;br /&gt;
&lt;br /&gt;
\begin{array}{c}&lt;br /&gt;
- \\&lt;br /&gt;
  \\&lt;br /&gt;
-&lt;br /&gt;
\end{array}&lt;br /&gt;
&lt;br /&gt;
\begin{array}{c}&lt;br /&gt;
\mathbf{proj}_{\mathbf{b}_2}\,\mathbf{a}_j       \\&lt;br /&gt;
   ||                                            \\&lt;br /&gt;
\mathbf{proj}_{\mathbf{b}_2}\,\mathbf{a}_j^{(1)}&lt;br /&gt;
\end{array}&lt;br /&gt;
&lt;br /&gt;
}_{\mathbf{a}_j^{(2)}}&lt;br /&gt;
&lt;br /&gt;
\begin{array}{c}&lt;br /&gt;
- \\&lt;br /&gt;
  \\&lt;br /&gt;
-&lt;br /&gt;
\end{array}&lt;br /&gt;
&lt;br /&gt;
\begin{array}{c}&lt;br /&gt;
\mathbf{proj}_{\mathbf{b}_3}\,\mathbf{a}_j       \\&lt;br /&gt;
   ||                                            \\&lt;br /&gt;
\mathbf{proj}_{\mathbf{b}_3}\,\mathbf{a}_j^{(2)}&lt;br /&gt;
\end{array}&lt;br /&gt;
&lt;br /&gt;
}_{\mathbf{a}_j^{(3)}}&lt;br /&gt;
&lt;br /&gt;
\begin{array}{ccc}&lt;br /&gt;
- &amp;amp; \ldots &amp;amp; - \\&lt;br /&gt;
               \\&lt;br /&gt;
- &amp;amp; \ldots &amp;amp; - &lt;br /&gt;
\end{array}&lt;br /&gt;
&lt;br /&gt;
\begin{array}{cc}&lt;br /&gt;
\mathbf{proj}_{\mathbf{b}_{j-1}}\,\mathbf{a}_j         &amp;amp; (1) \\&lt;br /&gt;
   ||                                                  &amp;amp;      \\&lt;br /&gt;
\mathbf{proj}_{\mathbf{b}_{j-1}}\,\mathbf{a}_j^{(j-2)} &amp;amp; (2)&lt;br /&gt;
\end{array}&lt;br /&gt;
&lt;br /&gt;
&amp;lt;/math&amp;gt;&lt;br /&gt;
&amp;lt;br /&amp;gt;&lt;br /&gt;
Формула (1) показывает вычисление &amp;lt;math&amp;gt;\mathbf{b}_j&amp;lt;/math&amp;gt; в классическом процессе, а формула (2) — в модифицированном.&lt;br /&gt;
&amp;lt;br /&amp;gt;&lt;br /&gt;
Разница между ними заключается в том, от каких векторов вычисляются компоненты: от &amp;lt;math&amp;gt;\mathbf{a}_j&amp;lt;/math&amp;gt; в классическом процессе или от результата предыдущего вычитания, то есть от &amp;lt;math&amp;gt;\mathbf{a}_j^{(k)}&amp;lt;/math&amp;gt; в модифицированном процессе. Таким образом, &amp;lt;math&amp;gt;\mathbf{a}_j^{(k)}&amp;lt;/math&amp;gt; представляет собой &amp;lt;math&amp;gt;\mathbf{a}_j&amp;lt;/math&amp;gt;, из которого удалены компоненты в направлениях &amp;lt;math&amp;gt;\mathbf{b}_1,\,\;\ldots,\;\mathbf{b}_{k}&amp;lt;/math&amp;gt;. Компонента вектора &amp;lt;math&amp;gt;\mathbf{a}_j&amp;lt;/math&amp;gt; в направлении &amp;lt;math&amp;gt;\mathbf{b}_{k+1}&amp;lt;/math&amp;gt; при этом удалении не затрагивается и поэтому она в &amp;lt;math&amp;gt;\mathbf{a}_j^{(k)}&amp;lt;/math&amp;gt; такая же, как в &amp;lt;math&amp;gt;\mathbf{a}_j&amp;lt;/math&amp;gt;.&amp;lt;/li&amp;gt;&lt;br /&gt;
&lt;br /&gt;
&amp;lt;li&amp;gt;Процесс Грама-Шмидта может применяться к бесконечной последовательности линейно независимых векторов, а также к линейно зависимым векторам. В этом случае он выдаёт &amp;lt;math&amp;gt;\mathbf{0}&amp;lt;/math&amp;gt; (нулевой вектор) на шаге &amp;lt;math&amp;gt;j&amp;lt;/math&amp;gt;, если &amp;lt;math&amp;gt;\mathbf{a}_j&amp;lt;/math&amp;gt; является линейной комбинацией векторов &amp;lt;math&amp;gt;\mathbf{a}_1,\;\ldots,\;\mathbf{a}_{j-1}&amp;lt;/math&amp;gt;. Если это может случиться, то для сохранения ортогональности выходных векторов и для предотвращения деления на ноль при ортонормировании алгоритм должен делать проверку на нулевые векторы и отбрасывать их. Количество векторов, выдаваемых алгоритмом, будет равно размерности подпространства, порождённого векторами (то есть количеству линейно независимых векторов, которые можно выделить среди исходных векторов).&amp;lt;/li&amp;gt;&lt;br /&gt;
&lt;br /&gt;
&amp;lt;li&amp;gt;Процесс Грама-Шмидта может быть истолкован как разложение невырожденной квадратной матрицы в произведение ортогональной (или унитарной матрицы в случае эрмитова пространства) и верхнетреугольной матрицы с положительными диагональными элементами — QR-разложение.&amp;lt;/li&amp;gt;&lt;br /&gt;
&amp;lt;/ol&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;
В рамках статьи была написана своя параллельная реализация процесса ортогонализации Грама-Шмидта с использованием OpenMPI. Реализация вместе с данными и вспомогательными скриптами доступна в репозитории [https://github.com/zodinyac/GramSchmidt GramSchmidt].&lt;br /&gt;
&lt;br /&gt;
Основная идея реализации: Нулевой вычислительный узел является управляющим, остальные ― подчиненными. Подчиненные узлы запрашивают &amp;quot;задание&amp;quot; у управляющего узла ― номер вектора, который требуется расчитать. Когда подчиненный узел заканчивает расчет, то пересылает готовый вектор на управляющий узел и запрашивает следующее задание. Если заданий больше нет, то подчиненный узел заканчивает свою работу. Каждый узел имеет список уже готовых векторов. Если при расчете требуется вектор, которого нет в списке, то он запрашивается у управляющего узла.&lt;br /&gt;
&lt;br /&gt;
Испытания реализованного алгоритма проводились на [http://parallel.ru/cluster/lomonosov.html суперкомпьютере &amp;quot;Ломоносов&amp;quot;] Суперкомпьютерного комплекса Московского университета со следующими значениями параметров:&lt;br /&gt;
* размер матрицы по одному измерению: 100, 500 и далее с шагом 500 до 10000 элементов,&lt;br /&gt;
* число процессов: 1, 2, 4, 8 и далее с шагом 8 до 128. Тестирование с использованием 1, 2, 4 и 8 процессов не использовалось для данных, где размер превышал 5000.&lt;br /&gt;
&lt;br /&gt;
На следующем рисунке приведен график времени работы алгоритма в зависимости от числа процессов и размерности матриц. &lt;br /&gt;
[[File:Plot3d-gs-belov-bogomolov-1.png|thumb|center|720px|Рисунок 2. График производительности реализации алгоритма в зависимости от числа процессоров и размерности матриц.]]&lt;br /&gt;
На следующем рисунке приведен график времени работы алгоритма в зависимости от числа процессов и размерности матриц, при этом часть данных с самым долгим временем работы отброшена, чтобы более наглядно продемонстрировать зависимость.&lt;br /&gt;
[[File:Plot3d-gs-belov-bogomolov-2.png|thumb|center|720px|Рисунок 3. График производительности реализации алгоритма в зависимости от числа процессоров и размерности матриц.]]&lt;br /&gt;
На следующем рисунке приведен график эффективности распараллеливания алгоритма в зависимости от числа процессов и размерности матриц.&lt;br /&gt;
[[File:Gs-parallel_efficiency.png|thumb|center|720px|Рисунок 4. График эффективности распараллеливания алгоритма в зависимости от числа процессоров и размерности матриц.]]&lt;br /&gt;
&lt;br /&gt;
{| class=&amp;quot;wikitable&amp;quot;&lt;br /&gt;
|-&lt;br /&gt;
! Размер матрицы&lt;br /&gt;
! 100&lt;br /&gt;
! 500&lt;br /&gt;
! 1000&lt;br /&gt;
! 1500&lt;br /&gt;
! 2000&lt;br /&gt;
! 2500&lt;br /&gt;
! 3000&lt;br /&gt;
! 3500&lt;br /&gt;
! 4000&lt;br /&gt;
! 4500&lt;br /&gt;
! 5000&lt;br /&gt;
! 5500&lt;br /&gt;
! 6000&lt;br /&gt;
! 6500&lt;br /&gt;
! 7000&lt;br /&gt;
! 7500&lt;br /&gt;
! 8000&lt;br /&gt;
! 8500&lt;br /&gt;
! 9000&lt;br /&gt;
! 9500&lt;br /&gt;
! 10000&lt;br /&gt;
|-&lt;br /&gt;
| Число узлов, на которых время работы минимально&lt;br /&gt;
| 1&lt;br /&gt;
| 32&lt;br /&gt;
| 48&lt;br /&gt;
| 56&lt;br /&gt;
| 24&lt;br /&gt;
| 32&lt;br /&gt;
| 32&lt;br /&gt;
| 40&lt;br /&gt;
| 40&lt;br /&gt;
| 40&lt;br /&gt;
| 48&lt;br /&gt;
| 56&lt;br /&gt;
| 56&lt;br /&gt;
| 56&lt;br /&gt;
| 64&lt;br /&gt;
| 64&lt;br /&gt;
| 72&lt;br /&gt;
| 72&lt;br /&gt;
| 72&lt;br /&gt;
| 80&lt;br /&gt;
| 80&lt;br /&gt;
|}&lt;br /&gt;
&lt;br /&gt;
=== Динамические характеристики и эффективность реализации алгоритма ===&lt;br /&gt;
=== Выводы для классов архитектур ===&lt;br /&gt;
=== Существующие реализации алгоритма ===&lt;br /&gt;
Данный алгоритм реализован во множестве библиотек и математических программных пакетах.&lt;br /&gt;
&lt;br /&gt;
# Библиотека [https://github.com/open-epicycle/Epicycle.Math-cs Epicycle] (C#).&lt;br /&gt;
# Библиотека [http://www.spectralpython.net/ Spectral Python (SPy)].&lt;br /&gt;
# Библиотека [https://hackage.haskell.org/package/vect-0.4.7/docs/Data-Vect-Float-GramSchmidt.html vect] (Haskell).&lt;br /&gt;
&lt;br /&gt;
==== Пакет Mathematica ====&lt;br /&gt;
Приведем пример скрипта, предназначенного для пакета Mathematica, который проводит процесс ортогонализации Грама-Шмидта над векторами, заданными в фигурных скобках последней строки. Количество векторов и их координат могут быть произвольными. В данном случае для примера взяты векторы &amp;lt;math&amp;gt;\{-2,\;1,\;0\}&amp;lt;/math&amp;gt;, &amp;lt;math&amp;gt;\{-2,\;0,\;1\}&amp;lt;/math&amp;gt;, &amp;lt;math&amp;gt;\{-0{.}5,\;-1,\;1\}&amp;lt;/math&amp;gt;.&lt;br /&gt;
&amp;lt;source lang=&#039;mathematica&#039;&amp;gt;Projection[v1_, v2_] := (v1.v2*v2)/v2.v2&lt;br /&gt;
MultipleProjection[v1_, vecs_] := Plus @@ (Projection[v1, #1] &amp;amp;) /@ vecs&lt;br /&gt;
GramSchmidt[mat_] := Fold[Join[#1, {#2 - MultipleProjection[#2, #1]}] &amp;amp;, {}, mat]&lt;br /&gt;
GramSchmidt[{{-2, 1, 0}, {-2, 0, 1}, {-0.5, -1, 1}}]&amp;lt;/source&amp;gt;&lt;br /&gt;
&lt;br /&gt;
==== Пакет Maxima ====&lt;br /&gt;
Приведем пример скрипта, предназначенного для пакета Maxima, который проводит процесс ортогонализации Грама-Шмидта над векторами, заданными в фигурных скобках последней строки. Количество векторов и их координат могут быть произвольными. В данном случае для примера взяты векторы &amp;lt;math&amp;gt;\{-2,\;1,\;0\}&amp;lt;/math&amp;gt;, &amp;lt;math&amp;gt;\{-2,\;0,\;1\}&amp;lt;/math&amp;gt;, &amp;lt;math&amp;gt;\{-0{.}5,\;-1,\;1\}&amp;lt;/math&amp;gt;.&lt;br /&gt;
&amp;lt;source lang=&#039;maxima&#039;&amp;gt;&lt;br /&gt;
load(eigen);&lt;br /&gt;
x: matrix ([-2,1,0],[-2,0,1],[-0.5,-1,1]);&lt;br /&gt;
y: gramschmidt(x);&lt;br /&gt;
&amp;lt;/source&amp;gt;&lt;br /&gt;
&lt;br /&gt;
==== Пакет MATLAB ====&lt;br /&gt;
Приведем пример скрипта, предназначенного для пакета MATLAB, который проводит процесс ортогонализации Грама-Шмидта над векторами, заданными в фигурных скобках последней строки. В данном пакете уже существует функция, которая осуществляет данный процесс. Столбцы входной матрицы предполагаются линейно-независимыми, количество векторов и их координат могут быть произвольными. Функция возращает матрицу X с ортонормированными столбцами и обратимую верхне-треугольную матрицу Y.&lt;br /&gt;
&lt;br /&gt;
В данном случае для примера взяты векторы &amp;lt;math&amp;gt;\{-2,\;1,\;0\}&amp;lt;/math&amp;gt;, &amp;lt;math&amp;gt;\{-2,\;0,\;1\}&amp;lt;/math&amp;gt;, &amp;lt;math&amp;gt;\{-0{.}5,\;-1,\;1\}&amp;lt;/math&amp;gt;.&lt;br /&gt;
&amp;lt;source lang=&#039;matlab&#039;&amp;gt;&lt;br /&gt;
[x y]=gschmidt([-2 1 0; -2 0 1; -0.5 -1 1])&lt;br /&gt;
&amp;lt;/source&amp;gt;&lt;br /&gt;
&lt;br /&gt;
== Литература ==&lt;/div&gt;</summary>
		<author><name>BDA</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:BDA/%D0%9E%D1%80%D1%82%D0%BE%D0%B3%D0%BE%D0%BD%D0%B0%D0%BB%D0%B8%D0%B7%D0%B0%D1%86%D0%B8%D1%8F_%D0%93%D1%80%D0%B0%D0%BC%D0%B0-%D0%A8%D0%BC%D0%B8%D0%B4%D1%82%D0%B0&amp;diff=18439</id>
		<title>Участник:BDA/Ортогонализация Грама-Шмидта</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:BDA/%D0%9E%D1%80%D1%82%D0%BE%D0%B3%D0%BE%D0%BD%D0%B0%D0%BB%D0%B8%D0%B7%D0%B0%D1%86%D0%B8%D1%8F_%D0%93%D1%80%D0%B0%D0%BC%D0%B0-%D0%A8%D0%BC%D0%B8%D0%B4%D1%82%D0%B0&amp;diff=18439"/>
		<updated>2016-11-19T02:49:24Z</updated>

		<summary type="html">&lt;p&gt;BDA: /* Масштабируемость алгоритма и его реализации */&lt;/p&gt;
&lt;hr /&gt;
&lt;div&gt;{{Assignment}}&lt;br /&gt;
&lt;br /&gt;
{{algorithm&lt;br /&gt;
| name              = Ортогонализация Грама-Шмидта&lt;br /&gt;
| serial_complexity = &amp;lt;math&amp;gt;O(nm^2)&amp;lt;/math&amp;gt;&lt;br /&gt;
| pf_height         = &amp;lt;math&amp;gt;O(nm)&amp;lt;/math&amp;gt;&lt;br /&gt;
| pf_width          = &amp;lt;math&amp;gt;O(m)&amp;lt;/math&amp;gt;&lt;br /&gt;
| input_data        = &amp;lt;math&amp;gt;nm&amp;lt;/math&amp;gt;&lt;br /&gt;
| output_data       = &amp;lt;math&amp;gt;nm&amp;lt;/math&amp;gt;&lt;br /&gt;
}}&lt;br /&gt;
&lt;br /&gt;
Основные авторы описания: [[Участник:Zodiac|Белов Н. А.]] (пункты 1.3, 1.4, 1.5, 1.6, 1.9, 1.10, 2.4, 2.7, 3), [[Участник:BDA|Богомолов Д. А.]] (пункты 1.1, 1.2, 1.6, 1.7, 1.8, 2.4, 3).&lt;br /&gt;
&lt;br /&gt;
== Свойства и структура алгоритма ==&lt;br /&gt;
=== Общее описание алгоритма ===&lt;br /&gt;
&lt;br /&gt;
Ортогонализация ― алгоритм построения для данной линейно независимой системы векторов евклидова или эрмитова пространства V ортогональной системы ненулевых векторов, порождающих то же самое подпространство в V.&lt;br /&gt;
&lt;br /&gt;
Ортогонализация Грама–Шмидта&amp;lt;ref&amp;gt;Канатников А.Н., Крищенко А.П. &amp;quot;Линейная алгебра.&amp;quot; ― 3-е изд., стер. ― М.: Изд-во МГТУ им. Н.Э. Баумана, 2002&amp;lt;/ref&amp;gt; (процесс Грама–Шмидта) ― наиболее известный алгоритм ортогонализации. Назван в честь Йоргена Педерсена Грама&amp;lt;ref&amp;gt;O&#039;Connor, John J.; Robertson, Edmund F., &amp;quot;Jørgen Pedersen Gram&amp;quot;, MacTutor History of Mathematics archive, University of St Andrews.&amp;lt;/ref&amp;gt; и Эрхарда Шмидта&amp;lt;ref&amp;gt;O&#039;Connor, John J.; Robertson, Edmund F., &amp;quot;Erhard Schmidt&amp;quot;, MacTutor History of Mathematics archive, University of St Andrews.&amp;lt;/ref&amp;gt;, однако ранее уже появлялся в работах Лапласа и Коши. Является частным случаем разложения Ивасавы, так как может быть представлен как разложение невырожденной квадратной матрицы в произведение ортогональной (или унитарной матрицы в случае эрмитова пространства) и верхнетреугольной матрицы с положительными диагональными элементами.&lt;br /&gt;
&lt;br /&gt;
Рассматриваемый алгоритм применяется для борьбы с помехами в адаптивной системе селекции движущихся целей&amp;lt;ref&amp;gt;Орешкин Б.Н., Бакулев П.А. &amp;quot;Быстрая процедура ортогонализации Грамма–Шмидта и ее применение для борьбы с помехами в адаптивной системе селекции движущихся целей&amp;quot; ― Радиотехника / №12 за 2007 г.&amp;lt;/ref&amp;gt;, в протоколах безопасности&amp;lt;ref&amp;gt;Пискова А.В., Менщиков А.А., Коробейников А.Г. &amp;quot;Использование ортогонализации Грама-Шмидта в алгоритме приведения базиса решетки для протоколов безопасности&amp;quot; ― Вопросы кибербезопасности №1(14) 2016&amp;lt;/ref&amp;gt;, для повышения экономичности алгоритмов оценивания параметров моделей объектов управления&amp;lt;ref&amp;gt;Карелин А.Е., Светлаков А.А. &amp;quot;Использование ортогонализации Грама-Шмидта для повышения экономичности многоточечных алгоритмов рекуррентного оценивания параметров моделей объектов управления&amp;quot; ― Известия Томского политехнического университета [Известия ТПУ]. — 2006. — Т. 309, № 8. — [С. 15-19].&amp;lt;/ref&amp;gt; и в других областях.&lt;br /&gt;
&lt;br /&gt;
=== Математическое описание алгоритма ===&lt;br /&gt;
&#039;&#039;&#039;Входные данные.&#039;&#039;&#039; &amp;lt;math&amp;gt;m&amp;lt;/math&amp;gt; линейно независимых векторов &amp;lt;math&amp;gt;\mathbf{a}_1,...,\mathbf{a}_m&amp;lt;/math&amp;gt; c размерностью пространства &amp;lt;math&amp;gt;n&amp;lt;/math&amp;gt;, записанных в матрице &amp;lt;math&amp;gt;A&amp;lt;/math&amp;gt; с элементами &amp;lt;math&amp;gt;\alpha_{ij}&amp;lt;/math&amp;gt;.&lt;br /&gt;
&lt;br /&gt;
&#039;&#039;&#039;Выходные данные.&#039;&#039;&#039; &amp;lt;math&amp;gt;m&amp;lt;/math&amp;gt; ортогональных векторов &amp;lt;math&amp;gt;\mathbf{b}_1,...,\mathbf{b}_m&amp;lt;/math&amp;gt; c размерностью пространства &amp;lt;math&amp;gt;n&amp;lt;/math&amp;gt;, записанных в матрице &amp;lt;math&amp;gt;B&amp;lt;/math&amp;gt; с элементами &amp;lt;math&amp;gt;\beta_{ij}&amp;lt;/math&amp;gt;.&lt;br /&gt;
&lt;br /&gt;
Определим оператор проекции (проецирует вектор &amp;lt;math&amp;gt;\mathbf{a}&amp;lt;/math&amp;gt; коллинеарно вектору &amp;lt;math&amp;gt;\mathbf{b}&amp;lt;/math&amp;gt;) &amp;lt;math&amp;gt;\mathbf{proj_b a = \frac{\left \langle a,b \right \rangle}{\left \langle b,b \right \rangle }b}&amp;lt;/math&amp;gt;, где &amp;lt;math&amp;gt;\mathbf{\left \langle a,b \right \rangle}&amp;lt;/math&amp;gt; ― скалярное произведение векторов &amp;lt;math&amp;gt;\mathbf{a}&amp;lt;/math&amp;gt; и &amp;lt;math&amp;gt;\mathbf{b}&amp;lt;/math&amp;gt;.&lt;br /&gt;
&lt;br /&gt;
Тогда ортогональные векторы вычисляются следующим образом:&lt;br /&gt;
&lt;br /&gt;
&amp;lt;math&amp;gt;\mathbf{b}_1 = \mathbf{a}_1&amp;lt;/math&amp;gt;&lt;br /&gt;
&lt;br /&gt;
&amp;lt;math&amp;gt;\mathbf{b}_2 = \mathbf{a}_2 - \mathbf{proj}_{\mathbf{b}_1} \mathbf{a}_2 &amp;lt;/math&amp;gt;&lt;br /&gt;
&lt;br /&gt;
&amp;lt;math&amp;gt;\mathbf{b}_3 = \mathbf{a}_3 - \mathbf{proj}_{\mathbf{b}_1} \mathbf{a}_3 - \mathbf{proj}_{\mathbf{b}_2} \mathbf{a}_3 &amp;lt;/math&amp;gt;&lt;br /&gt;
&lt;br /&gt;
&amp;lt;math&amp;gt;\vdots&amp;lt;/math&amp;gt;&lt;br /&gt;
&lt;br /&gt;
&amp;lt;math&amp;gt;\mathbf{b}_m = \mathbf{a}_m - \sum_{j=1}^{m-1} \mathbf{proj}_{\mathbf{b}_j} \mathbf{a}_m&amp;lt;/math&amp;gt;&lt;br /&gt;
&lt;br /&gt;
Или поэлементно:&lt;br /&gt;
&lt;br /&gt;
&amp;lt;math&amp;gt;\beta_{1j} = \alpha_{1j}&amp;lt;/math&amp;gt;&lt;br /&gt;
&lt;br /&gt;
&amp;lt;math&amp;gt;\beta_{ij} = \alpha_{ij} - (\sum_{k=1}^{i-1} \mathbf{proj}_{\mathbf{b}_k} \mathbf{a}_i)_j = \alpha_{ij} - \sum_{k=1}^{i-1}\frac{\sum_{s=1}^{n}\alpha_{is}\beta_{ks}}{\sum_{s=1}^{n}\beta_{ks}\beta_{ks}}\beta_{kj} &amp;lt;/math&amp;gt;&lt;br /&gt;
&lt;br /&gt;
=== Вычислительное ядро алгоритма ===&lt;br /&gt;
Основное время работы алгоритма приходится на вычисление сумм &amp;lt;math&amp;gt;\sum_{i=1}^{j-1} \mathbf{proj}_{\mathbf{b}_i} \mathbf{a}_k \forall j: j=\overline{1, m}&amp;lt;/math&amp;gt;.&lt;br /&gt;
&lt;br /&gt;
=== Макроструктура алгоритма ===&lt;br /&gt;
Из [[#Математическое описание алгоритма|математического описания алгоритма]] и [[#Вычислительное ядро алгоритма|описания ядра алгоритма]] в предыдущих разделах следует, что основную часть данного метода составляют операции вычисления проекций векторов, а также их сумм. Таким образом, в алгоритме можно выделить следующие макрооперации: скалярное произведение векторов в количестве &amp;lt;math&amp;gt;(m-1)m&amp;lt;/math&amp;gt;, а также множественные (всего &amp;lt;math&amp;gt;m-1&amp;lt;/math&amp;gt;) вычисления сумм &amp;lt;math&amp;gt;\mathbf{a}_i - \sum_{j=1}^{i-1} \frac{\left \langle a_i,b_j \right \rangle}{\left \langle b_j,b_j \right \rangle }b_j&amp;lt;/math&amp;gt;.&lt;br /&gt;
&lt;br /&gt;
Макроструктура может быть представлена в следующем виде:	&lt;br /&gt;
# Вычисление проекций &amp;lt;math&amp;gt;\mathbf{proj}_{\mathbf{b}_j} \mathbf{a}_i \forall j: j=\overline{1, i - 1}&amp;lt;/math&amp;gt; для текущего шага &amp;lt;math&amp;gt;i&amp;lt;/math&amp;gt;.	&lt;br /&gt;
# Вычисление суммы &amp;lt;math&amp;gt;\mathbf{a}_i - \sum_{j=1}^{i-1} \frac{\left \langle a_i,b_j \right \rangle}{\left \langle b_j,b_j \right \rangle }b_j&amp;lt;/math&amp;gt; для текущего шага &amp;lt;math&amp;gt;i&amp;lt;/math&amp;gt;.&lt;br /&gt;
# Переход на следующий шаг.&lt;br /&gt;
&lt;br /&gt;
=== Схема реализации последовательного алгоритма ===&lt;br /&gt;
Рассмотрим алгоритм, написанный в виде функции для математической системы MATLAB.&lt;br /&gt;
&lt;br /&gt;
&#039;&#039;&#039;Входные данные.&#039;&#039;&#039;&lt;br /&gt;
&lt;br /&gt;
Матрица &amp;lt;math&amp;gt;A&amp;lt;/math&amp;gt; с линейно-независимыми векторами в столбцах.&lt;br /&gt;
&lt;br /&gt;
&#039;&#039;&#039;Выходные данные.&#039;&#039;&#039;&lt;br /&gt;
&lt;br /&gt;
Матрица &amp;lt;math&amp;gt;Q&amp;lt;/math&amp;gt; с ортонормированным базисом &amp;lt;math&amp;gt;A&amp;lt;/math&amp;gt;.&lt;br /&gt;
&lt;br /&gt;
&#039;&#039;&#039;Использование.&#039;&#039;&#039;&lt;br /&gt;
&amp;lt;source lang=&amp;quot;matlab&amp;quot;&amp;gt;&lt;br /&gt;
Q = gramschmidt( A );&lt;br /&gt;
&amp;lt;/source&amp;gt;&lt;br /&gt;
&lt;br /&gt;
&#039;&#039;&#039;Реализация.&#039;&#039;&#039;&lt;br /&gt;
&amp;lt;source lang=&amp;quot;matlab&amp;quot;&amp;gt;&lt;br /&gt;
function Q = gramschmidt( A )&lt;br /&gt;
% Число векторов.&lt;br /&gt;
n = size( A, 2 );&lt;br /&gt;
 &lt;br /&gt;
% Инициализируем выходную матрицу.&lt;br /&gt;
Q = zeros( n );&lt;br /&gt;
 &lt;br /&gt;
% Преобразуем каждый вектор в базисный:&lt;br /&gt;
% (1) j-ый базисный вектор будет ортогонален каждому из предыдущих 1..j-1 векторов;&lt;br /&gt;
% (2) будет единичной длины.&lt;br /&gt;
for j = 1 : n&lt;br /&gt;
    % Выбираем j-ый вектор&lt;br /&gt;
    u = A( :, j );&lt;br /&gt;
    &lt;br /&gt;
    % Специальный случай для j = 1: просто нормируем этот вектор и помещаем&lt;br /&gt;
    % первым в найденный базис, так как нет векторов, относительно которых&lt;br /&gt;
    % нужно было бы делать его ортогональным.&lt;br /&gt;
&lt;br /&gt;
    % Удаляем из оригинального вектора &amp;quot;u&amp;quot; все компоненты натянутые на базис&lt;br /&gt;
    % из векторов 1..j-1, их вклад будет удален.&lt;br /&gt;
    % =&amp;gt; j-ый вектор ортогонален остальным.&lt;br /&gt;
    % Предыдущие базисные вектора были найдены на предыдуших шагах.&lt;br /&gt;
    % =&amp;gt; соблюдаем принцип ортогональности, но не ортонормированности.&lt;br /&gt;
    for i = 1 : j - 1&lt;br /&gt;
        u = u - proj( Q(:,i), A(:,j) );&lt;br /&gt;
    end&lt;br /&gt;
     &lt;br /&gt;
    % Нормируем вектор&lt;br /&gt;
    Q(:,j) = u ./ norm( u );&lt;br /&gt;
end&lt;br /&gt;
end&lt;br /&gt;
 &lt;br /&gt;
% Проекция вектора &amp;quot;a&amp;quot; коллинеарно вектору &amp;quot;e&amp;quot;.&lt;br /&gt;
function p = proj( e, a )&lt;br /&gt;
p = (e&#039; * a) / (e&#039; * e) .* e;&lt;br /&gt;
end&lt;br /&gt;
&amp;lt;/source&amp;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;.&lt;br /&gt;
&lt;br /&gt;
# Скалярное произведение векторов требует &amp;lt;math&amp;gt;n-1&amp;lt;/math&amp;gt; сложение и &amp;lt;math&amp;gt;n&amp;lt;/math&amp;gt; произведений.&lt;br /&gt;
# Вычитание проекции вектора требует &amp;lt;math&amp;gt;2&amp;lt;/math&amp;gt; скалярных произведения, &amp;lt;math&amp;gt;1&amp;lt;/math&amp;gt; деление, &amp;lt;math&amp;gt;n&amp;lt;/math&amp;gt; произведений и &amp;lt;math&amp;gt;n&amp;lt;/math&amp;gt; сложений, то есть:&lt;br /&gt;
## &amp;lt;math&amp;gt;3n-2&amp;lt;/math&amp;gt; (&amp;lt;math&amp;gt;+&amp;lt;/math&amp;gt;);&lt;br /&gt;
## &amp;lt;math&amp;gt;3n&amp;lt;/math&amp;gt; (&amp;lt;math&amp;gt;\times&amp;lt;/math&amp;gt;);&lt;br /&gt;
## &amp;lt;math&amp;gt;1&amp;lt;/math&amp;gt; (&amp;lt;math&amp;gt;\div&amp;lt;/math&amp;gt;).&lt;br /&gt;
# Вычисление &amp;lt;math&amp;gt;i&amp;lt;/math&amp;gt;-го вектора требует &amp;lt;math&amp;gt;i-1&amp;lt;/math&amp;gt; вычитаний проекций, то есть:&lt;br /&gt;
## &amp;lt;math&amp;gt;(3n-2)(i-1)&amp;lt;/math&amp;gt; (&amp;lt;math&amp;gt;+&amp;lt;/math&amp;gt;);&lt;br /&gt;
## &amp;lt;math&amp;gt;3n(i-1)&amp;lt;/math&amp;gt; (&amp;lt;math&amp;gt;\times&amp;lt;/math&amp;gt;);&lt;br /&gt;
## &amp;lt;math&amp;gt;i-1&amp;lt;/math&amp;gt; (&amp;lt;math&amp;gt;\div&amp;lt;/math&amp;gt;).&lt;br /&gt;
# Мы вычисляем вектора от &amp;lt;math&amp;gt;i=1&amp;lt;/math&amp;gt; до &amp;lt;math&amp;gt;m&amp;lt;/math&amp;gt;, поэтому множители &amp;lt;math&amp;gt;(i-1)&amp;lt;/math&amp;gt; выражаются &#039;&#039;треугольным числом&#039;&#039; &amp;lt;math&amp;gt;(m-1)\frac{m}{2}&amp;lt;/math&amp;gt;.&lt;br /&gt;
## &amp;lt;math&amp;gt;(3n-2)(m-1)\frac{m}{2}&amp;lt;/math&amp;gt; (&amp;lt;math&amp;gt;+&amp;lt;/math&amp;gt;);&lt;br /&gt;
## &amp;lt;math&amp;gt;3n(m-1)\frac{m}{2}&amp;lt;/math&amp;gt; (&amp;lt;math&amp;gt;\times&amp;lt;/math&amp;gt;);&lt;br /&gt;
## &amp;lt;math&amp;gt;(m-1)\frac{m}{2}&amp;lt;/math&amp;gt; (&amp;lt;math&amp;gt;\div&amp;lt;/math&amp;gt;).&lt;br /&gt;
&lt;br /&gt;
Таким образом, cложность алгоритма &amp;lt;math&amp;gt;O(nm^2)&amp;lt;/math&amp;gt;.&lt;br /&gt;
&lt;br /&gt;
=== Информационный граф ===&lt;br /&gt;
Граф состоит из элементов 2 видов: прямоугольников и овалов. Прямоугольниками обозначаются данные, причем красному цвету соответствуют входные данные, а зеленому ― выходные. Овалы означают операции над переданными данными. Голубым цветом обозначены более сложно организованные операции, а синим ― менее. Для нахождения &amp;lt;math&amp;gt;\mathbf{b}_i&amp;lt;/math&amp;gt; вектора требуются значения всех векторов с номерами, меньшими &amp;lt;math&amp;gt;i&amp;lt;/math&amp;gt;, однако, расчеты проекций можно начинать, не дожидаясь вычисления всех векторов, а производить сразу, как только соответствующий ортогональный вектор будет рассчитан. Эта зависимость и отражена на графе ниже.&lt;br /&gt;
[[Файл:Gram_schmidt_graph.png|thumb|800px|center|frame|Рисунок 1. Информационный граф алгоритма Грама-Шмидта.]]&lt;br /&gt;
&lt;br /&gt;
=== Ресурс параллелизма алгоритма ===&lt;br /&gt;
Для построения базиса методом Грама–Шмидта в параллельном случае, имея в распоряжении &amp;lt;math&amp;gt;m&amp;lt;/math&amp;gt; и более потоков, необходимо выполнить следующие ярусы:&lt;br /&gt;
#&amp;lt;math&amp;gt;m-1&amp;lt;/math&amp;gt; ярус вычисления проекций;&lt;br /&gt;
#&amp;lt;math&amp;gt;m-1&amp;lt;/math&amp;gt; ярус вычитания векторов.&lt;br /&gt;
&lt;br /&gt;
Эти ярусы чередуются. Количество операций проекции и вычитания векторов уменьшается на единицу в каждом следующем ярусе. Вычисление проекции вектора требует 2 скалярных произведения, 1 деление и &amp;lt;math&amp;gt;n&amp;lt;/math&amp;gt; произведений, то есть:&lt;br /&gt;
#&amp;lt;math&amp;gt;2n-2&amp;lt;/math&amp;gt; (&amp;lt;math&amp;gt;+&amp;lt;/math&amp;gt;);&lt;br /&gt;
#&amp;lt;math&amp;gt;3n&amp;lt;/math&amp;gt; (&amp;lt;math&amp;gt;\times&amp;lt;/math&amp;gt;);&lt;br /&gt;
#&amp;lt;math&amp;gt;1&amp;lt;/math&amp;gt; (&amp;lt;math&amp;gt;\div&amp;lt;/math&amp;gt;).&lt;br /&gt;
&lt;br /&gt;
Если считать, что вычисление проекции происходит последовательно, то сложность по высоте &amp;lt;math&amp;gt;O(n)&amp;lt;/math&amp;gt;, по ширине &amp;lt;math&amp;gt;O(1)&amp;lt;/math&amp;gt; (то есть одна операция проекции в ярусе представляется набором ярусов с простыми последовательными операциями). В самом первом ярусе находится &amp;lt;math&amp;gt;m-1&amp;lt;/math&amp;gt; проекций и это наибольшее количество операций проекций, тогда сложность по высоте будет &amp;lt;math&amp;gt;O(n)&amp;lt;/math&amp;gt;, по ширине ― &amp;lt;math&amp;gt;O(m)&amp;lt;/math&amp;gt;.&lt;br /&gt;
&lt;br /&gt;
Вычисление вычитания векторов требует &amp;lt;math&amp;gt;n&amp;lt;/math&amp;gt; вычитаний, и если считать, что операция происходит последовательно, то сложность по высоте &amp;lt;math&amp;gt;O(n)&amp;lt;/math&amp;gt;, по ширине &amp;lt;math&amp;gt;O(1)&amp;lt;/math&amp;gt;. Во втором ярусе находится &amp;lt;math&amp;gt;m-1&amp;lt;/math&amp;gt; вычитаний и это наибольшее количество операций вычитаний, тогда сложность по высоте будет &amp;lt;math&amp;gt;O(n)&amp;lt;/math&amp;gt;, по ширине ― &amp;lt;math&amp;gt;O(m)&amp;lt;/math&amp;gt;.&lt;br /&gt;
&lt;br /&gt;
Из вышеизложенного следует, что при классификации по ширине ЯПФ алгоритм имеет сложность &amp;lt;math&amp;gt;O(m)&amp;lt;/math&amp;gt;, а по высоте ― &amp;lt;math&amp;gt;O(nm)&amp;lt;/math&amp;gt;.&lt;br /&gt;
&lt;br /&gt;
=== Входные и выходные данные алгоритма ===&lt;br /&gt;
&#039;&#039;&#039;Входные данные.&#039;&#039;&#039; Матрица &amp;lt;math&amp;gt;A&amp;lt;/math&amp;gt; с элементами &amp;lt;math&amp;gt;\alpha_{ij}&amp;lt;/math&amp;gt;, где &amp;lt;math&amp;gt;i = \overline{1, m}&amp;lt;/math&amp;gt; (количество линейно независимых векторов) и &amp;lt;math&amp;gt;j = \overline{1, n}&amp;lt;/math&amp;gt; (размерность пространства), при этом &amp;lt;math&amp;gt;m \leqslant n&amp;lt;/math&amp;gt;.&lt;br /&gt;
&lt;br /&gt;
&#039;&#039;&#039;Объем входных данных.&#039;&#039;&#039; &amp;lt;math&amp;gt;mn&amp;lt;/math&amp;gt;&lt;br /&gt;
&lt;br /&gt;
&#039;&#039;&#039;Выходные данные.&#039;&#039;&#039; Матрица &amp;lt;math&amp;gt;B&amp;lt;/math&amp;gt; с элементами &amp;lt;math&amp;gt;\beta_{ij}&amp;lt;/math&amp;gt;, где &amp;lt;math&amp;gt;i = \overline{1, m}&amp;lt;/math&amp;gt; и &amp;lt;math&amp;gt;j = \overline{1, n}&amp;lt;/math&amp;gt;, тогда &amp;lt;math&amp;gt;b_{1}, \dots, b_{m}&amp;lt;/math&amp;gt; — система ортогональных векторов.&lt;br /&gt;
&lt;br /&gt;
&#039;&#039;&#039;Объем выходных данных.&#039;&#039;&#039; &amp;lt;math&amp;gt;mn&amp;lt;/math&amp;gt;&lt;br /&gt;
&lt;br /&gt;
=== Свойства алгоритма ===&lt;br /&gt;
&amp;lt;ol&amp;gt;&lt;br /&gt;
&amp;lt;li&amp;gt;Отношение последовательной и параллельной сложности в предположении доступности неограниченного числа необходимых ресурсов — &amp;lt;math&amp;gt;m&amp;lt;/math&amp;gt;. При этом необходимо отметить, что отношение числа операций к суммарному объему входных и выходных данных (вычислительная мощность алгоритма) — линейное.&amp;lt;/li&amp;gt;&lt;br /&gt;
&lt;br /&gt;
&amp;lt;li&amp;gt;Алгоритм почти полностью детерминирован, то есть гарантирована единственность результата выполнения. Это означает, что возможно накопление ошибок округления, то есть векторы выходной матрицы часто не точно ортогональны. Из-за потери ортогональности в процессе вычислений классический процесс Грама-Шмидта называют численно неустойчивым. Однако, процесс Грама-Шмидта может быть сделан более вычислительно устойчивым путём небольшой модификации. Такой алгоритм называется модифицированным процессом Грама-Шмидта. Рассмотрим его отличие подробнее.&lt;br /&gt;
&amp;lt;br /&amp;gt;&lt;br /&gt;
&amp;lt;math&amp;gt; &lt;br /&gt;
\begin{array}{l}&lt;br /&gt;
\mathbf{b}_j\\&lt;br /&gt;
  \\&lt;br /&gt;
\mathbf{b}_j&lt;br /&gt;
\end{array}&lt;br /&gt;
&lt;br /&gt;
\begin{array}{c}&lt;br /&gt;
= \\&lt;br /&gt;
  \\&lt;br /&gt;
=&lt;br /&gt;
\end{array}&lt;br /&gt;
&lt;br /&gt;
\underbrace{&lt;br /&gt;
\underbrace{&lt;br /&gt;
\underbrace{&lt;br /&gt;
&lt;br /&gt;
\begin{array}{c}&lt;br /&gt;
\mathbf{a}_j \\&lt;br /&gt;
   \\&lt;br /&gt;
\mathbf{a}_j&lt;br /&gt;
\end{array}&lt;br /&gt;
&lt;br /&gt;
\begin{array}{c}&lt;br /&gt;
- \\&lt;br /&gt;
  \\&lt;br /&gt;
-&lt;br /&gt;
\end{array}&lt;br /&gt;
&lt;br /&gt;
\begin{array}{c}&lt;br /&gt;
\mathbf{proj}_{\mathbf{b}_1}\,\mathbf{a}_j \\&lt;br /&gt;
   ||                                      \\&lt;br /&gt;
\mathbf{proj}_{\mathbf{b}_1}\,\mathbf{a}_j&lt;br /&gt;
\end{array}&lt;br /&gt;
&lt;br /&gt;
}_{\mathbf{a}_j^{(1)}}&lt;br /&gt;
&lt;br /&gt;
\begin{array}{c}&lt;br /&gt;
- \\&lt;br /&gt;
  \\&lt;br /&gt;
-&lt;br /&gt;
\end{array}&lt;br /&gt;
&lt;br /&gt;
\begin{array}{c}&lt;br /&gt;
\mathbf{proj}_{\mathbf{b}_2}\,\mathbf{a}_j       \\&lt;br /&gt;
   ||                                            \\&lt;br /&gt;
\mathbf{proj}_{\mathbf{b}_2}\,\mathbf{a}_j^{(1)}&lt;br /&gt;
\end{array}&lt;br /&gt;
&lt;br /&gt;
}_{\mathbf{a}_j^{(2)}}&lt;br /&gt;
&lt;br /&gt;
\begin{array}{c}&lt;br /&gt;
- \\&lt;br /&gt;
  \\&lt;br /&gt;
-&lt;br /&gt;
\end{array}&lt;br /&gt;
&lt;br /&gt;
\begin{array}{c}&lt;br /&gt;
\mathbf{proj}_{\mathbf{b}_3}\,\mathbf{a}_j       \\&lt;br /&gt;
   ||                                            \\&lt;br /&gt;
\mathbf{proj}_{\mathbf{b}_3}\,\mathbf{a}_j^{(2)}&lt;br /&gt;
\end{array}&lt;br /&gt;
&lt;br /&gt;
}_{\mathbf{a}_j^{(3)}}&lt;br /&gt;
&lt;br /&gt;
\begin{array}{ccc}&lt;br /&gt;
- &amp;amp; \ldots &amp;amp; - \\&lt;br /&gt;
               \\&lt;br /&gt;
- &amp;amp; \ldots &amp;amp; - &lt;br /&gt;
\end{array}&lt;br /&gt;
&lt;br /&gt;
\begin{array}{cc}&lt;br /&gt;
\mathbf{proj}_{\mathbf{b}_{j-1}}\,\mathbf{a}_j         &amp;amp; (1) \\&lt;br /&gt;
   ||                                                  &amp;amp;      \\&lt;br /&gt;
\mathbf{proj}_{\mathbf{b}_{j-1}}\,\mathbf{a}_j^{(j-2)} &amp;amp; (2)&lt;br /&gt;
\end{array}&lt;br /&gt;
&lt;br /&gt;
&amp;lt;/math&amp;gt;&lt;br /&gt;
&amp;lt;br /&amp;gt;&lt;br /&gt;
Формула (1) показывает вычисление &amp;lt;math&amp;gt;\mathbf{b}_j&amp;lt;/math&amp;gt; в классическом процессе, а формула (2) — в модифицированном.&lt;br /&gt;
&amp;lt;br /&amp;gt;&lt;br /&gt;
Разница между ними заключается в том, от каких векторов вычисляются компоненты: от &amp;lt;math&amp;gt;\mathbf{a}_j&amp;lt;/math&amp;gt; в классическом процессе или от результата предыдущего вычитания, то есть от &amp;lt;math&amp;gt;\mathbf{a}_j^{(k)}&amp;lt;/math&amp;gt; в модифицированном процессе. Таким образом, &amp;lt;math&amp;gt;\mathbf{a}_j^{(k)}&amp;lt;/math&amp;gt; представляет собой &amp;lt;math&amp;gt;\mathbf{a}_j&amp;lt;/math&amp;gt;, из которого удалены компоненты в направлениях &amp;lt;math&amp;gt;\mathbf{b}_1,\,\;\ldots,\;\mathbf{b}_{k}&amp;lt;/math&amp;gt;. Компонента вектора &amp;lt;math&amp;gt;\mathbf{a}_j&amp;lt;/math&amp;gt; в направлении &amp;lt;math&amp;gt;\mathbf{b}_{k+1}&amp;lt;/math&amp;gt; при этом удалении не затрагивается и поэтому она в &amp;lt;math&amp;gt;\mathbf{a}_j^{(k)}&amp;lt;/math&amp;gt; такая же, как в &amp;lt;math&amp;gt;\mathbf{a}_j&amp;lt;/math&amp;gt;.&amp;lt;/li&amp;gt;&lt;br /&gt;
&lt;br /&gt;
&amp;lt;li&amp;gt;Процесс Грама-Шмидта может применяться к бесконечной последовательности линейно независимых векторов, а также к линейно зависимым векторам. В этом случае он выдаёт &amp;lt;math&amp;gt;\mathbf{0}&amp;lt;/math&amp;gt; (нулевой вектор) на шаге &amp;lt;math&amp;gt;j&amp;lt;/math&amp;gt;, если &amp;lt;math&amp;gt;\mathbf{a}_j&amp;lt;/math&amp;gt; является линейной комбинацией векторов &amp;lt;math&amp;gt;\mathbf{a}_1,\;\ldots,\;\mathbf{a}_{j-1}&amp;lt;/math&amp;gt;. Если это может случиться, то для сохранения ортогональности выходных векторов и для предотвращения деления на ноль при ортонормировании алгоритм должен делать проверку на нулевые векторы и отбрасывать их. Количество векторов, выдаваемых алгоритмом, будет равно размерности подпространства, порождённого векторами (то есть количеству линейно независимых векторов, которые можно выделить среди исходных векторов).&amp;lt;/li&amp;gt;&lt;br /&gt;
&lt;br /&gt;
&amp;lt;li&amp;gt;Процесс Грама-Шмидта может быть истолкован как разложение невырожденной квадратной матрицы в произведение ортогональной (или унитарной матрицы в случае эрмитова пространства) и верхнетреугольной матрицы с положительными диагональными элементами — QR-разложение.&amp;lt;/li&amp;gt;&lt;br /&gt;
&amp;lt;/ol&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;
В рамках статьи была написана своя параллельная реализация процесса ортогонализации Грама-Шмидта с использованием OpenMPI. Реализация вместе с данными и вспомогательными скриптами доступна в репозитории [https://github.com/zodinyac/GramSchmidt GramSchmidt].&lt;br /&gt;
&lt;br /&gt;
Испытания реализованного алгоритма проводились на [http://parallel.ru/cluster/lomonosov.html суперкомпьютере &amp;quot;Ломоносов&amp;quot;] Суперкомпьютерного комплекса Московского университета со следующими значениями параметров:&lt;br /&gt;
* размер матрицы по одному измерению: 100, 500 и далее с шагом 500 до 10000 элементов,&lt;br /&gt;
* число процессов: 1, 2, 4, 8 и далее с шагом 8 до 128. Тестирование с использованием 1, 2, 4 и 8 процессов не использовалось для данных, где размер превышал 5000.&lt;br /&gt;
&lt;br /&gt;
На следующем рисунке приведен график времени работы алгоритма в зависимости от числа процессов и размерности матриц. &lt;br /&gt;
[[File:Plot3d-gs-belov-bogomolov-1.png|thumb|center|720px|Рисунок 2. График производительности реализации алгоритма в зависимости от числа процессоров и размерности матриц.]]&lt;br /&gt;
На следующем рисунке приведен график времени работы алгоритма в зависимости от числа процессов и размерности матриц, при этом часть данных с самым долгим временем работы отброшена, чтобы более наглядно продемонстрировать зависимость.&lt;br /&gt;
[[File:Plot3d-gs-belov-bogomolov-2.png|thumb|center|720px|Рисунок 3. График производительности реализации алгоритма в зависимости от числа процессоров и размерности матриц.]]&lt;br /&gt;
На следующем рисунке приведен график эффективности распараллеливания алгоритма в зависимости от числа процессов и размерности матриц.&lt;br /&gt;
[[File:Gs-parallel_efficiency.png|thumb|center|720px|Рисунок 4. График эффективности распараллеливания алгоритма в зависимости от числа процессоров и размерности матриц.]]&lt;br /&gt;
&lt;br /&gt;
{| class=&amp;quot;wikitable&amp;quot;&lt;br /&gt;
|-&lt;br /&gt;
! Размер матрицы&lt;br /&gt;
! 100&lt;br /&gt;
! 500&lt;br /&gt;
! 1000&lt;br /&gt;
! 1500&lt;br /&gt;
! 2000&lt;br /&gt;
! 2500&lt;br /&gt;
! 3000&lt;br /&gt;
! 3500&lt;br /&gt;
! 4000&lt;br /&gt;
! 4500&lt;br /&gt;
! 5000&lt;br /&gt;
! 5500&lt;br /&gt;
! 6000&lt;br /&gt;
! 6500&lt;br /&gt;
! 7000&lt;br /&gt;
! 7500&lt;br /&gt;
! 8000&lt;br /&gt;
! 8500&lt;br /&gt;
! 9000&lt;br /&gt;
! 9500&lt;br /&gt;
! 10000&lt;br /&gt;
|-&lt;br /&gt;
| Число узлов, на которых время работы минимально&lt;br /&gt;
| 1&lt;br /&gt;
| 32&lt;br /&gt;
| 48&lt;br /&gt;
| 56&lt;br /&gt;
| 24&lt;br /&gt;
| 32&lt;br /&gt;
| 32&lt;br /&gt;
| 40&lt;br /&gt;
| 40&lt;br /&gt;
| 40&lt;br /&gt;
| 48&lt;br /&gt;
| 56&lt;br /&gt;
| 56&lt;br /&gt;
| 56&lt;br /&gt;
| 64&lt;br /&gt;
| 64&lt;br /&gt;
| 72&lt;br /&gt;
| 72&lt;br /&gt;
| 72&lt;br /&gt;
| 80&lt;br /&gt;
| 80&lt;br /&gt;
|}&lt;br /&gt;
&lt;br /&gt;
=== Динамические характеристики и эффективность реализации алгоритма ===&lt;br /&gt;
=== Выводы для классов архитектур ===&lt;br /&gt;
=== Существующие реализации алгоритма ===&lt;br /&gt;
Данный алгоритм реализован во множестве библиотек и математических программных пакетах.&lt;br /&gt;
&lt;br /&gt;
# Библиотека [https://github.com/open-epicycle/Epicycle.Math-cs Epicycle] (C#).&lt;br /&gt;
# Библиотека [http://www.spectralpython.net/ Spectral Python (SPy)].&lt;br /&gt;
# Библиотека [https://hackage.haskell.org/package/vect-0.4.7/docs/Data-Vect-Float-GramSchmidt.html vect] (Haskell).&lt;br /&gt;
&lt;br /&gt;
==== Пакет Mathematica ====&lt;br /&gt;
Приведем пример скрипта, предназначенного для пакета Mathematica, который проводит процесс ортогонализации Грама-Шмидта над векторами, заданными в фигурных скобках последней строки. Количество векторов и их координат могут быть произвольными. В данном случае для примера взяты векторы &amp;lt;math&amp;gt;\{-2,\;1,\;0\}&amp;lt;/math&amp;gt;, &amp;lt;math&amp;gt;\{-2,\;0,\;1\}&amp;lt;/math&amp;gt;, &amp;lt;math&amp;gt;\{-0{.}5,\;-1,\;1\}&amp;lt;/math&amp;gt;.&lt;br /&gt;
&amp;lt;source lang=&#039;mathematica&#039;&amp;gt;Projection[v1_, v2_] := (v1.v2*v2)/v2.v2&lt;br /&gt;
MultipleProjection[v1_, vecs_] := Plus @@ (Projection[v1, #1] &amp;amp;) /@ vecs&lt;br /&gt;
GramSchmidt[mat_] := Fold[Join[#1, {#2 - MultipleProjection[#2, #1]}] &amp;amp;, {}, mat]&lt;br /&gt;
GramSchmidt[{{-2, 1, 0}, {-2, 0, 1}, {-0.5, -1, 1}}]&amp;lt;/source&amp;gt;&lt;br /&gt;
&lt;br /&gt;
==== Пакет Maxima ====&lt;br /&gt;
Приведем пример скрипта, предназначенного для пакета Maxima, который проводит процесс ортогонализации Грама-Шмидта над векторами, заданными в фигурных скобках последней строки. Количество векторов и их координат могут быть произвольными. В данном случае для примера взяты векторы &amp;lt;math&amp;gt;\{-2,\;1,\;0\}&amp;lt;/math&amp;gt;, &amp;lt;math&amp;gt;\{-2,\;0,\;1\}&amp;lt;/math&amp;gt;, &amp;lt;math&amp;gt;\{-0{.}5,\;-1,\;1\}&amp;lt;/math&amp;gt;.&lt;br /&gt;
&amp;lt;source lang=&#039;maxima&#039;&amp;gt;&lt;br /&gt;
load(eigen);&lt;br /&gt;
x: matrix ([-2,1,0],[-2,0,1],[-0.5,-1,1]);&lt;br /&gt;
y: gramschmidt(x);&lt;br /&gt;
&amp;lt;/source&amp;gt;&lt;br /&gt;
&lt;br /&gt;
==== Пакет MATLAB ====&lt;br /&gt;
Приведем пример скрипта, предназначенного для пакета MATLAB, который проводит процесс ортогонализации Грама-Шмидта над векторами, заданными в фигурных скобках последней строки. В данном пакете уже существует функция, которая осуществляет данный процесс. Столбцы входной матрицы предполагаются линейно-независимыми, количество векторов и их координат могут быть произвольными. Функция возращает матрицу X с ортонормированными столбцами и обратимую верхне-треугольную матрицу Y.&lt;br /&gt;
&lt;br /&gt;
В данном случае для примера взяты векторы &amp;lt;math&amp;gt;\{-2,\;1,\;0\}&amp;lt;/math&amp;gt;, &amp;lt;math&amp;gt;\{-2,\;0,\;1\}&amp;lt;/math&amp;gt;, &amp;lt;math&amp;gt;\{-0{.}5,\;-1,\;1\}&amp;lt;/math&amp;gt;.&lt;br /&gt;
&amp;lt;source lang=&#039;matlab&#039;&amp;gt;&lt;br /&gt;
[x y]=gschmidt([-2 1 0; -2 0 1; -0.5 -1 1])&lt;br /&gt;
&amp;lt;/source&amp;gt;&lt;br /&gt;
&lt;br /&gt;
== Литература ==&lt;/div&gt;</summary>
		<author><name>BDA</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:BDA/%D0%9E%D1%80%D1%82%D0%BE%D0%B3%D0%BE%D0%BD%D0%B0%D0%BB%D0%B8%D0%B7%D0%B0%D1%86%D0%B8%D1%8F_%D0%93%D1%80%D0%B0%D0%BC%D0%B0-%D0%A8%D0%BC%D0%B8%D0%B4%D1%82%D0%B0&amp;diff=18438</id>
		<title>Участник:BDA/Ортогонализация Грама-Шмидта</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:BDA/%D0%9E%D1%80%D1%82%D0%BE%D0%B3%D0%BE%D0%BD%D0%B0%D0%BB%D0%B8%D0%B7%D0%B0%D1%86%D0%B8%D1%8F_%D0%93%D1%80%D0%B0%D0%BC%D0%B0-%D0%A8%D0%BC%D0%B8%D0%B4%D1%82%D0%B0&amp;diff=18438"/>
		<updated>2016-11-19T02:46:54Z</updated>

		<summary type="html">&lt;p&gt;BDA: /* Масштабируемость алгоритма и его реализации */&lt;/p&gt;
&lt;hr /&gt;
&lt;div&gt;{{Assignment}}&lt;br /&gt;
&lt;br /&gt;
{{algorithm&lt;br /&gt;
| name              = Ортогонализация Грама-Шмидта&lt;br /&gt;
| serial_complexity = &amp;lt;math&amp;gt;O(nm^2)&amp;lt;/math&amp;gt;&lt;br /&gt;
| pf_height         = &amp;lt;math&amp;gt;O(nm)&amp;lt;/math&amp;gt;&lt;br /&gt;
| pf_width          = &amp;lt;math&amp;gt;O(m)&amp;lt;/math&amp;gt;&lt;br /&gt;
| input_data        = &amp;lt;math&amp;gt;nm&amp;lt;/math&amp;gt;&lt;br /&gt;
| output_data       = &amp;lt;math&amp;gt;nm&amp;lt;/math&amp;gt;&lt;br /&gt;
}}&lt;br /&gt;
&lt;br /&gt;
Основные авторы описания: [[Участник:Zodiac|Белов Н. А.]] (пункты 1.3, 1.4, 1.5, 1.6, 1.9, 1.10, 2.4, 2.7, 3), [[Участник:BDA|Богомолов Д. А.]] (пункты 1.1, 1.2, 1.6, 1.7, 1.8, 2.4, 3).&lt;br /&gt;
&lt;br /&gt;
== Свойства и структура алгоритма ==&lt;br /&gt;
=== Общее описание алгоритма ===&lt;br /&gt;
&lt;br /&gt;
Ортогонализация ― алгоритм построения для данной линейно независимой системы векторов евклидова или эрмитова пространства V ортогональной системы ненулевых векторов, порождающих то же самое подпространство в V.&lt;br /&gt;
&lt;br /&gt;
Ортогонализация Грама–Шмидта&amp;lt;ref&amp;gt;Канатников А.Н., Крищенко А.П. &amp;quot;Линейная алгебра.&amp;quot; ― 3-е изд., стер. ― М.: Изд-во МГТУ им. Н.Э. Баумана, 2002&amp;lt;/ref&amp;gt; (процесс Грама–Шмидта) ― наиболее известный алгоритм ортогонализации. Назван в честь Йоргена Педерсена Грама&amp;lt;ref&amp;gt;O&#039;Connor, John J.; Robertson, Edmund F., &amp;quot;Jørgen Pedersen Gram&amp;quot;, MacTutor History of Mathematics archive, University of St Andrews.&amp;lt;/ref&amp;gt; и Эрхарда Шмидта&amp;lt;ref&amp;gt;O&#039;Connor, John J.; Robertson, Edmund F., &amp;quot;Erhard Schmidt&amp;quot;, MacTutor History of Mathematics archive, University of St Andrews.&amp;lt;/ref&amp;gt;, однако ранее уже появлялся в работах Лапласа и Коши. Является частным случаем разложения Ивасавы, так как может быть представлен как разложение невырожденной квадратной матрицы в произведение ортогональной (или унитарной матрицы в случае эрмитова пространства) и верхнетреугольной матрицы с положительными диагональными элементами.&lt;br /&gt;
&lt;br /&gt;
Рассматриваемый алгоритм применяется для борьбы с помехами в адаптивной системе селекции движущихся целей&amp;lt;ref&amp;gt;Орешкин Б.Н., Бакулев П.А. &amp;quot;Быстрая процедура ортогонализации Грамма–Шмидта и ее применение для борьбы с помехами в адаптивной системе селекции движущихся целей&amp;quot; ― Радиотехника / №12 за 2007 г.&amp;lt;/ref&amp;gt;, в протоколах безопасности&amp;lt;ref&amp;gt;Пискова А.В., Менщиков А.А., Коробейников А.Г. &amp;quot;Использование ортогонализации Грама-Шмидта в алгоритме приведения базиса решетки для протоколов безопасности&amp;quot; ― Вопросы кибербезопасности №1(14) 2016&amp;lt;/ref&amp;gt;, для повышения экономичности алгоритмов оценивания параметров моделей объектов управления&amp;lt;ref&amp;gt;Карелин А.Е., Светлаков А.А. &amp;quot;Использование ортогонализации Грама-Шмидта для повышения экономичности многоточечных алгоритмов рекуррентного оценивания параметров моделей объектов управления&amp;quot; ― Известия Томского политехнического университета [Известия ТПУ]. — 2006. — Т. 309, № 8. — [С. 15-19].&amp;lt;/ref&amp;gt; и в других областях.&lt;br /&gt;
&lt;br /&gt;
=== Математическое описание алгоритма ===&lt;br /&gt;
&#039;&#039;&#039;Входные данные.&#039;&#039;&#039; &amp;lt;math&amp;gt;m&amp;lt;/math&amp;gt; линейно независимых векторов &amp;lt;math&amp;gt;\mathbf{a}_1,...,\mathbf{a}_m&amp;lt;/math&amp;gt; c размерностью пространства &amp;lt;math&amp;gt;n&amp;lt;/math&amp;gt;, записанных в матрице &amp;lt;math&amp;gt;A&amp;lt;/math&amp;gt; с элементами &amp;lt;math&amp;gt;\alpha_{ij}&amp;lt;/math&amp;gt;.&lt;br /&gt;
&lt;br /&gt;
&#039;&#039;&#039;Выходные данные.&#039;&#039;&#039; &amp;lt;math&amp;gt;m&amp;lt;/math&amp;gt; ортогональных векторов &amp;lt;math&amp;gt;\mathbf{b}_1,...,\mathbf{b}_m&amp;lt;/math&amp;gt; c размерностью пространства &amp;lt;math&amp;gt;n&amp;lt;/math&amp;gt;, записанных в матрице &amp;lt;math&amp;gt;B&amp;lt;/math&amp;gt; с элементами &amp;lt;math&amp;gt;\beta_{ij}&amp;lt;/math&amp;gt;.&lt;br /&gt;
&lt;br /&gt;
Определим оператор проекции (проецирует вектор &amp;lt;math&amp;gt;\mathbf{a}&amp;lt;/math&amp;gt; коллинеарно вектору &amp;lt;math&amp;gt;\mathbf{b}&amp;lt;/math&amp;gt;) &amp;lt;math&amp;gt;\mathbf{proj_b a = \frac{\left \langle a,b \right \rangle}{\left \langle b,b \right \rangle }b}&amp;lt;/math&amp;gt;, где &amp;lt;math&amp;gt;\mathbf{\left \langle a,b \right \rangle}&amp;lt;/math&amp;gt; ― скалярное произведение векторов &amp;lt;math&amp;gt;\mathbf{a}&amp;lt;/math&amp;gt; и &amp;lt;math&amp;gt;\mathbf{b}&amp;lt;/math&amp;gt;.&lt;br /&gt;
&lt;br /&gt;
Тогда ортогональные векторы вычисляются следующим образом:&lt;br /&gt;
&lt;br /&gt;
&amp;lt;math&amp;gt;\mathbf{b}_1 = \mathbf{a}_1&amp;lt;/math&amp;gt;&lt;br /&gt;
&lt;br /&gt;
&amp;lt;math&amp;gt;\mathbf{b}_2 = \mathbf{a}_2 - \mathbf{proj}_{\mathbf{b}_1} \mathbf{a}_2 &amp;lt;/math&amp;gt;&lt;br /&gt;
&lt;br /&gt;
&amp;lt;math&amp;gt;\mathbf{b}_3 = \mathbf{a}_3 - \mathbf{proj}_{\mathbf{b}_1} \mathbf{a}_3 - \mathbf{proj}_{\mathbf{b}_2} \mathbf{a}_3 &amp;lt;/math&amp;gt;&lt;br /&gt;
&lt;br /&gt;
&amp;lt;math&amp;gt;\vdots&amp;lt;/math&amp;gt;&lt;br /&gt;
&lt;br /&gt;
&amp;lt;math&amp;gt;\mathbf{b}_m = \mathbf{a}_m - \sum_{j=1}^{m-1} \mathbf{proj}_{\mathbf{b}_j} \mathbf{a}_m&amp;lt;/math&amp;gt;&lt;br /&gt;
&lt;br /&gt;
Или поэлементно:&lt;br /&gt;
&lt;br /&gt;
&amp;lt;math&amp;gt;\beta_{1j} = \alpha_{1j}&amp;lt;/math&amp;gt;&lt;br /&gt;
&lt;br /&gt;
&amp;lt;math&amp;gt;\beta_{ij} = \alpha_{ij} - (\sum_{k=1}^{i-1} \mathbf{proj}_{\mathbf{b}_k} \mathbf{a}_i)_j = \alpha_{ij} - \sum_{k=1}^{i-1}\frac{\sum_{s=1}^{n}\alpha_{is}\beta_{ks}}{\sum_{s=1}^{n}\beta_{ks}\beta_{ks}}\beta_{kj} &amp;lt;/math&amp;gt;&lt;br /&gt;
&lt;br /&gt;
=== Вычислительное ядро алгоритма ===&lt;br /&gt;
Основное время работы алгоритма приходится на вычисление сумм &amp;lt;math&amp;gt;\sum_{i=1}^{j-1} \mathbf{proj}_{\mathbf{b}_i} \mathbf{a}_k \forall j: j=\overline{1, m}&amp;lt;/math&amp;gt;.&lt;br /&gt;
&lt;br /&gt;
=== Макроструктура алгоритма ===&lt;br /&gt;
Из [[#Математическое описание алгоритма|математического описания алгоритма]] и [[#Вычислительное ядро алгоритма|описания ядра алгоритма]] в предыдущих разделах следует, что основную часть данного метода составляют операции вычисления проекций векторов, а также их сумм. Таким образом, в алгоритме можно выделить следующие макрооперации: скалярное произведение векторов в количестве &amp;lt;math&amp;gt;(m-1)m&amp;lt;/math&amp;gt;, а также множественные (всего &amp;lt;math&amp;gt;m-1&amp;lt;/math&amp;gt;) вычисления сумм &amp;lt;math&amp;gt;\mathbf{a}_i - \sum_{j=1}^{i-1} \frac{\left \langle a_i,b_j \right \rangle}{\left \langle b_j,b_j \right \rangle }b_j&amp;lt;/math&amp;gt;.&lt;br /&gt;
&lt;br /&gt;
Макроструктура может быть представлена в следующем виде:	&lt;br /&gt;
# Вычисление проекций &amp;lt;math&amp;gt;\mathbf{proj}_{\mathbf{b}_j} \mathbf{a}_i \forall j: j=\overline{1, i - 1}&amp;lt;/math&amp;gt; для текущего шага &amp;lt;math&amp;gt;i&amp;lt;/math&amp;gt;.	&lt;br /&gt;
# Вычисление суммы &amp;lt;math&amp;gt;\mathbf{a}_i - \sum_{j=1}^{i-1} \frac{\left \langle a_i,b_j \right \rangle}{\left \langle b_j,b_j \right \rangle }b_j&amp;lt;/math&amp;gt; для текущего шага &amp;lt;math&amp;gt;i&amp;lt;/math&amp;gt;.&lt;br /&gt;
# Переход на следующий шаг.&lt;br /&gt;
&lt;br /&gt;
=== Схема реализации последовательного алгоритма ===&lt;br /&gt;
Рассмотрим алгоритм, написанный в виде функции для математической системы MATLAB.&lt;br /&gt;
&lt;br /&gt;
&#039;&#039;&#039;Входные данные.&#039;&#039;&#039;&lt;br /&gt;
&lt;br /&gt;
Матрица &amp;lt;math&amp;gt;A&amp;lt;/math&amp;gt; с линейно-независимыми векторами в столбцах.&lt;br /&gt;
&lt;br /&gt;
&#039;&#039;&#039;Выходные данные.&#039;&#039;&#039;&lt;br /&gt;
&lt;br /&gt;
Матрица &amp;lt;math&amp;gt;Q&amp;lt;/math&amp;gt; с ортонормированным базисом &amp;lt;math&amp;gt;A&amp;lt;/math&amp;gt;.&lt;br /&gt;
&lt;br /&gt;
&#039;&#039;&#039;Использование.&#039;&#039;&#039;&lt;br /&gt;
&amp;lt;source lang=&amp;quot;matlab&amp;quot;&amp;gt;&lt;br /&gt;
Q = gramschmidt( A );&lt;br /&gt;
&amp;lt;/source&amp;gt;&lt;br /&gt;
&lt;br /&gt;
&#039;&#039;&#039;Реализация.&#039;&#039;&#039;&lt;br /&gt;
&amp;lt;source lang=&amp;quot;matlab&amp;quot;&amp;gt;&lt;br /&gt;
function Q = gramschmidt( A )&lt;br /&gt;
% Число векторов.&lt;br /&gt;
n = size( A, 2 );&lt;br /&gt;
 &lt;br /&gt;
% Инициализируем выходную матрицу.&lt;br /&gt;
Q = zeros( n );&lt;br /&gt;
 &lt;br /&gt;
% Преобразуем каждый вектор в базисный:&lt;br /&gt;
% (1) j-ый базисный вектор будет ортогонален каждому из предыдущих 1..j-1 векторов;&lt;br /&gt;
% (2) будет единичной длины.&lt;br /&gt;
for j = 1 : n&lt;br /&gt;
    % Выбираем j-ый вектор&lt;br /&gt;
    u = A( :, j );&lt;br /&gt;
    &lt;br /&gt;
    % Специальный случай для j = 1: просто нормируем этот вектор и помещаем&lt;br /&gt;
    % первым в найденный базис, так как нет векторов, относительно которых&lt;br /&gt;
    % нужно было бы делать его ортогональным.&lt;br /&gt;
&lt;br /&gt;
    % Удаляем из оригинального вектора &amp;quot;u&amp;quot; все компоненты натянутые на базис&lt;br /&gt;
    % из векторов 1..j-1, их вклад будет удален.&lt;br /&gt;
    % =&amp;gt; j-ый вектор ортогонален остальным.&lt;br /&gt;
    % Предыдущие базисные вектора были найдены на предыдуших шагах.&lt;br /&gt;
    % =&amp;gt; соблюдаем принцип ортогональности, но не ортонормированности.&lt;br /&gt;
    for i = 1 : j - 1&lt;br /&gt;
        u = u - proj( Q(:,i), A(:,j) );&lt;br /&gt;
    end&lt;br /&gt;
     &lt;br /&gt;
    % Нормируем вектор&lt;br /&gt;
    Q(:,j) = u ./ norm( u );&lt;br /&gt;
end&lt;br /&gt;
end&lt;br /&gt;
 &lt;br /&gt;
% Проекция вектора &amp;quot;a&amp;quot; коллинеарно вектору &amp;quot;e&amp;quot;.&lt;br /&gt;
function p = proj( e, a )&lt;br /&gt;
p = (e&#039; * a) / (e&#039; * e) .* e;&lt;br /&gt;
end&lt;br /&gt;
&amp;lt;/source&amp;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;.&lt;br /&gt;
&lt;br /&gt;
# Скалярное произведение векторов требует &amp;lt;math&amp;gt;n-1&amp;lt;/math&amp;gt; сложение и &amp;lt;math&amp;gt;n&amp;lt;/math&amp;gt; произведений.&lt;br /&gt;
# Вычитание проекции вектора требует &amp;lt;math&amp;gt;2&amp;lt;/math&amp;gt; скалярных произведения, &amp;lt;math&amp;gt;1&amp;lt;/math&amp;gt; деление, &amp;lt;math&amp;gt;n&amp;lt;/math&amp;gt; произведений и &amp;lt;math&amp;gt;n&amp;lt;/math&amp;gt; сложений, то есть:&lt;br /&gt;
## &amp;lt;math&amp;gt;3n-2&amp;lt;/math&amp;gt; (&amp;lt;math&amp;gt;+&amp;lt;/math&amp;gt;);&lt;br /&gt;
## &amp;lt;math&amp;gt;3n&amp;lt;/math&amp;gt; (&amp;lt;math&amp;gt;\times&amp;lt;/math&amp;gt;);&lt;br /&gt;
## &amp;lt;math&amp;gt;1&amp;lt;/math&amp;gt; (&amp;lt;math&amp;gt;\div&amp;lt;/math&amp;gt;).&lt;br /&gt;
# Вычисление &amp;lt;math&amp;gt;i&amp;lt;/math&amp;gt;-го вектора требует &amp;lt;math&amp;gt;i-1&amp;lt;/math&amp;gt; вычитаний проекций, то есть:&lt;br /&gt;
## &amp;lt;math&amp;gt;(3n-2)(i-1)&amp;lt;/math&amp;gt; (&amp;lt;math&amp;gt;+&amp;lt;/math&amp;gt;);&lt;br /&gt;
## &amp;lt;math&amp;gt;3n(i-1)&amp;lt;/math&amp;gt; (&amp;lt;math&amp;gt;\times&amp;lt;/math&amp;gt;);&lt;br /&gt;
## &amp;lt;math&amp;gt;i-1&amp;lt;/math&amp;gt; (&amp;lt;math&amp;gt;\div&amp;lt;/math&amp;gt;).&lt;br /&gt;
# Мы вычисляем вектора от &amp;lt;math&amp;gt;i=1&amp;lt;/math&amp;gt; до &amp;lt;math&amp;gt;m&amp;lt;/math&amp;gt;, поэтому множители &amp;lt;math&amp;gt;(i-1)&amp;lt;/math&amp;gt; выражаются &#039;&#039;треугольным числом&#039;&#039; &amp;lt;math&amp;gt;(m-1)\frac{m}{2}&amp;lt;/math&amp;gt;.&lt;br /&gt;
## &amp;lt;math&amp;gt;(3n-2)(m-1)\frac{m}{2}&amp;lt;/math&amp;gt; (&amp;lt;math&amp;gt;+&amp;lt;/math&amp;gt;);&lt;br /&gt;
## &amp;lt;math&amp;gt;3n(m-1)\frac{m}{2}&amp;lt;/math&amp;gt; (&amp;lt;math&amp;gt;\times&amp;lt;/math&amp;gt;);&lt;br /&gt;
## &amp;lt;math&amp;gt;(m-1)\frac{m}{2}&amp;lt;/math&amp;gt; (&amp;lt;math&amp;gt;\div&amp;lt;/math&amp;gt;).&lt;br /&gt;
&lt;br /&gt;
Таким образом, cложность алгоритма &amp;lt;math&amp;gt;O(nm^2)&amp;lt;/math&amp;gt;.&lt;br /&gt;
&lt;br /&gt;
=== Информационный граф ===&lt;br /&gt;
Граф состоит из элементов 2 видов: прямоугольников и овалов. Прямоугольниками обозначаются данные, причем красному цвету соответствуют входные данные, а зеленому ― выходные. Овалы означают операции над переданными данными. Голубым цветом обозначены более сложно организованные операции, а синим ― менее. Для нахождения &amp;lt;math&amp;gt;\mathbf{b}_i&amp;lt;/math&amp;gt; вектора требуются значения всех векторов с номерами, меньшими &amp;lt;math&amp;gt;i&amp;lt;/math&amp;gt;, однако, расчеты проекций можно начинать, не дожидаясь вычисления всех векторов, а производить сразу, как только соответствующий ортогональный вектор будет рассчитан. Эта зависимость и отражена на графе ниже.&lt;br /&gt;
[[Файл:Gram_schmidt_graph.png|thumb|800px|center|frame|Рисунок 1. Информационный граф алгоритма Грама-Шмидта.]]&lt;br /&gt;
&lt;br /&gt;
=== Ресурс параллелизма алгоритма ===&lt;br /&gt;
Для построения базиса методом Грама–Шмидта в параллельном случае, имея в распоряжении &amp;lt;math&amp;gt;m&amp;lt;/math&amp;gt; и более потоков, необходимо выполнить следующие ярусы:&lt;br /&gt;
#&amp;lt;math&amp;gt;m-1&amp;lt;/math&amp;gt; ярус вычисления проекций;&lt;br /&gt;
#&amp;lt;math&amp;gt;m-1&amp;lt;/math&amp;gt; ярус вычитания векторов.&lt;br /&gt;
&lt;br /&gt;
Эти ярусы чередуются. Количество операций проекции и вычитания векторов уменьшается на единицу в каждом следующем ярусе. Вычисление проекции вектора требует 2 скалярных произведения, 1 деление и &amp;lt;math&amp;gt;n&amp;lt;/math&amp;gt; произведений, то есть:&lt;br /&gt;
#&amp;lt;math&amp;gt;2n-2&amp;lt;/math&amp;gt; (&amp;lt;math&amp;gt;+&amp;lt;/math&amp;gt;);&lt;br /&gt;
#&amp;lt;math&amp;gt;3n&amp;lt;/math&amp;gt; (&amp;lt;math&amp;gt;\times&amp;lt;/math&amp;gt;);&lt;br /&gt;
#&amp;lt;math&amp;gt;1&amp;lt;/math&amp;gt; (&amp;lt;math&amp;gt;\div&amp;lt;/math&amp;gt;).&lt;br /&gt;
&lt;br /&gt;
Если считать, что вычисление проекции происходит последовательно, то сложность по высоте &amp;lt;math&amp;gt;O(n)&amp;lt;/math&amp;gt;, по ширине &amp;lt;math&amp;gt;O(1)&amp;lt;/math&amp;gt; (то есть одна операция проекции в ярусе представляется набором ярусов с простыми последовательными операциями). В самом первом ярусе находится &amp;lt;math&amp;gt;m-1&amp;lt;/math&amp;gt; проекций и это наибольшее количество операций проекций, тогда сложность по высоте будет &amp;lt;math&amp;gt;O(n)&amp;lt;/math&amp;gt;, по ширине ― &amp;lt;math&amp;gt;O(m)&amp;lt;/math&amp;gt;.&lt;br /&gt;
&lt;br /&gt;
Вычисление вычитания векторов требует &amp;lt;math&amp;gt;n&amp;lt;/math&amp;gt; вычитаний, и если считать, что операция происходит последовательно, то сложность по высоте &amp;lt;math&amp;gt;O(n)&amp;lt;/math&amp;gt;, по ширине &amp;lt;math&amp;gt;O(1)&amp;lt;/math&amp;gt;. Во втором ярусе находится &amp;lt;math&amp;gt;m-1&amp;lt;/math&amp;gt; вычитаний и это наибольшее количество операций вычитаний, тогда сложность по высоте будет &amp;lt;math&amp;gt;O(n)&amp;lt;/math&amp;gt;, по ширине ― &amp;lt;math&amp;gt;O(m)&amp;lt;/math&amp;gt;.&lt;br /&gt;
&lt;br /&gt;
Из вышеизложенного следует, что при классификации по ширине ЯПФ алгоритм имеет сложность &amp;lt;math&amp;gt;O(m)&amp;lt;/math&amp;gt;, а по высоте ― &amp;lt;math&amp;gt;O(nm)&amp;lt;/math&amp;gt;.&lt;br /&gt;
&lt;br /&gt;
=== Входные и выходные данные алгоритма ===&lt;br /&gt;
&#039;&#039;&#039;Входные данные.&#039;&#039;&#039; Матрица &amp;lt;math&amp;gt;A&amp;lt;/math&amp;gt; с элементами &amp;lt;math&amp;gt;\alpha_{ij}&amp;lt;/math&amp;gt;, где &amp;lt;math&amp;gt;i = \overline{1, m}&amp;lt;/math&amp;gt; (количество линейно независимых векторов) и &amp;lt;math&amp;gt;j = \overline{1, n}&amp;lt;/math&amp;gt; (размерность пространства), при этом &amp;lt;math&amp;gt;m \leqslant n&amp;lt;/math&amp;gt;.&lt;br /&gt;
&lt;br /&gt;
&#039;&#039;&#039;Объем входных данных.&#039;&#039;&#039; &amp;lt;math&amp;gt;mn&amp;lt;/math&amp;gt;&lt;br /&gt;
&lt;br /&gt;
&#039;&#039;&#039;Выходные данные.&#039;&#039;&#039; Матрица &amp;lt;math&amp;gt;B&amp;lt;/math&amp;gt; с элементами &amp;lt;math&amp;gt;\beta_{ij}&amp;lt;/math&amp;gt;, где &amp;lt;math&amp;gt;i = \overline{1, m}&amp;lt;/math&amp;gt; и &amp;lt;math&amp;gt;j = \overline{1, n}&amp;lt;/math&amp;gt;, тогда &amp;lt;math&amp;gt;b_{1}, \dots, b_{m}&amp;lt;/math&amp;gt; — система ортогональных векторов.&lt;br /&gt;
&lt;br /&gt;
&#039;&#039;&#039;Объем выходных данных.&#039;&#039;&#039; &amp;lt;math&amp;gt;mn&amp;lt;/math&amp;gt;&lt;br /&gt;
&lt;br /&gt;
=== Свойства алгоритма ===&lt;br /&gt;
&amp;lt;ol&amp;gt;&lt;br /&gt;
&amp;lt;li&amp;gt;Отношение последовательной и параллельной сложности в предположении доступности неограниченного числа необходимых ресурсов — &amp;lt;math&amp;gt;m&amp;lt;/math&amp;gt;. При этом необходимо отметить, что отношение числа операций к суммарному объему входных и выходных данных (вычислительная мощность алгоритма) — линейное.&amp;lt;/li&amp;gt;&lt;br /&gt;
&lt;br /&gt;
&amp;lt;li&amp;gt;Алгоритм почти полностью детерминирован, то есть гарантирована единственность результата выполнения. Это означает, что возможно накопление ошибок округления, то есть векторы выходной матрицы часто не точно ортогональны. Из-за потери ортогональности в процессе вычислений классический процесс Грама-Шмидта называют численно неустойчивым. Однако, процесс Грама-Шмидта может быть сделан более вычислительно устойчивым путём небольшой модификации. Такой алгоритм называется модифицированным процессом Грама-Шмидта. Рассмотрим его отличие подробнее.&lt;br /&gt;
&amp;lt;br /&amp;gt;&lt;br /&gt;
&amp;lt;math&amp;gt; &lt;br /&gt;
\begin{array}{l}&lt;br /&gt;
\mathbf{b}_j\\&lt;br /&gt;
  \\&lt;br /&gt;
\mathbf{b}_j&lt;br /&gt;
\end{array}&lt;br /&gt;
&lt;br /&gt;
\begin{array}{c}&lt;br /&gt;
= \\&lt;br /&gt;
  \\&lt;br /&gt;
=&lt;br /&gt;
\end{array}&lt;br /&gt;
&lt;br /&gt;
\underbrace{&lt;br /&gt;
\underbrace{&lt;br /&gt;
\underbrace{&lt;br /&gt;
&lt;br /&gt;
\begin{array}{c}&lt;br /&gt;
\mathbf{a}_j \\&lt;br /&gt;
   \\&lt;br /&gt;
\mathbf{a}_j&lt;br /&gt;
\end{array}&lt;br /&gt;
&lt;br /&gt;
\begin{array}{c}&lt;br /&gt;
- \\&lt;br /&gt;
  \\&lt;br /&gt;
-&lt;br /&gt;
\end{array}&lt;br /&gt;
&lt;br /&gt;
\begin{array}{c}&lt;br /&gt;
\mathbf{proj}_{\mathbf{b}_1}\,\mathbf{a}_j \\&lt;br /&gt;
   ||                                      \\&lt;br /&gt;
\mathbf{proj}_{\mathbf{b}_1}\,\mathbf{a}_j&lt;br /&gt;
\end{array}&lt;br /&gt;
&lt;br /&gt;
}_{\mathbf{a}_j^{(1)}}&lt;br /&gt;
&lt;br /&gt;
\begin{array}{c}&lt;br /&gt;
- \\&lt;br /&gt;
  \\&lt;br /&gt;
-&lt;br /&gt;
\end{array}&lt;br /&gt;
&lt;br /&gt;
\begin{array}{c}&lt;br /&gt;
\mathbf{proj}_{\mathbf{b}_2}\,\mathbf{a}_j       \\&lt;br /&gt;
   ||                                            \\&lt;br /&gt;
\mathbf{proj}_{\mathbf{b}_2}\,\mathbf{a}_j^{(1)}&lt;br /&gt;
\end{array}&lt;br /&gt;
&lt;br /&gt;
}_{\mathbf{a}_j^{(2)}}&lt;br /&gt;
&lt;br /&gt;
\begin{array}{c}&lt;br /&gt;
- \\&lt;br /&gt;
  \\&lt;br /&gt;
-&lt;br /&gt;
\end{array}&lt;br /&gt;
&lt;br /&gt;
\begin{array}{c}&lt;br /&gt;
\mathbf{proj}_{\mathbf{b}_3}\,\mathbf{a}_j       \\&lt;br /&gt;
   ||                                            \\&lt;br /&gt;
\mathbf{proj}_{\mathbf{b}_3}\,\mathbf{a}_j^{(2)}&lt;br /&gt;
\end{array}&lt;br /&gt;
&lt;br /&gt;
}_{\mathbf{a}_j^{(3)}}&lt;br /&gt;
&lt;br /&gt;
\begin{array}{ccc}&lt;br /&gt;
- &amp;amp; \ldots &amp;amp; - \\&lt;br /&gt;
               \\&lt;br /&gt;
- &amp;amp; \ldots &amp;amp; - &lt;br /&gt;
\end{array}&lt;br /&gt;
&lt;br /&gt;
\begin{array}{cc}&lt;br /&gt;
\mathbf{proj}_{\mathbf{b}_{j-1}}\,\mathbf{a}_j         &amp;amp; (1) \\&lt;br /&gt;
   ||                                                  &amp;amp;      \\&lt;br /&gt;
\mathbf{proj}_{\mathbf{b}_{j-1}}\,\mathbf{a}_j^{(j-2)} &amp;amp; (2)&lt;br /&gt;
\end{array}&lt;br /&gt;
&lt;br /&gt;
&amp;lt;/math&amp;gt;&lt;br /&gt;
&amp;lt;br /&amp;gt;&lt;br /&gt;
Формула (1) показывает вычисление &amp;lt;math&amp;gt;\mathbf{b}_j&amp;lt;/math&amp;gt; в классическом процессе, а формула (2) — в модифицированном.&lt;br /&gt;
&amp;lt;br /&amp;gt;&lt;br /&gt;
Разница между ними заключается в том, от каких векторов вычисляются компоненты: от &amp;lt;math&amp;gt;\mathbf{a}_j&amp;lt;/math&amp;gt; в классическом процессе или от результата предыдущего вычитания, то есть от &amp;lt;math&amp;gt;\mathbf{a}_j^{(k)}&amp;lt;/math&amp;gt; в модифицированном процессе. Таким образом, &amp;lt;math&amp;gt;\mathbf{a}_j^{(k)}&amp;lt;/math&amp;gt; представляет собой &amp;lt;math&amp;gt;\mathbf{a}_j&amp;lt;/math&amp;gt;, из которого удалены компоненты в направлениях &amp;lt;math&amp;gt;\mathbf{b}_1,\,\;\ldots,\;\mathbf{b}_{k}&amp;lt;/math&amp;gt;. Компонента вектора &amp;lt;math&amp;gt;\mathbf{a}_j&amp;lt;/math&amp;gt; в направлении &amp;lt;math&amp;gt;\mathbf{b}_{k+1}&amp;lt;/math&amp;gt; при этом удалении не затрагивается и поэтому она в &amp;lt;math&amp;gt;\mathbf{a}_j^{(k)}&amp;lt;/math&amp;gt; такая же, как в &amp;lt;math&amp;gt;\mathbf{a}_j&amp;lt;/math&amp;gt;.&amp;lt;/li&amp;gt;&lt;br /&gt;
&lt;br /&gt;
&amp;lt;li&amp;gt;Процесс Грама-Шмидта может применяться к бесконечной последовательности линейно независимых векторов, а также к линейно зависимым векторам. В этом случае он выдаёт &amp;lt;math&amp;gt;\mathbf{0}&amp;lt;/math&amp;gt; (нулевой вектор) на шаге &amp;lt;math&amp;gt;j&amp;lt;/math&amp;gt;, если &amp;lt;math&amp;gt;\mathbf{a}_j&amp;lt;/math&amp;gt; является линейной комбинацией векторов &amp;lt;math&amp;gt;\mathbf{a}_1,\;\ldots,\;\mathbf{a}_{j-1}&amp;lt;/math&amp;gt;. Если это может случиться, то для сохранения ортогональности выходных векторов и для предотвращения деления на ноль при ортонормировании алгоритм должен делать проверку на нулевые векторы и отбрасывать их. Количество векторов, выдаваемых алгоритмом, будет равно размерности подпространства, порождённого векторами (то есть количеству линейно независимых векторов, которые можно выделить среди исходных векторов).&amp;lt;/li&amp;gt;&lt;br /&gt;
&lt;br /&gt;
&amp;lt;li&amp;gt;Процесс Грама-Шмидта может быть истолкован как разложение невырожденной квадратной матрицы в произведение ортогональной (или унитарной матрицы в случае эрмитова пространства) и верхнетреугольной матрицы с положительными диагональными элементами — QR-разложение.&amp;lt;/li&amp;gt;&lt;br /&gt;
&amp;lt;/ol&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;
В рамках статьи была написана своя параллельная реализация процесса ортогонализации Грама-Шмидта с использованием OpenMPI. Реализация вместе с данными и вспомогательными скриптами доступна в репозитории [https://github.com/zodinyac/GramSchmidt GramSchmidt].&lt;br /&gt;
&lt;br /&gt;
Испытания реализованного алгоритма проводились на [http://parallel.ru/cluster/lomonosov.html суперкомпьютере &amp;quot;Ломоносов&amp;quot;] Суперкомпьютерного комплекса Московского университета со следующими значениями параметров:&lt;br /&gt;
* размер матрицы по одному измерению: 100, 500 и далее с шагом 500 до 10000 элементов,&lt;br /&gt;
* число процессов: 1, 2, 4, 8 и далее с шагом 8 до 128. Тестирование с использованием 1, 2, 4 и 8 процессов не использовалось для данных, где размер превышал 5000.&lt;br /&gt;
&lt;br /&gt;
На следующем рисунке приведен графики времени работы алгоритма в зависимости от числа процессов и размерности матриц. &lt;br /&gt;
[[File:Plot3d-gs-belov-bogomolov-1.png|thumb|center|720px|Рисунок 2. График производительности реализации алгоритма в зависимости от числа процессоров и размерности матриц.]]&lt;br /&gt;
[[File:Plot3d-gs-belov-bogomolov-2.png|thumb|center|720px|Рисунок 3. График производительности реализации алгоритма в зависимости от числа процессоров и размерности матриц.]]&lt;br /&gt;
[[File:Gs-parallel_efficiency.png|thumb|center|720px|Рисунок 4. График эффективности распараллеливания алгоритма в зависимости от числа процессоров и размерности матриц.]]&lt;br /&gt;
&lt;br /&gt;
{| class=&amp;quot;wikitable&amp;quot;&lt;br /&gt;
|-&lt;br /&gt;
! Размер матрицы&lt;br /&gt;
! 100&lt;br /&gt;
! 500&lt;br /&gt;
! 1000&lt;br /&gt;
! 1500&lt;br /&gt;
! 2000&lt;br /&gt;
! 2500&lt;br /&gt;
! 3000&lt;br /&gt;
! 3500&lt;br /&gt;
! 4000&lt;br /&gt;
! 4500&lt;br /&gt;
! 5000&lt;br /&gt;
! 5500&lt;br /&gt;
! 6000&lt;br /&gt;
! 6500&lt;br /&gt;
! 7000&lt;br /&gt;
! 7500&lt;br /&gt;
! 8000&lt;br /&gt;
! 8500&lt;br /&gt;
! 9000&lt;br /&gt;
! 9500&lt;br /&gt;
! 10000&lt;br /&gt;
|-&lt;br /&gt;
| Число узлов, на которых время работы минимально&lt;br /&gt;
| 1&lt;br /&gt;
| 32&lt;br /&gt;
| 48&lt;br /&gt;
| 56&lt;br /&gt;
| 24&lt;br /&gt;
| 32&lt;br /&gt;
| 32&lt;br /&gt;
| 40&lt;br /&gt;
| 40&lt;br /&gt;
| 40&lt;br /&gt;
| 48&lt;br /&gt;
| 56&lt;br /&gt;
| 56&lt;br /&gt;
| 56&lt;br /&gt;
| 64&lt;br /&gt;
| 64&lt;br /&gt;
| 72&lt;br /&gt;
| 72&lt;br /&gt;
| 72&lt;br /&gt;
| 80&lt;br /&gt;
| 80&lt;br /&gt;
|}&lt;br /&gt;
&lt;br /&gt;
=== Динамические характеристики и эффективность реализации алгоритма ===&lt;br /&gt;
=== Выводы для классов архитектур ===&lt;br /&gt;
=== Существующие реализации алгоритма ===&lt;br /&gt;
Данный алгоритм реализован во множестве библиотек и математических программных пакетах.&lt;br /&gt;
&lt;br /&gt;
# Библиотека [https://github.com/open-epicycle/Epicycle.Math-cs Epicycle] (C#).&lt;br /&gt;
# Библиотека [http://www.spectralpython.net/ Spectral Python (SPy)].&lt;br /&gt;
# Библиотека [https://hackage.haskell.org/package/vect-0.4.7/docs/Data-Vect-Float-GramSchmidt.html vect] (Haskell).&lt;br /&gt;
&lt;br /&gt;
==== Пакет Mathematica ====&lt;br /&gt;
Приведем пример скрипта, предназначенного для пакета Mathematica, который проводит процесс ортогонализации Грама-Шмидта над векторами, заданными в фигурных скобках последней строки. Количество векторов и их координат могут быть произвольными. В данном случае для примера взяты векторы &amp;lt;math&amp;gt;\{-2,\;1,\;0\}&amp;lt;/math&amp;gt;, &amp;lt;math&amp;gt;\{-2,\;0,\;1\}&amp;lt;/math&amp;gt;, &amp;lt;math&amp;gt;\{-0{.}5,\;-1,\;1\}&amp;lt;/math&amp;gt;.&lt;br /&gt;
&amp;lt;source lang=&#039;mathematica&#039;&amp;gt;Projection[v1_, v2_] := (v1.v2*v2)/v2.v2&lt;br /&gt;
MultipleProjection[v1_, vecs_] := Plus @@ (Projection[v1, #1] &amp;amp;) /@ vecs&lt;br /&gt;
GramSchmidt[mat_] := Fold[Join[#1, {#2 - MultipleProjection[#2, #1]}] &amp;amp;, {}, mat]&lt;br /&gt;
GramSchmidt[{{-2, 1, 0}, {-2, 0, 1}, {-0.5, -1, 1}}]&amp;lt;/source&amp;gt;&lt;br /&gt;
&lt;br /&gt;
==== Пакет Maxima ====&lt;br /&gt;
Приведем пример скрипта, предназначенного для пакета Maxima, который проводит процесс ортогонализации Грама-Шмидта над векторами, заданными в фигурных скобках последней строки. Количество векторов и их координат могут быть произвольными. В данном случае для примера взяты векторы &amp;lt;math&amp;gt;\{-2,\;1,\;0\}&amp;lt;/math&amp;gt;, &amp;lt;math&amp;gt;\{-2,\;0,\;1\}&amp;lt;/math&amp;gt;, &amp;lt;math&amp;gt;\{-0{.}5,\;-1,\;1\}&amp;lt;/math&amp;gt;.&lt;br /&gt;
&amp;lt;source lang=&#039;maxima&#039;&amp;gt;&lt;br /&gt;
load(eigen);&lt;br /&gt;
x: matrix ([-2,1,0],[-2,0,1],[-0.5,-1,1]);&lt;br /&gt;
y: gramschmidt(x);&lt;br /&gt;
&amp;lt;/source&amp;gt;&lt;br /&gt;
&lt;br /&gt;
==== Пакет MATLAB ====&lt;br /&gt;
Приведем пример скрипта, предназначенного для пакета MATLAB, который проводит процесс ортогонализации Грама-Шмидта над векторами, заданными в фигурных скобках последней строки. В данном пакете уже существует функция, которая осуществляет данный процесс. Столбцы входной матрицы предполагаются линейно-независимыми, количество векторов и их координат могут быть произвольными. Функция возращает матрицу X с ортонормированными столбцами и обратимую верхне-треугольную матрицу Y.&lt;br /&gt;
&lt;br /&gt;
В данном случае для примера взяты векторы &amp;lt;math&amp;gt;\{-2,\;1,\;0\}&amp;lt;/math&amp;gt;, &amp;lt;math&amp;gt;\{-2,\;0,\;1\}&amp;lt;/math&amp;gt;, &amp;lt;math&amp;gt;\{-0{.}5,\;-1,\;1\}&amp;lt;/math&amp;gt;.&lt;br /&gt;
&amp;lt;source lang=&#039;matlab&#039;&amp;gt;&lt;br /&gt;
[x y]=gschmidt([-2 1 0; -2 0 1; -0.5 -1 1])&lt;br /&gt;
&amp;lt;/source&amp;gt;&lt;br /&gt;
&lt;br /&gt;
== Литература ==&lt;/div&gt;</summary>
		<author><name>BDA</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:BDA/%D0%9E%D1%80%D1%82%D0%BE%D0%B3%D0%BE%D0%BD%D0%B0%D0%BB%D0%B8%D0%B7%D0%B0%D1%86%D0%B8%D1%8F_%D0%93%D1%80%D0%B0%D0%BC%D0%B0-%D0%A8%D0%BC%D0%B8%D0%B4%D1%82%D0%B0&amp;diff=14948</id>
		<title>Участник:BDA/Ортогонализация Грама-Шмидта</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:BDA/%D0%9E%D1%80%D1%82%D0%BE%D0%B3%D0%BE%D0%BD%D0%B0%D0%BB%D0%B8%D0%B7%D0%B0%D1%86%D0%B8%D1%8F_%D0%93%D1%80%D0%B0%D0%BC%D0%B0-%D0%A8%D0%BC%D0%B8%D0%B4%D1%82%D0%B0&amp;diff=14948"/>
		<updated>2016-10-30T21:01:18Z</updated>

		<summary type="html">&lt;p&gt;BDA: &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(nm^2)&amp;lt;/math&amp;gt;&lt;br /&gt;
| pf_height         = &amp;lt;math&amp;gt;O(nm)&amp;lt;/math&amp;gt;&lt;br /&gt;
| pf_width          = &amp;lt;math&amp;gt;O(m)&amp;lt;/math&amp;gt;&lt;br /&gt;
| input_data        = &amp;lt;math&amp;gt;nm&amp;lt;/math&amp;gt;&lt;br /&gt;
| output_data       = &amp;lt;math&amp;gt;nm&amp;lt;/math&amp;gt;&lt;br /&gt;
}}&lt;br /&gt;
&lt;br /&gt;
Основные авторы описания: [[Участник:Zodiac|Белов Н. А.]], [[Участник:BDA|Богомолов Д. А.]].&lt;br /&gt;
&lt;br /&gt;
== Свойства и структура алгоритма ==&lt;br /&gt;
=== Общее описание алгоритма ===&lt;br /&gt;
&lt;br /&gt;
Ортогонализация ― алгоритм построения для данной линейно независимой системы векторов евклидова или эрмитова пространства V ортогональной системы ненулевых векторов, порождающих то же самое подпространство в V.&lt;br /&gt;
&lt;br /&gt;
Ортогонализация Грама–Шмидта&amp;lt;ref&amp;gt;Канатников А.Н., Крищенко А.П. &amp;quot;Линейная алгебра.&amp;quot; ― 3-е изд., стер. ― М.: Изд-во МГТУ им. Н.Э. Баумана, 2002&amp;lt;/ref&amp;gt; (процесс Грама–Шмидта) ― наиболее известный алгоритм ортогонализации. Назван в честь Йоргена Педерсена Грама&amp;lt;ref&amp;gt;O&#039;Connor, John J.; Robertson, Edmund F., &amp;quot;Jørgen Pedersen Gram&amp;quot;, MacTutor History of Mathematics archive, University of St Andrews.&amp;lt;/ref&amp;gt; и Эрхарда Шмидта&amp;lt;ref&amp;gt;O&#039;Connor, John J.; Robertson, Edmund F., &amp;quot;Erhard Schmidt&amp;quot;, MacTutor History of Mathematics archive, University of St Andrews.&amp;lt;/ref&amp;gt;, однако ранее уже появлялся в работах Лапласа и Коши. Является частным случаем разложения Ивасавы, так как может быть представлен как разложение невырожденной квадратной матрицы в произведение ортогональной (или унитарной матрицы в случае эрмитова пространства) и верхнетреугольной матрицы с положительными диагональными элементами.&lt;br /&gt;
&lt;br /&gt;
Рассматриваемый алгоритм применяется для борьбы с помехами в адаптивной системе селекции движущихся целей&amp;lt;ref&amp;gt;Орешкин Б.Н., Бакулев П.А. &amp;quot;Быстрая процедура ортогонализации Грамма–Шмидта и ее применение для борьбы с помехами в адаптивной системе селекции движущихся целей&amp;quot; ― Радиотехника / №12 за 2007 г.&amp;lt;/ref&amp;gt;, в протоколах безопасности&amp;lt;ref&amp;gt;Пискова А.В., Менщиков А.А., Коробейников А.Г. &amp;quot;Использование ортогонализации Грама-Шмидта в алгоритме приведения базиса решетки для протоколов безопасности&amp;quot; ― Вопросы кибербезопасности №1(14) 2016&amp;lt;/ref&amp;gt;, для повышения экономичности алгоритмов оценивания параметров моделей объектов управления&amp;lt;ref&amp;gt;Карелин А.Е., Светлаков А.А. &amp;quot;Использование ортогонализации Грама-Шмидта для повышения экономичности многоточечных алгоритмов рекуррентного оценивания параметров моделей объектов управления&amp;quot; ― Известия Томского политехнического университета [Известия ТПУ]. — 2006. — Т. 309, № 8. — [С. 15-19].&amp;lt;/ref&amp;gt; и в других областях.&lt;br /&gt;
&lt;br /&gt;
=== Математическое описание алгоритма ===&lt;br /&gt;
&#039;&#039;&#039;Входные данные.&#039;&#039;&#039; &amp;lt;math&amp;gt;m&amp;lt;/math&amp;gt; линейно независимых векторов &amp;lt;math&amp;gt;\mathbf{a}_1,...,\mathbf{a}_m&amp;lt;/math&amp;gt; c размерностью пространства &amp;lt;math&amp;gt;n&amp;lt;/math&amp;gt;, записанных в матрице &amp;lt;math&amp;gt;A&amp;lt;/math&amp;gt; с элементами &amp;lt;math&amp;gt;\alpha_{ij}&amp;lt;/math&amp;gt;.&lt;br /&gt;
&lt;br /&gt;
&#039;&#039;&#039;Выходные данные.&#039;&#039;&#039; &amp;lt;math&amp;gt;m&amp;lt;/math&amp;gt; ортогональных векторов &amp;lt;math&amp;gt;\mathbf{b}_1,...,\mathbf{b}_m&amp;lt;/math&amp;gt; c размерностью пространства &amp;lt;math&amp;gt;n&amp;lt;/math&amp;gt;, записанных в матрице &amp;lt;math&amp;gt;B&amp;lt;/math&amp;gt; с элементами &amp;lt;math&amp;gt;\beta_{ij}&amp;lt;/math&amp;gt;.&lt;br /&gt;
&lt;br /&gt;
Определим оператор проекции (проецирует вектор &amp;lt;math&amp;gt;\mathbf{a}&amp;lt;/math&amp;gt; коллинеарно вектору &amp;lt;math&amp;gt;\mathbf{b}&amp;lt;/math&amp;gt;) &amp;lt;math&amp;gt;\mathbf{proj_b a = \frac{\left \langle a,b \right \rangle}{\left \langle b,b \right \rangle }b}&amp;lt;/math&amp;gt;, где &amp;lt;math&amp;gt;\mathbf{\left \langle a,b \right \rangle}&amp;lt;/math&amp;gt; ― скалярное произведение векторов &amp;lt;math&amp;gt;\mathbf{a}&amp;lt;/math&amp;gt; и &amp;lt;math&amp;gt;\mathbf{b}&amp;lt;/math&amp;gt;.&lt;br /&gt;
&lt;br /&gt;
Тогда ортогональные векторы вычисляются следующим образом:&lt;br /&gt;
&lt;br /&gt;
&amp;lt;math&amp;gt;\mathbf{b}_1 = \mathbf{a}_1&amp;lt;/math&amp;gt;&lt;br /&gt;
&lt;br /&gt;
&amp;lt;math&amp;gt;\mathbf{b}_2 = \mathbf{a}_2 - \mathbf{proj}_{\mathbf{b}_1} \mathbf{a}_2 &amp;lt;/math&amp;gt;&lt;br /&gt;
&lt;br /&gt;
&amp;lt;math&amp;gt;\mathbf{b}_3 = \mathbf{a}_3 - \mathbf{proj}_{\mathbf{b}_1} \mathbf{a}_3 - \mathbf{proj}_{\mathbf{b}_2} \mathbf{a}_3 &amp;lt;/math&amp;gt;&lt;br /&gt;
&lt;br /&gt;
&amp;lt;math&amp;gt;\vdots&amp;lt;/math&amp;gt;&lt;br /&gt;
&lt;br /&gt;
&amp;lt;math&amp;gt;\mathbf{b}_m = \mathbf{a}_m - \sum_{j=1}^{m-1} \mathbf{proj}_{\mathbf{b}_j} \mathbf{a}_m&amp;lt;/math&amp;gt;&lt;br /&gt;
&lt;br /&gt;
Или поэлементно:&lt;br /&gt;
&lt;br /&gt;
&amp;lt;math&amp;gt;\beta_{1j} = \alpha_{1j}&amp;lt;/math&amp;gt;&lt;br /&gt;
&lt;br /&gt;
&amp;lt;math&amp;gt;\beta_{ij} = \alpha_{ij} - (\sum_{k=1}^{i-1} \mathbf{proj}_{\mathbf{b}_k} \mathbf{a}_i)_j = \alpha_{ij} - \sum_{k=1}^{i-1}\frac{\sum_{s=1}^{n}\alpha_{is}\beta_{ks}}{\sum_{s=1}^{n}\beta_{ks}\beta_{ks}}\beta_{kj} &amp;lt;/math&amp;gt;&lt;br /&gt;
&lt;br /&gt;
=== Вычислительное ядро алгоритма ===&lt;br /&gt;
Основное время работы алгоритма приходится на вычисление сумм &amp;lt;math&amp;gt;\sum_{i=1}^{j-1} \mathbf{proj}_{\mathbf{b}_i} \mathbf{a}_k \forall j: j=\overline{1, m}&amp;lt;/math&amp;gt;.&lt;br /&gt;
&lt;br /&gt;
=== Макроструктура алгоритма ===&lt;br /&gt;
Из описания алгоритма в предыдущих разделов следует, что основную часть данного метода составляют операции вычисления проекций векторов, а также их сумм.&lt;br /&gt;
&lt;br /&gt;
=== Схема реализации последовательного алгоритма ===&lt;br /&gt;
Рассмотрим алгоритм, написанный в виде функции для математической системы MATLAB.&lt;br /&gt;
&lt;br /&gt;
&#039;&#039;&#039;Входные данные.&#039;&#039;&#039;&lt;br /&gt;
&lt;br /&gt;
Матрица &amp;lt;math&amp;gt;A&amp;lt;/math&amp;gt; с линейно-независимыми векторами в столбцах.&lt;br /&gt;
&lt;br /&gt;
&#039;&#039;&#039;Выходные данные.&#039;&#039;&#039;&lt;br /&gt;
&lt;br /&gt;
Матрица &amp;lt;math&amp;gt;Q&amp;lt;/math&amp;gt; с ортонормированным базисом &amp;lt;math&amp;gt;A&amp;lt;/math&amp;gt;.&lt;br /&gt;
&lt;br /&gt;
&#039;&#039;&#039;Использование.&#039;&#039;&#039;&lt;br /&gt;
&amp;lt;source lang=&amp;quot;matlab&amp;quot;&amp;gt;&lt;br /&gt;
Q = gramschmidt( A );&lt;br /&gt;
&amp;lt;/source&amp;gt;&lt;br /&gt;
&lt;br /&gt;
&#039;&#039;&#039;Реализация.&#039;&#039;&#039;&lt;br /&gt;
&amp;lt;source lang=&amp;quot;matlab&amp;quot;&amp;gt;&lt;br /&gt;
function Q = gramschmidt( A )&lt;br /&gt;
% Число векторов.&lt;br /&gt;
n = size( A, 2 );&lt;br /&gt;
 &lt;br /&gt;
% Инициализируем выходную матрицу.&lt;br /&gt;
Q = zeros( n );&lt;br /&gt;
 &lt;br /&gt;
% Преобразуем каждый вектор в базисный:&lt;br /&gt;
% (1) j-ый базисный вектор будет ортогонален каждому из предыдущих 1..j-1 векторов;&lt;br /&gt;
% (2) будет единичной длины.&lt;br /&gt;
for j = 1 : n&lt;br /&gt;
    % Выбираем j-ый вектор&lt;br /&gt;
    u = A( :, j );&lt;br /&gt;
    &lt;br /&gt;
    % Специальный случай для j = 1: просто нормируем этот вектор и помещаем&lt;br /&gt;
    % первым в найденный базис, так как нет векторов, относительно которых&lt;br /&gt;
    % нужно было бы делать его ортогональным.&lt;br /&gt;
&lt;br /&gt;
    % Удаляем из оригинального вектора &amp;quot;u&amp;quot; все компоненты натянутые на базис&lt;br /&gt;
    % из векторов 1..j-1, их вклад будет удален.&lt;br /&gt;
    % =&amp;gt; j-ый вектор ортогонален остальным.&lt;br /&gt;
    % Предыдущие базисные вектора были найдены на предыдуших шагах.&lt;br /&gt;
    % =&amp;gt; соблюдаем принцип ортогональности, но не ортонормированности.&lt;br /&gt;
    for i = 1 : j - 1&lt;br /&gt;
        u = u - proj( Q(:,i), A(:,j) );&lt;br /&gt;
    end&lt;br /&gt;
     &lt;br /&gt;
    % Нормируем вектор&lt;br /&gt;
    Q(:,j) = u ./ norm( u );&lt;br /&gt;
end&lt;br /&gt;
end&lt;br /&gt;
 &lt;br /&gt;
% Проекция вектора &amp;quot;a&amp;quot; коллинеарно вектору &amp;quot;e&amp;quot;.&lt;br /&gt;
function p = proj( e, a )&lt;br /&gt;
p = (e&#039; * a) / (e&#039; * e) .* e;&lt;br /&gt;
end&lt;br /&gt;
&amp;lt;/source&amp;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;.&lt;br /&gt;
&lt;br /&gt;
# Скалярное произведение векторов требует &amp;lt;math&amp;gt;n-1&amp;lt;/math&amp;gt; сложение и &amp;lt;math&amp;gt;n&amp;lt;/math&amp;gt; произведений.&lt;br /&gt;
# Вычитание проекции вектора требует &amp;lt;math&amp;gt;2&amp;lt;/math&amp;gt; скалярных произведения, &amp;lt;math&amp;gt;1&amp;lt;/math&amp;gt; деление, &amp;lt;math&amp;gt;n&amp;lt;/math&amp;gt; произведений и &amp;lt;math&amp;gt;n&amp;lt;/math&amp;gt; сложений, то есть:&lt;br /&gt;
## &amp;lt;math&amp;gt;3n-2&amp;lt;/math&amp;gt; (&amp;lt;math&amp;gt;+&amp;lt;/math&amp;gt;);&lt;br /&gt;
## &amp;lt;math&amp;gt;3n&amp;lt;/math&amp;gt; (&amp;lt;math&amp;gt;\times&amp;lt;/math&amp;gt;);&lt;br /&gt;
## &amp;lt;math&amp;gt;1&amp;lt;/math&amp;gt; (&amp;lt;math&amp;gt;\div&amp;lt;/math&amp;gt;).&lt;br /&gt;
# Вычисление &amp;lt;math&amp;gt;i&amp;lt;/math&amp;gt;-го вектора требует &amp;lt;math&amp;gt;i-1&amp;lt;/math&amp;gt; вычитаний проекций, то есть:&lt;br /&gt;
## &amp;lt;math&amp;gt;(3n-2)(i-1)&amp;lt;/math&amp;gt; (&amp;lt;math&amp;gt;+&amp;lt;/math&amp;gt;);&lt;br /&gt;
## &amp;lt;math&amp;gt;3n(i-1)&amp;lt;/math&amp;gt; (&amp;lt;math&amp;gt;\times&amp;lt;/math&amp;gt;);&lt;br /&gt;
## &amp;lt;math&amp;gt;i-1&amp;lt;/math&amp;gt; (&amp;lt;math&amp;gt;\div&amp;lt;/math&amp;gt;).&lt;br /&gt;
# Мы вычисляем вектора от &amp;lt;math&amp;gt;i=1&amp;lt;/math&amp;gt; до &amp;lt;math&amp;gt;m&amp;lt;/math&amp;gt;, поэтому множители &amp;lt;math&amp;gt;(i-1)&amp;lt;/math&amp;gt; выражаются &#039;&#039;треугольным числом&#039;&#039; &amp;lt;math&amp;gt;(m-1)\frac{m}{2}&amp;lt;/math&amp;gt;.&lt;br /&gt;
## &amp;lt;math&amp;gt;(3n-2)(m-1)\frac{m}{2}&amp;lt;/math&amp;gt; (&amp;lt;math&amp;gt;+&amp;lt;/math&amp;gt;);&lt;br /&gt;
## &amp;lt;math&amp;gt;3n(m-1)\frac{m}{2}&amp;lt;/math&amp;gt; (&amp;lt;math&amp;gt;\times&amp;lt;/math&amp;gt;);&lt;br /&gt;
## &amp;lt;math&amp;gt;(m-1)\frac{m}{2}&amp;lt;/math&amp;gt; (&amp;lt;math&amp;gt;\div&amp;lt;/math&amp;gt;).&lt;br /&gt;
&lt;br /&gt;
Таким образом, cложность алгоритма &amp;lt;math&amp;gt;O(nm^2)&amp;lt;/math&amp;gt;.&lt;br /&gt;
&lt;br /&gt;
=== Информационный граф ===&lt;br /&gt;
Граф состоит из элементов 2 видов: прямоугольников и овалов. Прямоугольниками обозначаются данные, причем красному цвету соответствуют входные данные, а зеленому ― выходные. Овалы означают операции над переданными данными. Голубым цветом обозначены более сложно организованные операции, а синим ― менее. Для нахождения &amp;lt;math&amp;gt;\mathbf{b}_i&amp;lt;/math&amp;gt; вектора требуются значения всех векторов с номерами, меньшими &amp;lt;math&amp;gt;i&amp;lt;/math&amp;gt;, однако, расчеты проекций можно начинать, не дожидаясь вычисления всех векторов, а производить сразу, как только соответствующий ортогональный вектор будет рассчитан. Эта зависимость и отражена на графе ниже.&lt;br /&gt;
[[Файл:Gram_schmidt_graph.png|thumb|800px|center|frame|Информационный граф алгоритма Грама-Шмидта]]&lt;br /&gt;
&lt;br /&gt;
=== Ресурс параллелизма алгоритма ===&lt;br /&gt;
Для построения базиса методом Грама–Шмидта в параллельном случае, имея в распоряжении &amp;lt;math&amp;gt;m&amp;lt;/math&amp;gt; и более потоков, необходимо выполнить следующие ярусы:&lt;br /&gt;
#&amp;lt;math&amp;gt;m-1&amp;lt;/math&amp;gt; ярус вычисления проекций;&lt;br /&gt;
#&amp;lt;math&amp;gt;m-1&amp;lt;/math&amp;gt; ярус вычитания векторов.&lt;br /&gt;
&lt;br /&gt;
Эти ярусы чередуются. Количество операций проекции и вычитания векторов уменьшается на единицу в каждом следующем ярусе. Вычисление проекции вектора требует 2 скалярных произведения, 1 деление и &amp;lt;math&amp;gt;n&amp;lt;/math&amp;gt; произведений, то есть:&lt;br /&gt;
#&amp;lt;math&amp;gt;2n-2&amp;lt;/math&amp;gt; (&amp;lt;math&amp;gt;+&amp;lt;/math&amp;gt;);&lt;br /&gt;
#&amp;lt;math&amp;gt;3n&amp;lt;/math&amp;gt; (&amp;lt;math&amp;gt;\times&amp;lt;/math&amp;gt;);&lt;br /&gt;
#&amp;lt;math&amp;gt;1&amp;lt;/math&amp;gt; (&amp;lt;math&amp;gt;\div&amp;lt;/math&amp;gt;).&lt;br /&gt;
&lt;br /&gt;
Если считать, что вычисление проекции происходит последовательно, то сложность по высоте &amp;lt;math&amp;gt;O(n)&amp;lt;/math&amp;gt;, по ширине &amp;lt;math&amp;gt;O(1)&amp;lt;/math&amp;gt; (то есть одна операция проекции в ярусе представляется набором ярусов с простыми последовательными операциями). В самом первом ярусе находится &amp;lt;math&amp;gt;m-1&amp;lt;/math&amp;gt; проекций и это наибольшее количество операций проекций, тогда сложность по высоте будет &amp;lt;math&amp;gt;O(n)&amp;lt;/math&amp;gt;, по ширине ― &amp;lt;math&amp;gt;O(m)&amp;lt;/math&amp;gt;.&lt;br /&gt;
&lt;br /&gt;
Вычисление вычитания векторов требует &amp;lt;math&amp;gt;n&amp;lt;/math&amp;gt; вычитаний, и если считать, что операция происходит последовательно, то сложность по высоте &amp;lt;math&amp;gt;O(n)&amp;lt;/math&amp;gt;, по ширине &amp;lt;math&amp;gt;O(1)&amp;lt;/math&amp;gt;. Во втором ярусе находится &amp;lt;math&amp;gt;m-1&amp;lt;/math&amp;gt; вычитаний и это наибольшее количество операций вычитаний, тогда сложность по высоте будет &amp;lt;math&amp;gt;O(n)&amp;lt;/math&amp;gt;, по ширине ― &amp;lt;math&amp;gt;O(m)&amp;lt;/math&amp;gt;.&lt;br /&gt;
&lt;br /&gt;
Из вышеизложенного следует, что при классификации по ширине ЯПФ алгоритм имеет сложность &amp;lt;math&amp;gt;O(m)&amp;lt;/math&amp;gt;, а по высоте ― &amp;lt;math&amp;gt;O(nm)&amp;lt;/math&amp;gt;.&lt;br /&gt;
&lt;br /&gt;
=== Входные и выходные данные алгоритма ===&lt;br /&gt;
&#039;&#039;&#039;Входные данные.&#039;&#039;&#039; Матрица &amp;lt;math&amp;gt;A&amp;lt;/math&amp;gt; с элементами &amp;lt;math&amp;gt;\alpha_{ij}&amp;lt;/math&amp;gt;, где &amp;lt;math&amp;gt;i = \overline{1, m}&amp;lt;/math&amp;gt; (количество линейно независимых векторов) и &amp;lt;math&amp;gt;j = \overline{1, n}&amp;lt;/math&amp;gt; (размерность пространства), при этом &amp;lt;math&amp;gt;m \leqslant n&amp;lt;/math&amp;gt;.&lt;br /&gt;
&lt;br /&gt;
&#039;&#039;&#039;Объем входных данных.&#039;&#039;&#039; &amp;lt;math&amp;gt;mn&amp;lt;/math&amp;gt;&lt;br /&gt;
&lt;br /&gt;
&#039;&#039;&#039;Выходные данные.&#039;&#039;&#039; Матрица &amp;lt;math&amp;gt;B&amp;lt;/math&amp;gt; с элементами &amp;lt;math&amp;gt;\beta_{ij}&amp;lt;/math&amp;gt;, где &amp;lt;math&amp;gt;i = \overline{1, m}&amp;lt;/math&amp;gt; и &amp;lt;math&amp;gt;j = \overline{1, n}&amp;lt;/math&amp;gt;, тогда &amp;lt;math&amp;gt;b_{1}, \dots, b_{m}&amp;lt;/math&amp;gt; — система ортогональных векторов.&lt;br /&gt;
&lt;br /&gt;
&#039;&#039;&#039;Объем выходных данных.&#039;&#039;&#039; &amp;lt;math&amp;gt;mn&amp;lt;/math&amp;gt;&lt;br /&gt;
&lt;br /&gt;
=== Свойства алгоритма ===&lt;br /&gt;
&amp;lt;ol&amp;gt;&lt;br /&gt;
&amp;lt;li&amp;gt;Отношение последовательной и параллельной сложности в предположении доступности неограниченного числа необходимых ресурсов — ?. При этом необходимо отметить, что отношение числа операций к суммарному объему входных и выходных данных (вычислительная мощность алгоритма) — линейное.&amp;lt;/li&amp;gt;&lt;br /&gt;
&lt;br /&gt;
&amp;lt;li&amp;gt;Алгоритм почти полностью детерминирован, то есть гарантирована единственность результата выполнения. Это означает, что возможно накопление ошибок округления, то есть векторы выходной матрицы часто не точно ортогональны. Из-за потери ортогональности в процессе вычислений классический процесс Грама-Шмидта называют численно неустойчивым. Однако, процесс Грама-Шмидта может быть сделан более вычислительно устойчивым путём небольшой модификации. Такой алгоритм называется модифицированным процессом Грама-Шмидта. Рассмотрим его отличие подробнее.&lt;br /&gt;
&amp;lt;br /&amp;gt;&lt;br /&gt;
&amp;lt;math&amp;gt; &lt;br /&gt;
\begin{array}{l}&lt;br /&gt;
\mathbf{b}_j\\&lt;br /&gt;
  \\&lt;br /&gt;
\mathbf{b}_j&lt;br /&gt;
\end{array}&lt;br /&gt;
&lt;br /&gt;
\begin{array}{c}&lt;br /&gt;
= \\&lt;br /&gt;
  \\&lt;br /&gt;
=&lt;br /&gt;
\end{array}&lt;br /&gt;
&lt;br /&gt;
\underbrace{&lt;br /&gt;
\underbrace{&lt;br /&gt;
\underbrace{&lt;br /&gt;
&lt;br /&gt;
\begin{array}{c}&lt;br /&gt;
\mathbf{a}_j \\&lt;br /&gt;
   \\&lt;br /&gt;
\mathbf{a}_j&lt;br /&gt;
\end{array}&lt;br /&gt;
&lt;br /&gt;
\begin{array}{c}&lt;br /&gt;
- \\&lt;br /&gt;
  \\&lt;br /&gt;
-&lt;br /&gt;
\end{array}&lt;br /&gt;
&lt;br /&gt;
\begin{array}{c}&lt;br /&gt;
\mathbf{proj}_{\mathbf{b}_1}\,\mathbf{a}_j \\&lt;br /&gt;
   ||                                      \\&lt;br /&gt;
\mathbf{proj}_{\mathbf{b}_1}\,\mathbf{a}_j&lt;br /&gt;
\end{array}&lt;br /&gt;
&lt;br /&gt;
}_{\mathbf{a}_j^{(1)}}&lt;br /&gt;
&lt;br /&gt;
\begin{array}{c}&lt;br /&gt;
- \\&lt;br /&gt;
  \\&lt;br /&gt;
-&lt;br /&gt;
\end{array}&lt;br /&gt;
&lt;br /&gt;
\begin{array}{c}&lt;br /&gt;
\mathbf{proj}_{\mathbf{b}_2}\,\mathbf{a}_j       \\&lt;br /&gt;
   ||                                            \\&lt;br /&gt;
\mathbf{proj}_{\mathbf{b}_2}\,\mathbf{a}_j^{(1)}&lt;br /&gt;
\end{array}&lt;br /&gt;
&lt;br /&gt;
}_{\mathbf{a}_j^{(2)}}&lt;br /&gt;
&lt;br /&gt;
\begin{array}{c}&lt;br /&gt;
- \\&lt;br /&gt;
  \\&lt;br /&gt;
-&lt;br /&gt;
\end{array}&lt;br /&gt;
&lt;br /&gt;
\begin{array}{c}&lt;br /&gt;
\mathbf{proj}_{\mathbf{b}_3}\,\mathbf{a}_j       \\&lt;br /&gt;
   ||                                            \\&lt;br /&gt;
\mathbf{proj}_{\mathbf{b}_3}\,\mathbf{a}_j^{(2)}&lt;br /&gt;
\end{array}&lt;br /&gt;
&lt;br /&gt;
}_{\mathbf{a}_j^{(3)}}&lt;br /&gt;
&lt;br /&gt;
\begin{array}{ccc}&lt;br /&gt;
- &amp;amp; \ldots &amp;amp; - \\&lt;br /&gt;
               \\&lt;br /&gt;
- &amp;amp; \ldots &amp;amp; - &lt;br /&gt;
\end{array}&lt;br /&gt;
&lt;br /&gt;
\begin{array}{cc}&lt;br /&gt;
\mathbf{proj}_{\mathbf{b}_{j-1}}\,\mathbf{a}_j         &amp;amp; (1) \\&lt;br /&gt;
   ||                                                  &amp;amp;      \\&lt;br /&gt;
\mathbf{proj}_{\mathbf{b}_{j-1}}\,\mathbf{a}_j^{(j-2)} &amp;amp; (2)&lt;br /&gt;
\end{array}&lt;br /&gt;
&lt;br /&gt;
&amp;lt;/math&amp;gt;&lt;br /&gt;
&amp;lt;br /&amp;gt;&lt;br /&gt;
Формула (1) показывает вычисление &amp;lt;math&amp;gt;\mathbf{b}_j&amp;lt;/math&amp;gt; в классическом процессе, а формула (2) — в модифицированном.&lt;br /&gt;
&amp;lt;br /&amp;gt;&lt;br /&gt;
Разница между ними заключается в том, от каких векторов вычисляются компоненты: от &amp;lt;math&amp;gt;\mathbf{a}_j&amp;lt;/math&amp;gt; в классическом процессе или от результата предыдущего вычитания, то есть от &amp;lt;math&amp;gt;\mathbf{a}_j^{(k)}&amp;lt;/math&amp;gt; в модифицированном процессе. Таким образом, &amp;lt;math&amp;gt;\mathbf{a}_j^{(k)}&amp;lt;/math&amp;gt; представляет собой &amp;lt;math&amp;gt;\mathbf{a}_j&amp;lt;/math&amp;gt;, из которого удалены компоненты в направлениях &amp;lt;math&amp;gt;\mathbf{b}_1,\,\;\ldots,\;\mathbf{b}_{k}&amp;lt;/math&amp;gt;. Компонента вектора &amp;lt;math&amp;gt;\mathbf{a}_j&amp;lt;/math&amp;gt; в направлении &amp;lt;math&amp;gt;\mathbf{b}_{k+1}&amp;lt;/math&amp;gt; при этом удалении не затрагивается и поэтому она в &amp;lt;math&amp;gt;\mathbf{a}_j^{(k)}&amp;lt;/math&amp;gt; такая же, как в &amp;lt;math&amp;gt;\mathbf{a}_j&amp;lt;/math&amp;gt;.&amp;lt;/li&amp;gt;&lt;br /&gt;
&lt;br /&gt;
&amp;lt;li&amp;gt;Процесс Грама-Шмидта может применяться к бесконечной последовательности линейно независимых векторов, а также к линейно зависимым векторам. В этом случае он выдаёт &amp;lt;math&amp;gt;\mathbf{0}&amp;lt;/math&amp;gt; (нулевой вектор) на шаге &amp;lt;math&amp;gt;j&amp;lt;/math&amp;gt;, если &amp;lt;math&amp;gt;\mathbf{a}_j&amp;lt;/math&amp;gt; является линейной комбинацией векторов &amp;lt;math&amp;gt;\mathbf{a}_1,\;\ldots,\;\mathbf{a}_{j-1}&amp;lt;/math&amp;gt;. Если это может случиться, то для сохранения ортогональности выходных векторов и для предотвращения деления на ноль при ортонормировании алгоритм должен делать проверку на нулевые векторы и отбрасывать их. Количество векторов, выдаваемых алгоритмом, будет равно размерности подпространства, порождённого векторами (то есть количеству линейно независимых векторов, которые можно выделить среди исходных векторов).&amp;lt;/li&amp;gt;&lt;br /&gt;
&lt;br /&gt;
&amp;lt;li&amp;gt;Процесс Грама-Шмидта может быть истолкован как разложение невырожденной квадратной матрицы в произведение ортогональной (или унитарной матрицы в случае эрмитова пространства) и верхнетреугольной матрицы с положительными диагональными элементами — QR-разложение.&amp;lt;/li&amp;gt;&lt;br /&gt;
&amp;lt;/ol&amp;gt;&lt;br /&gt;
&lt;br /&gt;
== Программная реализация алгоритма ==&lt;br /&gt;
=== Особенности реализации последовательного алгоритма ===&lt;br /&gt;
=== Локальность данных и вычислений ===&lt;br /&gt;
=== Возможные способы и особенности параллельной реализации алгоритма ===&lt;br /&gt;
=== Масштабируемость алгоритма и его реализации ===&lt;br /&gt;
&#039;&#039;Срок сдачи продлен до 15 ноября.&#039;&#039;&lt;br /&gt;
=== Динамические характеристики и эффективность реализации алгоритма ===&lt;br /&gt;
=== Выводы для классов архитектур ===&lt;br /&gt;
=== Существующие реализации алгоритма ===&lt;br /&gt;
Данный алгоритм реализован во множестве библиотек и математических программных пакетах.&lt;br /&gt;
&lt;br /&gt;
# Библиотека [https://github.com/open-epicycle/Epicycle.Math-cs Epicycle] (C#).&lt;br /&gt;
# Библиотека [http://www.spectralpython.net/ Spectral Python (SPy)].&lt;br /&gt;
# Библиотека [https://hackage.haskell.org/package/vect-0.4.7/docs/Data-Vect-Float-GramSchmidt.html vect] (Haskell).&lt;br /&gt;
&lt;br /&gt;
==== Пакет Mathematica ====&lt;br /&gt;
Приведем пример скрипта, предназначенного для пакета Mathematica, который проводит процесс ортогонализации Грама-Шмидта над векторами, заданными в фигурных скобках последней строки. Количество векторов и их координат могут быть произвольными. В данном случае для примера взяты векторы &amp;lt;math&amp;gt;\{-2,\;1,\;0\}&amp;lt;/math&amp;gt;, &amp;lt;math&amp;gt;\{-2,\;0,\;1\}&amp;lt;/math&amp;gt;, &amp;lt;math&amp;gt;\{-0{.}5,\;-1,\;1\}&amp;lt;/math&amp;gt;.&lt;br /&gt;
&amp;lt;source lang=&#039;mathematica&#039;&amp;gt;Projection[v1_, v2_] := (v1.v2*v2)/v2.v2&lt;br /&gt;
MultipleProjection[v1_, vecs_] := Plus @@ (Projection[v1, #1] &amp;amp;) /@ vecs&lt;br /&gt;
GramSchmidt[mat_] := Fold[Join[#1, {#2 - MultipleProjection[#2, #1]}] &amp;amp;, {}, mat]&lt;br /&gt;
GramSchmidt[{{-2, 1, 0}, {-2, 0, 1}, {-0.5, -1, 1}}]&amp;lt;/source&amp;gt;&lt;br /&gt;
&lt;br /&gt;
==== Пакет Maxima ====&lt;br /&gt;
Приведем пример скрипта, предназначенного для пакета Maxima, который проводит процесс ортогонализации Грама-Шмидта над векторами, заданными в фигурных скобках последней строки. Количество векторов и их координат могут быть произвольными. В данном случае для примера взяты векторы &amp;lt;math&amp;gt;\{-2,\;1,\;0\}&amp;lt;/math&amp;gt;, &amp;lt;math&amp;gt;\{-2,\;0,\;1\}&amp;lt;/math&amp;gt;, &amp;lt;math&amp;gt;\{-0{.}5,\;-1,\;1\}&amp;lt;/math&amp;gt;.&lt;br /&gt;
&amp;lt;source lang=&#039;maxima&#039;&amp;gt;&lt;br /&gt;
load(eigen);&lt;br /&gt;
x: matrix ([-2,1,0],[-2,0,1],[-0.5,-1,1]);&lt;br /&gt;
y: gramschmidt(x);&lt;br /&gt;
&amp;lt;/source&amp;gt;&lt;br /&gt;
&lt;br /&gt;
==== Пакет MATLAB ====&lt;br /&gt;
Приведем пример скрипта, предназначенного для пакета MATLAB, который проводит процесс ортогонализации Грама-Шмидта над векторами, заданными в фигурных скобках последней строки. В данном пакете уже существует функция, которая осуществляет данный процесс. Столбцы входной матрицы предполагаются линейно-независимыми, количество векторов и их координат могут быть произвольными. Функция возращает матрицу X с ортонормированными столбцами и обратимую верхне-треугольную матрицу Y.&lt;br /&gt;
&lt;br /&gt;
В данном случае для примера взяты векторы &amp;lt;math&amp;gt;\{-2,\;1,\;0\}&amp;lt;/math&amp;gt;, &amp;lt;math&amp;gt;\{-2,\;0,\;1\}&amp;lt;/math&amp;gt;, &amp;lt;math&amp;gt;\{-0{.}5,\;-1,\;1\}&amp;lt;/math&amp;gt;.&lt;br /&gt;
&amp;lt;source lang=&#039;matlab&#039;&amp;gt;&lt;br /&gt;
[x y]=gschmidt([-2 1 0; -2 0 1; -0.5 -1 1])&lt;br /&gt;
&amp;lt;/source&amp;gt;&lt;br /&gt;
&lt;br /&gt;
== Литература ==&lt;/div&gt;</summary>
		<author><name>BDA</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:BDA/%D0%9E%D1%80%D1%82%D0%BE%D0%B3%D0%BE%D0%BD%D0%B0%D0%BB%D0%B8%D0%B7%D0%B0%D1%86%D0%B8%D1%8F_%D0%93%D1%80%D0%B0%D0%BC%D0%B0-%D0%A8%D0%BC%D0%B8%D0%B4%D1%82%D0%B0&amp;diff=14941</id>
		<title>Участник:BDA/Ортогонализация Грама-Шмидта</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:BDA/%D0%9E%D1%80%D1%82%D0%BE%D0%B3%D0%BE%D0%BD%D0%B0%D0%BB%D0%B8%D0%B7%D0%B0%D1%86%D0%B8%D1%8F_%D0%93%D1%80%D0%B0%D0%BC%D0%B0-%D0%A8%D0%BC%D0%B8%D0%B4%D1%82%D0%B0&amp;diff=14941"/>
		<updated>2016-10-30T20:45:08Z</updated>

		<summary type="html">&lt;p&gt;BDA: /* Ресурс параллелизма алгоритма */&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(nm^2)&amp;lt;/math&amp;gt;&lt;br /&gt;
| pf_height         = &amp;lt;math&amp;gt;?&amp;lt;/math&amp;gt;&lt;br /&gt;
| pf_width          = &amp;lt;math&amp;gt;?&amp;lt;/math&amp;gt;&lt;br /&gt;
| input_data        = &amp;lt;math&amp;gt;nm&amp;lt;/math&amp;gt;&lt;br /&gt;
| output_data       = &amp;lt;math&amp;gt;nm&amp;lt;/math&amp;gt;&lt;br /&gt;
}}&lt;br /&gt;
&lt;br /&gt;
Основные авторы описания: [[Участник:Zodiac|Белов Н. А.]], [[Участник:BDA|Богомолов Д. А.]].&lt;br /&gt;
&lt;br /&gt;
== Свойства и структура алгоритма ==&lt;br /&gt;
=== Общее описание алгоритма ===&lt;br /&gt;
&lt;br /&gt;
Ортогонализация ― алгоритм построения для данной линейно независимой системы векторов евклидова или эрмитова пространства V ортогональной системы ненулевых векторов, порождающих то же самое подпространство в V.&lt;br /&gt;
&lt;br /&gt;
Ортогонализация Грама–Шмидта&amp;lt;ref&amp;gt;Канатников А.Н., Крищенко А.П. &amp;quot;Линейная алгебра.&amp;quot; ― 3-е изд., стер. ― М.: Изд-во МГТУ им. Н.Э. Баумана, 2002&amp;lt;/ref&amp;gt; (процесс Грама–Шмидта) ― наиболее известный алгоритм ортогонализации. Назван в честь Йоргена Педерсена Грама&amp;lt;ref&amp;gt;O&#039;Connor, John J.; Robertson, Edmund F., &amp;quot;Jørgen Pedersen Gram&amp;quot;, MacTutor History of Mathematics archive, University of St Andrews.&amp;lt;/ref&amp;gt; и Эрхарда Шмидта&amp;lt;ref&amp;gt;O&#039;Connor, John J.; Robertson, Edmund F., &amp;quot;Erhard Schmidt&amp;quot;, MacTutor History of Mathematics archive, University of St Andrews.&amp;lt;/ref&amp;gt;, однако ранее уже появлялся в работах Лапласа и Коши. Является частным случаем разложения Ивасавы, так как может быть представлен как разложение невырожденной квадратной матрицы в произведение ортогональной (или унитарной матрицы в случае эрмитова пространства) и верхнетреугольной матрицы с положительными диагональными элементами.&lt;br /&gt;
&lt;br /&gt;
Рассматриваемый алгоритм применяется для борьбы с помехами в адаптивной системе селекции движущихся целей&amp;lt;ref&amp;gt;Орешкин Б.Н., Бакулев П.А. &amp;quot;Быстрая процедура ортогонализации Грамма–Шмидта и ее применение для борьбы с помехами в адаптивной системе селекции движущихся целей&amp;quot; ― Радиотехника / №12 за 2007 г.&amp;lt;/ref&amp;gt;, в протоколах безопасности&amp;lt;ref&amp;gt;Пискова А.В., Менщиков А.А., Коробейников А.Г. &amp;quot;Использование ортогонализации Грама-Шмидта в алгоритме приведения базиса решетки для протоколов безопасности&amp;quot; ― Вопросы кибербезопасности №1(14) 2016&amp;lt;/ref&amp;gt;, для повышения экономичности алгоритмов оценивания параметров моделей объектов управления&amp;lt;ref&amp;gt;Карелин А.Е., Светлаков А.А. &amp;quot;Использование ортогонализации Грама-Шмидта для повышения экономичности многоточечных алгоритмов рекуррентного оценивания параметров моделей объектов управления&amp;quot; ― Известия Томского политехнического университета [Известия ТПУ]. — 2006. — Т. 309, № 8. — [С. 15-19].&amp;lt;/ref&amp;gt; и в других областях.&lt;br /&gt;
&lt;br /&gt;
=== Математическое описание алгоритма ===&lt;br /&gt;
&#039;&#039;&#039;Входные данные.&#039;&#039;&#039; &amp;lt;math&amp;gt;m&amp;lt;/math&amp;gt; линейно независимых векторов &amp;lt;math&amp;gt;\mathbf{a}_1,...,\mathbf{a}_m&amp;lt;/math&amp;gt; c размерностью пространства &amp;lt;math&amp;gt;n&amp;lt;/math&amp;gt;, записанных в матрице &amp;lt;math&amp;gt;A&amp;lt;/math&amp;gt; с элементами &amp;lt;math&amp;gt;\alpha_{ij}&amp;lt;/math&amp;gt;.&lt;br /&gt;
&lt;br /&gt;
&#039;&#039;&#039;Выходные данные.&#039;&#039;&#039; &amp;lt;math&amp;gt;m&amp;lt;/math&amp;gt; ортогональных векторов &amp;lt;math&amp;gt;\mathbf{b}_1,...,\mathbf{b}_m&amp;lt;/math&amp;gt; c размерностью пространства &amp;lt;math&amp;gt;n&amp;lt;/math&amp;gt;, записанных в матрице &amp;lt;math&amp;gt;B&amp;lt;/math&amp;gt; с элементами &amp;lt;math&amp;gt;\beta_{ij}&amp;lt;/math&amp;gt;.&lt;br /&gt;
&lt;br /&gt;
Определим оператор проекции (проецирует вектор &amp;lt;math&amp;gt;\mathbf{a}&amp;lt;/math&amp;gt; коллинеарно вектору &amp;lt;math&amp;gt;\mathbf{b}&amp;lt;/math&amp;gt;) &amp;lt;math&amp;gt;\mathbf{proj_b a = \frac{\left \langle a,b \right \rangle}{\left \langle b,b \right \rangle }b}&amp;lt;/math&amp;gt;, где &amp;lt;math&amp;gt;\mathbf{\left \langle a,b \right \rangle}&amp;lt;/math&amp;gt; ― скалярное произведение векторов &amp;lt;math&amp;gt;\mathbf{a}&amp;lt;/math&amp;gt; и &amp;lt;math&amp;gt;\mathbf{b}&amp;lt;/math&amp;gt;.&lt;br /&gt;
&lt;br /&gt;
Тогда ортогональные векторы вычисляются следующим образом:&lt;br /&gt;
&lt;br /&gt;
&amp;lt;math&amp;gt;\mathbf{b}_1 = \mathbf{a}_1&amp;lt;/math&amp;gt;&lt;br /&gt;
&lt;br /&gt;
&amp;lt;math&amp;gt;\mathbf{b}_2 = \mathbf{a}_2 - \mathbf{proj}_{\mathbf{b}_1} \mathbf{a}_2 &amp;lt;/math&amp;gt;&lt;br /&gt;
&lt;br /&gt;
&amp;lt;math&amp;gt;\mathbf{b}_3 = \mathbf{a}_3 - \mathbf{proj}_{\mathbf{b}_1} \mathbf{a}_3 - \mathbf{proj}_{\mathbf{b}_2} \mathbf{a}_3 &amp;lt;/math&amp;gt;&lt;br /&gt;
&lt;br /&gt;
&amp;lt;math&amp;gt;\vdots&amp;lt;/math&amp;gt;&lt;br /&gt;
&lt;br /&gt;
&amp;lt;math&amp;gt;\mathbf{b}_m = \mathbf{a}_m - \sum_{j=1}^{m-1} \mathbf{proj}_{\mathbf{b}_j} \mathbf{a}_m&amp;lt;/math&amp;gt;&lt;br /&gt;
&lt;br /&gt;
Или поэлементно:&lt;br /&gt;
&lt;br /&gt;
&amp;lt;math&amp;gt;\beta_{1j} = \alpha_{1j}&amp;lt;/math&amp;gt;&lt;br /&gt;
&lt;br /&gt;
&amp;lt;math&amp;gt;\beta_{ij} = \alpha_{ij} - (\sum_{k=1}^{i-1} \mathbf{proj}_{\mathbf{b}_k} \mathbf{a}_i)_j = \alpha_{ij} - \sum_{k=1}^{i-1}\frac{\sum_{s=1}^{n}\alpha_{is}\beta_{ks}}{\sum_{s=1}^{n}\beta_{ks}\beta_{ks}}\beta_{kj} &amp;lt;/math&amp;gt;&lt;br /&gt;
&lt;br /&gt;
=== Вычислительное ядро алгоритма ===&lt;br /&gt;
Основное время работы алгоритма приходится на вычисление сумм &amp;lt;math&amp;gt;\sum_{i=1}^{j-1} \mathbf{proj}_{\mathbf{b}_i} \mathbf{a}_k \forall j: j=\overline{1, m}&amp;lt;/math&amp;gt;.&lt;br /&gt;
&lt;br /&gt;
=== Макроструктура алгоритма ===&lt;br /&gt;
Из описания алгоритма в предыдущих разделов следует, что основную часть данного метода составляют операции вычисления проекций векторов, а также их сумм.&lt;br /&gt;
&lt;br /&gt;
=== Схема реализации последовательного алгоритма ===&lt;br /&gt;
Рассмотрим алгоритм, написанный в виде функции для математической системы MATLAB.&lt;br /&gt;
&lt;br /&gt;
&#039;&#039;&#039;Входные данные.&#039;&#039;&#039;&lt;br /&gt;
&lt;br /&gt;
Матрица &amp;lt;math&amp;gt;A&amp;lt;/math&amp;gt; с линейно-независимыми векторами в столбцах.&lt;br /&gt;
&lt;br /&gt;
&#039;&#039;&#039;Выходные данные.&#039;&#039;&#039;&lt;br /&gt;
&lt;br /&gt;
Матрица &amp;lt;math&amp;gt;Q&amp;lt;/math&amp;gt; с ортонормированным базисом &amp;lt;math&amp;gt;A&amp;lt;/math&amp;gt;.&lt;br /&gt;
&lt;br /&gt;
&#039;&#039;&#039;Использование.&#039;&#039;&#039;&lt;br /&gt;
&amp;lt;source lang=&amp;quot;matlab&amp;quot;&amp;gt;&lt;br /&gt;
Q = gramschmidt( A );&lt;br /&gt;
&amp;lt;/source&amp;gt;&lt;br /&gt;
&lt;br /&gt;
&#039;&#039;&#039;Реализация.&#039;&#039;&#039;&lt;br /&gt;
&amp;lt;source lang=&amp;quot;matlab&amp;quot;&amp;gt;&lt;br /&gt;
function Q = gramschmidt( A )&lt;br /&gt;
% Число векторов.&lt;br /&gt;
n = size( A, 2 );&lt;br /&gt;
 &lt;br /&gt;
% Инициализируем выходную матрицу.&lt;br /&gt;
Q = zeros( n );&lt;br /&gt;
 &lt;br /&gt;
% Преобразуем каждый вектор в базисный:&lt;br /&gt;
% (1) j-ый базисный вектор будет ортогонален каждому из предыдущих 1..j-1 векторов;&lt;br /&gt;
% (2) будет единичной длины.&lt;br /&gt;
for j = 1 : n&lt;br /&gt;
    % Выбираем j-ый вектор&lt;br /&gt;
    u = A( :, j );&lt;br /&gt;
    &lt;br /&gt;
    % Специальный случай для j = 1: просто нормируем этот вектор и помещаем&lt;br /&gt;
    % первым в найденный базис, так как нет векторов, относительно которых&lt;br /&gt;
    % нужно было бы делать его ортогональным.&lt;br /&gt;
&lt;br /&gt;
    % Удаляем из оригинального вектора &amp;quot;u&amp;quot; все компоненты натянутые на базис&lt;br /&gt;
    % из векторов 1..j-1, их вклад будет удален.&lt;br /&gt;
    % =&amp;gt; j-ый вектор ортогонален остальным.&lt;br /&gt;
    % Предыдущие базисные вектора были найдены на предыдуших шагах.&lt;br /&gt;
    % =&amp;gt; соблюдаем принцип ортогональности, но не ортонормированности.&lt;br /&gt;
    for i = 1 : j - 1&lt;br /&gt;
        u = u - proj( Q(:,i), A(:,j) );&lt;br /&gt;
    end&lt;br /&gt;
     &lt;br /&gt;
    % Нормируем вектор&lt;br /&gt;
    Q(:,j) = u ./ norm( u );&lt;br /&gt;
end&lt;br /&gt;
end&lt;br /&gt;
 &lt;br /&gt;
% Проекция вектора &amp;quot;a&amp;quot; коллинеарно вектору &amp;quot;e&amp;quot;.&lt;br /&gt;
function p = proj( e, a )&lt;br /&gt;
p = (e&#039; * a) / (e&#039; * e) .* e;&lt;br /&gt;
end&lt;br /&gt;
&amp;lt;/source&amp;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;.&lt;br /&gt;
&lt;br /&gt;
# Скалярное произведение векторов требует &amp;lt;math&amp;gt;n-1&amp;lt;/math&amp;gt; сложение и &amp;lt;math&amp;gt;n&amp;lt;/math&amp;gt; произведений.&lt;br /&gt;
# Вычитание проекции вектора требует &amp;lt;math&amp;gt;2&amp;lt;/math&amp;gt; скалярных произведения, &amp;lt;math&amp;gt;1&amp;lt;/math&amp;gt; деление, &amp;lt;math&amp;gt;n&amp;lt;/math&amp;gt; произведений и &amp;lt;math&amp;gt;n&amp;lt;/math&amp;gt; сложений, то есть:&lt;br /&gt;
## &amp;lt;math&amp;gt;3n-2&amp;lt;/math&amp;gt; (&amp;lt;math&amp;gt;+&amp;lt;/math&amp;gt;);&lt;br /&gt;
## &amp;lt;math&amp;gt;3n&amp;lt;/math&amp;gt; (&amp;lt;math&amp;gt;\times&amp;lt;/math&amp;gt;);&lt;br /&gt;
## &amp;lt;math&amp;gt;1&amp;lt;/math&amp;gt; (&amp;lt;math&amp;gt;\div&amp;lt;/math&amp;gt;).&lt;br /&gt;
# Вычисление &amp;lt;math&amp;gt;i&amp;lt;/math&amp;gt;-го вектора требует &amp;lt;math&amp;gt;i-1&amp;lt;/math&amp;gt; вычитаний проекций, то есть:&lt;br /&gt;
## &amp;lt;math&amp;gt;(3n-2)(i-1)&amp;lt;/math&amp;gt; (&amp;lt;math&amp;gt;+&amp;lt;/math&amp;gt;);&lt;br /&gt;
## &amp;lt;math&amp;gt;3n(i-1)&amp;lt;/math&amp;gt; (&amp;lt;math&amp;gt;\times&amp;lt;/math&amp;gt;);&lt;br /&gt;
## &amp;lt;math&amp;gt;i-1&amp;lt;/math&amp;gt; (&amp;lt;math&amp;gt;\div&amp;lt;/math&amp;gt;).&lt;br /&gt;
# Мы вычисляем вектора от &amp;lt;math&amp;gt;i=1&amp;lt;/math&amp;gt; до &amp;lt;math&amp;gt;m&amp;lt;/math&amp;gt;, поэтому множители &amp;lt;math&amp;gt;(i-1)&amp;lt;/math&amp;gt; выражаются &#039;&#039;треугольным числом&#039;&#039; &amp;lt;math&amp;gt;(m-1)\frac{m}{2}&amp;lt;/math&amp;gt;.&lt;br /&gt;
## &amp;lt;math&amp;gt;(3n-2)(m-1)\frac{m}{2}&amp;lt;/math&amp;gt; (&amp;lt;math&amp;gt;+&amp;lt;/math&amp;gt;);&lt;br /&gt;
## &amp;lt;math&amp;gt;3n(m-1)\frac{m}{2}&amp;lt;/math&amp;gt; (&amp;lt;math&amp;gt;\times&amp;lt;/math&amp;gt;);&lt;br /&gt;
## &amp;lt;math&amp;gt;(m-1)\frac{m}{2}&amp;lt;/math&amp;gt; (&amp;lt;math&amp;gt;\div&amp;lt;/math&amp;gt;).&lt;br /&gt;
&lt;br /&gt;
Таким образом, cложность алгоритма &amp;lt;math&amp;gt;O(nm^2)&amp;lt;/math&amp;gt;.&lt;br /&gt;
&lt;br /&gt;
=== Информационный граф ===&lt;br /&gt;
Граф состоит из элементов 2 видов: прямоугольников и овалов. Прямоугольниками обозначаются данные, причем красному цвету соответствуют входные данные, а зеленому ― выходные. Овалы означают операции над переданными данными. Голубым цветом обозначены более сложно организованные операции, а синим ― менее. Для нахождения &amp;lt;math&amp;gt;\mathbf{b}_i&amp;lt;/math&amp;gt; вектора требуются значения всех векторов с номерами, меньшими &amp;lt;math&amp;gt;i&amp;lt;/math&amp;gt;, однако, расчеты проекций можно начинать, не дожидаясь вычисления всех векторов, а производить сразу, как только соответствующий ортогональный вектор будет рассчитан. Эта зависимость и отражена на графе ниже.&lt;br /&gt;
[[Файл:Gram_schmidt_graph.png|thumb|800px|center|frame|Информационный граф алгоритма Грама-Шмидта]]&lt;br /&gt;
&lt;br /&gt;
=== Ресурс параллелизма алгоритма ===&lt;br /&gt;
Для построения базиса методом Грама–Шмидта в параллельном случае, имея в распоряжении &amp;lt;math&amp;gt;m&amp;lt;/math&amp;gt; и более потоков, необходимо выполнить следующие ярусы:&lt;br /&gt;
#&amp;lt;math&amp;gt;m-1&amp;lt;/math&amp;gt; ярус вычисления проекций;&lt;br /&gt;
#&amp;lt;math&amp;gt;m-1&amp;lt;/math&amp;gt; ярус вычитания векторов.&lt;br /&gt;
&lt;br /&gt;
Эти ярусы чередуются. Количество операций проекции и вычитания векторов уменьшается на единицу в каждом следующем ярусе. Вычисление проекции вектора требует 2 скалярных произведения, 1 деление и &amp;lt;math&amp;gt;n&amp;lt;/math&amp;gt; произведений, то есть:&lt;br /&gt;
#&amp;lt;math&amp;gt;2n-2&amp;lt;/math&amp;gt; (&amp;lt;math&amp;gt;+&amp;lt;/math&amp;gt;);&lt;br /&gt;
#&amp;lt;math&amp;gt;3n&amp;lt;/math&amp;gt; (&amp;lt;math&amp;gt;\times&amp;lt;/math&amp;gt;);&lt;br /&gt;
#&amp;lt;math&amp;gt;1&amp;lt;/math&amp;gt; (&amp;lt;math&amp;gt;\div&amp;lt;/math&amp;gt;).&lt;br /&gt;
&lt;br /&gt;
Если считать, что вычисление проекции происходит последовательно, то сложность по высоте &amp;lt;math&amp;gt;O(n)&amp;lt;/math&amp;gt;, по ширине &amp;lt;math&amp;gt;O(1)&amp;lt;/math&amp;gt; (то есть одна операция проекции в ярусе представляется набором ярусов с простыми последовательными операциями). В самом первом ярусе находится &amp;lt;math&amp;gt;m-1&amp;lt;/math&amp;gt; проекций и это наибольшее количество операций проекций, тогда сложность по высоте будет &amp;lt;math&amp;gt;O(n)&amp;lt;/math&amp;gt;, по ширине ― &amp;lt;math&amp;gt;O(m)&amp;lt;/math&amp;gt;.&lt;br /&gt;
&lt;br /&gt;
Вычисление вычитания векторов требует &amp;lt;math&amp;gt;n&amp;lt;/math&amp;gt; вычитаний, и если считать, что операция происходит последовательно, то сложность по высоте &amp;lt;math&amp;gt;O(n)&amp;lt;/math&amp;gt;, по ширине &amp;lt;math&amp;gt;O(1)&amp;lt;/math&amp;gt;. Во втором ярусе находится &amp;lt;math&amp;gt;m-1&amp;lt;/math&amp;gt; вычитаний и это наибольшее количество операций вычитаний, тогда сложность по высоте будет &amp;lt;math&amp;gt;O(n)&amp;lt;/math&amp;gt;, по ширине ― &amp;lt;math&amp;gt;O(m)&amp;lt;/math&amp;gt;.&lt;br /&gt;
&lt;br /&gt;
Из вышеизложенного следует, что при классификации по ширине ЯПФ алгоритм имеет сложность &amp;lt;math&amp;gt;O(m)&amp;lt;/math&amp;gt;, а по высоте ― &amp;lt;math&amp;gt;O(nm)&amp;lt;/math&amp;gt;.&lt;br /&gt;
&lt;br /&gt;
=== Входные и выходные данные алгоритма ===&lt;br /&gt;
&#039;&#039;&#039;Входные данные.&#039;&#039;&#039; Матрица &amp;lt;math&amp;gt;A&amp;lt;/math&amp;gt; с элементами &amp;lt;math&amp;gt;\alpha_{ij}&amp;lt;/math&amp;gt;, где &amp;lt;math&amp;gt;i = \overline{1, m}&amp;lt;/math&amp;gt; (количество линейно независимых векторов) и &amp;lt;math&amp;gt;j = \overline{1, n}&amp;lt;/math&amp;gt; (размерность пространства), при этом &amp;lt;math&amp;gt;m \leqslant n&amp;lt;/math&amp;gt;.&lt;br /&gt;
&lt;br /&gt;
&#039;&#039;&#039;Объем входных данных.&#039;&#039;&#039; &amp;lt;math&amp;gt;mn&amp;lt;/math&amp;gt;&lt;br /&gt;
&lt;br /&gt;
&#039;&#039;&#039;Выходные данные.&#039;&#039;&#039; Матрица &amp;lt;math&amp;gt;B&amp;lt;/math&amp;gt; с элементами &amp;lt;math&amp;gt;\beta_{ij}&amp;lt;/math&amp;gt;, где &amp;lt;math&amp;gt;i = \overline{1, m}&amp;lt;/math&amp;gt; и &amp;lt;math&amp;gt;j = \overline{1, n}&amp;lt;/math&amp;gt;, тогда &amp;lt;math&amp;gt;b_{1}, \dots, b_{m}&amp;lt;/math&amp;gt; — система ортогональных векторов.&lt;br /&gt;
&lt;br /&gt;
&#039;&#039;&#039;Объем выходных данных.&#039;&#039;&#039; &amp;lt;math&amp;gt;mn&amp;lt;/math&amp;gt;&lt;br /&gt;
&lt;br /&gt;
=== Свойства алгоритма ===&lt;br /&gt;
&amp;lt;ol&amp;gt;&lt;br /&gt;
&amp;lt;li&amp;gt;Отношение последовательной и параллельной сложности в предположении доступности неограниченного числа необходимых ресурсов — ?. При этом необходимо отметить, что отношение числа операций к суммарному объему входных и выходных данных (вычислительная мощность алгоритма) — линейное.&amp;lt;/li&amp;gt;&lt;br /&gt;
&lt;br /&gt;
&amp;lt;li&amp;gt;Алгоритм почти полностью детерминирован, то есть гарантирована единственность результата выполнения. Это означает, что возможно накопление ошибок округления, то есть векторы выходной матрицы часто не точно ортогональны. Из-за потери ортогональности в процессе вычислений классический процесс Грама-Шмидта называют численно неустойчивым. Однако, процесс Грама-Шмидта может быть сделан более вычислительно устойчивым путём небольшой модификации. Такой алгоритм называется модифицированным процессом Грама-Шмидта. Рассмотрим его отличие подробнее.&lt;br /&gt;
&amp;lt;br /&amp;gt;&lt;br /&gt;
&amp;lt;math&amp;gt; &lt;br /&gt;
\begin{array}{l}&lt;br /&gt;
\mathbf{b}_j\\&lt;br /&gt;
  \\&lt;br /&gt;
\mathbf{b}_j&lt;br /&gt;
\end{array}&lt;br /&gt;
&lt;br /&gt;
\begin{array}{c}&lt;br /&gt;
= \\&lt;br /&gt;
  \\&lt;br /&gt;
=&lt;br /&gt;
\end{array}&lt;br /&gt;
&lt;br /&gt;
\underbrace{&lt;br /&gt;
\underbrace{&lt;br /&gt;
\underbrace{&lt;br /&gt;
&lt;br /&gt;
\begin{array}{c}&lt;br /&gt;
\mathbf{a}_j \\&lt;br /&gt;
   \\&lt;br /&gt;
\mathbf{a}_j&lt;br /&gt;
\end{array}&lt;br /&gt;
&lt;br /&gt;
\begin{array}{c}&lt;br /&gt;
- \\&lt;br /&gt;
  \\&lt;br /&gt;
-&lt;br /&gt;
\end{array}&lt;br /&gt;
&lt;br /&gt;
\begin{array}{c}&lt;br /&gt;
\mathbf{proj}_{\mathbf{b}_1}\,\mathbf{a}_j \\&lt;br /&gt;
   ||                                      \\&lt;br /&gt;
\mathbf{proj}_{\mathbf{b}_1}\,\mathbf{a}_j&lt;br /&gt;
\end{array}&lt;br /&gt;
&lt;br /&gt;
}_{\mathbf{a}_j^{(1)}}&lt;br /&gt;
&lt;br /&gt;
\begin{array}{c}&lt;br /&gt;
- \\&lt;br /&gt;
  \\&lt;br /&gt;
-&lt;br /&gt;
\end{array}&lt;br /&gt;
&lt;br /&gt;
\begin{array}{c}&lt;br /&gt;
\mathbf{proj}_{\mathbf{b}_2}\,\mathbf{a}_j       \\&lt;br /&gt;
   ||                                            \\&lt;br /&gt;
\mathbf{proj}_{\mathbf{b}_2}\,\mathbf{a}_j^{(1)}&lt;br /&gt;
\end{array}&lt;br /&gt;
&lt;br /&gt;
}_{\mathbf{a}_j^{(2)}}&lt;br /&gt;
&lt;br /&gt;
\begin{array}{c}&lt;br /&gt;
- \\&lt;br /&gt;
  \\&lt;br /&gt;
-&lt;br /&gt;
\end{array}&lt;br /&gt;
&lt;br /&gt;
\begin{array}{c}&lt;br /&gt;
\mathbf{proj}_{\mathbf{b}_3}\,\mathbf{a}_j       \\&lt;br /&gt;
   ||                                            \\&lt;br /&gt;
\mathbf{proj}_{\mathbf{b}_3}\,\mathbf{a}_j^{(2)}&lt;br /&gt;
\end{array}&lt;br /&gt;
&lt;br /&gt;
}_{\mathbf{a}_j^{(3)}}&lt;br /&gt;
&lt;br /&gt;
\begin{array}{ccc}&lt;br /&gt;
- &amp;amp; \ldots &amp;amp; - \\&lt;br /&gt;
               \\&lt;br /&gt;
- &amp;amp; \ldots &amp;amp; - &lt;br /&gt;
\end{array}&lt;br /&gt;
&lt;br /&gt;
\begin{array}{cc}&lt;br /&gt;
\mathbf{proj}_{\mathbf{b}_{j-1}}\,\mathbf{a}_j         &amp;amp; (1) \\&lt;br /&gt;
   ||                                                  &amp;amp;      \\&lt;br /&gt;
\mathbf{proj}_{\mathbf{b}_{j-1}}\,\mathbf{a}_j^{(j-2)} &amp;amp; (2)&lt;br /&gt;
\end{array}&lt;br /&gt;
&lt;br /&gt;
&amp;lt;/math&amp;gt;&lt;br /&gt;
&amp;lt;br /&amp;gt;&lt;br /&gt;
Формула (1) показывает вычисление &amp;lt;math&amp;gt;\mathbf{b}_j&amp;lt;/math&amp;gt; в классическом процессе, а формула (2) — в модифицированном.&lt;br /&gt;
&amp;lt;br /&amp;gt;&lt;br /&gt;
Разница между ними заключается в том, от каких векторов вычисляются компоненты: от &amp;lt;math&amp;gt;\mathbf{a}_j&amp;lt;/math&amp;gt; в классическом процессе или от результата предыдущего вычитания, то есть от &amp;lt;math&amp;gt;\mathbf{a}_j^{(k)}&amp;lt;/math&amp;gt; в модифицированном процессе. Таким образом, &amp;lt;math&amp;gt;\mathbf{a}_j^{(k)}&amp;lt;/math&amp;gt; представляет собой &amp;lt;math&amp;gt;\mathbf{a}_j&amp;lt;/math&amp;gt;, из которого удалены компоненты в направлениях &amp;lt;math&amp;gt;\mathbf{b}_1,\,\;\ldots,\;\mathbf{b}_{k}&amp;lt;/math&amp;gt;. Компонента вектора &amp;lt;math&amp;gt;\mathbf{a}_j&amp;lt;/math&amp;gt; в направлении &amp;lt;math&amp;gt;\mathbf{b}_{k+1}&amp;lt;/math&amp;gt; при этом удалении не затрагивается и поэтому она в &amp;lt;math&amp;gt;\mathbf{a}_j^{(k)}&amp;lt;/math&amp;gt; такая же, как в &amp;lt;math&amp;gt;\mathbf{a}_j&amp;lt;/math&amp;gt;.&amp;lt;/li&amp;gt;&lt;br /&gt;
&lt;br /&gt;
&amp;lt;li&amp;gt;Процесс Грама-Шмидта может применяться к бесконечной последовательности линейно независимых векторов, а также к линейно зависимым векторам. В этом случае он выдаёт &amp;lt;math&amp;gt;\mathbf{0}&amp;lt;/math&amp;gt; (нулевой вектор) на шаге &amp;lt;math&amp;gt;j&amp;lt;/math&amp;gt;, если &amp;lt;math&amp;gt;\mathbf{a}_j&amp;lt;/math&amp;gt; является линейной комбинацией векторов &amp;lt;math&amp;gt;\mathbf{a}_1,\;\ldots,\;\mathbf{a}_{j-1}&amp;lt;/math&amp;gt;. Если это может случиться, то для сохранения ортогональности выходных векторов и для предотвращения деления на ноль при ортонормировании алгоритм должен делать проверку на нулевые векторы и отбрасывать их. Количество векторов, выдаваемых алгоритмом, будет равно размерности подпространства, порождённого векторами (то есть количеству линейно независимых векторов, которые можно выделить среди исходных векторов).&amp;lt;/li&amp;gt;&lt;br /&gt;
&lt;br /&gt;
&amp;lt;li&amp;gt;Процесс Грама-Шмидта может быть истолкован как разложение невырожденной квадратной матрицы в произведение ортогональной (или унитарной матрицы в случае эрмитова пространства) и верхнетреугольной матрицы с положительными диагональными элементами — QR-разложение.&amp;lt;/li&amp;gt;&lt;br /&gt;
&amp;lt;/ol&amp;gt;&lt;br /&gt;
&lt;br /&gt;
== Программная реализация алгоритма ==&lt;br /&gt;
=== Особенности реализации последовательного алгоритма ===&lt;br /&gt;
=== Локальность данных и вычислений ===&lt;br /&gt;
=== Возможные способы и особенности параллельной реализации алгоритма ===&lt;br /&gt;
=== Масштабируемость алгоритма и его реализации ===&lt;br /&gt;
&#039;&#039;Срок сдачи продлен до 15 ноября.&#039;&#039;&lt;br /&gt;
=== Динамические характеристики и эффективность реализации алгоритма ===&lt;br /&gt;
=== Выводы для классов архитектур ===&lt;br /&gt;
=== Существующие реализации алгоритма ===&lt;br /&gt;
Данный алгоритм реализован во множестве библиотек и математических программных пакетах.&lt;br /&gt;
&lt;br /&gt;
# Библиотека [https://github.com/open-epicycle/Epicycle.Math-cs Epicycle] (C#).&lt;br /&gt;
# Библиотека [http://www.spectralpython.net/ Spectral Python (SPy)].&lt;br /&gt;
# Библиотека [https://hackage.haskell.org/package/vect-0.4.7/docs/Data-Vect-Float-GramSchmidt.html vect] (Haskell).&lt;br /&gt;
&lt;br /&gt;
==== Пакет Mathematica ====&lt;br /&gt;
Приведем пример скрипта, предназначенного для пакета Mathematica, который проводит процесс ортогонализации Грама-Шмидта над векторами, заданными в фигурных скобках последней строки. Количество векторов и их координат могут быть произвольными. В данном случае для примера взяты векторы &amp;lt;math&amp;gt;\{-2,\;1,\;0\}&amp;lt;/math&amp;gt;, &amp;lt;math&amp;gt;\{-2,\;0,\;1\}&amp;lt;/math&amp;gt;, &amp;lt;math&amp;gt;\{-0{.}5,\;-1,\;1\}&amp;lt;/math&amp;gt;.&lt;br /&gt;
&amp;lt;source lang=&#039;mathematica&#039;&amp;gt;Projection[v1_, v2_] := (v1.v2*v2)/v2.v2&lt;br /&gt;
MultipleProjection[v1_, vecs_] := Plus @@ (Projection[v1, #1] &amp;amp;) /@ vecs&lt;br /&gt;
GramSchmidt[mat_] := Fold[Join[#1, {#2 - MultipleProjection[#2, #1]}] &amp;amp;, {}, mat]&lt;br /&gt;
GramSchmidt[{{-2, 1, 0}, {-2, 0, 1}, {-0.5, -1, 1}}]&amp;lt;/source&amp;gt;&lt;br /&gt;
&lt;br /&gt;
==== Пакет Maxima ====&lt;br /&gt;
Приведем пример скрипта, предназначенного для пакета Maxima, который проводит процесс ортогонализации Грама-Шмидта над векторами, заданными в фигурных скобках последней строки. Количество векторов и их координат могут быть произвольными. В данном случае для примера взяты векторы &amp;lt;math&amp;gt;\{-2,\;1,\;0\}&amp;lt;/math&amp;gt;, &amp;lt;math&amp;gt;\{-2,\;0,\;1\}&amp;lt;/math&amp;gt;, &amp;lt;math&amp;gt;\{-0{.}5,\;-1,\;1\}&amp;lt;/math&amp;gt;.&lt;br /&gt;
&amp;lt;source lang=&#039;maxima&#039;&amp;gt;&lt;br /&gt;
load(eigen);&lt;br /&gt;
x: matrix ([-2,1,0],[-2,0,1],[-0.5,-1,1]);&lt;br /&gt;
y: gramschmidt(x);&lt;br /&gt;
&amp;lt;/source&amp;gt;&lt;br /&gt;
&lt;br /&gt;
==== Пакет MATLAB ====&lt;br /&gt;
Приведем пример скрипта, предназначенного для пакета MATLAB, который проводит процесс ортогонализации Грама-Шмидта над векторами, заданными в фигурных скобках последней строки. В данном пакете уже существует функция, которая осуществляет данный процесс. Столбцы входной матрицы предполагаются линейно-независимыми, количество векторов и их координат могут быть произвольными. Функция возращает матрицу X с ортонормированными столбцами и обратимую верхне-треугольную матрицу Y.&lt;br /&gt;
&lt;br /&gt;
В данном случае для примера взяты векторы &amp;lt;math&amp;gt;\{-2,\;1,\;0\}&amp;lt;/math&amp;gt;, &amp;lt;math&amp;gt;\{-2,\;0,\;1\}&amp;lt;/math&amp;gt;, &amp;lt;math&amp;gt;\{-0{.}5,\;-1,\;1\}&amp;lt;/math&amp;gt;.&lt;br /&gt;
&amp;lt;source lang=&#039;matlab&#039;&amp;gt;&lt;br /&gt;
[x y]=gschmidt([-2 1 0; -2 0 1; -0.5 -1 1])&lt;br /&gt;
&amp;lt;/source&amp;gt;&lt;br /&gt;
&lt;br /&gt;
== Литература ==&lt;/div&gt;</summary>
		<author><name>BDA</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:BDA/%D0%9E%D1%80%D1%82%D0%BE%D0%B3%D0%BE%D0%BD%D0%B0%D0%BB%D0%B8%D0%B7%D0%B0%D1%86%D0%B8%D1%8F_%D0%93%D1%80%D0%B0%D0%BC%D0%B0-%D0%A8%D0%BC%D0%B8%D0%B4%D1%82%D0%B0&amp;diff=14877</id>
		<title>Участник:BDA/Ортогонализация Грама-Шмидта</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:BDA/%D0%9E%D1%80%D1%82%D0%BE%D0%B3%D0%BE%D0%BD%D0%B0%D0%BB%D0%B8%D0%B7%D0%B0%D1%86%D0%B8%D1%8F_%D0%93%D1%80%D0%B0%D0%BC%D0%B0-%D0%A8%D0%BC%D0%B8%D0%B4%D1%82%D0%B0&amp;diff=14877"/>
		<updated>2016-10-30T17:02:06Z</updated>

		<summary type="html">&lt;p&gt;BDA: /* Последовательная сложность алгоритма */&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(nm^2)&amp;lt;/math&amp;gt;&lt;br /&gt;
| pf_height         = &amp;lt;math&amp;gt;?&amp;lt;/math&amp;gt;&lt;br /&gt;
| pf_width          = &amp;lt;math&amp;gt;?&amp;lt;/math&amp;gt;&lt;br /&gt;
| input_data        = &amp;lt;math&amp;gt;nm&amp;lt;/math&amp;gt;&lt;br /&gt;
| output_data       = &amp;lt;math&amp;gt;nm&amp;lt;/math&amp;gt;&lt;br /&gt;
}}&lt;br /&gt;
&lt;br /&gt;
Основные авторы описания: [[Участник:Zodiac|Белов Н. А.]], [[Участник:BDA|Богомолов Д. А.]].&lt;br /&gt;
&lt;br /&gt;
== Свойства и структура алгоритма ==&lt;br /&gt;
=== Общее описание алгоритма ===&lt;br /&gt;
&lt;br /&gt;
Ортогонализация ― алгоритм построения для данной линейно независимой системы векторов евклидова или эрмитова пространства V ортогональной системы ненулевых векторов, порождающих то же самое подпространство в V.&lt;br /&gt;
&lt;br /&gt;
Ортогонализация Грама–Шмидта&amp;lt;ref&amp;gt;Канатников А.Н., Крищенко А.П. &amp;quot;Линейная алгебра.&amp;quot; ― 3-е изд., стер. ― М.: Изд-во МГТУ им. Н.Э. Баумана, 2002&amp;lt;/ref&amp;gt; (процесс Грама–Шмидта) ― наиболее известный алгоритм ортогонализации. Назван в честь Йоргена Педерсена Грама&amp;lt;ref&amp;gt;O&#039;Connor, John J.; Robertson, Edmund F., &amp;quot;Jørgen Pedersen Gram&amp;quot;, MacTutor History of Mathematics archive, University of St Andrews.&amp;lt;/ref&amp;gt; и Эрхарда Шмидта&amp;lt;ref&amp;gt;O&#039;Connor, John J.; Robertson, Edmund F., &amp;quot;Erhard Schmidt&amp;quot;, MacTutor History of Mathematics archive, University of St Andrews.&amp;lt;/ref&amp;gt;, однако ранее уже появлялся в работах Лапласа и Коши. Является частным случаем разложения Ивасавы, так как может быть представлен как разложение невырожденной квадратной матрицы в произведение ортогональной (или унитарной матрицы в случае эрмитова пространства) и верхнетреугольной матрицы с положительными диагональными элементами.&lt;br /&gt;
&lt;br /&gt;
Рассматриваемый алгоритм применяется для борьбы с помехами в адаптивной системе селекции движущихся целей&amp;lt;ref&amp;gt;Орешкин Б.Н., Бакулев П.А. &amp;quot;Быстрая процедура ортогонализации Грамма–Шмидта и ее применение для борьбы с помехами в адаптивной системе селекции движущихся целей&amp;quot; ― Радиотехника / №12 за 2007 г.&amp;lt;/ref&amp;gt;, в протоколах безопасности&amp;lt;ref&amp;gt;Пискова А.В., Менщиков А.А., Коробейников А.Г. &amp;quot;Использование ортогонализации Грама-Шмидта в алгоритме приведения базиса решетки для протоколов безопасности&amp;quot; ― Вопросы кибербезопасности №1(14) 2016&amp;lt;/ref&amp;gt;, для повышения экономичности алгоритмов оценивания параметров моделей объектов управления&amp;lt;ref&amp;gt;Карелин А.Е., Светлаков А.А. &amp;quot;Использование ортогонализации Грама-Шмидта для повышения экономичности многоточечных алгоритмов рекуррентного оценивания параметров моделей объектов управления&amp;quot; ― Известия Томского политехнического университета [Известия ТПУ]. — 2006. — Т. 309, № 8. — [С. 15-19].&amp;lt;/ref&amp;gt; и в других областях.&lt;br /&gt;
&lt;br /&gt;
=== Математическое описание алгоритма ===&lt;br /&gt;
&#039;&#039;&#039;Входные данные.&#039;&#039;&#039; &amp;lt;math&amp;gt;m&amp;lt;/math&amp;gt; линейно независимых векторов &amp;lt;math&amp;gt;\mathbf{a}_1,...,\mathbf{a}_m&amp;lt;/math&amp;gt; c размерностью пространства &amp;lt;math&amp;gt;n&amp;lt;/math&amp;gt;, записанных в матрице &amp;lt;math&amp;gt;A&amp;lt;/math&amp;gt; с элементами &amp;lt;math&amp;gt;\alpha_{ij}&amp;lt;/math&amp;gt;.&lt;br /&gt;
&lt;br /&gt;
&#039;&#039;&#039;Выходные данные.&#039;&#039;&#039; &amp;lt;math&amp;gt;m&amp;lt;/math&amp;gt; ортогональных векторов &amp;lt;math&amp;gt;\mathbf{b}_1,...,\mathbf{b}_m&amp;lt;/math&amp;gt; c размерностью пространства &amp;lt;math&amp;gt;n&amp;lt;/math&amp;gt;, записанных в матрице &amp;lt;math&amp;gt;B&amp;lt;/math&amp;gt; с элементами &amp;lt;math&amp;gt;\beta_{ij}&amp;lt;/math&amp;gt;.&lt;br /&gt;
&lt;br /&gt;
Определим оператор проекции (проецирует вектор &amp;lt;math&amp;gt;\mathbf{a}&amp;lt;/math&amp;gt; коллинеарно вектору &amp;lt;math&amp;gt;\mathbf{b}&amp;lt;/math&amp;gt;) &amp;lt;math&amp;gt;\mathbf{proj_b a = \frac{\left \langle a,b \right \rangle}{\left \langle b,b \right \rangle }b}&amp;lt;/math&amp;gt;, где &amp;lt;math&amp;gt;\mathbf{\left \langle a,b \right \rangle}&amp;lt;/math&amp;gt; ― скалярное произведение векторов &amp;lt;math&amp;gt;\mathbf{a}&amp;lt;/math&amp;gt; и &amp;lt;math&amp;gt;\mathbf{b}&amp;lt;/math&amp;gt;.&lt;br /&gt;
&lt;br /&gt;
Тогда ортогональные векторы вычисляются следующим образом:&lt;br /&gt;
&lt;br /&gt;
&amp;lt;math&amp;gt;\mathbf{b}_1 = \mathbf{a}_1&amp;lt;/math&amp;gt;&lt;br /&gt;
&lt;br /&gt;
&amp;lt;math&amp;gt;\mathbf{b}_2 = \mathbf{a}_2 - \mathbf{proj}_{\mathbf{b}_1} \mathbf{a}_2 &amp;lt;/math&amp;gt;&lt;br /&gt;
&lt;br /&gt;
&amp;lt;math&amp;gt;\mathbf{b}_3 = \mathbf{a}_3 - \mathbf{proj}_{\mathbf{b}_1} \mathbf{a}_3 - \mathbf{proj}_{\mathbf{b}_2} \mathbf{a}_3 &amp;lt;/math&amp;gt;&lt;br /&gt;
&lt;br /&gt;
&amp;lt;math&amp;gt;\vdots&amp;lt;/math&amp;gt;&lt;br /&gt;
&lt;br /&gt;
&amp;lt;math&amp;gt;\mathbf{b}_m = \mathbf{a}_m - \sum_{j=1}^{m-1} \mathbf{proj}_{\mathbf{b}_j} \mathbf{a}_m&amp;lt;/math&amp;gt;&lt;br /&gt;
&lt;br /&gt;
Или поэлементно:&lt;br /&gt;
&lt;br /&gt;
&amp;lt;math&amp;gt;\beta_{1j} = \alpha_{1j}&amp;lt;/math&amp;gt;&lt;br /&gt;
&lt;br /&gt;
&amp;lt;math&amp;gt;\beta_{ij} = \alpha_{ij} - (\sum_{k=1}^{i-1} \mathbf{proj}_{\mathbf{b}_k} \mathbf{a}_i)_j = \alpha_{ij} - \sum_{k=1}^{i-1}\frac{\sum_{s=1}^{n}\alpha_{is}\beta_{ks}}{\sum_{s=1}^{n}\beta_{ks}\beta_{ks}}\beta_{kj} &amp;lt;/math&amp;gt;&lt;br /&gt;
&lt;br /&gt;
=== Вычислительное ядро алгоритма ===&lt;br /&gt;
Основное время работы алгоритма приходится на вычисление сумм &amp;lt;math&amp;gt;\sum_{i=1}^{j-1} \mathbf{proj}_{\mathbf{b}_i} \mathbf{a}_k \forall j: j=\overline{1, m}&amp;lt;/math&amp;gt;.&lt;br /&gt;
&lt;br /&gt;
=== Макроструктура алгоритма ===&lt;br /&gt;
Из описания алгоритма в предыдущих разделов следует, что основную часть данного метода составляют операции вычисления проекций векторов, а также их сумм.&lt;br /&gt;
&lt;br /&gt;
=== Схема реализации последовательного алгоритма ===&lt;br /&gt;
Рассмотрим алгоритм, написанный в виде функции для математической системы MATLAB.&lt;br /&gt;
&lt;br /&gt;
&#039;&#039;&#039;Входные данные.&#039;&#039;&#039;&lt;br /&gt;
&lt;br /&gt;
Матрица &amp;lt;math&amp;gt;A&amp;lt;/math&amp;gt; с линейно-независимыми векторами в столбцах.&lt;br /&gt;
&lt;br /&gt;
&#039;&#039;&#039;Выходные данные.&#039;&#039;&#039;&lt;br /&gt;
&lt;br /&gt;
Матрица &amp;lt;math&amp;gt;Q&amp;lt;/math&amp;gt; с ортонормированным базисом &amp;lt;math&amp;gt;A&amp;lt;/math&amp;gt;.&lt;br /&gt;
&lt;br /&gt;
&#039;&#039;&#039;Использование.&#039;&#039;&#039;&lt;br /&gt;
&amp;lt;source lang=&amp;quot;matlab&amp;quot;&amp;gt;&lt;br /&gt;
Q = gramschmidt( A );&lt;br /&gt;
&amp;lt;/source&amp;gt;&lt;br /&gt;
&lt;br /&gt;
&#039;&#039;&#039;Реализация.&#039;&#039;&#039;&lt;br /&gt;
&amp;lt;source lang=&amp;quot;matlab&amp;quot;&amp;gt;&lt;br /&gt;
function Q = gramschmidt( A )&lt;br /&gt;
% Число векторов.&lt;br /&gt;
n = size( A, 2 );&lt;br /&gt;
 &lt;br /&gt;
% Инициализируем выходную матрицу.&lt;br /&gt;
Q = zeros( n );&lt;br /&gt;
 &lt;br /&gt;
% Преобразуем каждый вектор в базисный:&lt;br /&gt;
% (1) j-ый базисный вектор будет ортогонален каждому из предыдущих 1..j-1 векторов;&lt;br /&gt;
% (2) будет единичной длины.&lt;br /&gt;
for j = 1 : n&lt;br /&gt;
    % Выбираем j-ый вектор&lt;br /&gt;
    u = A( :, j );&lt;br /&gt;
    &lt;br /&gt;
    % Специальный случай для j = 1: просто нормируем этот вектор и помещаем&lt;br /&gt;
    % первым в найденный базис, так как нет векторов, относительно которых&lt;br /&gt;
    % нужно было бы делать его ортогональным.&lt;br /&gt;
&lt;br /&gt;
    % Удаляем из оригинального вектора &amp;quot;u&amp;quot; все компоненты натянутые на базис&lt;br /&gt;
    % из векторов 1..j-1, их вклад будет удален.&lt;br /&gt;
    % =&amp;gt; j-ый вектор ортогонален остальным.&lt;br /&gt;
    % Предыдущие базисные вектора были найдены на предыдуших шагах.&lt;br /&gt;
    % =&amp;gt; соблюдаем принцип ортогональности, но не ортонормированности.&lt;br /&gt;
    for i = 1 : j - 1&lt;br /&gt;
        u = u - proj( Q(:,i), A(:,j) );&lt;br /&gt;
    end&lt;br /&gt;
     &lt;br /&gt;
    % Нормируем вектор&lt;br /&gt;
    Q(:,j) = u ./ norm( u );&lt;br /&gt;
end&lt;br /&gt;
end&lt;br /&gt;
 &lt;br /&gt;
% Проекция вектора &amp;quot;a&amp;quot; коллинеарно вектору &amp;quot;e&amp;quot;.&lt;br /&gt;
function p = proj( e, a )&lt;br /&gt;
p = (e&#039; * a) / (e&#039; * e) .* e;&lt;br /&gt;
end&lt;br /&gt;
&amp;lt;/source&amp;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;.&lt;br /&gt;
&lt;br /&gt;
# Скалярное произведение векторов требует &amp;lt;math&amp;gt;n-1&amp;lt;/math&amp;gt; сложение и &amp;lt;math&amp;gt;n&amp;lt;/math&amp;gt; произведений.&lt;br /&gt;
# Вычитание проекции вектора требует &amp;lt;math&amp;gt;2&amp;lt;/math&amp;gt; скалярных произведения, &amp;lt;math&amp;gt;1&amp;lt;/math&amp;gt; деление, &amp;lt;math&amp;gt;n&amp;lt;/math&amp;gt; произведений и &amp;lt;math&amp;gt;n&amp;lt;/math&amp;gt; сложений, то есть:&lt;br /&gt;
## &amp;lt;math&amp;gt;3n-2&amp;lt;/math&amp;gt; (&amp;lt;math&amp;gt;+&amp;lt;/math&amp;gt;);&lt;br /&gt;
## &amp;lt;math&amp;gt;3n&amp;lt;/math&amp;gt; (&amp;lt;math&amp;gt;\times&amp;lt;/math&amp;gt;);&lt;br /&gt;
## &amp;lt;math&amp;gt;1&amp;lt;/math&amp;gt; (&amp;lt;math&amp;gt;\div&amp;lt;/math&amp;gt;).&lt;br /&gt;
# Вычисление &amp;lt;math&amp;gt;i&amp;lt;/math&amp;gt;-го вектора требует &amp;lt;math&amp;gt;i-1&amp;lt;/math&amp;gt; вычитаний проекций, то есть:&lt;br /&gt;
## &amp;lt;math&amp;gt;(3n-2)(i-1)&amp;lt;/math&amp;gt; (&amp;lt;math&amp;gt;+&amp;lt;/math&amp;gt;);&lt;br /&gt;
## &amp;lt;math&amp;gt;3n(i-1)&amp;lt;/math&amp;gt; (&amp;lt;math&amp;gt;\times&amp;lt;/math&amp;gt;);&lt;br /&gt;
## &amp;lt;math&amp;gt;i-1&amp;lt;/math&amp;gt; (&amp;lt;math&amp;gt;\div&amp;lt;/math&amp;gt;).&lt;br /&gt;
# Мы вычисляем вектора от &amp;lt;math&amp;gt;i=1&amp;lt;/math&amp;gt; до &amp;lt;math&amp;gt;m&amp;lt;/math&amp;gt;, поэтому множители &amp;lt;math&amp;gt;(i-1)&amp;lt;/math&amp;gt; выражаются &#039;&#039;треугольным числом&#039;&#039; &amp;lt;math&amp;gt;(m-1)\frac{m}{2}&amp;lt;/math&amp;gt;.&lt;br /&gt;
## &amp;lt;math&amp;gt;(3n-2)(m-1)\frac{m}{2}&amp;lt;/math&amp;gt; (&amp;lt;math&amp;gt;+&amp;lt;/math&amp;gt;);&lt;br /&gt;
## &amp;lt;math&amp;gt;3n(m-1)\frac{m}{2}&amp;lt;/math&amp;gt; (&amp;lt;math&amp;gt;\times&amp;lt;/math&amp;gt;);&lt;br /&gt;
## &amp;lt;math&amp;gt;(m-1)\frac{m}{2}&amp;lt;/math&amp;gt; (&amp;lt;math&amp;gt;\div&amp;lt;/math&amp;gt;).&lt;br /&gt;
&lt;br /&gt;
Таким образом, cложность алгоритма &amp;lt;math&amp;gt;O(nm^2)&amp;lt;/math&amp;gt;.&lt;br /&gt;
&lt;br /&gt;
=== Информационный граф ===&lt;br /&gt;
Граф состоит из элементов 2 видов: прямоугольников и овалов. Прямоугольниками обозначаются данные, причем красному цвету соответствуют входные данные, а зеленому ― выходные. Овалы означают операции над переданными данными. Голубым цветом обозначены более сложно организованные операции, а синим ― менее. Для нахождения &amp;lt;math&amp;gt;\mathbf{b}_i&amp;lt;/math&amp;gt; вектора требуются значения всех векторов с номерами, меньшими &amp;lt;math&amp;gt;i&amp;lt;/math&amp;gt;, однако, расчеты проекций можно начинать, не дожидаясь вычисления всех векторов, а производить сразу, как только соответствующий ортогональный вектор будет рассчитан. Эта зависимость и отражена на графе ниже.&lt;br /&gt;
[[Файл:Gram_schmidt_graph.png|thumb|800px|center|frame|Информационный граф алгоритма Грама-Шмидта]]&lt;br /&gt;
&lt;br /&gt;
=== Ресурс параллелизма алгоритма ===&lt;br /&gt;
*&lt;br /&gt;
=== Входные и выходные данные алгоритма ===&lt;br /&gt;
&#039;&#039;&#039;Входные данные.&#039;&#039;&#039; Матрица &amp;lt;math&amp;gt;A&amp;lt;/math&amp;gt; с элементами &amp;lt;math&amp;gt;\alpha_{ij}&amp;lt;/math&amp;gt;, где &amp;lt;math&amp;gt;i = \overline{1, m}&amp;lt;/math&amp;gt; (количество линейно независимых векторов) и &amp;lt;math&amp;gt;j = \overline{1, n}&amp;lt;/math&amp;gt; (размерность пространства), при этом &amp;lt;math&amp;gt;m \leqslant n&amp;lt;/math&amp;gt;.&lt;br /&gt;
&lt;br /&gt;
&#039;&#039;&#039;Объем входных данных.&#039;&#039;&#039; &amp;lt;math&amp;gt;mn&amp;lt;/math&amp;gt;&lt;br /&gt;
&lt;br /&gt;
&#039;&#039;&#039;Выходные данные.&#039;&#039;&#039; Матрица &amp;lt;math&amp;gt;B&amp;lt;/math&amp;gt; с элементами &amp;lt;math&amp;gt;\beta_{ij}&amp;lt;/math&amp;gt;, где &amp;lt;math&amp;gt;i = \overline{1, m}&amp;lt;/math&amp;gt; и &amp;lt;math&amp;gt;j = \overline{1, n}&amp;lt;/math&amp;gt;, тогда &amp;lt;math&amp;gt;b_{1}, \dots, b_{m}&amp;lt;/math&amp;gt; — система ортогональных векторов.&lt;br /&gt;
&lt;br /&gt;
&#039;&#039;&#039;Объем выходных данных.&#039;&#039;&#039; &amp;lt;math&amp;gt;mn&amp;lt;/math&amp;gt;&lt;br /&gt;
&lt;br /&gt;
=== Свойства алгоритма ===&lt;br /&gt;
&amp;lt;ol&amp;gt;&lt;br /&gt;
&amp;lt;li&amp;gt;Отношение последовательной и параллельной сложности в предположении доступности неограниченного числа необходимых ресурсов — ?. При этом необходимо отметить, что отношение числа операций к суммарному объему входных и выходных данных (вычислительная мощность алгоритма) — линейное.&amp;lt;/li&amp;gt;&lt;br /&gt;
&lt;br /&gt;
&amp;lt;li&amp;gt;Алгоритм почти полностью детерминирован, то есть гарантирована единственность результата выполнения. Это означает, что возможно накопление ошибок округления, то есть векторы выходной матрицы часто не точно ортогональны. Из-за потери ортогональности в процессе вычислений классический процесс Грама-Шмидта называют численно неустойчивым. Однако, процесс Грама-Шмидта может быть сделан более вычислительно устойчивым путём небольшой модификации. Такой алгоритм называется модифицированным процессом Грама-Шмидта. Рассмотрим его отличие подробнее.&lt;br /&gt;
&amp;lt;br /&amp;gt;&lt;br /&gt;
&amp;lt;math&amp;gt; &lt;br /&gt;
\begin{array}{l}&lt;br /&gt;
\mathbf{b}_j\\&lt;br /&gt;
  \\&lt;br /&gt;
\mathbf{b}_j&lt;br /&gt;
\end{array}&lt;br /&gt;
&lt;br /&gt;
\begin{array}{c}&lt;br /&gt;
= \\&lt;br /&gt;
  \\&lt;br /&gt;
=&lt;br /&gt;
\end{array}&lt;br /&gt;
&lt;br /&gt;
\underbrace{&lt;br /&gt;
\underbrace{&lt;br /&gt;
\underbrace{&lt;br /&gt;
&lt;br /&gt;
\begin{array}{c}&lt;br /&gt;
\mathbf{a}_j \\&lt;br /&gt;
   \\&lt;br /&gt;
\mathbf{a}_j&lt;br /&gt;
\end{array}&lt;br /&gt;
&lt;br /&gt;
\begin{array}{c}&lt;br /&gt;
- \\&lt;br /&gt;
  \\&lt;br /&gt;
-&lt;br /&gt;
\end{array}&lt;br /&gt;
&lt;br /&gt;
\begin{array}{c}&lt;br /&gt;
\mathbf{proj}_{\mathbf{b}_1}\,\mathbf{a}_j \\&lt;br /&gt;
   ||                                      \\&lt;br /&gt;
\mathbf{proj}_{\mathbf{b}_1}\,\mathbf{a}_j&lt;br /&gt;
\end{array}&lt;br /&gt;
&lt;br /&gt;
}_{\mathbf{a}_j^{(1)}}&lt;br /&gt;
&lt;br /&gt;
\begin{array}{c}&lt;br /&gt;
- \\&lt;br /&gt;
  \\&lt;br /&gt;
-&lt;br /&gt;
\end{array}&lt;br /&gt;
&lt;br /&gt;
\begin{array}{c}&lt;br /&gt;
\mathbf{proj}_{\mathbf{b}_2}\,\mathbf{a}_j       \\&lt;br /&gt;
   ||                                            \\&lt;br /&gt;
\mathbf{proj}_{\mathbf{b}_2}\,\mathbf{a}_j^{(1)}&lt;br /&gt;
\end{array}&lt;br /&gt;
&lt;br /&gt;
}_{\mathbf{a}_j^{(2)}}&lt;br /&gt;
&lt;br /&gt;
\begin{array}{c}&lt;br /&gt;
- \\&lt;br /&gt;
  \\&lt;br /&gt;
-&lt;br /&gt;
\end{array}&lt;br /&gt;
&lt;br /&gt;
\begin{array}{c}&lt;br /&gt;
\mathbf{proj}_{\mathbf{b}_3}\,\mathbf{a}_j       \\&lt;br /&gt;
   ||                                            \\&lt;br /&gt;
\mathbf{proj}_{\mathbf{b}_3}\,\mathbf{a}_j^{(2)}&lt;br /&gt;
\end{array}&lt;br /&gt;
&lt;br /&gt;
}_{\mathbf{a}_j^{(3)}}&lt;br /&gt;
&lt;br /&gt;
\begin{array}{ccc}&lt;br /&gt;
- &amp;amp; \ldots &amp;amp; - \\&lt;br /&gt;
               \\&lt;br /&gt;
- &amp;amp; \ldots &amp;amp; - &lt;br /&gt;
\end{array}&lt;br /&gt;
&lt;br /&gt;
\begin{array}{cc}&lt;br /&gt;
\mathbf{proj}_{\mathbf{b}_{j-1}}\,\mathbf{a}_j         &amp;amp; (1) \\&lt;br /&gt;
   ||                                                  &amp;amp;      \\&lt;br /&gt;
\mathbf{proj}_{\mathbf{b}_{j-1}}\,\mathbf{a}_j^{(j-2)} &amp;amp; (2)&lt;br /&gt;
\end{array}&lt;br /&gt;
&lt;br /&gt;
&amp;lt;/math&amp;gt;&lt;br /&gt;
&amp;lt;br /&amp;gt;&lt;br /&gt;
Формула (1) показывает вычисление &amp;lt;math&amp;gt;\mathbf{b}_j&amp;lt;/math&amp;gt; в классическом процессе, а формула (2) — в модифицированном.&lt;br /&gt;
&amp;lt;br /&amp;gt;&lt;br /&gt;
Разница между ними заключается в том, от каких векторов вычисляются компоненты: от &amp;lt;math&amp;gt;\mathbf{a}_j&amp;lt;/math&amp;gt; в классическом процессе или от результата предыдущего вычитания, то есть от &amp;lt;math&amp;gt;\mathbf{a}_j^{(k)}&amp;lt;/math&amp;gt; в модифицированном процессе. Таким образом, &amp;lt;math&amp;gt;\mathbf{a}_j^{(k)}&amp;lt;/math&amp;gt; представляет собой &amp;lt;math&amp;gt;\mathbf{a}_j&amp;lt;/math&amp;gt;, из которого удалены компоненты в направлениях &amp;lt;math&amp;gt;\mathbf{b}_1,\,\;\ldots,\;\mathbf{b}_{k}&amp;lt;/math&amp;gt;. Компонента вектора &amp;lt;math&amp;gt;\mathbf{a}_j&amp;lt;/math&amp;gt; в направлении &amp;lt;math&amp;gt;\mathbf{b}_{k+1}&amp;lt;/math&amp;gt; при этом удалении не затрагивается и поэтому она в &amp;lt;math&amp;gt;\mathbf{a}_j^{(k)}&amp;lt;/math&amp;gt; такая же, как в &amp;lt;math&amp;gt;\mathbf{a}_j&amp;lt;/math&amp;gt;.&amp;lt;/li&amp;gt;&lt;br /&gt;
&lt;br /&gt;
&amp;lt;li&amp;gt;Процесс Грама-Шмидта может применяться к бесконечной последовательности линейно независимых векторов, а также к линейно зависимым векторам. В этом случае он выдаёт &amp;lt;math&amp;gt;\mathbf{0}&amp;lt;/math&amp;gt; (нулевой вектор) на шаге &amp;lt;math&amp;gt;j&amp;lt;/math&amp;gt;, если &amp;lt;math&amp;gt;\mathbf{a}_j&amp;lt;/math&amp;gt; является линейной комбинацией векторов &amp;lt;math&amp;gt;\mathbf{a}_1,\;\ldots,\;\mathbf{a}_{j-1}&amp;lt;/math&amp;gt;. Если это может случиться, то для сохранения ортогональности выходных векторов и для предотвращения деления на ноль при ортонормировании алгоритм должен делать проверку на нулевые векторы и отбрасывать их. Количество векторов, выдаваемых алгоритмом, будет равно размерности подпространства, порождённого векторами (то есть количеству линейно независимых векторов, которые можно выделить среди исходных векторов).&amp;lt;/li&amp;gt;&lt;br /&gt;
&lt;br /&gt;
&amp;lt;li&amp;gt;Процесс Грама-Шмидта может быть истолкован как разложение невырожденной квадратной матрицы в произведение ортогональной (или унитарной матрицы в случае эрмитова пространства) и верхнетреугольной матрицы с положительными диагональными элементами — QR-разложение.&amp;lt;/li&amp;gt;&lt;br /&gt;
&amp;lt;/ol&amp;gt;&lt;br /&gt;
&lt;br /&gt;
== Программная реализация алгоритма ==&lt;br /&gt;
=== Особенности реализации последовательного алгоритма ===&lt;br /&gt;
=== Локальность данных и вычислений ===&lt;br /&gt;
=== Возможные способы и особенности параллельной реализации алгоритма ===&lt;br /&gt;
=== Масштабируемость алгоритма и его реализации ===&lt;br /&gt;
&#039;&#039;Срок сдачи продлен до 15 ноября.&#039;&#039;&lt;br /&gt;
=== Динамические характеристики и эффективность реализации алгоритма ===&lt;br /&gt;
=== Выводы для классов архитектур ===&lt;br /&gt;
=== Существующие реализации алгоритма ===&lt;br /&gt;
Данный алгоритм реализован во множестве библиотек и математических программных пакетах.&lt;br /&gt;
&lt;br /&gt;
# Библиотека [https://github.com/open-epicycle/Epicycle.Math-cs Epicycle] (C#).&lt;br /&gt;
# Библиотека [http://www.spectralpython.net/ Spectral Python (SPy)].&lt;br /&gt;
# Библиотека [https://hackage.haskell.org/package/vect-0.4.7/docs/Data-Vect-Float-GramSchmidt.html vect] (Haskell).&lt;br /&gt;
&lt;br /&gt;
==== Пакет Mathematica ====&lt;br /&gt;
Приведем пример скрипта, предназначенного для пакета Mathematica, который проводит процесс ортогонализации Грама-Шмидта над векторами, заданными в фигурных скобках последней строки. Количество векторов и их координат могут быть произвольными. В данном случае для примера взяты векторы &amp;lt;math&amp;gt;\{-2,\;1,\;0\}&amp;lt;/math&amp;gt;, &amp;lt;math&amp;gt;\{-2,\;0,\;1\}&amp;lt;/math&amp;gt;, &amp;lt;math&amp;gt;\{-0{.}5,\;-1,\;1\}&amp;lt;/math&amp;gt;.&lt;br /&gt;
&amp;lt;source lang=&#039;mathematica&#039;&amp;gt;Projection[v1_, v2_] := (v1.v2*v2)/v2.v2&lt;br /&gt;
MultipleProjection[v1_, vecs_] := Plus @@ (Projection[v1, #1] &amp;amp;) /@ vecs&lt;br /&gt;
GramSchmidt[mat_] := Fold[Join[#1, {#2 - MultipleProjection[#2, #1]}] &amp;amp;, {}, mat]&lt;br /&gt;
GramSchmidt[{{-2, 1, 0}, {-2, 0, 1}, {-0.5, -1, 1}}]&amp;lt;/source&amp;gt;&lt;br /&gt;
&lt;br /&gt;
==== Пакет Maxima ====&lt;br /&gt;
Приведем пример скрипта, предназначенного для пакета Maxima, который проводит процесс ортогонализации Грама-Шмидта над векторами, заданными в фигурных скобках последней строки. Количество векторов и их координат могут быть произвольными. В данном случае для примера взяты векторы &amp;lt;math&amp;gt;\{-2,\;1,\;0\}&amp;lt;/math&amp;gt;, &amp;lt;math&amp;gt;\{-2,\;0,\;1\}&amp;lt;/math&amp;gt;, &amp;lt;math&amp;gt;\{-0{.}5,\;-1,\;1\}&amp;lt;/math&amp;gt;.&lt;br /&gt;
&amp;lt;source lang=&#039;maxima&#039;&amp;gt;&lt;br /&gt;
load(eigen);&lt;br /&gt;
x: matrix ([-2,1,0],[-2,0,1],[-0.5,-1,1]);&lt;br /&gt;
y: gramschmidt(x);&lt;br /&gt;
&amp;lt;/source&amp;gt;&lt;br /&gt;
&lt;br /&gt;
==== Пакет MATLAB ====&lt;br /&gt;
Приведем пример скрипта, предназначенного для пакета MATLAB, который проводит процесс ортогонализации Грама-Шмидта над векторами, заданными в фигурных скобках последней строки. В данном пакете уже существует функция, которая осуществляет данный процесс. Столбцы входной матрицы предполагаются линейно-независимыми, количество векторов и их координат могут быть произвольными. Функция возращает матрицу X с ортонормированными столбцами и обратимую верхне-треугольную матрицу Y.&lt;br /&gt;
&lt;br /&gt;
В данном случае для примера взяты векторы &amp;lt;math&amp;gt;\{-2,\;1,\;0\}&amp;lt;/math&amp;gt;, &amp;lt;math&amp;gt;\{-2,\;0,\;1\}&amp;lt;/math&amp;gt;, &amp;lt;math&amp;gt;\{-0{.}5,\;-1,\;1\}&amp;lt;/math&amp;gt;.&lt;br /&gt;
&amp;lt;source lang=&#039;matlab&#039;&amp;gt;&lt;br /&gt;
[x y]=gschmidt([-2 1 0; -2 0 1; -0.5 -1 1])&lt;br /&gt;
&amp;lt;/source&amp;gt;&lt;br /&gt;
&lt;br /&gt;
== Литература ==&lt;/div&gt;</summary>
		<author><name>BDA</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:BDA/%D0%9E%D1%80%D1%82%D0%BE%D0%B3%D0%BE%D0%BD%D0%B0%D0%BB%D0%B8%D0%B7%D0%B0%D1%86%D0%B8%D1%8F_%D0%93%D1%80%D0%B0%D0%BC%D0%B0-%D0%A8%D0%BC%D0%B8%D0%B4%D1%82%D0%B0&amp;diff=14861</id>
		<title>Участник:BDA/Ортогонализация Грама-Шмидта</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:BDA/%D0%9E%D1%80%D1%82%D0%BE%D0%B3%D0%BE%D0%BD%D0%B0%D0%BB%D0%B8%D0%B7%D0%B0%D1%86%D0%B8%D1%8F_%D0%93%D1%80%D0%B0%D0%BC%D0%B0-%D0%A8%D0%BC%D0%B8%D0%B4%D1%82%D0%B0&amp;diff=14861"/>
		<updated>2016-10-30T16:44:39Z</updated>

		<summary type="html">&lt;p&gt;BDA: /* Информационный граф */&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(nm^2)&amp;lt;/math&amp;gt;&lt;br /&gt;
| pf_height         = &amp;lt;math&amp;gt;?&amp;lt;/math&amp;gt;&lt;br /&gt;
| pf_width          = &amp;lt;math&amp;gt;?&amp;lt;/math&amp;gt;&lt;br /&gt;
| input_data        = &amp;lt;math&amp;gt;nm&amp;lt;/math&amp;gt;&lt;br /&gt;
| output_data       = &amp;lt;math&amp;gt;nm&amp;lt;/math&amp;gt;&lt;br /&gt;
}}&lt;br /&gt;
&lt;br /&gt;
Основные авторы описания: [[Участник:Zodiac|Белов Н. А.]], [[Участник:BDA|Богомолов Д. А.]].&lt;br /&gt;
&lt;br /&gt;
== Свойства и структура алгоритма ==&lt;br /&gt;
=== Общее описание алгоритма ===&lt;br /&gt;
&lt;br /&gt;
Ортогонализация ― алгоритм построения для данной линейно независимой системы векторов евклидова или эрмитова пространства V ортогональной системы ненулевых векторов, порождающих то же самое подпространство в V.&lt;br /&gt;
&lt;br /&gt;
Ортогонализация Грама–Шмидта&amp;lt;ref&amp;gt;Канатников А.Н., Крищенко А.П. &amp;quot;Линейная алгебра.&amp;quot; ― 3-е изд., стер. ― М.: Изд-во МГТУ им. Н.Э. Баумана, 2002&amp;lt;/ref&amp;gt; (процесс Грама–Шмидта) ― наиболее известный алгоритм ортогонализации. Назван в честь Йоргена Педерсена Грама&amp;lt;ref&amp;gt;O&#039;Connor, John J.; Robertson, Edmund F., &amp;quot;Jørgen Pedersen Gram&amp;quot;, MacTutor History of Mathematics archive, University of St Andrews.&amp;lt;/ref&amp;gt; и Эрхарда Шмидта&amp;lt;ref&amp;gt;O&#039;Connor, John J.; Robertson, Edmund F., &amp;quot;Erhard Schmidt&amp;quot;, MacTutor History of Mathematics archive, University of St Andrews.&amp;lt;/ref&amp;gt;, однако ранее уже появлялся в работах Лапласа и Коши. Является частным случаем разложения Ивасавы, так как может быть представлен как разложение невырожденной квадратной матрицы в произведение ортогональной (или унитарной матрицы в случае эрмитова пространства) и верхнетреугольной матрицы с положительными диагональными элементами.&lt;br /&gt;
&lt;br /&gt;
Рассматриваемый алгоритм применяется для борьбы с помехами в адаптивной системе селекции движущихся целей&amp;lt;ref&amp;gt;Орешкин Б.Н., Бакулев П.А. &amp;quot;Быстрая процедура ортогонализации Грамма–Шмидта и ее применение для борьбы с помехами в адаптивной системе селекции движущихся целей&amp;quot; ― Радиотехника / №12 за 2007 г.&amp;lt;/ref&amp;gt;, в протоколах безопасности&amp;lt;ref&amp;gt;Пискова А.В., Менщиков А.А., Коробейников А.Г. &amp;quot;Использование ортогонализации Грама-Шмидта в алгоритме приведения базиса решетки для протоколов безопасности&amp;quot; ― Вопросы кибербезопасности №1(14) 2016&amp;lt;/ref&amp;gt;, для повышения экономичности алгоритмов оценивания параметров моделей объектов управления&amp;lt;ref&amp;gt;Карелин А.Е., Светлаков А.А. &amp;quot;Использование ортогонализации Грама-Шмидта для повышения экономичности многоточечных алгоритмов рекуррентного оценивания параметров моделей объектов управления&amp;quot; ― Известия Томского политехнического университета [Известия ТПУ]. — 2006. — Т. 309, № 8. — [С. 15-19].&amp;lt;/ref&amp;gt; и в других областях.&lt;br /&gt;
&lt;br /&gt;
=== Математическое описание алгоритма ===&lt;br /&gt;
&#039;&#039;&#039;Входные данные.&#039;&#039;&#039; &amp;lt;math&amp;gt;m&amp;lt;/math&amp;gt; линейно независимых векторов &amp;lt;math&amp;gt;\mathbf{a}_1,...,\mathbf{a}_m&amp;lt;/math&amp;gt; c размерностью пространства &amp;lt;math&amp;gt;n&amp;lt;/math&amp;gt;, записанных в матрице &amp;lt;math&amp;gt;A&amp;lt;/math&amp;gt; с элементами &amp;lt;math&amp;gt;\alpha_{ij}&amp;lt;/math&amp;gt;.&lt;br /&gt;
&lt;br /&gt;
&#039;&#039;&#039;Выходные данные.&#039;&#039;&#039; &amp;lt;math&amp;gt;m&amp;lt;/math&amp;gt; ортогональных векторов &amp;lt;math&amp;gt;\mathbf{b}_1,...,\mathbf{b}_m&amp;lt;/math&amp;gt; c размерностью пространства &amp;lt;math&amp;gt;n&amp;lt;/math&amp;gt;, записанных в матрице &amp;lt;math&amp;gt;B&amp;lt;/math&amp;gt; с элементами &amp;lt;math&amp;gt;\beta_{ij}&amp;lt;/math&amp;gt;.&lt;br /&gt;
&lt;br /&gt;
Определим оператор проекции (проецирует вектор &amp;lt;math&amp;gt;\mathbf{a}&amp;lt;/math&amp;gt; коллинеарно вектору &amp;lt;math&amp;gt;\mathbf{b}&amp;lt;/math&amp;gt;) &amp;lt;math&amp;gt;\mathbf{proj_b a = \frac{\left \langle a,b \right \rangle}{\left \langle b,b \right \rangle }b}&amp;lt;/math&amp;gt;, где &amp;lt;math&amp;gt;\mathbf{\left \langle a,b \right \rangle}&amp;lt;/math&amp;gt; ― скалярное произведение векторов &amp;lt;math&amp;gt;\mathbf{a}&amp;lt;/math&amp;gt; и &amp;lt;math&amp;gt;\mathbf{b}&amp;lt;/math&amp;gt;.&lt;br /&gt;
&lt;br /&gt;
Тогда ортогональные векторы вычисляются следующим образом:&lt;br /&gt;
&lt;br /&gt;
&amp;lt;math&amp;gt;\mathbf{b}_1 = \mathbf{a}_1&amp;lt;/math&amp;gt;&lt;br /&gt;
&lt;br /&gt;
&amp;lt;math&amp;gt;\mathbf{b}_2 = \mathbf{a}_2 - \mathbf{proj}_{\mathbf{b}_1} \mathbf{a}_2 &amp;lt;/math&amp;gt;&lt;br /&gt;
&lt;br /&gt;
&amp;lt;math&amp;gt;\mathbf{b}_3 = \mathbf{a}_3 - \mathbf{proj}_{\mathbf{b}_1} \mathbf{a}_3 - \mathbf{proj}_{\mathbf{b}_2} \mathbf{a}_3 &amp;lt;/math&amp;gt;&lt;br /&gt;
&lt;br /&gt;
&amp;lt;math&amp;gt;\vdots&amp;lt;/math&amp;gt;&lt;br /&gt;
&lt;br /&gt;
&amp;lt;math&amp;gt;\mathbf{b}_m = \mathbf{a}_m - \sum_{j=1}^{m-1} \mathbf{proj}_{\mathbf{b}_j} \mathbf{a}_m&amp;lt;/math&amp;gt;&lt;br /&gt;
&lt;br /&gt;
Или поэлементно:&lt;br /&gt;
&lt;br /&gt;
&amp;lt;math&amp;gt;\beta_{1j} = \alpha_{1j}&amp;lt;/math&amp;gt;&lt;br /&gt;
&lt;br /&gt;
&amp;lt;math&amp;gt;\beta_{ij} = \alpha_{ij} - (\sum_{k=1}^{i-1} \mathbf{proj}_{\mathbf{b}_k} \mathbf{a}_i)_j = \alpha_{ij} - \sum_{k=1}^{i-1}\frac{\sum_{s=1}^{n}\alpha_{is}\beta_{ks}}{\sum_{s=1}^{n}\beta_{ks}\beta_{ks}}\beta_{kj} &amp;lt;/math&amp;gt;&lt;br /&gt;
&lt;br /&gt;
=== Вычислительное ядро алгоритма ===&lt;br /&gt;
Основное время работы алгоритма приходится на вычисление сумм &amp;lt;math&amp;gt;\sum_{i=1}^{j-1} \mathbf{proj}_{\mathbf{b}_i} \mathbf{a}_k \forall j: j=\overline{1, m}&amp;lt;/math&amp;gt;.&lt;br /&gt;
&lt;br /&gt;
=== Макроструктура алгоритма ===&lt;br /&gt;
Из описания алгоритма в предыдущих разделов следует, что основную часть данного метода составляют операции вычисления проекций векторов, а также их сумм.&lt;br /&gt;
&lt;br /&gt;
=== Схема реализации последовательного алгоритма ===&lt;br /&gt;
Рассмотрим алгоритм, написанный в виде функции для математической системы MATLAB.&lt;br /&gt;
&lt;br /&gt;
&#039;&#039;&#039;Входные данные.&#039;&#039;&#039;&lt;br /&gt;
&lt;br /&gt;
Матрица &amp;lt;math&amp;gt;A&amp;lt;/math&amp;gt; с линейно-независимыми векторами в столбцах.&lt;br /&gt;
&lt;br /&gt;
&#039;&#039;&#039;Выходные данные.&#039;&#039;&#039;&lt;br /&gt;
&lt;br /&gt;
Матрица &amp;lt;math&amp;gt;Q&amp;lt;/math&amp;gt; с ортонормированным базисом &amp;lt;math&amp;gt;A&amp;lt;/math&amp;gt;.&lt;br /&gt;
&lt;br /&gt;
&#039;&#039;&#039;Использование.&#039;&#039;&#039;&lt;br /&gt;
&amp;lt;source lang=&amp;quot;matlab&amp;quot;&amp;gt;&lt;br /&gt;
Q = gramschmidt( A );&lt;br /&gt;
&amp;lt;/source&amp;gt;&lt;br /&gt;
&lt;br /&gt;
&#039;&#039;&#039;Реализация.&#039;&#039;&#039;&lt;br /&gt;
&amp;lt;source lang=&amp;quot;matlab&amp;quot;&amp;gt;&lt;br /&gt;
function Q = gramschmidt( A )&lt;br /&gt;
% Число векторов.&lt;br /&gt;
n = size( A, 2 );&lt;br /&gt;
 &lt;br /&gt;
% Инициализируем выходную матрицу.&lt;br /&gt;
Q = zeros( n );&lt;br /&gt;
 &lt;br /&gt;
% Преобразуем каждый вектор в базисный:&lt;br /&gt;
% (1) j-ый базисный вектор будет ортогонален каждому из предыдущих 1..j-1 векторов;&lt;br /&gt;
% (2) будет единичной длины.&lt;br /&gt;
for j = 1 : n&lt;br /&gt;
    % Выбираем j-ый вектор&lt;br /&gt;
    u = A( :, j );&lt;br /&gt;
    &lt;br /&gt;
    % Специальный случай для j = 1: просто нормируем этот вектор и помещаем&lt;br /&gt;
    % первым в найденный базис, так как нет векторов, относительно которых&lt;br /&gt;
    % нужно было бы делать его ортогональным.&lt;br /&gt;
&lt;br /&gt;
    % Удаляем из оригинального вектора &amp;quot;u&amp;quot; все компоненты натянутые на базис&lt;br /&gt;
    % из векторов 1..j-1, их вклад будет удален.&lt;br /&gt;
    % =&amp;gt; j-ый вектор ортогонален остальным.&lt;br /&gt;
    % Предыдущие базисные вектора были найдены на предыдуших шагах.&lt;br /&gt;
    % =&amp;gt; соблюдаем принцип ортогональности, но не ортонормированности.&lt;br /&gt;
    for i = 1 : j - 1&lt;br /&gt;
        u = u - proj( Q(:,i), A(:,j) );&lt;br /&gt;
    end&lt;br /&gt;
     &lt;br /&gt;
    % Нормируем вектор&lt;br /&gt;
    Q(:,j) = u ./ norm( u );&lt;br /&gt;
end&lt;br /&gt;
end&lt;br /&gt;
 &lt;br /&gt;
% Проекция вектора &amp;quot;a&amp;quot; коллинеарно вектору &amp;quot;e&amp;quot;.&lt;br /&gt;
function p = proj( e, a )&lt;br /&gt;
p = (e&#039; * a) / (e&#039; * e) .* e;&lt;br /&gt;
end&lt;br /&gt;
&amp;lt;/source&amp;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;.&lt;br /&gt;
&lt;br /&gt;
# Скалярное произведение векторов требует &amp;lt;math&amp;gt;n-1&amp;lt;/math&amp;gt; сложение и &amp;lt;math&amp;gt;n&amp;lt;/math&amp;gt; произведений.&lt;br /&gt;
# Вычитание проекции вектора требует &amp;lt;math&amp;gt;2&amp;lt;/math&amp;gt; скалярных произведения, &amp;lt;math&amp;gt;1&amp;lt;/math&amp;gt; деление, &amp;lt;math&amp;gt;n&amp;lt;/math&amp;gt; умножений и &amp;lt;math&amp;gt;n&amp;lt;/math&amp;gt; сложений, то есть:&lt;br /&gt;
## &amp;lt;math&amp;gt;3n-2&amp;lt;/math&amp;gt; (&amp;lt;math&amp;gt;+&amp;lt;/math&amp;gt;);&lt;br /&gt;
## &amp;lt;math&amp;gt;3n&amp;lt;/math&amp;gt; (&amp;lt;math&amp;gt;\times&amp;lt;/math&amp;gt;);&lt;br /&gt;
## &amp;lt;math&amp;gt;1&amp;lt;/math&amp;gt; (&amp;lt;math&amp;gt;\div&amp;lt;/math&amp;gt;).&lt;br /&gt;
# Вычисление &amp;lt;math&amp;gt;i&amp;lt;/math&amp;gt;-го вектора требует &amp;lt;math&amp;gt;i-1&amp;lt;/math&amp;gt; вычитаний проекций, то есть:&lt;br /&gt;
## &amp;lt;math&amp;gt;(3n-2)(i-1)&amp;lt;/math&amp;gt; (&amp;lt;math&amp;gt;+&amp;lt;/math&amp;gt;);&lt;br /&gt;
## &amp;lt;math&amp;gt;3n(i-1)&amp;lt;/math&amp;gt; (&amp;lt;math&amp;gt;\times&amp;lt;/math&amp;gt;);&lt;br /&gt;
## &amp;lt;math&amp;gt;i-1&amp;lt;/math&amp;gt; (&amp;lt;math&amp;gt;\div&amp;lt;/math&amp;gt;).&lt;br /&gt;
# Мы вычисляем вектора от &amp;lt;math&amp;gt;i=1&amp;lt;/math&amp;gt; до &amp;lt;math&amp;gt;m&amp;lt;/math&amp;gt;, поэтому множители &amp;lt;math&amp;gt;(i-1)&amp;lt;/math&amp;gt; выражаются &#039;&#039;треугольным числом&#039;&#039; &amp;lt;math&amp;gt;(m-1)\frac{m}{2}&amp;lt;/math&amp;gt;.&lt;br /&gt;
## &amp;lt;math&amp;gt;(3n-2)(m-1)\frac{m}{2}&amp;lt;/math&amp;gt; (&amp;lt;math&amp;gt;+&amp;lt;/math&amp;gt;);&lt;br /&gt;
## &amp;lt;math&amp;gt;3n(m-1)\frac{m}{2}&amp;lt;/math&amp;gt; (&amp;lt;math&amp;gt;\times&amp;lt;/math&amp;gt;);&lt;br /&gt;
## &amp;lt;math&amp;gt;(m-1)\frac{m}{2}&amp;lt;/math&amp;gt; (&amp;lt;math&amp;gt;\div&amp;lt;/math&amp;gt;).&lt;br /&gt;
&lt;br /&gt;
Таким образом, cложность алгоритма &amp;lt;math&amp;gt;O(nm^2)&amp;lt;/math&amp;gt;.&lt;br /&gt;
&lt;br /&gt;
=== Информационный граф ===&lt;br /&gt;
Граф состоит из элементов 2 видов: прямоугольников и овалов. Прямоугольниками обозначаются данные, причем красному цвету соответствуют входные данные, а зеленому ― выходные. Овалы означают операции над переданными данными. Голубым цветом обозначены более сложно организованные операции, а синим ― менее. Для нахождения &amp;lt;math&amp;gt;\mathbf{b}_i&amp;lt;/math&amp;gt; вектора требуются значения всех векторов с номерами, меньшими &amp;lt;math&amp;gt;i&amp;lt;/math&amp;gt;, однако, расчеты проекций можно начинать, не дожидаясь вычисления всех векторов, а производить сразу, как только соответствующий ортогональный вектор будет рассчитан. Эта зависимость и отражена на графе ниже.&lt;br /&gt;
[[Файл:Gram_schmidt_graph.png|thumb|800px|center|frame|Информационный граф алгоритма Грама-Шмидта]]&lt;br /&gt;
&lt;br /&gt;
=== Ресурс параллелизма алгоритма ===&lt;br /&gt;
*&lt;br /&gt;
=== Входные и выходные данные алгоритма ===&lt;br /&gt;
&#039;&#039;&#039;Входные данные.&#039;&#039;&#039; Матрица &amp;lt;math&amp;gt;A&amp;lt;/math&amp;gt; с элементами &amp;lt;math&amp;gt;\alpha_{ij}&amp;lt;/math&amp;gt;, где &amp;lt;math&amp;gt;i = \overline{1, m}&amp;lt;/math&amp;gt; (количество линейно независимых векторов) и &amp;lt;math&amp;gt;j = \overline{1, n}&amp;lt;/math&amp;gt; (размерность пространства), при этом &amp;lt;math&amp;gt;m \leqslant n&amp;lt;/math&amp;gt;.&lt;br /&gt;
&lt;br /&gt;
&#039;&#039;&#039;Объем входных данных.&#039;&#039;&#039; &amp;lt;math&amp;gt;mn&amp;lt;/math&amp;gt;&lt;br /&gt;
&lt;br /&gt;
&#039;&#039;&#039;Выходные данные.&#039;&#039;&#039; Матрица &amp;lt;math&amp;gt;B&amp;lt;/math&amp;gt; с элементами &amp;lt;math&amp;gt;\beta_{ij}&amp;lt;/math&amp;gt;, где &amp;lt;math&amp;gt;i = \overline{1, m}&amp;lt;/math&amp;gt; и &amp;lt;math&amp;gt;j = \overline{1, n}&amp;lt;/math&amp;gt;, тогда &amp;lt;math&amp;gt;b_{1}, \dots, b_{m}&amp;lt;/math&amp;gt; — система ортогональных векторов.&lt;br /&gt;
&lt;br /&gt;
&#039;&#039;&#039;Объем выходных данных.&#039;&#039;&#039; &amp;lt;math&amp;gt;mn&amp;lt;/math&amp;gt;&lt;br /&gt;
&lt;br /&gt;
=== Свойства алгоритма ===&lt;br /&gt;
&amp;lt;ol&amp;gt;&lt;br /&gt;
&amp;lt;li&amp;gt;Отношение последовательной и параллельной сложности в предположении доступности неограниченного числа необходимых ресурсов — ?. При этом необходимо отметить, что отношение числа операций к суммарному объему входных и выходных данных (вычислительная мощность алгоритма) — линейное.&amp;lt;/li&amp;gt;&lt;br /&gt;
&lt;br /&gt;
&amp;lt;li&amp;gt;Алгоритм почти полностью детерминирован, то есть гарантирована единственность результата выполнения. Это означает, что возможно накопление ошибок округления, то есть векторы выходной матрицы часто не точно ортогональны. Из-за потери ортогональности в процессе вычислений классический процесс Грама-Шмидта называют численно неустойчивым. Однако, процесс Грама-Шмидта может быть сделан более вычислительно устойчивым путём небольшой модификации. Такой алгоритм называется модифицированным процессом Грама-Шмидта. Рассмотрим его отличие подробнее.&lt;br /&gt;
&amp;lt;br /&amp;gt;&lt;br /&gt;
&amp;lt;math&amp;gt; &lt;br /&gt;
\begin{array}{l}&lt;br /&gt;
\mathbf{b}_j\\&lt;br /&gt;
  \\&lt;br /&gt;
\mathbf{b}_j&lt;br /&gt;
\end{array}&lt;br /&gt;
&lt;br /&gt;
\begin{array}{c}&lt;br /&gt;
= \\&lt;br /&gt;
  \\&lt;br /&gt;
=&lt;br /&gt;
\end{array}&lt;br /&gt;
&lt;br /&gt;
\underbrace{&lt;br /&gt;
\underbrace{&lt;br /&gt;
\underbrace{&lt;br /&gt;
&lt;br /&gt;
\begin{array}{c}&lt;br /&gt;
\mathbf{a}_j \\&lt;br /&gt;
   \\&lt;br /&gt;
\mathbf{a}_j&lt;br /&gt;
\end{array}&lt;br /&gt;
&lt;br /&gt;
\begin{array}{c}&lt;br /&gt;
- \\&lt;br /&gt;
  \\&lt;br /&gt;
-&lt;br /&gt;
\end{array}&lt;br /&gt;
&lt;br /&gt;
\begin{array}{c}&lt;br /&gt;
\mathbf{proj}_{\mathbf{b}_1}\,\mathbf{a}_j \\&lt;br /&gt;
   ||                                      \\&lt;br /&gt;
\mathbf{proj}_{\mathbf{b}_1}\,\mathbf{a}_j&lt;br /&gt;
\end{array}&lt;br /&gt;
&lt;br /&gt;
}_{\mathbf{a}_j^{(1)}}&lt;br /&gt;
&lt;br /&gt;
\begin{array}{c}&lt;br /&gt;
- \\&lt;br /&gt;
  \\&lt;br /&gt;
-&lt;br /&gt;
\end{array}&lt;br /&gt;
&lt;br /&gt;
\begin{array}{c}&lt;br /&gt;
\mathbf{proj}_{\mathbf{b}_2}\,\mathbf{a}_j       \\&lt;br /&gt;
   ||                                            \\&lt;br /&gt;
\mathbf{proj}_{\mathbf{b}_2}\,\mathbf{a}_j^{(1)}&lt;br /&gt;
\end{array}&lt;br /&gt;
&lt;br /&gt;
}_{\mathbf{a}_j^{(2)}}&lt;br /&gt;
&lt;br /&gt;
\begin{array}{c}&lt;br /&gt;
- \\&lt;br /&gt;
  \\&lt;br /&gt;
-&lt;br /&gt;
\end{array}&lt;br /&gt;
&lt;br /&gt;
\begin{array}{c}&lt;br /&gt;
\mathbf{proj}_{\mathbf{b}_3}\,\mathbf{a}_j       \\&lt;br /&gt;
   ||                                            \\&lt;br /&gt;
\mathbf{proj}_{\mathbf{b}_3}\,\mathbf{a}_j^{(2)}&lt;br /&gt;
\end{array}&lt;br /&gt;
&lt;br /&gt;
}_{\mathbf{a}_j^{(3)}}&lt;br /&gt;
&lt;br /&gt;
\begin{array}{ccc}&lt;br /&gt;
- &amp;amp; \ldots &amp;amp; - \\&lt;br /&gt;
               \\&lt;br /&gt;
- &amp;amp; \ldots &amp;amp; - &lt;br /&gt;
\end{array}&lt;br /&gt;
&lt;br /&gt;
\begin{array}{cc}&lt;br /&gt;
\mathbf{proj}_{\mathbf{b}_{j-1}}\,\mathbf{a}_j         &amp;amp; (1) \\&lt;br /&gt;
   ||                                                  &amp;amp;      \\&lt;br /&gt;
\mathbf{proj}_{\mathbf{b}_{j-1}}\,\mathbf{a}_j^{(j-2)} &amp;amp; (2)&lt;br /&gt;
\end{array}&lt;br /&gt;
&lt;br /&gt;
&amp;lt;/math&amp;gt;&lt;br /&gt;
&amp;lt;br /&amp;gt;&lt;br /&gt;
Формула (1) показывает вычисление &amp;lt;math&amp;gt;\mathbf{b}_j&amp;lt;/math&amp;gt; в классическом процессе, а формула (2) — в модифицированном.&lt;br /&gt;
&amp;lt;br /&amp;gt;&lt;br /&gt;
Разница между ними заключается в том, от каких векторов вычисляются компоненты: от &amp;lt;math&amp;gt;\mathbf{a}_j&amp;lt;/math&amp;gt; в классическом процессе или от результата предыдущего вычитания, то есть от &amp;lt;math&amp;gt;\mathbf{a}_j^{(k)}&amp;lt;/math&amp;gt; в модифицированном процессе. Таким образом, &amp;lt;math&amp;gt;\mathbf{a}_j^{(k)}&amp;lt;/math&amp;gt; представляет собой &amp;lt;math&amp;gt;\mathbf{a}_j&amp;lt;/math&amp;gt;, из которого удалены компоненты в направлениях &amp;lt;math&amp;gt;\mathbf{b}_1,\,\;\ldots,\;\mathbf{b}_{k}&amp;lt;/math&amp;gt;. Компонента вектора &amp;lt;math&amp;gt;\mathbf{a}_j&amp;lt;/math&amp;gt; в направлении &amp;lt;math&amp;gt;\mathbf{b}_{k+1}&amp;lt;/math&amp;gt; при этом удалении не затрагивается и поэтому она в &amp;lt;math&amp;gt;\mathbf{a}_j^{(k)}&amp;lt;/math&amp;gt; такая же, как в &amp;lt;math&amp;gt;\mathbf{a}_j&amp;lt;/math&amp;gt;.&amp;lt;/li&amp;gt;&lt;br /&gt;
&lt;br /&gt;
&amp;lt;li&amp;gt;Процесс Грама-Шмидта может применяться к бесконечной последовательности линейно независимых векторов, а также к линейно зависимым векторам. В этом случае он выдаёт &amp;lt;math&amp;gt;\mathbf{0}&amp;lt;/math&amp;gt; (нулевой вектор) на шаге &amp;lt;math&amp;gt;j&amp;lt;/math&amp;gt;, если &amp;lt;math&amp;gt;\mathbf{a}_j&amp;lt;/math&amp;gt; является линейной комбинацией векторов &amp;lt;math&amp;gt;\mathbf{a}_1,\;\ldots,\;\mathbf{a}_{j-1}&amp;lt;/math&amp;gt;. Если это может случиться, то для сохранения ортогональности выходных векторов и для предотвращения деления на ноль при ортонормировании алгоритм должен делать проверку на нулевые векторы и отбрасывать их. Количество векторов, выдаваемых алгоритмом, будет равно размерности подпространства, порождённого векторами (то есть количеству линейно независимых векторов, которые можно выделить среди исходных векторов).&amp;lt;/li&amp;gt;&lt;br /&gt;
&lt;br /&gt;
&amp;lt;li&amp;gt;Процесс Грама-Шмидта может быть истолкован как разложение невырожденной квадратной матрицы в произведение ортогональной (или унитарной матрицы в случае эрмитова пространства) и верхнетреугольной матрицы с положительными диагональными элементами — QR-разложение.&amp;lt;/li&amp;gt;&lt;br /&gt;
&amp;lt;/ol&amp;gt;&lt;br /&gt;
&lt;br /&gt;
== Программная реализация алгоритма ==&lt;br /&gt;
=== Особенности реализации последовательного алгоритма ===&lt;br /&gt;
=== Локальность данных и вычислений ===&lt;br /&gt;
=== Возможные способы и особенности параллельной реализации алгоритма ===&lt;br /&gt;
=== Масштабируемость алгоритма и его реализации ===&lt;br /&gt;
&#039;&#039;Срок сдачи продлен до 15 ноября.&#039;&#039;&lt;br /&gt;
=== Динамические характеристики и эффективность реализации алгоритма ===&lt;br /&gt;
=== Выводы для классов архитектур ===&lt;br /&gt;
=== Существующие реализации алгоритма ===&lt;br /&gt;
Данный алгоритм реализован во множестве библиотек и математических программных пакетах.&lt;br /&gt;
&lt;br /&gt;
# Библиотека [https://github.com/open-epicycle/Epicycle.Math-cs Epicycle] (C#).&lt;br /&gt;
# Библиотека [http://www.spectralpython.net/ Spectral Python (SPy)].&lt;br /&gt;
# Библиотека [https://hackage.haskell.org/package/vect-0.4.7/docs/Data-Vect-Float-GramSchmidt.html vect] (Haskell).&lt;br /&gt;
&lt;br /&gt;
==== Пакет Mathematica ====&lt;br /&gt;
Приведем пример скрипта, предназначенного для пакета Mathematica, который проводит процесс ортогонализации Грама-Шмидта над векторами, заданными в фигурных скобках последней строки. Количество векторов и их координат могут быть произвольными. В данном случае для примера взяты векторы &amp;lt;math&amp;gt;\{-2,\;1,\;0\}&amp;lt;/math&amp;gt;, &amp;lt;math&amp;gt;\{-2,\;0,\;1\}&amp;lt;/math&amp;gt;, &amp;lt;math&amp;gt;\{-0{.}5,\;-1,\;1\}&amp;lt;/math&amp;gt;.&lt;br /&gt;
&amp;lt;source lang=&#039;mathematica&#039;&amp;gt;Projection[v1_, v2_] := (v1.v2*v2)/v2.v2&lt;br /&gt;
MultipleProjection[v1_, vecs_] := Plus @@ (Projection[v1, #1] &amp;amp;) /@ vecs&lt;br /&gt;
GramSchmidt[mat_] := Fold[Join[#1, {#2 - MultipleProjection[#2, #1]}] &amp;amp;, {}, mat]&lt;br /&gt;
GramSchmidt[{{-2, 1, 0}, {-2, 0, 1}, {-0.5, -1, 1}}]&amp;lt;/source&amp;gt;&lt;br /&gt;
&lt;br /&gt;
==== Пакет Maxima ====&lt;br /&gt;
Приведем пример скрипта, предназначенного для пакета Maxima, который проводит процесс ортогонализации Грама-Шмидта над векторами, заданными в фигурных скобках последней строки. Количество векторов и их координат могут быть произвольными. В данном случае для примера взяты векторы &amp;lt;math&amp;gt;\{-2,\;1,\;0\}&amp;lt;/math&amp;gt;, &amp;lt;math&amp;gt;\{-2,\;0,\;1\}&amp;lt;/math&amp;gt;, &amp;lt;math&amp;gt;\{-0{.}5,\;-1,\;1\}&amp;lt;/math&amp;gt;.&lt;br /&gt;
&amp;lt;source lang=&#039;maxima&#039;&amp;gt;&lt;br /&gt;
load(eigen);&lt;br /&gt;
x: matrix ([-2,1,0],[-2,0,1],[-0.5,-1,1]);&lt;br /&gt;
y: gramschmidt(x);&lt;br /&gt;
&amp;lt;/source&amp;gt;&lt;br /&gt;
&lt;br /&gt;
==== Пакет MATLAB ====&lt;br /&gt;
Приведем пример скрипта, предназначенного для пакета MATLAB, который проводит процесс ортогонализации Грама-Шмидта над векторами, заданными в фигурных скобках последней строки. В данном пакете уже существует функция, которая осуществляет данный процесс. Столбцы входной матрицы предполагаются линейно-независимыми, количество векторов и их координат могут быть произвольными. Функция возращает матрицу X с ортонормированными столбцами и обратимую верхне-треугольную матрицу Y.&lt;br /&gt;
&lt;br /&gt;
В данном случае для примера взяты векторы &amp;lt;math&amp;gt;\{-2,\;1,\;0\}&amp;lt;/math&amp;gt;, &amp;lt;math&amp;gt;\{-2,\;0,\;1\}&amp;lt;/math&amp;gt;, &amp;lt;math&amp;gt;\{-0{.}5,\;-1,\;1\}&amp;lt;/math&amp;gt;.&lt;br /&gt;
&amp;lt;source lang=&#039;matlab&#039;&amp;gt;&lt;br /&gt;
[x y]=gschmidt([-2 1 0; -2 0 1; -0.5 -1 1])&lt;br /&gt;
&amp;lt;/source&amp;gt;&lt;br /&gt;
&lt;br /&gt;
== Литература ==&lt;/div&gt;</summary>
		<author><name>BDA</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:BDA/%D0%9E%D1%80%D1%82%D0%BE%D0%B3%D0%BE%D0%BD%D0%B0%D0%BB%D0%B8%D0%B7%D0%B0%D1%86%D0%B8%D1%8F_%D0%93%D1%80%D0%B0%D0%BC%D0%B0-%D0%A8%D0%BC%D0%B8%D0%B4%D1%82%D0%B0&amp;diff=14751</id>
		<title>Участник:BDA/Ортогонализация Грама-Шмидта</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:BDA/%D0%9E%D1%80%D1%82%D0%BE%D0%B3%D0%BE%D0%BD%D0%B0%D0%BB%D0%B8%D0%B7%D0%B0%D1%86%D0%B8%D1%8F_%D0%93%D1%80%D0%B0%D0%BC%D0%B0-%D0%A8%D0%BC%D0%B8%D0%B4%D1%82%D0%B0&amp;diff=14751"/>
		<updated>2016-10-29T22:15:29Z</updated>

		<summary type="html">&lt;p&gt;BDA: /* Информационный граф */&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(nm^2)&amp;lt;/math&amp;gt;&lt;br /&gt;
| pf_height         = &amp;lt;math&amp;gt;?&amp;lt;/math&amp;gt;&lt;br /&gt;
| pf_width          = &amp;lt;math&amp;gt;?&amp;lt;/math&amp;gt;&lt;br /&gt;
| input_data        = &amp;lt;math&amp;gt;nm&amp;lt;/math&amp;gt;&lt;br /&gt;
| output_data       = &amp;lt;math&amp;gt;nm&amp;lt;/math&amp;gt;&lt;br /&gt;
}}&lt;br /&gt;
&lt;br /&gt;
Основные авторы описания: [[Участник:Zodiac|Белов Н. А.]], [[Участник:BDA|Богомолов Д. А.]].&lt;br /&gt;
&lt;br /&gt;
== Свойства и структура алгоритма ==&lt;br /&gt;
=== Общее описание алгоритма ===&lt;br /&gt;
&lt;br /&gt;
Ортогонализация ― алгоритм построения для данной линейно независимой системы векторов евклидова или эрмитова пространства V ортогональной системы ненулевых векторов, порождающих то же самое подпространство в V.&lt;br /&gt;
&lt;br /&gt;
Ортогонализация Грама–Шмидта&amp;lt;ref&amp;gt;Канатников А.Н., Крищенко А.П. &amp;quot;Линейная алгебра.&amp;quot; ― 3-е изд., стер. ― М.: Изд-во МГТУ им. Н.Э. Баумана, 2002&amp;lt;/ref&amp;gt; (процесс Грама–Шмидта) ― наиболее известный алгоритм ортогонализации. Назван в честь Йоргена Педерсена Грама&amp;lt;ref&amp;gt;O&#039;Connor, John J.; Robertson, Edmund F., &amp;quot;Jørgen Pedersen Gram&amp;quot;, MacTutor History of Mathematics archive, University of St Andrews.&amp;lt;/ref&amp;gt; и Эрхарда Шмидта&amp;lt;ref&amp;gt;O&#039;Connor, John J.; Robertson, Edmund F., &amp;quot;Erhard Schmidt&amp;quot;, MacTutor History of Mathematics archive, University of St Andrews.&amp;lt;/ref&amp;gt;, однако ранее уже появлялся в работах Лапласа и Коши. Является частным случаем разложения Ивасавы, так как может быть представлен как разложение невырожденной квадратной матрицы в произведение ортогональной (или унитарной матрицы в случае эрмитова пространства) и верхнетреугольной матрицы с положительными диагональными элементами.&lt;br /&gt;
&lt;br /&gt;
Рассматриваемый алгоритм применяется для борьбы с помехами в адаптивной системе селекции движущихся целей&amp;lt;ref&amp;gt;Орешкин Б.Н., Бакулев П.А. &amp;quot;Быстрая процедура ортогонализации Грамма–Шмидта и ее применение для борьбы с помехами в адаптивной системе селекции движущихся целей&amp;quot; ― Радиотехника / №12 за 2007 г.&amp;lt;/ref&amp;gt;, в протоколах безопасности&amp;lt;ref&amp;gt;Пискова А.В., Менщиков А.А., Коробейников А.Г. &amp;quot;Использование ортогонализации Грама-Шмидта в алгоритме приведения базиса решетки для протоколов безопасности&amp;quot; ― Вопросы кибербезопасности №1(14) 2016&amp;lt;/ref&amp;gt;, для повышения экономичности алгоритмов оценивания параметров моделей объектов управления&amp;lt;ref&amp;gt;Карелин А.Е., Светлаков А.А. &amp;quot;Использование ортогонализации Грама-Шмидта для повышения экономичности многоточечных алгоритмов рекуррентного оценивания параметров моделей объектов управления&amp;quot; ― Известия Томского политехнического университета [Известия ТПУ]. — 2006. — Т. 309, № 8. — [С. 15-19].&amp;lt;/ref&amp;gt; и в других областях.&lt;br /&gt;
&lt;br /&gt;
=== Математическое описание алгоритма ===&lt;br /&gt;
&#039;&#039;&#039;Входные данные.&#039;&#039;&#039; &amp;lt;math&amp;gt;m&amp;lt;/math&amp;gt; линейно независимых векторов &amp;lt;math&amp;gt;\mathbf{a}_1,...,\mathbf{a}_m&amp;lt;/math&amp;gt; c размерностью пространства &amp;lt;math&amp;gt;n&amp;lt;/math&amp;gt;, записанных в матрице &amp;lt;math&amp;gt;A&amp;lt;/math&amp;gt; с элементами &amp;lt;math&amp;gt;\alpha_{ij}&amp;lt;/math&amp;gt;.&lt;br /&gt;
&lt;br /&gt;
&#039;&#039;&#039;Выходные данные.&#039;&#039;&#039; &amp;lt;math&amp;gt;m&amp;lt;/math&amp;gt; ортогональных векторов &amp;lt;math&amp;gt;\mathbf{b}_1,...,\mathbf{b}_m&amp;lt;/math&amp;gt; c размерностью пространства &amp;lt;math&amp;gt;n&amp;lt;/math&amp;gt;, записанных в матрице &amp;lt;math&amp;gt;B&amp;lt;/math&amp;gt; с элементами &amp;lt;math&amp;gt;\beta_{ij}&amp;lt;/math&amp;gt;.&lt;br /&gt;
&lt;br /&gt;
Определим оператор проекции (проецирует вектор &amp;lt;math&amp;gt;\mathbf{a}&amp;lt;/math&amp;gt; коллинеарно вектору &amp;lt;math&amp;gt;\mathbf{b}&amp;lt;/math&amp;gt;) &amp;lt;math&amp;gt;\mathbf{proj_b a = \frac{\left \langle a,b \right \rangle}{\left \langle b,b \right \rangle }b}&amp;lt;/math&amp;gt;, где &amp;lt;math&amp;gt;\mathbf{\left \langle a,b \right \rangle}&amp;lt;/math&amp;gt; ― скалярное произведение векторов &amp;lt;math&amp;gt;\mathbf{a}&amp;lt;/math&amp;gt; и &amp;lt;math&amp;gt;\mathbf{b}&amp;lt;/math&amp;gt;.&lt;br /&gt;
&lt;br /&gt;
Тогда ортогональные векторы вычисляются следующим образом:&lt;br /&gt;
&lt;br /&gt;
&amp;lt;math&amp;gt;\mathbf{b}_1 = \mathbf{a}_1&amp;lt;/math&amp;gt;&lt;br /&gt;
&lt;br /&gt;
&amp;lt;math&amp;gt;\mathbf{b}_2 = \mathbf{a}_2 - \mathbf{proj}_{\mathbf{b}_1} \mathbf{a}_2 &amp;lt;/math&amp;gt;&lt;br /&gt;
&lt;br /&gt;
&amp;lt;math&amp;gt;\mathbf{b}_3 = \mathbf{a}_3 - \mathbf{proj}_{\mathbf{b}_1} \mathbf{a}_3 - \mathbf{proj}_{\mathbf{b}_2} \mathbf{a}_3 &amp;lt;/math&amp;gt;&lt;br /&gt;
&lt;br /&gt;
&amp;lt;math&amp;gt;\vdots&amp;lt;/math&amp;gt;&lt;br /&gt;
&lt;br /&gt;
&amp;lt;math&amp;gt;\mathbf{b}_m = \mathbf{a}_m - \sum_{j=1}^{m-1} \mathbf{proj}_{\mathbf{b}_j} \mathbf{a}_m&amp;lt;/math&amp;gt;&lt;br /&gt;
&lt;br /&gt;
Или поэлементно:&lt;br /&gt;
&lt;br /&gt;
&amp;lt;math&amp;gt;\beta_{1j} = \alpha_{1j}&amp;lt;/math&amp;gt;&lt;br /&gt;
&lt;br /&gt;
&amp;lt;math&amp;gt;\beta_{ij} = \alpha_{ij} - (\sum_{k=1}^{i-1} \mathbf{proj}_{\mathbf{b}_k} \mathbf{a}_i)_j = \alpha_{ij} - \sum_{k=1}^{i-1}\frac{\sum_{s=1}^{n}\alpha_{is}\beta_{ks}}{\sum_{s=1}^{n}\beta_{ks}\beta_{ks}}\beta_{kj} &amp;lt;/math&amp;gt;&lt;br /&gt;
&lt;br /&gt;
=== Вычислительное ядро алгоритма ===&lt;br /&gt;
Основное время работы алгоритма приходится на вычисление сумм &amp;lt;math&amp;gt;\sum_{i=1}^{j-1} \mathbf{proj}_{\mathbf{b}_i} \mathbf{a}_k \forall j: j=\overline{1, m}&amp;lt;/math&amp;gt;.&lt;br /&gt;
&lt;br /&gt;
=== Макроструктура алгоритма ===&lt;br /&gt;
Из описания алгоритма в предыдущих разделов следует, что основную часть данного метода составляют операции вычисления проекций векторов, а также их сумм.&lt;br /&gt;
&lt;br /&gt;
=== Схема реализации последовательного алгоритма ===&lt;br /&gt;
Рассмотрим алгоритм, написанный в виде функции для математической системы MATLAB.&lt;br /&gt;
&lt;br /&gt;
&#039;&#039;&#039;Входные данные.&#039;&#039;&#039;&lt;br /&gt;
&lt;br /&gt;
Матрица &amp;lt;math&amp;gt;A&amp;lt;/math&amp;gt; с линейно-независимыми векторами в столбцах.&lt;br /&gt;
&lt;br /&gt;
&#039;&#039;&#039;Выходные данные.&#039;&#039;&#039;&lt;br /&gt;
&lt;br /&gt;
Матрица &amp;lt;math&amp;gt;Q&amp;lt;/math&amp;gt; с ортонормированным базисом &amp;lt;math&amp;gt;A&amp;lt;/math&amp;gt;.&lt;br /&gt;
&lt;br /&gt;
&#039;&#039;&#039;Использование.&#039;&#039;&#039;&lt;br /&gt;
&amp;lt;source lang=&amp;quot;matlab&amp;quot;&amp;gt;&lt;br /&gt;
Q = gramschmidt( A );&lt;br /&gt;
&amp;lt;/source&amp;gt;&lt;br /&gt;
&lt;br /&gt;
&#039;&#039;&#039;Реализация.&#039;&#039;&#039;&lt;br /&gt;
&amp;lt;source lang=&amp;quot;matlab&amp;quot;&amp;gt;&lt;br /&gt;
function Q = gramschmidt( A )&lt;br /&gt;
% Число векторов.&lt;br /&gt;
n = size( A, 2 );&lt;br /&gt;
 &lt;br /&gt;
% Инициализируем выходную матрицу.&lt;br /&gt;
Q = zeros( n );&lt;br /&gt;
 &lt;br /&gt;
% Преобразуем каждый вектор в базисный:&lt;br /&gt;
% (1) j-ый базисный вектор будет ортогонален каждому из предыдущих 1..j-1 векторов;&lt;br /&gt;
% (2) будет единичной длины.&lt;br /&gt;
for j = 1 : n&lt;br /&gt;
    % Выбираем j-ый вектор&lt;br /&gt;
    u = A( :, j );&lt;br /&gt;
    &lt;br /&gt;
    % Специальный случай для j = 1: просто нормируем этот вектор и помещаем&lt;br /&gt;
    % первым в найденный базис, так как нет векторов, относительно которых&lt;br /&gt;
    % нужно было бы делать его ортогональным.&lt;br /&gt;
&lt;br /&gt;
    % Удаляем из оригинального вектора &amp;quot;u&amp;quot; все компоненты натянутые на базис&lt;br /&gt;
    % из векторов 1..j-1, их вклад будет удален.&lt;br /&gt;
    % =&amp;gt; j-ый вектор ортогонален остальным.&lt;br /&gt;
    % Предыдущие базисные вектора были найдены на предыдуших шагах.&lt;br /&gt;
    % =&amp;gt; соблюдаем принцип ортогональности, но не ортонормированности.&lt;br /&gt;
    for i = 1 : j - 1&lt;br /&gt;
        u = u - proj( Q(:,i), A(:,j) );&lt;br /&gt;
    end&lt;br /&gt;
     &lt;br /&gt;
    % Нормируем вектор&lt;br /&gt;
    Q(:,j) = u ./ norm( u );&lt;br /&gt;
end&lt;br /&gt;
end&lt;br /&gt;
 &lt;br /&gt;
% Проекция вектора &amp;quot;a&amp;quot; коллинеарно вектору &amp;quot;e&amp;quot;.&lt;br /&gt;
function p = proj( e, a )&lt;br /&gt;
p = (e&#039; * a) / (e&#039; * e) .* e;&lt;br /&gt;
end&lt;br /&gt;
&amp;lt;/source&amp;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;.&lt;br /&gt;
&lt;br /&gt;
# Скалярное произведение векторов требует &amp;lt;math&amp;gt;n-1&amp;lt;/math&amp;gt; сложение и &amp;lt;math&amp;gt;n&amp;lt;/math&amp;gt; произведений.&lt;br /&gt;
# Вычитание проекции вектора требует &amp;lt;math&amp;gt;2&amp;lt;/math&amp;gt; скалярных произведения, &amp;lt;math&amp;gt;1&amp;lt;/math&amp;gt; деление, &amp;lt;math&amp;gt;n&amp;lt;/math&amp;gt; умножений и &amp;lt;math&amp;gt;n&amp;lt;/math&amp;gt; сложений, то есть:&lt;br /&gt;
## &amp;lt;math&amp;gt;3n-2&amp;lt;/math&amp;gt; (&amp;lt;math&amp;gt;+&amp;lt;/math&amp;gt;);&lt;br /&gt;
## &amp;lt;math&amp;gt;3n&amp;lt;/math&amp;gt; (&amp;lt;math&amp;gt;\times&amp;lt;/math&amp;gt;);&lt;br /&gt;
## &amp;lt;math&amp;gt;1&amp;lt;/math&amp;gt; (&amp;lt;math&amp;gt;\div&amp;lt;/math&amp;gt;).&lt;br /&gt;
# Вычисление &amp;lt;math&amp;gt;i&amp;lt;/math&amp;gt;-го вектора требует &amp;lt;math&amp;gt;i-1&amp;lt;/math&amp;gt; вычитаний проекций, то есть:&lt;br /&gt;
## &amp;lt;math&amp;gt;(3n-2)(i-1)&amp;lt;/math&amp;gt; (&amp;lt;math&amp;gt;+&amp;lt;/math&amp;gt;);&lt;br /&gt;
## &amp;lt;math&amp;gt;3n(i-1)&amp;lt;/math&amp;gt; (&amp;lt;math&amp;gt;\times&amp;lt;/math&amp;gt;);&lt;br /&gt;
## &amp;lt;math&amp;gt;i-1&amp;lt;/math&amp;gt; (&amp;lt;math&amp;gt;\div&amp;lt;/math&amp;gt;).&lt;br /&gt;
# Мы вычисляем вектора от &amp;lt;math&amp;gt;i=1&amp;lt;/math&amp;gt; до &amp;lt;math&amp;gt;m&amp;lt;/math&amp;gt;, поэтому множители &amp;lt;math&amp;gt;(i-1)&amp;lt;/math&amp;gt; выражаются &#039;&#039;треугольным числом&#039;&#039; &amp;lt;math&amp;gt;(m-1)\frac{m}{2}&amp;lt;/math&amp;gt;.&lt;br /&gt;
## &amp;lt;math&amp;gt;(3n-2)(m-1)\frac{m}{2}&amp;lt;/math&amp;gt; (&amp;lt;math&amp;gt;+&amp;lt;/math&amp;gt;);&lt;br /&gt;
## &amp;lt;math&amp;gt;3n(m-1)\frac{m}{2}&amp;lt;/math&amp;gt; (&amp;lt;math&amp;gt;\times&amp;lt;/math&amp;gt;);&lt;br /&gt;
## &amp;lt;math&amp;gt;(m-1)\frac{m}{2}&amp;lt;/math&amp;gt; (&amp;lt;math&amp;gt;\div&amp;lt;/math&amp;gt;).&lt;br /&gt;
&lt;br /&gt;
Таким образом, cложность алгоритма &amp;lt;math&amp;gt;O(nm^2)&amp;lt;/math&amp;gt;.&lt;br /&gt;
&lt;br /&gt;
=== Информационный граф ===&lt;br /&gt;
Граф состоит из элементов 2 видов: прямоугольников и овалов. Прямоугольниками обозначаются данные, причем красному цвету соответствуют входные данные, а зеленому - выходные. Овалы означают операции над переданными данными. Голубым цветом обозначены более сложно организованные операции, а синим - менее. Для нахождения &amp;lt;math&amp;gt;\mathbf{b}_i&amp;lt;/math&amp;gt; вектора требуются значения всех векторов с номерами, меньшими &amp;lt;math&amp;gt;i&amp;lt;/math&amp;gt;, однако, расчеты проекций можно начинать, не дожидаясь вычисления всех векторов, а производить сразу, как только соответствующий ортогональный вектор будет рассчитан. Эта зависимость и отражена на графе ниже.&lt;br /&gt;
[[Файл:Gram_schmidt_graph.png|thumb|800px|center|frame|Информационный граф алгоритма Грама-Шмидта]]&lt;br /&gt;
&lt;br /&gt;
=== Ресурс параллелизма алгоритма ===&lt;br /&gt;
*&lt;br /&gt;
=== Входные и выходные данные алгоритма ===&lt;br /&gt;
&#039;&#039;&#039;Входные данные.&#039;&#039;&#039; Матрица &amp;lt;math&amp;gt;A&amp;lt;/math&amp;gt; с элементами &amp;lt;math&amp;gt;\alpha_{ij}&amp;lt;/math&amp;gt;, где &amp;lt;math&amp;gt;i = \overline{1, m}&amp;lt;/math&amp;gt; (количество линейно независимых векторов) и &amp;lt;math&amp;gt;j = \overline{1, n}&amp;lt;/math&amp;gt; (размерность пространства), при этом &amp;lt;math&amp;gt;m \leqslant n&amp;lt;/math&amp;gt;.&lt;br /&gt;
&lt;br /&gt;
&#039;&#039;&#039;Объем входных данных.&#039;&#039;&#039; &amp;lt;math&amp;gt;mn&amp;lt;/math&amp;gt;&lt;br /&gt;
&lt;br /&gt;
&#039;&#039;&#039;Выходные данные.&#039;&#039;&#039; Матрица &amp;lt;math&amp;gt;B&amp;lt;/math&amp;gt; с элементами &amp;lt;math&amp;gt;\beta_{ij}&amp;lt;/math&amp;gt;, где &amp;lt;math&amp;gt;i = \overline{1, m}&amp;lt;/math&amp;gt; и &amp;lt;math&amp;gt;j = \overline{1, n}&amp;lt;/math&amp;gt;, тогда &amp;lt;math&amp;gt;b_{1}, \dots, b_{m}&amp;lt;/math&amp;gt; — система ортогональных векторов.&lt;br /&gt;
&lt;br /&gt;
&#039;&#039;&#039;Объем выходных данных.&#039;&#039;&#039; &amp;lt;math&amp;gt;mn&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;
Однако, возможно накопление ошибок округления, то есть векторы выходной матрицы часто не точно ортогональны. Из-за потери ортогональности в процессе вычислений классический процесс Грама-Шмидта называют численно неустойчивым.&lt;br /&gt;
&lt;br /&gt;
Процесс Грама-Шмидта может быть сделан более вычислительно устойчивым путём небольшой модификации. Такой алгоритм называется модифицированным процессом Грама-Шмидта.&lt;br /&gt;
&lt;br /&gt;
Процесс Грама-Шмидта может применяться также к бесконечной последовательности линейно независимых векторов.&lt;br /&gt;
&lt;br /&gt;
Процесс Грама-Шмидта может применяться к линейно зависимым векторам. В этом случае он выдаёт &amp;lt;math&amp;gt;\mathbf{0}&amp;lt;/math&amp;gt; (нулевой вектор) на шаге &amp;lt;math&amp;gt;j&amp;lt;/math&amp;gt;, если &amp;lt;math&amp;gt;\mathbf{a}_j&amp;lt;/math&amp;gt; является линейной комбинацией векторов &amp;lt;math&amp;gt;\mathbf{a}_1,\;\ldots,\;\mathbf{a}_{j-1}&amp;lt;/math&amp;gt;. Если это может случиться, то для сохранения ортогональности выходных векторов и для предотвращения деления на ноль при ортонормировании алгоритм должен делать проверку на нулевые векторы и отбрасывать их. Количество векторов, выдаваемых алгоритмом, будет равно размерности подпространства, порождённого векторами (то есть количеству линейно независимых векторов, которые можно выделить среди исходных векторов).&lt;br /&gt;
&lt;br /&gt;
Процесс Грама-Шмидта может быть истолкован как разложение невырожденной квадратной матрицы в произведение ортогональной (или унитарной матрицы в случае эрмитова пространства) и верхнетреугольной матрицы с положительными диагональными элементами -- QR-разложение.&lt;br /&gt;
&lt;br /&gt;
== Программная реализация алгоритма ==&lt;br /&gt;
=== Особенности реализации последовательного алгоритма ===&lt;br /&gt;
=== Локальность данных и вычислений ===&lt;br /&gt;
=== Возможные способы и особенности параллельной реализации алгоритма ===&lt;br /&gt;
=== Масштабируемость алгоритма и его реализации ===&lt;br /&gt;
&#039;&#039;Срок сдачи продлен до 15 ноября.&#039;&#039;&lt;br /&gt;
=== Динамические характеристики и эффективность реализации алгоритма ===&lt;br /&gt;
=== Выводы для классов архитектур ===&lt;br /&gt;
=== Существующие реализации алгоритма ===&lt;br /&gt;
Данный алгоритм реализован во множестве библиотек и математических программных пакетах.&lt;br /&gt;
&lt;br /&gt;
# Библиотека [https://github.com/open-epicycle/Epicycle.Math-cs Epicycle] (C#).&lt;br /&gt;
# Библиотека [http://www.spectralpython.net/ Spectral Python (SPy)].&lt;br /&gt;
# Библиотека [https://hackage.haskell.org/package/vect-0.4.7/docs/Data-Vect-Float-GramSchmidt.html vect] (Haskell).&lt;br /&gt;
&lt;br /&gt;
==== Пакет Mathematica ====&lt;br /&gt;
Приведем пример скрипта, предназначенного для пакета Mathematica, который проводит процесс ортогонализации Грама-Шмидта над векторами, заданными в фигурных скобках последней строки. Количество векторов и их координат могут быть произвольными. В данном случае для примера взяты векторы &amp;lt;math&amp;gt;\{-2,\;1,\;0\}&amp;lt;/math&amp;gt;, &amp;lt;math&amp;gt;\{-2,\;0,\;1\}&amp;lt;/math&amp;gt;, &amp;lt;math&amp;gt;\{-0{.}5,\;-1,\;1\}&amp;lt;/math&amp;gt;.&lt;br /&gt;
&amp;lt;source lang=&#039;mathematica&#039;&amp;gt;Projection[v1_, v2_] := (v1.v2*v2)/v2.v2&lt;br /&gt;
MultipleProjection[v1_, vecs_] := Plus @@ (Projection[v1, #1] &amp;amp;) /@ vecs&lt;br /&gt;
GramSchmidt[mat_] := Fold[Join[#1, {#2 - MultipleProjection[#2, #1]}] &amp;amp;, {}, mat]&lt;br /&gt;
GramSchmidt[{{-2, 1, 0}, {-2, 0, 1}, {-0.5, -1, 1}}]&amp;lt;/source&amp;gt;&lt;br /&gt;
&lt;br /&gt;
==== Пакет Maxima ====&lt;br /&gt;
Приведем пример скрипта, предназначенного для пакета Maxima, который проводит процесс ортогонализации Грама-Шмидта над векторами, заданными в фигурных скобках последней строки. Количество векторов и их координат могут быть произвольными. В данном случае для примера взяты векторы &amp;lt;math&amp;gt;\{-2,\;1,\;0\}&amp;lt;/math&amp;gt;, &amp;lt;math&amp;gt;\{-2,\;0,\;1\}&amp;lt;/math&amp;gt;, &amp;lt;math&amp;gt;\{-0{.}5,\;-1,\;1\}&amp;lt;/math&amp;gt;.&lt;br /&gt;
&amp;lt;source lang=&#039;maxima&#039;&amp;gt;&lt;br /&gt;
load(eigen);&lt;br /&gt;
x: matrix ([-2,1,0],[-2,0,1],[-0.5,-1,1]);&lt;br /&gt;
y: gramschmidt(x);&lt;br /&gt;
&amp;lt;/source&amp;gt;&lt;br /&gt;
&lt;br /&gt;
==== Пакет MATLAB ====&lt;br /&gt;
Приведем пример скрипта, предназначенного для пакета MATLAB, который проводит процесс ортогонализации Грама-Шмидта над векторами, заданными в фигурных скобках последней строки. В данном пакете уже существует функция, которая осуществляет данный процесс. Столбцы входной матрицы предполагаются линейно-независимыми, количество векторов и их координат могут быть произвольными. Функция возращает матрицу X с ортонормированными столбцами и обратимую верхне-треугольную матрицу Y.&lt;br /&gt;
&lt;br /&gt;
В данном случае для примера взяты векторы &amp;lt;math&amp;gt;\{-2,\;1,\;0\}&amp;lt;/math&amp;gt;, &amp;lt;math&amp;gt;\{-2,\;0,\;1\}&amp;lt;/math&amp;gt;, &amp;lt;math&amp;gt;\{-0{.}5,\;-1,\;1\}&amp;lt;/math&amp;gt;.&lt;br /&gt;
&amp;lt;source lang=&#039;matlab&#039;&amp;gt;&lt;br /&gt;
[x y]=gschmidt([-2 1 0; -2 0 1; -0.5 -1 1])&lt;br /&gt;
&amp;lt;/source&amp;gt;&lt;br /&gt;
&lt;br /&gt;
== Литература ==&lt;/div&gt;</summary>
		<author><name>BDA</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:BDA/%D0%9E%D1%80%D1%82%D0%BE%D0%B3%D0%BE%D0%BD%D0%B0%D0%BB%D0%B8%D0%B7%D0%B0%D1%86%D0%B8%D1%8F_%D0%93%D1%80%D0%B0%D0%BC%D0%B0-%D0%A8%D0%BC%D0%B8%D0%B4%D1%82%D0%B0&amp;diff=14750</id>
		<title>Участник:BDA/Ортогонализация Грама-Шмидта</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:BDA/%D0%9E%D1%80%D1%82%D0%BE%D0%B3%D0%BE%D0%BD%D0%B0%D0%BB%D0%B8%D0%B7%D0%B0%D1%86%D0%B8%D1%8F_%D0%93%D1%80%D0%B0%D0%BC%D0%B0-%D0%A8%D0%BC%D0%B8%D0%B4%D1%82%D0%B0&amp;diff=14750"/>
		<updated>2016-10-29T22:13:44Z</updated>

		<summary type="html">&lt;p&gt;BDA: /* Информационный граф */&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(nm^2)&amp;lt;/math&amp;gt;&lt;br /&gt;
| pf_height         = &amp;lt;math&amp;gt;?&amp;lt;/math&amp;gt;&lt;br /&gt;
| pf_width          = &amp;lt;math&amp;gt;?&amp;lt;/math&amp;gt;&lt;br /&gt;
| input_data        = &amp;lt;math&amp;gt;nm&amp;lt;/math&amp;gt;&lt;br /&gt;
| output_data       = &amp;lt;math&amp;gt;nm&amp;lt;/math&amp;gt;&lt;br /&gt;
}}&lt;br /&gt;
&lt;br /&gt;
Основные авторы описания: [[Участник:Zodiac|Белов Н. А.]], [[Участник:BDA|Богомолов Д. А.]].&lt;br /&gt;
&lt;br /&gt;
== Свойства и структура алгоритма ==&lt;br /&gt;
=== Общее описание алгоритма ===&lt;br /&gt;
&lt;br /&gt;
Ортогонализация ― алгоритм построения для данной линейно независимой системы векторов евклидова или эрмитова пространства V ортогональной системы ненулевых векторов, порождающих то же самое подпространство в V.&lt;br /&gt;
&lt;br /&gt;
Ортогонализация Грама–Шмидта&amp;lt;ref&amp;gt;Канатников А.Н., Крищенко А.П. &amp;quot;Линейная алгебра.&amp;quot; ― 3-е изд., стер. ― М.: Изд-во МГТУ им. Н.Э. Баумана, 2002&amp;lt;/ref&amp;gt; (процесс Грама–Шмидта) ― наиболее известный алгоритм ортогонализации. Назван в честь Йоргена Педерсена Грама&amp;lt;ref&amp;gt;O&#039;Connor, John J.; Robertson, Edmund F., &amp;quot;Jørgen Pedersen Gram&amp;quot;, MacTutor History of Mathematics archive, University of St Andrews.&amp;lt;/ref&amp;gt; и Эрхарда Шмидта&amp;lt;ref&amp;gt;O&#039;Connor, John J.; Robertson, Edmund F., &amp;quot;Erhard Schmidt&amp;quot;, MacTutor History of Mathematics archive, University of St Andrews.&amp;lt;/ref&amp;gt;, однако ранее уже появлялся в работах Лапласа и Коши. Является частным случаем разложения Ивасавы, так как может быть представлен как разложение невырожденной квадратной матрицы в произведение ортогональной (или унитарной матрицы в случае эрмитова пространства) и верхнетреугольной матрицы с положительными диагональными элементами.&lt;br /&gt;
&lt;br /&gt;
Рассматриваемый алгоритм применяется для борьбы с помехами в адаптивной системе селекции движущихся целей&amp;lt;ref&amp;gt;Орешкин Б.Н., Бакулев П.А. &amp;quot;Быстрая процедура ортогонализации Грамма–Шмидта и ее применение для борьбы с помехами в адаптивной системе селекции движущихся целей&amp;quot; ― Радиотехника / №12 за 2007 г.&amp;lt;/ref&amp;gt;, в протоколах безопасности&amp;lt;ref&amp;gt;Пискова А.В., Менщиков А.А., Коробейников А.Г. &amp;quot;Использование ортогонализации Грама-Шмидта в алгоритме приведения базиса решетки для протоколов безопасности&amp;quot; ― Вопросы кибербезопасности №1(14) 2016&amp;lt;/ref&amp;gt;, для повышения экономичности алгоритмов оценивания параметров моделей объектов управления&amp;lt;ref&amp;gt;Карелин А.Е., Светлаков А.А. &amp;quot;Использование ортогонализации Грама-Шмидта для повышения экономичности многоточечных алгоритмов рекуррентного оценивания параметров моделей объектов управления&amp;quot; ― Известия Томского политехнического университета [Известия ТПУ]. — 2006. — Т. 309, № 8. — [С. 15-19].&amp;lt;/ref&amp;gt; и в других областях.&lt;br /&gt;
&lt;br /&gt;
=== Математическое описание алгоритма ===&lt;br /&gt;
&#039;&#039;&#039;Входные данные.&#039;&#039;&#039; &amp;lt;math&amp;gt;m&amp;lt;/math&amp;gt; линейно независимых векторов &amp;lt;math&amp;gt;\mathbf{a}_1,...,\mathbf{a}_m&amp;lt;/math&amp;gt; c размерностью пространства &amp;lt;math&amp;gt;n&amp;lt;/math&amp;gt;, записанных в матрице &amp;lt;math&amp;gt;A&amp;lt;/math&amp;gt; с элементами &amp;lt;math&amp;gt;\alpha_{ij}&amp;lt;/math&amp;gt;.&lt;br /&gt;
&lt;br /&gt;
&#039;&#039;&#039;Выходные данные.&#039;&#039;&#039; &amp;lt;math&amp;gt;m&amp;lt;/math&amp;gt; ортогональных векторов &amp;lt;math&amp;gt;\mathbf{b}_1,...,\mathbf{b}_m&amp;lt;/math&amp;gt; c размерностью пространства &amp;lt;math&amp;gt;n&amp;lt;/math&amp;gt;, записанных в матрице &amp;lt;math&amp;gt;B&amp;lt;/math&amp;gt; с элементами &amp;lt;math&amp;gt;\beta_{ij}&amp;lt;/math&amp;gt;.&lt;br /&gt;
&lt;br /&gt;
Определим оператор проекции (проецирует вектор &amp;lt;math&amp;gt;\mathbf{a}&amp;lt;/math&amp;gt; коллинеарно вектору &amp;lt;math&amp;gt;\mathbf{b}&amp;lt;/math&amp;gt;) &amp;lt;math&amp;gt;\mathbf{proj_b a = \frac{\left \langle a,b \right \rangle}{\left \langle b,b \right \rangle }b}&amp;lt;/math&amp;gt;, где &amp;lt;math&amp;gt;\mathbf{\left \langle a,b \right \rangle}&amp;lt;/math&amp;gt; ― скалярное произведение векторов &amp;lt;math&amp;gt;\mathbf{a}&amp;lt;/math&amp;gt; и &amp;lt;math&amp;gt;\mathbf{b}&amp;lt;/math&amp;gt;.&lt;br /&gt;
&lt;br /&gt;
Тогда ортогональные векторы вычисляются следующим образом:&lt;br /&gt;
&lt;br /&gt;
&amp;lt;math&amp;gt;\mathbf{b}_1 = \mathbf{a}_1&amp;lt;/math&amp;gt;&lt;br /&gt;
&lt;br /&gt;
&amp;lt;math&amp;gt;\mathbf{b}_2 = \mathbf{a}_2 - \mathbf{proj}_{\mathbf{b}_1} \mathbf{a}_2 &amp;lt;/math&amp;gt;&lt;br /&gt;
&lt;br /&gt;
&amp;lt;math&amp;gt;\mathbf{b}_3 = \mathbf{a}_3 - \mathbf{proj}_{\mathbf{b}_1} \mathbf{a}_3 - \mathbf{proj}_{\mathbf{b}_2} \mathbf{a}_3 &amp;lt;/math&amp;gt;&lt;br /&gt;
&lt;br /&gt;
&amp;lt;math&amp;gt;\vdots&amp;lt;/math&amp;gt;&lt;br /&gt;
&lt;br /&gt;
&amp;lt;math&amp;gt;\mathbf{b}_m = \mathbf{a}_m - \sum_{j=1}^{m-1} \mathbf{proj}_{\mathbf{b}_j} \mathbf{a}_m&amp;lt;/math&amp;gt;&lt;br /&gt;
&lt;br /&gt;
Или поэлементно:&lt;br /&gt;
&lt;br /&gt;
&amp;lt;math&amp;gt;\beta_{1j} = \alpha_{1j}&amp;lt;/math&amp;gt;&lt;br /&gt;
&lt;br /&gt;
&amp;lt;math&amp;gt;\beta_{ij} = \alpha_{ij} - (\sum_{k=1}^{i-1} \mathbf{proj}_{\mathbf{b}_k} \mathbf{a}_i)_j = \alpha_{ij} - \sum_{k=1}^{i-1}\frac{\sum_{s=1}^{n}\alpha_{is}\beta_{ks}}{\sum_{s=1}^{n}\beta_{ks}\beta_{ks}}\beta_{kj} &amp;lt;/math&amp;gt;&lt;br /&gt;
&lt;br /&gt;
=== Вычислительное ядро алгоритма ===&lt;br /&gt;
Основное время работы алгоритма приходится на вычисление сумм &amp;lt;math&amp;gt;\sum_{i=1}^{j-1} \mathbf{proj}_{\mathbf{b}_i} \mathbf{a}_k \forall j: j=\overline{1, m}&amp;lt;/math&amp;gt;.&lt;br /&gt;
&lt;br /&gt;
=== Макроструктура алгоритма ===&lt;br /&gt;
Из описания алгоритма в предыдущих разделов следует, что основную часть данного метода составляют операции вычисления проекций векторов, а также их сумм.&lt;br /&gt;
&lt;br /&gt;
=== Схема реализации последовательного алгоритма ===&lt;br /&gt;
Рассмотрим алгоритм, написанный в виде функции для математической системы MATLAB.&lt;br /&gt;
&lt;br /&gt;
&#039;&#039;&#039;Входные данные.&#039;&#039;&#039;&lt;br /&gt;
&lt;br /&gt;
Матрица &amp;lt;math&amp;gt;A&amp;lt;/math&amp;gt; с линейно-независимыми векторами в столбцах.&lt;br /&gt;
&lt;br /&gt;
&#039;&#039;&#039;Выходные данные.&#039;&#039;&#039;&lt;br /&gt;
&lt;br /&gt;
Матрица &amp;lt;math&amp;gt;Q&amp;lt;/math&amp;gt; с ортонормированным базисом &amp;lt;math&amp;gt;A&amp;lt;/math&amp;gt;.&lt;br /&gt;
&lt;br /&gt;
&#039;&#039;&#039;Использование.&#039;&#039;&#039;&lt;br /&gt;
&amp;lt;source lang=&amp;quot;matlab&amp;quot;&amp;gt;&lt;br /&gt;
Q = gramschmidt( A );&lt;br /&gt;
&amp;lt;/source&amp;gt;&lt;br /&gt;
&lt;br /&gt;
&#039;&#039;&#039;Реализация.&#039;&#039;&#039;&lt;br /&gt;
&amp;lt;source lang=&amp;quot;matlab&amp;quot;&amp;gt;&lt;br /&gt;
function Q = gramschmidt( A )&lt;br /&gt;
% Число векторов.&lt;br /&gt;
n = size( A, 2 );&lt;br /&gt;
 &lt;br /&gt;
% Инициализируем выходную матрицу.&lt;br /&gt;
Q = zeros( n );&lt;br /&gt;
 &lt;br /&gt;
% Преобразуем каждый вектор в базисный:&lt;br /&gt;
% (1) j-ый базисный вектор будет ортогонален каждому из предыдущих 1..j-1 векторов;&lt;br /&gt;
% (2) будет единичной длины.&lt;br /&gt;
for j = 1 : n&lt;br /&gt;
    % Выбираем j-ый вектор&lt;br /&gt;
    u = A( :, j );&lt;br /&gt;
    &lt;br /&gt;
    % Специальный случай для j = 1: просто нормируем этот вектор и помещаем&lt;br /&gt;
    % первым в найденный базис, так как нет векторов, относительно которых&lt;br /&gt;
    % нужно было бы делать его ортогональным.&lt;br /&gt;
&lt;br /&gt;
    % Удаляем из оригинального вектора &amp;quot;u&amp;quot; все компоненты натянутые на базис&lt;br /&gt;
    % из векторов 1..j-1, их вклад будет удален.&lt;br /&gt;
    % =&amp;gt; j-ый вектор ортогонален остальным.&lt;br /&gt;
    % Предыдущие базисные вектора были найдены на предыдуших шагах.&lt;br /&gt;
    % =&amp;gt; соблюдаем принцип ортогональности, но не ортонормированности.&lt;br /&gt;
    for i = 1 : j - 1&lt;br /&gt;
        u = u - proj( Q(:,i), A(:,j) );&lt;br /&gt;
    end&lt;br /&gt;
     &lt;br /&gt;
    % Нормируем вектор&lt;br /&gt;
    Q(:,j) = u ./ norm( u );&lt;br /&gt;
end&lt;br /&gt;
end&lt;br /&gt;
 &lt;br /&gt;
% Проекция вектора &amp;quot;a&amp;quot; коллинеарно вектору &amp;quot;e&amp;quot;.&lt;br /&gt;
function p = proj( e, a )&lt;br /&gt;
p = (e&#039; * a) / (e&#039; * e) .* e;&lt;br /&gt;
end&lt;br /&gt;
&amp;lt;/source&amp;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;.&lt;br /&gt;
&lt;br /&gt;
# Скалярное произведение векторов требует &amp;lt;math&amp;gt;n-1&amp;lt;/math&amp;gt; сложение и &amp;lt;math&amp;gt;n&amp;lt;/math&amp;gt; произведений.&lt;br /&gt;
# Вычитание проекции вектора требует &amp;lt;math&amp;gt;2&amp;lt;/math&amp;gt; скалярных произведения, &amp;lt;math&amp;gt;1&amp;lt;/math&amp;gt; деление, &amp;lt;math&amp;gt;n&amp;lt;/math&amp;gt; умножений и &amp;lt;math&amp;gt;n&amp;lt;/math&amp;gt; сложений, то есть:&lt;br /&gt;
## &amp;lt;math&amp;gt;3n-2&amp;lt;/math&amp;gt; (&amp;lt;math&amp;gt;+&amp;lt;/math&amp;gt;);&lt;br /&gt;
## &amp;lt;math&amp;gt;3n&amp;lt;/math&amp;gt; (&amp;lt;math&amp;gt;\times&amp;lt;/math&amp;gt;);&lt;br /&gt;
## &amp;lt;math&amp;gt;1&amp;lt;/math&amp;gt; (&amp;lt;math&amp;gt;\div&amp;lt;/math&amp;gt;).&lt;br /&gt;
# Вычисление &amp;lt;math&amp;gt;i&amp;lt;/math&amp;gt;-го вектора требует &amp;lt;math&amp;gt;i-1&amp;lt;/math&amp;gt; вычитаний проекций, то есть:&lt;br /&gt;
## &amp;lt;math&amp;gt;(3n-2)(i-1)&amp;lt;/math&amp;gt; (&amp;lt;math&amp;gt;+&amp;lt;/math&amp;gt;);&lt;br /&gt;
## &amp;lt;math&amp;gt;3n(i-1)&amp;lt;/math&amp;gt; (&amp;lt;math&amp;gt;\times&amp;lt;/math&amp;gt;);&lt;br /&gt;
## &amp;lt;math&amp;gt;i-1&amp;lt;/math&amp;gt; (&amp;lt;math&amp;gt;\div&amp;lt;/math&amp;gt;).&lt;br /&gt;
# Мы вычисляем вектора от &amp;lt;math&amp;gt;i=1&amp;lt;/math&amp;gt; до &amp;lt;math&amp;gt;m&amp;lt;/math&amp;gt;, поэтому множители &amp;lt;math&amp;gt;(i-1)&amp;lt;/math&amp;gt; выражаются &#039;&#039;треугольным числом&#039;&#039; &amp;lt;math&amp;gt;(m-1)\frac{m}{2}&amp;lt;/math&amp;gt;.&lt;br /&gt;
## &amp;lt;math&amp;gt;(3n-2)(m-1)\frac{m}{2}&amp;lt;/math&amp;gt; (&amp;lt;math&amp;gt;+&amp;lt;/math&amp;gt;);&lt;br /&gt;
## &amp;lt;math&amp;gt;3n(m-1)\frac{m}{2}&amp;lt;/math&amp;gt; (&amp;lt;math&amp;gt;\times&amp;lt;/math&amp;gt;);&lt;br /&gt;
## &amp;lt;math&amp;gt;(m-1)\frac{m}{2}&amp;lt;/math&amp;gt; (&amp;lt;math&amp;gt;\div&amp;lt;/math&amp;gt;).&lt;br /&gt;
&lt;br /&gt;
Таким образом, cложность алгоритма &amp;lt;math&amp;gt;O(nm^2)&amp;lt;/math&amp;gt;.&lt;br /&gt;
&lt;br /&gt;
=== Информационный граф ===&lt;br /&gt;
Граф состоит из элементов 2 видов: прямоугольников и овалов. Прямоугольниками обозначаются данные, причем красному цвету соответствуют входные данные, а зеленому - выходные. Овалы означают операции над переданными данными. Голубым цветом обозначены более сложно организованные операции, а синим - менее. Для нахождения &amp;lt;math&amp;gt;\mathbf{b}_i&amp;lt;/math&amp;gt; вектора требуются значения всех векторов с номерами, меньшими &amp;lt;math&amp;gt;i&amp;lt;/math&amp;gt;, однако, расчеты проекций можно начинать, не дожидаясь вычисления всех векторов, а производить сразу, как только соответствующий ортогональный вектор будет рассчитан.&lt;br /&gt;
[[Файл:Gram_schmidt_graph.png|thumb|800px|center|frame|Информационный граф алгоритма Грама-Шмидта]]&lt;br /&gt;
&lt;br /&gt;
=== Ресурс параллелизма алгоритма ===&lt;br /&gt;
*&lt;br /&gt;
=== Входные и выходные данные алгоритма ===&lt;br /&gt;
&#039;&#039;&#039;Входные данные.&#039;&#039;&#039; Матрица &amp;lt;math&amp;gt;A&amp;lt;/math&amp;gt; с элементами &amp;lt;math&amp;gt;\alpha_{ij}&amp;lt;/math&amp;gt;, где &amp;lt;math&amp;gt;i = \overline{1, m}&amp;lt;/math&amp;gt; (количество линейно независимых векторов) и &amp;lt;math&amp;gt;j = \overline{1, n}&amp;lt;/math&amp;gt; (размерность пространства), при этом &amp;lt;math&amp;gt;m \leqslant n&amp;lt;/math&amp;gt;.&lt;br /&gt;
&lt;br /&gt;
&#039;&#039;&#039;Объем входных данных.&#039;&#039;&#039; &amp;lt;math&amp;gt;mn&amp;lt;/math&amp;gt;&lt;br /&gt;
&lt;br /&gt;
&#039;&#039;&#039;Выходные данные.&#039;&#039;&#039; Матрица &amp;lt;math&amp;gt;B&amp;lt;/math&amp;gt; с элементами &amp;lt;math&amp;gt;\beta_{ij}&amp;lt;/math&amp;gt;, где &amp;lt;math&amp;gt;i = \overline{1, m}&amp;lt;/math&amp;gt; и &amp;lt;math&amp;gt;j = \overline{1, n}&amp;lt;/math&amp;gt;, тогда &amp;lt;math&amp;gt;b_{1}, \dots, b_{m}&amp;lt;/math&amp;gt; — система ортогональных векторов.&lt;br /&gt;
&lt;br /&gt;
&#039;&#039;&#039;Объем выходных данных.&#039;&#039;&#039; &amp;lt;math&amp;gt;mn&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;
Однако, возможно накопление ошибок округления, то есть векторы выходной матрицы часто не точно ортогональны. Из-за потери ортогональности в процессе вычислений классический процесс Грама-Шмидта называют численно неустойчивым.&lt;br /&gt;
&lt;br /&gt;
Процесс Грама-Шмидта может быть сделан более вычислительно устойчивым путём небольшой модификации. Такой алгоритм называется модифицированным процессом Грама-Шмидта.&lt;br /&gt;
&lt;br /&gt;
Процесс Грама-Шмидта может применяться также к бесконечной последовательности линейно независимых векторов.&lt;br /&gt;
&lt;br /&gt;
Процесс Грама-Шмидта может применяться к линейно зависимым векторам. В этом случае он выдаёт &amp;lt;math&amp;gt;\mathbf{0}&amp;lt;/math&amp;gt; (нулевой вектор) на шаге &amp;lt;math&amp;gt;j&amp;lt;/math&amp;gt;, если &amp;lt;math&amp;gt;\mathbf{a}_j&amp;lt;/math&amp;gt; является линейной комбинацией векторов &amp;lt;math&amp;gt;\mathbf{a}_1,\;\ldots,\;\mathbf{a}_{j-1}&amp;lt;/math&amp;gt;. Если это может случиться, то для сохранения ортогональности выходных векторов и для предотвращения деления на ноль при ортонормировании алгоритм должен делать проверку на нулевые векторы и отбрасывать их. Количество векторов, выдаваемых алгоритмом, будет равно размерности подпространства, порождённого векторами (то есть количеству линейно независимых векторов, которые можно выделить среди исходных векторов).&lt;br /&gt;
&lt;br /&gt;
Процесс Грама-Шмидта может быть истолкован как разложение невырожденной квадратной матрицы в произведение ортогональной (или унитарной матрицы в случае эрмитова пространства) и верхнетреугольной матрицы с положительными диагональными элементами -- QR-разложение.&lt;br /&gt;
&lt;br /&gt;
== Программная реализация алгоритма ==&lt;br /&gt;
=== Особенности реализации последовательного алгоритма ===&lt;br /&gt;
=== Локальность данных и вычислений ===&lt;br /&gt;
=== Возможные способы и особенности параллельной реализации алгоритма ===&lt;br /&gt;
=== Масштабируемость алгоритма и его реализации ===&lt;br /&gt;
&#039;&#039;Срок сдачи продлен до 15 ноября.&#039;&#039;&lt;br /&gt;
=== Динамические характеристики и эффективность реализации алгоритма ===&lt;br /&gt;
=== Выводы для классов архитектур ===&lt;br /&gt;
=== Существующие реализации алгоритма ===&lt;br /&gt;
Данный алгоритм реализован во множестве библиотек и математических программных пакетах.&lt;br /&gt;
&lt;br /&gt;
# Библиотека [https://github.com/open-epicycle/Epicycle.Math-cs Epicycle] (C#).&lt;br /&gt;
# Библиотека [http://www.spectralpython.net/ Spectral Python (SPy)].&lt;br /&gt;
# Библиотека [https://hackage.haskell.org/package/vect-0.4.7/docs/Data-Vect-Float-GramSchmidt.html vect] (Haskell).&lt;br /&gt;
&lt;br /&gt;
==== Пакет Mathematica ====&lt;br /&gt;
Приведем пример скрипта, предназначенного для пакета Mathematica, который проводит процесс ортогонализации Грама-Шмидта над векторами, заданными в фигурных скобках последней строки. Количество векторов и их координат могут быть произвольными. В данном случае для примера взяты векторы &amp;lt;math&amp;gt;\{-2,\;1,\;0\}&amp;lt;/math&amp;gt;, &amp;lt;math&amp;gt;\{-2,\;0,\;1\}&amp;lt;/math&amp;gt;, &amp;lt;math&amp;gt;\{-0{.}5,\;-1,\;1\}&amp;lt;/math&amp;gt;.&lt;br /&gt;
&amp;lt;source lang=&#039;mathematica&#039;&amp;gt;Projection[v1_, v2_] := (v1.v2*v2)/v2.v2&lt;br /&gt;
MultipleProjection[v1_, vecs_] := Plus @@ (Projection[v1, #1] &amp;amp;) /@ vecs&lt;br /&gt;
GramSchmidt[mat_] := Fold[Join[#1, {#2 - MultipleProjection[#2, #1]}] &amp;amp;, {}, mat]&lt;br /&gt;
GramSchmidt[{{-2, 1, 0}, {-2, 0, 1}, {-0.5, -1, 1}}]&amp;lt;/source&amp;gt;&lt;br /&gt;
&lt;br /&gt;
==== Пакет Maxima ====&lt;br /&gt;
Приведем пример скрипта, предназначенного для пакета Maxima, который проводит процесс ортогонализации Грама-Шмидта над векторами, заданными в фигурных скобках последней строки. Количество векторов и их координат могут быть произвольными. В данном случае для примера взяты векторы &amp;lt;math&amp;gt;\{-2,\;1,\;0\}&amp;lt;/math&amp;gt;, &amp;lt;math&amp;gt;\{-2,\;0,\;1\}&amp;lt;/math&amp;gt;, &amp;lt;math&amp;gt;\{-0{.}5,\;-1,\;1\}&amp;lt;/math&amp;gt;.&lt;br /&gt;
&amp;lt;source lang=&#039;maxima&#039;&amp;gt;&lt;br /&gt;
load(eigen);&lt;br /&gt;
x: matrix ([-2,1,0],[-2,0,1],[-0.5,-1,1]);&lt;br /&gt;
y: gramschmidt(x);&lt;br /&gt;
&amp;lt;/source&amp;gt;&lt;br /&gt;
&lt;br /&gt;
==== Пакет MATLAB ====&lt;br /&gt;
Приведем пример скрипта, предназначенного для пакета MATLAB, который проводит процесс ортогонализации Грама-Шмидта над векторами, заданными в фигурных скобках последней строки. В данном пакете уже существует функция, которая осуществляет данный процесс. Столбцы входной матрицы предполагаются линейно-независимыми, количество векторов и их координат могут быть произвольными. Функция возращает матрицу X с ортонормированными столбцами и обратимую верхне-треугольную матрицу Y.&lt;br /&gt;
&lt;br /&gt;
В данном случае для примера взяты векторы &amp;lt;math&amp;gt;\{-2,\;1,\;0\}&amp;lt;/math&amp;gt;, &amp;lt;math&amp;gt;\{-2,\;0,\;1\}&amp;lt;/math&amp;gt;, &amp;lt;math&amp;gt;\{-0{.}5,\;-1,\;1\}&amp;lt;/math&amp;gt;.&lt;br /&gt;
&amp;lt;source lang=&#039;matlab&#039;&amp;gt;&lt;br /&gt;
[x y]=gschmidt([-2 1 0; -2 0 1; -0.5 -1 1])&lt;br /&gt;
&amp;lt;/source&amp;gt;&lt;br /&gt;
&lt;br /&gt;
== Литература ==&lt;/div&gt;</summary>
		<author><name>BDA</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:BDA/%D0%9E%D1%80%D1%82%D0%BE%D0%B3%D0%BE%D0%BD%D0%B0%D0%BB%D0%B8%D0%B7%D0%B0%D1%86%D0%B8%D1%8F_%D0%93%D1%80%D0%B0%D0%BC%D0%B0-%D0%A8%D0%BC%D0%B8%D0%B4%D1%82%D0%B0&amp;diff=14749</id>
		<title>Участник:BDA/Ортогонализация Грама-Шмидта</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:BDA/%D0%9E%D1%80%D1%82%D0%BE%D0%B3%D0%BE%D0%BD%D0%B0%D0%BB%D0%B8%D0%B7%D0%B0%D1%86%D0%B8%D1%8F_%D0%93%D1%80%D0%B0%D0%BC%D0%B0-%D0%A8%D0%BC%D0%B8%D0%B4%D1%82%D0%B0&amp;diff=14749"/>
		<updated>2016-10-29T22:13:17Z</updated>

		<summary type="html">&lt;p&gt;BDA: /* Информационный граф */&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(nm^2)&amp;lt;/math&amp;gt;&lt;br /&gt;
| pf_height         = &amp;lt;math&amp;gt;?&amp;lt;/math&amp;gt;&lt;br /&gt;
| pf_width          = &amp;lt;math&amp;gt;?&amp;lt;/math&amp;gt;&lt;br /&gt;
| input_data        = &amp;lt;math&amp;gt;nm&amp;lt;/math&amp;gt;&lt;br /&gt;
| output_data       = &amp;lt;math&amp;gt;nm&amp;lt;/math&amp;gt;&lt;br /&gt;
}}&lt;br /&gt;
&lt;br /&gt;
Основные авторы описания: [[Участник:Zodiac|Белов Н. А.]], [[Участник:BDA|Богомолов Д. А.]].&lt;br /&gt;
&lt;br /&gt;
== Свойства и структура алгоритма ==&lt;br /&gt;
=== Общее описание алгоритма ===&lt;br /&gt;
&lt;br /&gt;
Ортогонализация ― алгоритм построения для данной линейно независимой системы векторов евклидова или эрмитова пространства V ортогональной системы ненулевых векторов, порождающих то же самое подпространство в V.&lt;br /&gt;
&lt;br /&gt;
Ортогонализация Грама–Шмидта&amp;lt;ref&amp;gt;Канатников А.Н., Крищенко А.П. &amp;quot;Линейная алгебра.&amp;quot; ― 3-е изд., стер. ― М.: Изд-во МГТУ им. Н.Э. Баумана, 2002&amp;lt;/ref&amp;gt; (процесс Грама–Шмидта) ― наиболее известный алгоритм ортогонализации. Назван в честь Йоргена Педерсена Грама&amp;lt;ref&amp;gt;O&#039;Connor, John J.; Robertson, Edmund F., &amp;quot;Jørgen Pedersen Gram&amp;quot;, MacTutor History of Mathematics archive, University of St Andrews.&amp;lt;/ref&amp;gt; и Эрхарда Шмидта&amp;lt;ref&amp;gt;O&#039;Connor, John J.; Robertson, Edmund F., &amp;quot;Erhard Schmidt&amp;quot;, MacTutor History of Mathematics archive, University of St Andrews.&amp;lt;/ref&amp;gt;, однако ранее уже появлялся в работах Лапласа и Коши. Является частным случаем разложения Ивасавы, так как может быть представлен как разложение невырожденной квадратной матрицы в произведение ортогональной (или унитарной матрицы в случае эрмитова пространства) и верхнетреугольной матрицы с положительными диагональными элементами.&lt;br /&gt;
&lt;br /&gt;
Рассматриваемый алгоритм применяется для борьбы с помехами в адаптивной системе селекции движущихся целей&amp;lt;ref&amp;gt;Орешкин Б.Н., Бакулев П.А. &amp;quot;Быстрая процедура ортогонализации Грамма–Шмидта и ее применение для борьбы с помехами в адаптивной системе селекции движущихся целей&amp;quot; ― Радиотехника / №12 за 2007 г.&amp;lt;/ref&amp;gt;, в протоколах безопасности&amp;lt;ref&amp;gt;Пискова А.В., Менщиков А.А., Коробейников А.Г. &amp;quot;Использование ортогонализации Грама-Шмидта в алгоритме приведения базиса решетки для протоколов безопасности&amp;quot; ― Вопросы кибербезопасности №1(14) 2016&amp;lt;/ref&amp;gt;, для повышения экономичности алгоритмов оценивания параметров моделей объектов управления&amp;lt;ref&amp;gt;Карелин А.Е., Светлаков А.А. &amp;quot;Использование ортогонализации Грама-Шмидта для повышения экономичности многоточечных алгоритмов рекуррентного оценивания параметров моделей объектов управления&amp;quot; ― Известия Томского политехнического университета [Известия ТПУ]. — 2006. — Т. 309, № 8. — [С. 15-19].&amp;lt;/ref&amp;gt; и в других областях.&lt;br /&gt;
&lt;br /&gt;
=== Математическое описание алгоритма ===&lt;br /&gt;
&#039;&#039;&#039;Входные данные.&#039;&#039;&#039; &amp;lt;math&amp;gt;m&amp;lt;/math&amp;gt; линейно независимых векторов &amp;lt;math&amp;gt;\mathbf{a}_1,...,\mathbf{a}_m&amp;lt;/math&amp;gt; c размерностью пространства &amp;lt;math&amp;gt;n&amp;lt;/math&amp;gt;, записанных в матрице &amp;lt;math&amp;gt;A&amp;lt;/math&amp;gt; с элементами &amp;lt;math&amp;gt;\alpha_{ij}&amp;lt;/math&amp;gt;.&lt;br /&gt;
&lt;br /&gt;
&#039;&#039;&#039;Выходные данные.&#039;&#039;&#039; &amp;lt;math&amp;gt;m&amp;lt;/math&amp;gt; ортогональных векторов &amp;lt;math&amp;gt;\mathbf{b}_1,...,\mathbf{b}_m&amp;lt;/math&amp;gt; c размерностью пространства &amp;lt;math&amp;gt;n&amp;lt;/math&amp;gt;, записанных в матрице &amp;lt;math&amp;gt;B&amp;lt;/math&amp;gt; с элементами &amp;lt;math&amp;gt;\beta_{ij}&amp;lt;/math&amp;gt;.&lt;br /&gt;
&lt;br /&gt;
Определим оператор проекции (проецирует вектор &amp;lt;math&amp;gt;\mathbf{a}&amp;lt;/math&amp;gt; коллинеарно вектору &amp;lt;math&amp;gt;\mathbf{b}&amp;lt;/math&amp;gt;) &amp;lt;math&amp;gt;\mathbf{proj_b a = \frac{\left \langle a,b \right \rangle}{\left \langle b,b \right \rangle }b}&amp;lt;/math&amp;gt;, где &amp;lt;math&amp;gt;\mathbf{\left \langle a,b \right \rangle}&amp;lt;/math&amp;gt; ― скалярное произведение векторов &amp;lt;math&amp;gt;\mathbf{a}&amp;lt;/math&amp;gt; и &amp;lt;math&amp;gt;\mathbf{b}&amp;lt;/math&amp;gt;.&lt;br /&gt;
&lt;br /&gt;
Тогда ортогональные векторы вычисляются следующим образом:&lt;br /&gt;
&lt;br /&gt;
&amp;lt;math&amp;gt;\mathbf{b}_1 = \mathbf{a}_1&amp;lt;/math&amp;gt;&lt;br /&gt;
&lt;br /&gt;
&amp;lt;math&amp;gt;\mathbf{b}_2 = \mathbf{a}_2 - \mathbf{proj}_{\mathbf{b}_1} \mathbf{a}_2 &amp;lt;/math&amp;gt;&lt;br /&gt;
&lt;br /&gt;
&amp;lt;math&amp;gt;\mathbf{b}_3 = \mathbf{a}_3 - \mathbf{proj}_{\mathbf{b}_1} \mathbf{a}_3 - \mathbf{proj}_{\mathbf{b}_2} \mathbf{a}_3 &amp;lt;/math&amp;gt;&lt;br /&gt;
&lt;br /&gt;
&amp;lt;math&amp;gt;\vdots&amp;lt;/math&amp;gt;&lt;br /&gt;
&lt;br /&gt;
&amp;lt;math&amp;gt;\mathbf{b}_m = \mathbf{a}_m - \sum_{j=1}^{m-1} \mathbf{proj}_{\mathbf{b}_j} \mathbf{a}_m&amp;lt;/math&amp;gt;&lt;br /&gt;
&lt;br /&gt;
Или поэлементно:&lt;br /&gt;
&lt;br /&gt;
&amp;lt;math&amp;gt;\beta_{1j} = \alpha_{1j}&amp;lt;/math&amp;gt;&lt;br /&gt;
&lt;br /&gt;
&amp;lt;math&amp;gt;\beta_{ij} = \alpha_{ij} - (\sum_{k=1}^{i-1} \mathbf{proj}_{\mathbf{b}_k} \mathbf{a}_i)_j = \alpha_{ij} - \sum_{k=1}^{i-1}\frac{\sum_{s=1}^{n}\alpha_{is}\beta_{ks}}{\sum_{s=1}^{n}\beta_{ks}\beta_{ks}}\beta_{kj} &amp;lt;/math&amp;gt;&lt;br /&gt;
&lt;br /&gt;
=== Вычислительное ядро алгоритма ===&lt;br /&gt;
Основное время работы алгоритма приходится на вычисление сумм &amp;lt;math&amp;gt;\sum_{i=1}^{j-1} \mathbf{proj}_{\mathbf{b}_i} \mathbf{a}_k \forall j: j=\overline{1, m}&amp;lt;/math&amp;gt;.&lt;br /&gt;
&lt;br /&gt;
=== Макроструктура алгоритма ===&lt;br /&gt;
Из описания алгоритма в предыдущих разделов следует, что основную часть данного метода составляют операции вычисления проекций векторов, а также их сумм.&lt;br /&gt;
&lt;br /&gt;
=== Схема реализации последовательного алгоритма ===&lt;br /&gt;
Рассмотрим алгоритм, написанный в виде функции для математической системы MATLAB.&lt;br /&gt;
&lt;br /&gt;
&#039;&#039;&#039;Входные данные.&#039;&#039;&#039;&lt;br /&gt;
&lt;br /&gt;
Матрица &amp;lt;math&amp;gt;A&amp;lt;/math&amp;gt; с линейно-независимыми векторами в столбцах.&lt;br /&gt;
&lt;br /&gt;
&#039;&#039;&#039;Выходные данные.&#039;&#039;&#039;&lt;br /&gt;
&lt;br /&gt;
Матрица &amp;lt;math&amp;gt;Q&amp;lt;/math&amp;gt; с ортонормированным базисом &amp;lt;math&amp;gt;A&amp;lt;/math&amp;gt;.&lt;br /&gt;
&lt;br /&gt;
&#039;&#039;&#039;Использование.&#039;&#039;&#039;&lt;br /&gt;
&amp;lt;source lang=&amp;quot;matlab&amp;quot;&amp;gt;&lt;br /&gt;
Q = gramschmidt( A );&lt;br /&gt;
&amp;lt;/source&amp;gt;&lt;br /&gt;
&lt;br /&gt;
&#039;&#039;&#039;Реализация.&#039;&#039;&#039;&lt;br /&gt;
&amp;lt;source lang=&amp;quot;matlab&amp;quot;&amp;gt;&lt;br /&gt;
function Q = gramschmidt( A )&lt;br /&gt;
% Число векторов.&lt;br /&gt;
n = size( A, 2 );&lt;br /&gt;
 &lt;br /&gt;
% Инициализируем выходную матрицу.&lt;br /&gt;
Q = zeros( n );&lt;br /&gt;
 &lt;br /&gt;
% Преобразуем каждый вектор в базисный:&lt;br /&gt;
% (1) j-ый базисный вектор будет ортогонален каждому из предыдущих 1..j-1 векторов;&lt;br /&gt;
% (2) будет единичной длины.&lt;br /&gt;
for j = 1 : n&lt;br /&gt;
    % Выбираем j-ый вектор&lt;br /&gt;
    u = A( :, j );&lt;br /&gt;
    &lt;br /&gt;
    % Специальный случай для j = 1: просто нормируем этот вектор и помещаем&lt;br /&gt;
    % первым в найденный базис, так как нет векторов, относительно которых&lt;br /&gt;
    % нужно было бы делать его ортогональным.&lt;br /&gt;
&lt;br /&gt;
    % Удаляем из оригинального вектора &amp;quot;u&amp;quot; все компоненты натянутые на базис&lt;br /&gt;
    % из векторов 1..j-1, их вклад будет удален.&lt;br /&gt;
    % =&amp;gt; j-ый вектор ортогонален остальным.&lt;br /&gt;
    % Предыдущие базисные вектора были найдены на предыдуших шагах.&lt;br /&gt;
    % =&amp;gt; соблюдаем принцип ортогональности, но не ортонормированности.&lt;br /&gt;
    for i = 1 : j - 1&lt;br /&gt;
        u = u - proj( Q(:,i), A(:,j) );&lt;br /&gt;
    end&lt;br /&gt;
     &lt;br /&gt;
    % Нормируем вектор&lt;br /&gt;
    Q(:,j) = u ./ norm( u );&lt;br /&gt;
end&lt;br /&gt;
end&lt;br /&gt;
 &lt;br /&gt;
% Проекция вектора &amp;quot;a&amp;quot; коллинеарно вектору &amp;quot;e&amp;quot;.&lt;br /&gt;
function p = proj( e, a )&lt;br /&gt;
p = (e&#039; * a) / (e&#039; * e) .* e;&lt;br /&gt;
end&lt;br /&gt;
&amp;lt;/source&amp;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;.&lt;br /&gt;
&lt;br /&gt;
# Скалярное произведение векторов требует &amp;lt;math&amp;gt;n-1&amp;lt;/math&amp;gt; сложение и &amp;lt;math&amp;gt;n&amp;lt;/math&amp;gt; произведений.&lt;br /&gt;
# Вычитание проекции вектора требует &amp;lt;math&amp;gt;2&amp;lt;/math&amp;gt; скалярных произведения, &amp;lt;math&amp;gt;1&amp;lt;/math&amp;gt; деление, &amp;lt;math&amp;gt;n&amp;lt;/math&amp;gt; умножений и &amp;lt;math&amp;gt;n&amp;lt;/math&amp;gt; сложений, то есть:&lt;br /&gt;
## &amp;lt;math&amp;gt;3n-2&amp;lt;/math&amp;gt; (&amp;lt;math&amp;gt;+&amp;lt;/math&amp;gt;);&lt;br /&gt;
## &amp;lt;math&amp;gt;3n&amp;lt;/math&amp;gt; (&amp;lt;math&amp;gt;\times&amp;lt;/math&amp;gt;);&lt;br /&gt;
## &amp;lt;math&amp;gt;1&amp;lt;/math&amp;gt; (&amp;lt;math&amp;gt;\div&amp;lt;/math&amp;gt;).&lt;br /&gt;
# Вычисление &amp;lt;math&amp;gt;i&amp;lt;/math&amp;gt;-го вектора требует &amp;lt;math&amp;gt;i-1&amp;lt;/math&amp;gt; вычитаний проекций, то есть:&lt;br /&gt;
## &amp;lt;math&amp;gt;(3n-2)(i-1)&amp;lt;/math&amp;gt; (&amp;lt;math&amp;gt;+&amp;lt;/math&amp;gt;);&lt;br /&gt;
## &amp;lt;math&amp;gt;3n(i-1)&amp;lt;/math&amp;gt; (&amp;lt;math&amp;gt;\times&amp;lt;/math&amp;gt;);&lt;br /&gt;
## &amp;lt;math&amp;gt;i-1&amp;lt;/math&amp;gt; (&amp;lt;math&amp;gt;\div&amp;lt;/math&amp;gt;).&lt;br /&gt;
# Мы вычисляем вектора от &amp;lt;math&amp;gt;i=1&amp;lt;/math&amp;gt; до &amp;lt;math&amp;gt;m&amp;lt;/math&amp;gt;, поэтому множители &amp;lt;math&amp;gt;(i-1)&amp;lt;/math&amp;gt; выражаются &#039;&#039;треугольным числом&#039;&#039; &amp;lt;math&amp;gt;(m-1)\frac{m}{2}&amp;lt;/math&amp;gt;.&lt;br /&gt;
## &amp;lt;math&amp;gt;(3n-2)(m-1)\frac{m}{2}&amp;lt;/math&amp;gt; (&amp;lt;math&amp;gt;+&amp;lt;/math&amp;gt;);&lt;br /&gt;
## &amp;lt;math&amp;gt;3n(m-1)\frac{m}{2}&amp;lt;/math&amp;gt; (&amp;lt;math&amp;gt;\times&amp;lt;/math&amp;gt;);&lt;br /&gt;
## &amp;lt;math&amp;gt;(m-1)\frac{m}{2}&amp;lt;/math&amp;gt; (&amp;lt;math&amp;gt;\div&amp;lt;/math&amp;gt;).&lt;br /&gt;
&lt;br /&gt;
Таким образом, cложность алгоритма &amp;lt;math&amp;gt;O(nm^2)&amp;lt;/math&amp;gt;.&lt;br /&gt;
&lt;br /&gt;
=== Информационный граф ===&lt;br /&gt;
Граф состоит из элементов 2 видов: прямоугольников и овалов. Прямоугольниками обозначаются данные, причем красному цвету соответствуют входные данные, а зеленому - выходные. Овалы означают операции над переданными данными. Голубым цветом обозначены более сложно организованные операции, а синим - менее. Для нахождения &amp;lt;math&amp;gt;\mathbf{b}_i&amp;lt;/math&amp;gt; вектора требуются значения всех векторов с номерами, меньшими &amp;lt;math&amp;gt;\i&amp;lt;/math&amp;gt;, однако, расчеты проекций можно начинать, не дожидаясь вычисления всех векторов, а производить сразу, как только соответствующий ортогональный вектор будет рассчитан.&lt;br /&gt;
[[Файл:Gram_schmidt_graph.png|thumb|800px|center|frame|Информационный граф алгоритма Грама-Шмидта]]&lt;br /&gt;
&lt;br /&gt;
=== Ресурс параллелизма алгоритма ===&lt;br /&gt;
*&lt;br /&gt;
=== Входные и выходные данные алгоритма ===&lt;br /&gt;
&#039;&#039;&#039;Входные данные.&#039;&#039;&#039; Матрица &amp;lt;math&amp;gt;A&amp;lt;/math&amp;gt; с элементами &amp;lt;math&amp;gt;\alpha_{ij}&amp;lt;/math&amp;gt;, где &amp;lt;math&amp;gt;i = \overline{1, m}&amp;lt;/math&amp;gt; (количество линейно независимых векторов) и &amp;lt;math&amp;gt;j = \overline{1, n}&amp;lt;/math&amp;gt; (размерность пространства), при этом &amp;lt;math&amp;gt;m \leqslant n&amp;lt;/math&amp;gt;.&lt;br /&gt;
&lt;br /&gt;
&#039;&#039;&#039;Объем входных данных.&#039;&#039;&#039; &amp;lt;math&amp;gt;mn&amp;lt;/math&amp;gt;&lt;br /&gt;
&lt;br /&gt;
&#039;&#039;&#039;Выходные данные.&#039;&#039;&#039; Матрица &amp;lt;math&amp;gt;B&amp;lt;/math&amp;gt; с элементами &amp;lt;math&amp;gt;\beta_{ij}&amp;lt;/math&amp;gt;, где &amp;lt;math&amp;gt;i = \overline{1, m}&amp;lt;/math&amp;gt; и &amp;lt;math&amp;gt;j = \overline{1, n}&amp;lt;/math&amp;gt;, тогда &amp;lt;math&amp;gt;b_{1}, \dots, b_{m}&amp;lt;/math&amp;gt; — система ортогональных векторов.&lt;br /&gt;
&lt;br /&gt;
&#039;&#039;&#039;Объем выходных данных.&#039;&#039;&#039; &amp;lt;math&amp;gt;mn&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;
Однако, возможно накопление ошибок округления, то есть векторы выходной матрицы часто не точно ортогональны. Из-за потери ортогональности в процессе вычислений классический процесс Грама-Шмидта называют численно неустойчивым.&lt;br /&gt;
&lt;br /&gt;
Процесс Грама-Шмидта может быть сделан более вычислительно устойчивым путём небольшой модификации. Такой алгоритм называется модифицированным процессом Грама-Шмидта.&lt;br /&gt;
&lt;br /&gt;
Процесс Грама-Шмидта может применяться также к бесконечной последовательности линейно независимых векторов.&lt;br /&gt;
&lt;br /&gt;
Процесс Грама-Шмидта может применяться к линейно зависимым векторам. В этом случае он выдаёт &amp;lt;math&amp;gt;\mathbf{0}&amp;lt;/math&amp;gt; (нулевой вектор) на шаге &amp;lt;math&amp;gt;j&amp;lt;/math&amp;gt;, если &amp;lt;math&amp;gt;\mathbf{a}_j&amp;lt;/math&amp;gt; является линейной комбинацией векторов &amp;lt;math&amp;gt;\mathbf{a}_1,\;\ldots,\;\mathbf{a}_{j-1}&amp;lt;/math&amp;gt;. Если это может случиться, то для сохранения ортогональности выходных векторов и для предотвращения деления на ноль при ортонормировании алгоритм должен делать проверку на нулевые векторы и отбрасывать их. Количество векторов, выдаваемых алгоритмом, будет равно размерности подпространства, порождённого векторами (то есть количеству линейно независимых векторов, которые можно выделить среди исходных векторов).&lt;br /&gt;
&lt;br /&gt;
Процесс Грама-Шмидта может быть истолкован как разложение невырожденной квадратной матрицы в произведение ортогональной (или унитарной матрицы в случае эрмитова пространства) и верхнетреугольной матрицы с положительными диагональными элементами -- QR-разложение.&lt;br /&gt;
&lt;br /&gt;
== Программная реализация алгоритма ==&lt;br /&gt;
=== Особенности реализации последовательного алгоритма ===&lt;br /&gt;
=== Локальность данных и вычислений ===&lt;br /&gt;
=== Возможные способы и особенности параллельной реализации алгоритма ===&lt;br /&gt;
=== Масштабируемость алгоритма и его реализации ===&lt;br /&gt;
&#039;&#039;Срок сдачи продлен до 15 ноября.&#039;&#039;&lt;br /&gt;
=== Динамические характеристики и эффективность реализации алгоритма ===&lt;br /&gt;
=== Выводы для классов архитектур ===&lt;br /&gt;
=== Существующие реализации алгоритма ===&lt;br /&gt;
Данный алгоритм реализован во множестве библиотек и математических программных пакетах.&lt;br /&gt;
&lt;br /&gt;
# Библиотека [https://github.com/open-epicycle/Epicycle.Math-cs Epicycle] (C#).&lt;br /&gt;
# Библиотека [http://www.spectralpython.net/ Spectral Python (SPy)].&lt;br /&gt;
# Библиотека [https://hackage.haskell.org/package/vect-0.4.7/docs/Data-Vect-Float-GramSchmidt.html vect] (Haskell).&lt;br /&gt;
&lt;br /&gt;
==== Пакет Mathematica ====&lt;br /&gt;
Приведем пример скрипта, предназначенного для пакета Mathematica, который проводит процесс ортогонализации Грама-Шмидта над векторами, заданными в фигурных скобках последней строки. Количество векторов и их координат могут быть произвольными. В данном случае для примера взяты векторы &amp;lt;math&amp;gt;\{-2,\;1,\;0\}&amp;lt;/math&amp;gt;, &amp;lt;math&amp;gt;\{-2,\;0,\;1\}&amp;lt;/math&amp;gt;, &amp;lt;math&amp;gt;\{-0{.}5,\;-1,\;1\}&amp;lt;/math&amp;gt;.&lt;br /&gt;
&amp;lt;source lang=&#039;mathematica&#039;&amp;gt;Projection[v1_, v2_] := (v1.v2*v2)/v2.v2&lt;br /&gt;
MultipleProjection[v1_, vecs_] := Plus @@ (Projection[v1, #1] &amp;amp;) /@ vecs&lt;br /&gt;
GramSchmidt[mat_] := Fold[Join[#1, {#2 - MultipleProjection[#2, #1]}] &amp;amp;, {}, mat]&lt;br /&gt;
GramSchmidt[{{-2, 1, 0}, {-2, 0, 1}, {-0.5, -1, 1}}]&amp;lt;/source&amp;gt;&lt;br /&gt;
&lt;br /&gt;
==== Пакет Maxima ====&lt;br /&gt;
Приведем пример скрипта, предназначенного для пакета Maxima, который проводит процесс ортогонализации Грама-Шмидта над векторами, заданными в фигурных скобках последней строки. Количество векторов и их координат могут быть произвольными. В данном случае для примера взяты векторы &amp;lt;math&amp;gt;\{-2,\;1,\;0\}&amp;lt;/math&amp;gt;, &amp;lt;math&amp;gt;\{-2,\;0,\;1\}&amp;lt;/math&amp;gt;, &amp;lt;math&amp;gt;\{-0{.}5,\;-1,\;1\}&amp;lt;/math&amp;gt;.&lt;br /&gt;
&amp;lt;source lang=&#039;maxima&#039;&amp;gt;&lt;br /&gt;
load(eigen);&lt;br /&gt;
x: matrix ([-2,1,0],[-2,0,1],[-0.5,-1,1]);&lt;br /&gt;
y: gramschmidt(x);&lt;br /&gt;
&amp;lt;/source&amp;gt;&lt;br /&gt;
&lt;br /&gt;
==== Пакет MATLAB ====&lt;br /&gt;
Приведем пример скрипта, предназначенного для пакета MATLAB, который проводит процесс ортогонализации Грама-Шмидта над векторами, заданными в фигурных скобках последней строки. В данном пакете уже существует функция, которая осуществляет данный процесс. Столбцы входной матрицы предполагаются линейно-независимыми, количество векторов и их координат могут быть произвольными. Функция возращает матрицу X с ортонормированными столбцами и обратимую верхне-треугольную матрицу Y.&lt;br /&gt;
&lt;br /&gt;
В данном случае для примера взяты векторы &amp;lt;math&amp;gt;\{-2,\;1,\;0\}&amp;lt;/math&amp;gt;, &amp;lt;math&amp;gt;\{-2,\;0,\;1\}&amp;lt;/math&amp;gt;, &amp;lt;math&amp;gt;\{-0{.}5,\;-1,\;1\}&amp;lt;/math&amp;gt;.&lt;br /&gt;
&amp;lt;source lang=&#039;matlab&#039;&amp;gt;&lt;br /&gt;
[x y]=gschmidt([-2 1 0; -2 0 1; -0.5 -1 1])&lt;br /&gt;
&amp;lt;/source&amp;gt;&lt;br /&gt;
&lt;br /&gt;
== Литература ==&lt;/div&gt;</summary>
		<author><name>BDA</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:BDA/%D0%9E%D1%80%D1%82%D0%BE%D0%B3%D0%BE%D0%BD%D0%B0%D0%BB%D0%B8%D0%B7%D0%B0%D1%86%D0%B8%D1%8F_%D0%93%D1%80%D0%B0%D0%BC%D0%B0-%D0%A8%D0%BC%D0%B8%D0%B4%D1%82%D0%B0&amp;diff=14748</id>
		<title>Участник:BDA/Ортогонализация Грама-Шмидта</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:BDA/%D0%9E%D1%80%D1%82%D0%BE%D0%B3%D0%BE%D0%BD%D0%B0%D0%BB%D0%B8%D0%B7%D0%B0%D1%86%D0%B8%D1%8F_%D0%93%D1%80%D0%B0%D0%BC%D0%B0-%D0%A8%D0%BC%D0%B8%D0%B4%D1%82%D0%B0&amp;diff=14748"/>
		<updated>2016-10-29T22:12:59Z</updated>

		<summary type="html">&lt;p&gt;BDA: /* Информационный граф */&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(nm^2)&amp;lt;/math&amp;gt;&lt;br /&gt;
| pf_height         = &amp;lt;math&amp;gt;?&amp;lt;/math&amp;gt;&lt;br /&gt;
| pf_width          = &amp;lt;math&amp;gt;?&amp;lt;/math&amp;gt;&lt;br /&gt;
| input_data        = &amp;lt;math&amp;gt;nm&amp;lt;/math&amp;gt;&lt;br /&gt;
| output_data       = &amp;lt;math&amp;gt;nm&amp;lt;/math&amp;gt;&lt;br /&gt;
}}&lt;br /&gt;
&lt;br /&gt;
Основные авторы описания: [[Участник:Zodiac|Белов Н. А.]], [[Участник:BDA|Богомолов Д. А.]].&lt;br /&gt;
&lt;br /&gt;
== Свойства и структура алгоритма ==&lt;br /&gt;
=== Общее описание алгоритма ===&lt;br /&gt;
&lt;br /&gt;
Ортогонализация ― алгоритм построения для данной линейно независимой системы векторов евклидова или эрмитова пространства V ортогональной системы ненулевых векторов, порождающих то же самое подпространство в V.&lt;br /&gt;
&lt;br /&gt;
Ортогонализация Грама–Шмидта&amp;lt;ref&amp;gt;Канатников А.Н., Крищенко А.П. &amp;quot;Линейная алгебра.&amp;quot; ― 3-е изд., стер. ― М.: Изд-во МГТУ им. Н.Э. Баумана, 2002&amp;lt;/ref&amp;gt; (процесс Грама–Шмидта) ― наиболее известный алгоритм ортогонализации. Назван в честь Йоргена Педерсена Грама&amp;lt;ref&amp;gt;O&#039;Connor, John J.; Robertson, Edmund F., &amp;quot;Jørgen Pedersen Gram&amp;quot;, MacTutor History of Mathematics archive, University of St Andrews.&amp;lt;/ref&amp;gt; и Эрхарда Шмидта&amp;lt;ref&amp;gt;O&#039;Connor, John J.; Robertson, Edmund F., &amp;quot;Erhard Schmidt&amp;quot;, MacTutor History of Mathematics archive, University of St Andrews.&amp;lt;/ref&amp;gt;, однако ранее уже появлялся в работах Лапласа и Коши. Является частным случаем разложения Ивасавы, так как может быть представлен как разложение невырожденной квадратной матрицы в произведение ортогональной (или унитарной матрицы в случае эрмитова пространства) и верхнетреугольной матрицы с положительными диагональными элементами.&lt;br /&gt;
&lt;br /&gt;
Рассматриваемый алгоритм применяется для борьбы с помехами в адаптивной системе селекции движущихся целей&amp;lt;ref&amp;gt;Орешкин Б.Н., Бакулев П.А. &amp;quot;Быстрая процедура ортогонализации Грамма–Шмидта и ее применение для борьбы с помехами в адаптивной системе селекции движущихся целей&amp;quot; ― Радиотехника / №12 за 2007 г.&amp;lt;/ref&amp;gt;, в протоколах безопасности&amp;lt;ref&amp;gt;Пискова А.В., Менщиков А.А., Коробейников А.Г. &amp;quot;Использование ортогонализации Грама-Шмидта в алгоритме приведения базиса решетки для протоколов безопасности&amp;quot; ― Вопросы кибербезопасности №1(14) 2016&amp;lt;/ref&amp;gt;, для повышения экономичности алгоритмов оценивания параметров моделей объектов управления&amp;lt;ref&amp;gt;Карелин А.Е., Светлаков А.А. &amp;quot;Использование ортогонализации Грама-Шмидта для повышения экономичности многоточечных алгоритмов рекуррентного оценивания параметров моделей объектов управления&amp;quot; ― Известия Томского политехнического университета [Известия ТПУ]. — 2006. — Т. 309, № 8. — [С. 15-19].&amp;lt;/ref&amp;gt; и в других областях.&lt;br /&gt;
&lt;br /&gt;
=== Математическое описание алгоритма ===&lt;br /&gt;
&#039;&#039;&#039;Входные данные.&#039;&#039;&#039; &amp;lt;math&amp;gt;m&amp;lt;/math&amp;gt; линейно независимых векторов &amp;lt;math&amp;gt;\mathbf{a}_1,...,\mathbf{a}_m&amp;lt;/math&amp;gt; c размерностью пространства &amp;lt;math&amp;gt;n&amp;lt;/math&amp;gt;, записанных в матрице &amp;lt;math&amp;gt;A&amp;lt;/math&amp;gt; с элементами &amp;lt;math&amp;gt;\alpha_{ij}&amp;lt;/math&amp;gt;.&lt;br /&gt;
&lt;br /&gt;
&#039;&#039;&#039;Выходные данные.&#039;&#039;&#039; &amp;lt;math&amp;gt;m&amp;lt;/math&amp;gt; ортогональных векторов &amp;lt;math&amp;gt;\mathbf{b}_1,...,\mathbf{b}_m&amp;lt;/math&amp;gt; c размерностью пространства &amp;lt;math&amp;gt;n&amp;lt;/math&amp;gt;, записанных в матрице &amp;lt;math&amp;gt;B&amp;lt;/math&amp;gt; с элементами &amp;lt;math&amp;gt;\beta_{ij}&amp;lt;/math&amp;gt;.&lt;br /&gt;
&lt;br /&gt;
Определим оператор проекции (проецирует вектор &amp;lt;math&amp;gt;\mathbf{a}&amp;lt;/math&amp;gt; коллинеарно вектору &amp;lt;math&amp;gt;\mathbf{b}&amp;lt;/math&amp;gt;) &amp;lt;math&amp;gt;\mathbf{proj_b a = \frac{\left \langle a,b \right \rangle}{\left \langle b,b \right \rangle }b}&amp;lt;/math&amp;gt;, где &amp;lt;math&amp;gt;\mathbf{\left \langle a,b \right \rangle}&amp;lt;/math&amp;gt; ― скалярное произведение векторов &amp;lt;math&amp;gt;\mathbf{a}&amp;lt;/math&amp;gt; и &amp;lt;math&amp;gt;\mathbf{b}&amp;lt;/math&amp;gt;.&lt;br /&gt;
&lt;br /&gt;
Тогда ортогональные векторы вычисляются следующим образом:&lt;br /&gt;
&lt;br /&gt;
&amp;lt;math&amp;gt;\mathbf{b}_1 = \mathbf{a}_1&amp;lt;/math&amp;gt;&lt;br /&gt;
&lt;br /&gt;
&amp;lt;math&amp;gt;\mathbf{b}_2 = \mathbf{a}_2 - \mathbf{proj}_{\mathbf{b}_1} \mathbf{a}_2 &amp;lt;/math&amp;gt;&lt;br /&gt;
&lt;br /&gt;
&amp;lt;math&amp;gt;\mathbf{b}_3 = \mathbf{a}_3 - \mathbf{proj}_{\mathbf{b}_1} \mathbf{a}_3 - \mathbf{proj}_{\mathbf{b}_2} \mathbf{a}_3 &amp;lt;/math&amp;gt;&lt;br /&gt;
&lt;br /&gt;
&amp;lt;math&amp;gt;\vdots&amp;lt;/math&amp;gt;&lt;br /&gt;
&lt;br /&gt;
&amp;lt;math&amp;gt;\mathbf{b}_m = \mathbf{a}_m - \sum_{j=1}^{m-1} \mathbf{proj}_{\mathbf{b}_j} \mathbf{a}_m&amp;lt;/math&amp;gt;&lt;br /&gt;
&lt;br /&gt;
Или поэлементно:&lt;br /&gt;
&lt;br /&gt;
&amp;lt;math&amp;gt;\beta_{1j} = \alpha_{1j}&amp;lt;/math&amp;gt;&lt;br /&gt;
&lt;br /&gt;
&amp;lt;math&amp;gt;\beta_{ij} = \alpha_{ij} - (\sum_{k=1}^{i-1} \mathbf{proj}_{\mathbf{b}_k} \mathbf{a}_i)_j = \alpha_{ij} - \sum_{k=1}^{i-1}\frac{\sum_{s=1}^{n}\alpha_{is}\beta_{ks}}{\sum_{s=1}^{n}\beta_{ks}\beta_{ks}}\beta_{kj} &amp;lt;/math&amp;gt;&lt;br /&gt;
&lt;br /&gt;
=== Вычислительное ядро алгоритма ===&lt;br /&gt;
Основное время работы алгоритма приходится на вычисление сумм &amp;lt;math&amp;gt;\sum_{i=1}^{j-1} \mathbf{proj}_{\mathbf{b}_i} \mathbf{a}_k \forall j: j=\overline{1, m}&amp;lt;/math&amp;gt;.&lt;br /&gt;
&lt;br /&gt;
=== Макроструктура алгоритма ===&lt;br /&gt;
Из описания алгоритма в предыдущих разделов следует, что основную часть данного метода составляют операции вычисления проекций векторов, а также их сумм.&lt;br /&gt;
&lt;br /&gt;
=== Схема реализации последовательного алгоритма ===&lt;br /&gt;
Рассмотрим алгоритм, написанный в виде функции для математической системы MATLAB.&lt;br /&gt;
&lt;br /&gt;
&#039;&#039;&#039;Входные данные.&#039;&#039;&#039;&lt;br /&gt;
&lt;br /&gt;
Матрица &amp;lt;math&amp;gt;A&amp;lt;/math&amp;gt; с линейно-независимыми векторами в столбцах.&lt;br /&gt;
&lt;br /&gt;
&#039;&#039;&#039;Выходные данные.&#039;&#039;&#039;&lt;br /&gt;
&lt;br /&gt;
Матрица &amp;lt;math&amp;gt;Q&amp;lt;/math&amp;gt; с ортонормированным базисом &amp;lt;math&amp;gt;A&amp;lt;/math&amp;gt;.&lt;br /&gt;
&lt;br /&gt;
&#039;&#039;&#039;Использование.&#039;&#039;&#039;&lt;br /&gt;
&amp;lt;source lang=&amp;quot;matlab&amp;quot;&amp;gt;&lt;br /&gt;
Q = gramschmidt( A );&lt;br /&gt;
&amp;lt;/source&amp;gt;&lt;br /&gt;
&lt;br /&gt;
&#039;&#039;&#039;Реализация.&#039;&#039;&#039;&lt;br /&gt;
&amp;lt;source lang=&amp;quot;matlab&amp;quot;&amp;gt;&lt;br /&gt;
function Q = gramschmidt( A )&lt;br /&gt;
% Число векторов.&lt;br /&gt;
n = size( A, 2 );&lt;br /&gt;
 &lt;br /&gt;
% Инициализируем выходную матрицу.&lt;br /&gt;
Q = zeros( n );&lt;br /&gt;
 &lt;br /&gt;
% Преобразуем каждый вектор в базисный:&lt;br /&gt;
% (1) j-ый базисный вектор будет ортогонален каждому из предыдущих 1..j-1 векторов;&lt;br /&gt;
% (2) будет единичной длины.&lt;br /&gt;
for j = 1 : n&lt;br /&gt;
    % Выбираем j-ый вектор&lt;br /&gt;
    u = A( :, j );&lt;br /&gt;
    &lt;br /&gt;
    % Специальный случай для j = 1: просто нормируем этот вектор и помещаем&lt;br /&gt;
    % первым в найденный базис, так как нет векторов, относительно которых&lt;br /&gt;
    % нужно было бы делать его ортогональным.&lt;br /&gt;
&lt;br /&gt;
    % Удаляем из оригинального вектора &amp;quot;u&amp;quot; все компоненты натянутые на базис&lt;br /&gt;
    % из векторов 1..j-1, их вклад будет удален.&lt;br /&gt;
    % =&amp;gt; j-ый вектор ортогонален остальным.&lt;br /&gt;
    % Предыдущие базисные вектора были найдены на предыдуших шагах.&lt;br /&gt;
    % =&amp;gt; соблюдаем принцип ортогональности, но не ортонормированности.&lt;br /&gt;
    for i = 1 : j - 1&lt;br /&gt;
        u = u - proj( Q(:,i), A(:,j) );&lt;br /&gt;
    end&lt;br /&gt;
     &lt;br /&gt;
    % Нормируем вектор&lt;br /&gt;
    Q(:,j) = u ./ norm( u );&lt;br /&gt;
end&lt;br /&gt;
end&lt;br /&gt;
 &lt;br /&gt;
% Проекция вектора &amp;quot;a&amp;quot; коллинеарно вектору &amp;quot;e&amp;quot;.&lt;br /&gt;
function p = proj( e, a )&lt;br /&gt;
p = (e&#039; * a) / (e&#039; * e) .* e;&lt;br /&gt;
end&lt;br /&gt;
&amp;lt;/source&amp;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;.&lt;br /&gt;
&lt;br /&gt;
# Скалярное произведение векторов требует &amp;lt;math&amp;gt;n-1&amp;lt;/math&amp;gt; сложение и &amp;lt;math&amp;gt;n&amp;lt;/math&amp;gt; произведений.&lt;br /&gt;
# Вычитание проекции вектора требует &amp;lt;math&amp;gt;2&amp;lt;/math&amp;gt; скалярных произведения, &amp;lt;math&amp;gt;1&amp;lt;/math&amp;gt; деление, &amp;lt;math&amp;gt;n&amp;lt;/math&amp;gt; умножений и &amp;lt;math&amp;gt;n&amp;lt;/math&amp;gt; сложений, то есть:&lt;br /&gt;
## &amp;lt;math&amp;gt;3n-2&amp;lt;/math&amp;gt; (&amp;lt;math&amp;gt;+&amp;lt;/math&amp;gt;);&lt;br /&gt;
## &amp;lt;math&amp;gt;3n&amp;lt;/math&amp;gt; (&amp;lt;math&amp;gt;\times&amp;lt;/math&amp;gt;);&lt;br /&gt;
## &amp;lt;math&amp;gt;1&amp;lt;/math&amp;gt; (&amp;lt;math&amp;gt;\div&amp;lt;/math&amp;gt;).&lt;br /&gt;
# Вычисление &amp;lt;math&amp;gt;i&amp;lt;/math&amp;gt;-го вектора требует &amp;lt;math&amp;gt;i-1&amp;lt;/math&amp;gt; вычитаний проекций, то есть:&lt;br /&gt;
## &amp;lt;math&amp;gt;(3n-2)(i-1)&amp;lt;/math&amp;gt; (&amp;lt;math&amp;gt;+&amp;lt;/math&amp;gt;);&lt;br /&gt;
## &amp;lt;math&amp;gt;3n(i-1)&amp;lt;/math&amp;gt; (&amp;lt;math&amp;gt;\times&amp;lt;/math&amp;gt;);&lt;br /&gt;
## &amp;lt;math&amp;gt;i-1&amp;lt;/math&amp;gt; (&amp;lt;math&amp;gt;\div&amp;lt;/math&amp;gt;).&lt;br /&gt;
# Мы вычисляем вектора от &amp;lt;math&amp;gt;i=1&amp;lt;/math&amp;gt; до &amp;lt;math&amp;gt;m&amp;lt;/math&amp;gt;, поэтому множители &amp;lt;math&amp;gt;(i-1)&amp;lt;/math&amp;gt; выражаются &#039;&#039;треугольным числом&#039;&#039; &amp;lt;math&amp;gt;(m-1)\frac{m}{2}&amp;lt;/math&amp;gt;.&lt;br /&gt;
## &amp;lt;math&amp;gt;(3n-2)(m-1)\frac{m}{2}&amp;lt;/math&amp;gt; (&amp;lt;math&amp;gt;+&amp;lt;/math&amp;gt;);&lt;br /&gt;
## &amp;lt;math&amp;gt;3n(m-1)\frac{m}{2}&amp;lt;/math&amp;gt; (&amp;lt;math&amp;gt;\times&amp;lt;/math&amp;gt;);&lt;br /&gt;
## &amp;lt;math&amp;gt;(m-1)\frac{m}{2}&amp;lt;/math&amp;gt; (&amp;lt;math&amp;gt;\div&amp;lt;/math&amp;gt;).&lt;br /&gt;
&lt;br /&gt;
Таким образом, cложность алгоритма &amp;lt;math&amp;gt;O(nm^2)&amp;lt;/math&amp;gt;.&lt;br /&gt;
&lt;br /&gt;
=== Информационный граф ===&lt;br /&gt;
Граф состоит из элементов 2 видов: прямоугольников и овалов. Прямоугольниками обозначаются данные, причем красному цвету соответствуют входные данные, а зеленому - выходные. Овалы означают операции над переданными данными. Голубым цветом обозначены более сложно организованные операции, а синим - менее. Для нахождения &amp;lt;math&amp;gt;\mathbf{b}_i&amp;lt;/math&amp;gt; вектора требуются значения всех векторов с номерами, меньшими &amp;lt;math&amp;gt;\_i&amp;lt;/math&amp;gt;, однако, расчеты проекций можно начинать, не дожидаясь вычисления всех векторов, а производить сразу, как только соответствующий ортогональный вектор будет рассчитан.&lt;br /&gt;
[[Файл:Gram_schmidt_graph.png|thumb|800px|center|frame|Информационный граф алгоритма Грама-Шмидта]]&lt;br /&gt;
&lt;br /&gt;
=== Ресурс параллелизма алгоритма ===&lt;br /&gt;
*&lt;br /&gt;
=== Входные и выходные данные алгоритма ===&lt;br /&gt;
&#039;&#039;&#039;Входные данные.&#039;&#039;&#039; Матрица &amp;lt;math&amp;gt;A&amp;lt;/math&amp;gt; с элементами &amp;lt;math&amp;gt;\alpha_{ij}&amp;lt;/math&amp;gt;, где &amp;lt;math&amp;gt;i = \overline{1, m}&amp;lt;/math&amp;gt; (количество линейно независимых векторов) и &amp;lt;math&amp;gt;j = \overline{1, n}&amp;lt;/math&amp;gt; (размерность пространства), при этом &amp;lt;math&amp;gt;m \leqslant n&amp;lt;/math&amp;gt;.&lt;br /&gt;
&lt;br /&gt;
&#039;&#039;&#039;Объем входных данных.&#039;&#039;&#039; &amp;lt;math&amp;gt;mn&amp;lt;/math&amp;gt;&lt;br /&gt;
&lt;br /&gt;
&#039;&#039;&#039;Выходные данные.&#039;&#039;&#039; Матрица &amp;lt;math&amp;gt;B&amp;lt;/math&amp;gt; с элементами &amp;lt;math&amp;gt;\beta_{ij}&amp;lt;/math&amp;gt;, где &amp;lt;math&amp;gt;i = \overline{1, m}&amp;lt;/math&amp;gt; и &amp;lt;math&amp;gt;j = \overline{1, n}&amp;lt;/math&amp;gt;, тогда &amp;lt;math&amp;gt;b_{1}, \dots, b_{m}&amp;lt;/math&amp;gt; — система ортогональных векторов.&lt;br /&gt;
&lt;br /&gt;
&#039;&#039;&#039;Объем выходных данных.&#039;&#039;&#039; &amp;lt;math&amp;gt;mn&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;
Однако, возможно накопление ошибок округления, то есть векторы выходной матрицы часто не точно ортогональны. Из-за потери ортогональности в процессе вычислений классический процесс Грама-Шмидта называют численно неустойчивым.&lt;br /&gt;
&lt;br /&gt;
Процесс Грама-Шмидта может быть сделан более вычислительно устойчивым путём небольшой модификации. Такой алгоритм называется модифицированным процессом Грама-Шмидта.&lt;br /&gt;
&lt;br /&gt;
Процесс Грама-Шмидта может применяться также к бесконечной последовательности линейно независимых векторов.&lt;br /&gt;
&lt;br /&gt;
Процесс Грама-Шмидта может применяться к линейно зависимым векторам. В этом случае он выдаёт &amp;lt;math&amp;gt;\mathbf{0}&amp;lt;/math&amp;gt; (нулевой вектор) на шаге &amp;lt;math&amp;gt;j&amp;lt;/math&amp;gt;, если &amp;lt;math&amp;gt;\mathbf{a}_j&amp;lt;/math&amp;gt; является линейной комбинацией векторов &amp;lt;math&amp;gt;\mathbf{a}_1,\;\ldots,\;\mathbf{a}_{j-1}&amp;lt;/math&amp;gt;. Если это может случиться, то для сохранения ортогональности выходных векторов и для предотвращения деления на ноль при ортонормировании алгоритм должен делать проверку на нулевые векторы и отбрасывать их. Количество векторов, выдаваемых алгоритмом, будет равно размерности подпространства, порождённого векторами (то есть количеству линейно независимых векторов, которые можно выделить среди исходных векторов).&lt;br /&gt;
&lt;br /&gt;
Процесс Грама-Шмидта может быть истолкован как разложение невырожденной квадратной матрицы в произведение ортогональной (или унитарной матрицы в случае эрмитова пространства) и верхнетреугольной матрицы с положительными диагональными элементами -- QR-разложение.&lt;br /&gt;
&lt;br /&gt;
== Программная реализация алгоритма ==&lt;br /&gt;
=== Особенности реализации последовательного алгоритма ===&lt;br /&gt;
=== Локальность данных и вычислений ===&lt;br /&gt;
=== Возможные способы и особенности параллельной реализации алгоритма ===&lt;br /&gt;
=== Масштабируемость алгоритма и его реализации ===&lt;br /&gt;
&#039;&#039;Срок сдачи продлен до 15 ноября.&#039;&#039;&lt;br /&gt;
=== Динамические характеристики и эффективность реализации алгоритма ===&lt;br /&gt;
=== Выводы для классов архитектур ===&lt;br /&gt;
=== Существующие реализации алгоритма ===&lt;br /&gt;
Данный алгоритм реализован во множестве библиотек и математических программных пакетах.&lt;br /&gt;
&lt;br /&gt;
# Библиотека [https://github.com/open-epicycle/Epicycle.Math-cs Epicycle] (C#).&lt;br /&gt;
# Библиотека [http://www.spectralpython.net/ Spectral Python (SPy)].&lt;br /&gt;
# Библиотека [https://hackage.haskell.org/package/vect-0.4.7/docs/Data-Vect-Float-GramSchmidt.html vect] (Haskell).&lt;br /&gt;
&lt;br /&gt;
==== Пакет Mathematica ====&lt;br /&gt;
Приведем пример скрипта, предназначенного для пакета Mathematica, который проводит процесс ортогонализации Грама-Шмидта над векторами, заданными в фигурных скобках последней строки. Количество векторов и их координат могут быть произвольными. В данном случае для примера взяты векторы &amp;lt;math&amp;gt;\{-2,\;1,\;0\}&amp;lt;/math&amp;gt;, &amp;lt;math&amp;gt;\{-2,\;0,\;1\}&amp;lt;/math&amp;gt;, &amp;lt;math&amp;gt;\{-0{.}5,\;-1,\;1\}&amp;lt;/math&amp;gt;.&lt;br /&gt;
&amp;lt;source lang=&#039;mathematica&#039;&amp;gt;Projection[v1_, v2_] := (v1.v2*v2)/v2.v2&lt;br /&gt;
MultipleProjection[v1_, vecs_] := Plus @@ (Projection[v1, #1] &amp;amp;) /@ vecs&lt;br /&gt;
GramSchmidt[mat_] := Fold[Join[#1, {#2 - MultipleProjection[#2, #1]}] &amp;amp;, {}, mat]&lt;br /&gt;
GramSchmidt[{{-2, 1, 0}, {-2, 0, 1}, {-0.5, -1, 1}}]&amp;lt;/source&amp;gt;&lt;br /&gt;
&lt;br /&gt;
==== Пакет Maxima ====&lt;br /&gt;
Приведем пример скрипта, предназначенного для пакета Maxima, который проводит процесс ортогонализации Грама-Шмидта над векторами, заданными в фигурных скобках последней строки. Количество векторов и их координат могут быть произвольными. В данном случае для примера взяты векторы &amp;lt;math&amp;gt;\{-2,\;1,\;0\}&amp;lt;/math&amp;gt;, &amp;lt;math&amp;gt;\{-2,\;0,\;1\}&amp;lt;/math&amp;gt;, &amp;lt;math&amp;gt;\{-0{.}5,\;-1,\;1\}&amp;lt;/math&amp;gt;.&lt;br /&gt;
&amp;lt;source lang=&#039;maxima&#039;&amp;gt;&lt;br /&gt;
load(eigen);&lt;br /&gt;
x: matrix ([-2,1,0],[-2,0,1],[-0.5,-1,1]);&lt;br /&gt;
y: gramschmidt(x);&lt;br /&gt;
&amp;lt;/source&amp;gt;&lt;br /&gt;
&lt;br /&gt;
==== Пакет MATLAB ====&lt;br /&gt;
Приведем пример скрипта, предназначенного для пакета MATLAB, который проводит процесс ортогонализации Грама-Шмидта над векторами, заданными в фигурных скобках последней строки. В данном пакете уже существует функция, которая осуществляет данный процесс. Столбцы входной матрицы предполагаются линейно-независимыми, количество векторов и их координат могут быть произвольными. Функция возращает матрицу X с ортонормированными столбцами и обратимую верхне-треугольную матрицу Y.&lt;br /&gt;
&lt;br /&gt;
В данном случае для примера взяты векторы &amp;lt;math&amp;gt;\{-2,\;1,\;0\}&amp;lt;/math&amp;gt;, &amp;lt;math&amp;gt;\{-2,\;0,\;1\}&amp;lt;/math&amp;gt;, &amp;lt;math&amp;gt;\{-0{.}5,\;-1,\;1\}&amp;lt;/math&amp;gt;.&lt;br /&gt;
&amp;lt;source lang=&#039;matlab&#039;&amp;gt;&lt;br /&gt;
[x y]=gschmidt([-2 1 0; -2 0 1; -0.5 -1 1])&lt;br /&gt;
&amp;lt;/source&amp;gt;&lt;br /&gt;
&lt;br /&gt;
== Литература ==&lt;/div&gt;</summary>
		<author><name>BDA</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:BDA/%D0%9E%D1%80%D1%82%D0%BE%D0%B3%D0%BE%D0%BD%D0%B0%D0%BB%D0%B8%D0%B7%D0%B0%D1%86%D0%B8%D1%8F_%D0%93%D1%80%D0%B0%D0%BC%D0%B0-%D0%A8%D0%BC%D0%B8%D0%B4%D1%82%D0%B0&amp;diff=13054</id>
		<title>Участник:BDA/Ортогонализация Грама-Шмидта</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:BDA/%D0%9E%D1%80%D1%82%D0%BE%D0%B3%D0%BE%D0%BD%D0%B0%D0%BB%D0%B8%D0%B7%D0%B0%D1%86%D0%B8%D1%8F_%D0%93%D1%80%D0%B0%D0%BC%D0%B0-%D0%A8%D0%BC%D0%B8%D0%B4%D1%82%D0%B0&amp;diff=13054"/>
		<updated>2016-10-17T21:04:24Z</updated>

		<summary type="html">&lt;p&gt;BDA: /* Информационный граф */&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(nm^2)&amp;lt;/math&amp;gt;&lt;br /&gt;
| pf_height         = &amp;lt;math&amp;gt;?&amp;lt;/math&amp;gt;&lt;br /&gt;
| pf_width          = &amp;lt;math&amp;gt;?&amp;lt;/math&amp;gt;&lt;br /&gt;
| input_data        = &amp;lt;math&amp;gt;nm&amp;lt;/math&amp;gt;&lt;br /&gt;
| output_data       = &amp;lt;math&amp;gt;nm&amp;lt;/math&amp;gt;&lt;br /&gt;
}}&lt;br /&gt;
&lt;br /&gt;
Основные авторы описания: [[Участник:Zodiac|Белов Н. А.]], [[Участник:BDA|Богомолов Д. А.]].&lt;br /&gt;
&lt;br /&gt;
== Свойства и структура алгоритма ==&lt;br /&gt;
=== Общее описание алгоритма ===&lt;br /&gt;
&lt;br /&gt;
Ортогонализация ― алгоритм построения для данной линейно независимой системы векторов евклидова или эрмитова пространства V ортогональной системы ненулевых векторов, порождающих то же самое подпространство в V.&lt;br /&gt;
&lt;br /&gt;
Ортогонализация Грама–Шмидта&amp;lt;ref&amp;gt;Канатников А.Н., Крищенко А.П. &amp;quot;Линейная алгебра.&amp;quot; ― 3-е изд., стер. ― М.: Изд-во МГТУ им. Н.Э. Баумана, 2002&amp;lt;/ref&amp;gt; (процесс Грама–Шмидта) ― наиболее известный алгоритм ортогонализации. Назван в честь Йоргена Педерсена Грама&amp;lt;ref&amp;gt;O&#039;Connor, John J.; Robertson, Edmund F., &amp;quot;Jørgen Pedersen Gram&amp;quot;, MacTutor History of Mathematics archive, University of St Andrews.&amp;lt;/ref&amp;gt; и Эрхарда Шмидта&amp;lt;ref&amp;gt;O&#039;Connor, John J.; Robertson, Edmund F., &amp;quot;Erhard Schmidt&amp;quot;, MacTutor History of Mathematics archive, University of St Andrews.&amp;lt;/ref&amp;gt;, однако ранее уже появлялся в работах Лапласа и Коши. Является частным случаем разложения Ивасавы, так как может быть представлен как разложение невырожденной квадратной матрицы в произведение ортогональной (или унитарной матрицы в случае эрмитова пространства) и верхнетреугольной матрицы с положительными диагональными элементами.&lt;br /&gt;
&lt;br /&gt;
Рассматриваемый алгоритм применяется для борьбы с помехами в адаптивной системе селекции движущихся целей&amp;lt;ref&amp;gt;Орешкин Б.Н., Бакулев П.А. &amp;quot;Быстрая процедура ортогонализации Грамма–Шмидта и ее применение для борьбы с помехами в адаптивной системе селекции движущихся целей&amp;quot; ― Радиотехника / №12 за 2007 г.&amp;lt;/ref&amp;gt;, в протоколах безопасности&amp;lt;ref&amp;gt;Пискова А.В., Менщиков А.А., Коробейников А.Г. &amp;quot;Использование ортогонализации Грама-Шмидта в алгоритме приведения базиса решетки для протоколов безопасности&amp;quot; ― Вопросы кибербезопасности №1(14) 2016&amp;lt;/ref&amp;gt;, для повышения экономичности алгоритмов оценивания параметров моделей объектов управления&amp;lt;ref&amp;gt;Карелин А.Е., Светлаков А.А. &amp;quot;Использование ортогонализации Грама-Шмидта для повышения экономичности многоточечных алгоритмов рекуррентного оценивания параметров моделей объектов управления&amp;quot; ― Известия Томского политехнического университета [Известия ТПУ]. — 2006. — Т. 309, № 8. — [С. 15-19].&amp;lt;/ref&amp;gt; и в других областях.&lt;br /&gt;
&lt;br /&gt;
=== Математическое описание алгоритма ===&lt;br /&gt;
&#039;&#039;&#039;Входные данные.&#039;&#039;&#039; &amp;lt;math&amp;gt;m&amp;lt;/math&amp;gt; линейно независимых векторов &amp;lt;math&amp;gt;\mathbf{a}_1,...,\mathbf{a}_m&amp;lt;/math&amp;gt; c размерностью пространства &amp;lt;math&amp;gt;n&amp;lt;/math&amp;gt;, записанных в матрице &amp;lt;math&amp;gt;A&amp;lt;/math&amp;gt; с элементами &amp;lt;math&amp;gt;\alpha_{ij}&amp;lt;/math&amp;gt;.&lt;br /&gt;
&lt;br /&gt;
&#039;&#039;&#039;Выходные данные.&#039;&#039;&#039; &amp;lt;math&amp;gt;m&amp;lt;/math&amp;gt; ортогональных векторов &amp;lt;math&amp;gt;\mathbf{b}_1,...,\mathbf{b}_m&amp;lt;/math&amp;gt; c размерностью пространства &amp;lt;math&amp;gt;n&amp;lt;/math&amp;gt;, записанных в матрице &amp;lt;math&amp;gt;B&amp;lt;/math&amp;gt; с элементами &amp;lt;math&amp;gt;\beta_{ij}&amp;lt;/math&amp;gt;.&lt;br /&gt;
&lt;br /&gt;
Определим оператор проекции (проецирует вектор &amp;lt;math&amp;gt;\mathbf{a}&amp;lt;/math&amp;gt; коллинеарно вектору &amp;lt;math&amp;gt;\mathbf{b}&amp;lt;/math&amp;gt;) &amp;lt;math&amp;gt;\mathbf{proj_b a = \frac{\left \langle a,b \right \rangle}{\left \langle b,b \right \rangle }b}&amp;lt;/math&amp;gt;, где &amp;lt;math&amp;gt;\mathbf{\left \langle a,b \right \rangle}&amp;lt;/math&amp;gt; ― скалярное произведение векторов &amp;lt;math&amp;gt;\mathbf{a}&amp;lt;/math&amp;gt; и &amp;lt;math&amp;gt;\mathbf{b}&amp;lt;/math&amp;gt;.&lt;br /&gt;
&lt;br /&gt;
Тогда ортогональные векторы вычисляются следующим образом:&lt;br /&gt;
&lt;br /&gt;
&amp;lt;math&amp;gt;\mathbf{b}_1 = \mathbf{a}_1&amp;lt;/math&amp;gt;&lt;br /&gt;
&lt;br /&gt;
&amp;lt;math&amp;gt;\mathbf{b}_2 = \mathbf{a}_2 - \mathbf{proj}_{\mathbf{b}_1} \mathbf{a}_2 &amp;lt;/math&amp;gt;&lt;br /&gt;
&lt;br /&gt;
&amp;lt;math&amp;gt;\mathbf{b}_3 = \mathbf{a}_3 - \mathbf{proj}_{\mathbf{b}_1} \mathbf{a}_3 - \mathbf{proj}_{\mathbf{b}_2} \mathbf{a}_3 &amp;lt;/math&amp;gt;&lt;br /&gt;
&lt;br /&gt;
&amp;lt;math&amp;gt;\vdots&amp;lt;/math&amp;gt;&lt;br /&gt;
&lt;br /&gt;
&amp;lt;math&amp;gt;\mathbf{b}_m = \mathbf{a}_m - \sum_{j=1}^{m-1} \mathbf{proj}_{\mathbf{b}_j} \mathbf{a}_m&amp;lt;/math&amp;gt;&lt;br /&gt;
&lt;br /&gt;
Или поэлементно:&lt;br /&gt;
&lt;br /&gt;
&amp;lt;math&amp;gt;\beta_{1j} = \alpha_{1j}&amp;lt;/math&amp;gt;&lt;br /&gt;
&lt;br /&gt;
&amp;lt;math&amp;gt;\beta_{ij} = \alpha_{ij} - (\sum_{k=1}^{i-1} \mathbf{proj}_{\mathbf{b}_k} \mathbf{a}_i)_j = \alpha_{ij} - \sum_{k=1}^{i-1}\frac{\sum_{s=1}^{n}\alpha_{is}\beta_{ks}}{\sum_{s=1}^{n}\beta_{ks}\beta_{ks}}\beta_{kj} &amp;lt;/math&amp;gt;&lt;br /&gt;
&lt;br /&gt;
=== Вычислительное ядро алгоритма ===&lt;br /&gt;
Основное время работы алгоритма приходится на вычисление сумм &amp;lt;math&amp;gt;\sum_{i=1}^{j-1} \mathbf{proj}_{\mathbf{b}_i} \mathbf{a}_k \forall j: j=\overline{1, m}&amp;lt;/math&amp;gt;.&lt;br /&gt;
&lt;br /&gt;
=== Макроструктура алгоритма ===&lt;br /&gt;
Из описания алгоритма в предыдущих разделов следует, что основную часть данного метода составляют операции вычисления проекций векторов, а также их сумм.&lt;br /&gt;
&lt;br /&gt;
=== Схема реализации последовательного алгоритма ===&lt;br /&gt;
Рассмотрим алгоритм, написанный в виде функции для математической системы MATLAB.&lt;br /&gt;
&lt;br /&gt;
&#039;&#039;&#039;Входные данные.&#039;&#039;&#039;&lt;br /&gt;
&lt;br /&gt;
Матрица &amp;lt;math&amp;gt;A&amp;lt;/math&amp;gt; с линейно-независимыми векторами в столбцах.&lt;br /&gt;
&lt;br /&gt;
&#039;&#039;&#039;Выходные данные.&#039;&#039;&#039;&lt;br /&gt;
&lt;br /&gt;
Матрица &amp;lt;math&amp;gt;Q&amp;lt;/math&amp;gt; с ортонормированным базисом &amp;lt;math&amp;gt;A&amp;lt;/math&amp;gt;.&lt;br /&gt;
&lt;br /&gt;
&#039;&#039;&#039;Использование.&#039;&#039;&#039;&lt;br /&gt;
&amp;lt;source lang=&amp;quot;matlab&amp;quot;&amp;gt;&lt;br /&gt;
Q = gramschmidt( A );&lt;br /&gt;
&amp;lt;/source&amp;gt;&lt;br /&gt;
&lt;br /&gt;
&#039;&#039;&#039;Реализация.&#039;&#039;&#039;&lt;br /&gt;
&amp;lt;source lang=&amp;quot;matlab&amp;quot;&amp;gt;&lt;br /&gt;
function Q = gramschmidt( A )&lt;br /&gt;
% Число векторов.&lt;br /&gt;
n = size( A, 2 );&lt;br /&gt;
 &lt;br /&gt;
% Инициализируем выходную матрицу.&lt;br /&gt;
Q = zeros( n );&lt;br /&gt;
 &lt;br /&gt;
% Преобразуем каждый вектор в базисный:&lt;br /&gt;
% (1) j-ый базисный вектор будет ортогонален каждому из предыдущих 1..j-1 векторов;&lt;br /&gt;
% (2) будет единичной длины.&lt;br /&gt;
for j = 1 : n&lt;br /&gt;
    % Выбираем j-ый вектор&lt;br /&gt;
    u = A( :, j );&lt;br /&gt;
    &lt;br /&gt;
    % Специальный случай для j = 1: просто нормируем этот вектор и помещаем&lt;br /&gt;
    % первым в найденный базис, так как нет векторов, относительно которых&lt;br /&gt;
    % нужно было бы делать его ортогональным.&lt;br /&gt;
&lt;br /&gt;
    % Удаляем из оригинального вектора &amp;quot;u&amp;quot; все компоненты натянутые на базис&lt;br /&gt;
    % из векторов 1..j-1, их вклад будет удален.&lt;br /&gt;
    % =&amp;gt; j-ый вектор ортогонален остальным.&lt;br /&gt;
    % Предыдущие базисные вектора были найдены на предыдуших шагах.&lt;br /&gt;
    % =&amp;gt; соблюдаем принцип ортогональности, но не ортонормированности.&lt;br /&gt;
    for i = 1 : j - 1&lt;br /&gt;
        u = u - proj( Q(:,i), A(:,j) );&lt;br /&gt;
    end&lt;br /&gt;
     &lt;br /&gt;
    % Нормируем вектор&lt;br /&gt;
    Q(:,j) = u ./ norm( u );&lt;br /&gt;
end&lt;br /&gt;
end&lt;br /&gt;
 &lt;br /&gt;
% Проекция вектора &amp;quot;a&amp;quot; коллинеарно вектору &amp;quot;e&amp;quot;.&lt;br /&gt;
function p = proj( e, a )&lt;br /&gt;
p = (e&#039; * a) / (e&#039; * e) .* e;&lt;br /&gt;
end&lt;br /&gt;
&amp;lt;/source&amp;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;.&lt;br /&gt;
&lt;br /&gt;
# Скалярное произведение векторов требует &amp;lt;math&amp;gt;n-1&amp;lt;/math&amp;gt; сложение и &amp;lt;math&amp;gt;n&amp;lt;/math&amp;gt; произведений.&lt;br /&gt;
# Вычитание проекции вектора требует &amp;lt;math&amp;gt;2&amp;lt;/math&amp;gt; скалярных произведения, &amp;lt;math&amp;gt;1&amp;lt;/math&amp;gt; деление, &amp;lt;math&amp;gt;n&amp;lt;/math&amp;gt; умножений и &amp;lt;math&amp;gt;n&amp;lt;/math&amp;gt; сложений, то есть:&lt;br /&gt;
## &amp;lt;math&amp;gt;3n-2&amp;lt;/math&amp;gt; (&amp;lt;math&amp;gt;+&amp;lt;/math&amp;gt;);&lt;br /&gt;
## &amp;lt;math&amp;gt;3n&amp;lt;/math&amp;gt; (&amp;lt;math&amp;gt;\times&amp;lt;/math&amp;gt;);&lt;br /&gt;
## &amp;lt;math&amp;gt;1&amp;lt;/math&amp;gt; (&amp;lt;math&amp;gt;\div&amp;lt;/math&amp;gt;).&lt;br /&gt;
# Вычисление &amp;lt;math&amp;gt;i&amp;lt;/math&amp;gt;-го вектора требует &amp;lt;math&amp;gt;i-1&amp;lt;/math&amp;gt; вычитаний проекций, то есть:&lt;br /&gt;
## &amp;lt;math&amp;gt;(3n-2)(i-1)&amp;lt;/math&amp;gt; (&amp;lt;math&amp;gt;+&amp;lt;/math&amp;gt;);&lt;br /&gt;
## &amp;lt;math&amp;gt;3n(i-1)&amp;lt;/math&amp;gt; (&amp;lt;math&amp;gt;\times&amp;lt;/math&amp;gt;);&lt;br /&gt;
## &amp;lt;math&amp;gt;i-1&amp;lt;/math&amp;gt; (&amp;lt;math&amp;gt;\div&amp;lt;/math&amp;gt;).&lt;br /&gt;
# Мы вычисляем вектора от &amp;lt;math&amp;gt;i=1&amp;lt;/math&amp;gt; до &amp;lt;math&amp;gt;m&amp;lt;/math&amp;gt;, поэтому множители &amp;lt;math&amp;gt;(i-1)&amp;lt;/math&amp;gt; выражаются &#039;&#039;треугольным числом&#039;&#039; &amp;lt;math&amp;gt;(m-1)\frac{m}{2}&amp;lt;/math&amp;gt;.&lt;br /&gt;
## &amp;lt;math&amp;gt;(3n-2)(m-1)\frac{m}{2}&amp;lt;/math&amp;gt; (&amp;lt;math&amp;gt;+&amp;lt;/math&amp;gt;);&lt;br /&gt;
## &amp;lt;math&amp;gt;3n(m-1)\frac{m}{2}&amp;lt;/math&amp;gt; (&amp;lt;math&amp;gt;\times&amp;lt;/math&amp;gt;);&lt;br /&gt;
## &amp;lt;math&amp;gt;(m-1)\frac{m}{2}&amp;lt;/math&amp;gt; (&amp;lt;math&amp;gt;\div&amp;lt;/math&amp;gt;).&lt;br /&gt;
&lt;br /&gt;
Таким образом, cложность алгоритма &amp;lt;math&amp;gt;O(nm^2)&amp;lt;/math&amp;gt;.&lt;br /&gt;
&lt;br /&gt;
=== Информационный граф ===&lt;br /&gt;
[[Файл:Gram_schmidt_graph.png|thumb|800px|center|frame|Информационный граф алгоритма Грама-Шмидта]]&lt;br /&gt;
&lt;br /&gt;
=== Ресурс параллелизма алгоритма ===&lt;br /&gt;
*&lt;br /&gt;
=== Входные и выходные данные алгоритма ===&lt;br /&gt;
&#039;&#039;&#039;Входные данные.&#039;&#039;&#039; Матрица &amp;lt;math&amp;gt;A&amp;lt;/math&amp;gt; с элементами &amp;lt;math&amp;gt;\alpha_{ij}&amp;lt;/math&amp;gt;, где &amp;lt;math&amp;gt;i = \overline{1, m}&amp;lt;/math&amp;gt; (количество линейно независимых векторов) и &amp;lt;math&amp;gt;j = \overline{1, n}&amp;lt;/math&amp;gt; (размерность пространства), при этом &amp;lt;math&amp;gt;m \leqslant n&amp;lt;/math&amp;gt;.&lt;br /&gt;
&lt;br /&gt;
&#039;&#039;&#039;Объем входных данных.&#039;&#039;&#039; &amp;lt;math&amp;gt;mn&amp;lt;/math&amp;gt;&lt;br /&gt;
&lt;br /&gt;
&#039;&#039;&#039;Выходные данные.&#039;&#039;&#039; Матрица &amp;lt;math&amp;gt;B&amp;lt;/math&amp;gt; с элементами &amp;lt;math&amp;gt;\beta_{ij}&amp;lt;/math&amp;gt;, где &amp;lt;math&amp;gt;i = \overline{1, m}&amp;lt;/math&amp;gt; и &amp;lt;math&amp;gt;j = \overline{1, n}&amp;lt;/math&amp;gt;, тогда &amp;lt;math&amp;gt;b_{1}, \dots, b_{m}&amp;lt;/math&amp;gt; — система ортогональных векторов.&lt;br /&gt;
&lt;br /&gt;
&#039;&#039;&#039;Объем выходных данных.&#039;&#039;&#039; &amp;lt;math&amp;gt;mn&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;
Однако, возможно накопление ошибок округления, то есть векторы выходной матрицы часто не точно ортогональны. Из-за потери ортогональности в процессе вычислений классический процесс Грама-Шмидта называют численно неустойчивым.&lt;br /&gt;
&lt;br /&gt;
Процесс Грама-Шмидта может быть сделан более вычислительно устойчивым путём небольшой модификации. Такой алгоритм называется модифицированным процессом Грама-Шмидта.&lt;br /&gt;
&lt;br /&gt;
Процесс Грама-Шмидта может применяться также к бесконечной последовательности линейно независимых векторов.&lt;br /&gt;
&lt;br /&gt;
Процесс Грама-Шмидта может применяться к линейно зависимым векторам. В этом случае он выдаёт &amp;lt;math&amp;gt;\mathbf{0}&amp;lt;/math&amp;gt; (нулевой вектор) на шаге &amp;lt;math&amp;gt;j&amp;lt;/math&amp;gt;, если &amp;lt;math&amp;gt;\mathbf{a}_j&amp;lt;/math&amp;gt; является линейной комбинацией векторов &amp;lt;math&amp;gt;\mathbf{a}_1,\;\ldots,\;\mathbf{a}_{j-1}&amp;lt;/math&amp;gt;. Если это может случиться, то для сохранения ортогональности выходных векторов и для предотвращения деления на ноль при ортонормировании алгоритм должен делать проверку на нулевые векторы и отбрасывать их. Количество векторов, выдаваемых алгоритмом, будет равно размерности подпространства, порождённого векторами (то есть количеству линейно независимых векторов, которые можно выделить среди исходных векторов).&lt;br /&gt;
&lt;br /&gt;
Процесс Грама-Шмидта может быть истолкован как разложение невырожденной квадратной матрицы в произведение ортогональной (или унитарной матрицы в случае эрмитова пространства) и верхнетреугольной матрицы с положительными диагональными элементами -- QR-разложение.&lt;br /&gt;
&lt;br /&gt;
== Программная реализация алгоритма ==&lt;br /&gt;
=== Особенности реализации последовательного алгоритма ===&lt;br /&gt;
=== Локальность данных и вычислений ===&lt;br /&gt;
=== Возможные способы и особенности параллельной реализации алгоритма ===&lt;br /&gt;
=== Масштабируемость алгоритма и его реализации ===&lt;br /&gt;
&#039;&#039;Срок сдачи продлен до 15 ноября.&#039;&#039;&lt;br /&gt;
=== Динамические характеристики и эффективность реализации алгоритма ===&lt;br /&gt;
=== Выводы для классов архитектур ===&lt;br /&gt;
=== Существующие реализации алгоритма ===&lt;br /&gt;
Данный алгоритм реализован во множестве библиотек и математических программных пакетах.&lt;br /&gt;
&lt;br /&gt;
# Библиотека [https://github.com/open-epicycle/Epicycle.Math-cs Epicycle] (C#).&lt;br /&gt;
# Библиотека [http://www.spectralpython.net/ Spectral Python (SPy)].&lt;br /&gt;
# Библиотека [https://hackage.haskell.org/package/vect-0.4.7/docs/Data-Vect-Float-GramSchmidt.html vect] (Haskell).&lt;br /&gt;
&lt;br /&gt;
==== Пакет Mathematica ====&lt;br /&gt;
Приведем пример скрипта, предназначенного для пакета Mathematica, который проводит процесс ортогонализации Грама-Шмидта над векторами, заданными в фигурных скобках последней строки. Количество векторов и их координат могут быть произвольными. В данном случае для примера взяты векторы &amp;lt;math&amp;gt;\{-2,\;1,\;0\}&amp;lt;/math&amp;gt;, &amp;lt;math&amp;gt;\{-2,\;0,\;1\}&amp;lt;/math&amp;gt;, &amp;lt;math&amp;gt;\{-0{.}5,\;-1,\;1\}&amp;lt;/math&amp;gt;.&lt;br /&gt;
&amp;lt;source lang=&#039;mathematica&#039;&amp;gt;Projection[v1_, v2_] := (v1.v2*v2)/v2.v2&lt;br /&gt;
MultipleProjection[v1_, vecs_] := Plus @@ (Projection[v1, #1] &amp;amp;) /@ vecs&lt;br /&gt;
GramSchmidt[mat_] := Fold[Join[#1, {#2 - MultipleProjection[#2, #1]}] &amp;amp;, {}, mat]&lt;br /&gt;
GramSchmidt[{{-2, 1, 0}, {-2, 0, 1}, {-0.5, -1, 1}}]&amp;lt;/source&amp;gt;&lt;br /&gt;
&lt;br /&gt;
==== Пакет Maxima ====&lt;br /&gt;
Приведем пример скрипта, предназначенного для пакета Maxima, который проводит процесс ортогонализации Грама-Шмидта над векторами, заданными в фигурных скобках последней строки. Количество векторов и их координат могут быть произвольными. В данном случае для примера взяты векторы &amp;lt;math&amp;gt;\{-2,\;1,\;0\}&amp;lt;/math&amp;gt;, &amp;lt;math&amp;gt;\{-2,\;0,\;1\}&amp;lt;/math&amp;gt;, &amp;lt;math&amp;gt;\{-0{.}5,\;-1,\;1\}&amp;lt;/math&amp;gt;.&lt;br /&gt;
&amp;lt;source lang=&#039;maxima&#039;&amp;gt;&lt;br /&gt;
load(eigen);&lt;br /&gt;
x: matrix ([-2,1,0],[-2,0,1],[-0.5,-1,1]);&lt;br /&gt;
y: gramschmidt(x);&lt;br /&gt;
&amp;lt;/source&amp;gt;&lt;br /&gt;
&lt;br /&gt;
==== Пакет MATLAB ====&lt;br /&gt;
Приведем пример скрипта, предназначенного для пакета MATLAB, который проводит процесс ортогонализации Грама-Шмидта над векторами, заданными в фигурных скобках последней строки. В данном пакете уже существует функция, которая осуществляет данный процесс. Столбцы входной матрицы предполагаются линейно-независимыми, количество векторов и их координат могут быть произвольными. Функция возращает матрицу X с ортонормированными столбцами и обратимую верхне-треугольную матрицу Y.&lt;br /&gt;
&lt;br /&gt;
В данном случае для примера взяты векторы &amp;lt;math&amp;gt;\{-2,\;1,\;0\}&amp;lt;/math&amp;gt;, &amp;lt;math&amp;gt;\{-2,\;0,\;1\}&amp;lt;/math&amp;gt;, &amp;lt;math&amp;gt;\{-0{.}5,\;-1,\;1\}&amp;lt;/math&amp;gt;.&lt;br /&gt;
&amp;lt;source lang=&#039;matlab&#039;&amp;gt;&lt;br /&gt;
[x y]=gschmidt([-2 1 0; -2 0 1; -0.5 -1 1])&lt;br /&gt;
&amp;lt;/source&amp;gt;&lt;br /&gt;
&lt;br /&gt;
== Литература ==&lt;/div&gt;</summary>
		<author><name>BDA</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:BDA/%D0%9E%D1%80%D1%82%D0%BE%D0%B3%D0%BE%D0%BD%D0%B0%D0%BB%D0%B8%D0%B7%D0%B0%D1%86%D0%B8%D1%8F_%D0%93%D1%80%D0%B0%D0%BC%D0%B0-%D0%A8%D0%BC%D0%B8%D0%B4%D1%82%D0%B0&amp;diff=12695</id>
		<title>Участник:BDA/Ортогонализация Грама-Шмидта</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:BDA/%D0%9E%D1%80%D1%82%D0%BE%D0%B3%D0%BE%D0%BD%D0%B0%D0%BB%D0%B8%D0%B7%D0%B0%D1%86%D0%B8%D1%8F_%D0%93%D1%80%D0%B0%D0%BC%D0%B0-%D0%A8%D0%BC%D0%B8%D0%B4%D1%82%D0%B0&amp;diff=12695"/>
		<updated>2016-10-16T17:23:40Z</updated>

		<summary type="html">&lt;p&gt;BDA: /* Последовательная сложность алгоритма */&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(nm^2)&amp;lt;/math&amp;gt;&lt;br /&gt;
| pf_height         = &amp;lt;math&amp;gt;?&amp;lt;/math&amp;gt;&lt;br /&gt;
| pf_width          = &amp;lt;math&amp;gt;?&amp;lt;/math&amp;gt;&lt;br /&gt;
| input_data        = &amp;lt;math&amp;gt;nm&amp;lt;/math&amp;gt;&lt;br /&gt;
| output_data       = &amp;lt;math&amp;gt;nm&amp;lt;/math&amp;gt;&lt;br /&gt;
}}&lt;br /&gt;
&lt;br /&gt;
Основные авторы описания: [[Участник:Zodiac|Белов Н. А.]], [[Участник:BDA|Богомолов Д. А.]].&lt;br /&gt;
&lt;br /&gt;
== Свойства и структура алгоритма ==&lt;br /&gt;
=== Общее описание алгоритма ===&lt;br /&gt;
&lt;br /&gt;
Ортогонализация ― алгоритм построения для данной линейно независимой системы векторов евклидова или эрмитова пространства V ортогональной системы ненулевых векторов, порождающих то же самое подпространство в V.&lt;br /&gt;
&lt;br /&gt;
Ортогонализация Грама–Шмидта&amp;lt;ref&amp;gt;Канатников А.Н., Крищенко А.П. &amp;quot;Линейная алгебра.&amp;quot; ― 3-е изд., стер. ― М.: Изд-во МГТУ им. Н.Э. Баумана, 2002&amp;lt;/ref&amp;gt; (процесс Грама–Шмидта) ― наиболее известный алгоритм ортогонализации. Назван в честь Йоргена Педерсена Грама&amp;lt;ref&amp;gt;O&#039;Connor, John J.; Robertson, Edmund F., &amp;quot;Jørgen Pedersen Gram&amp;quot;, MacTutor History of Mathematics archive, University of St Andrews.&amp;lt;/ref&amp;gt; и Эрхарда Шмидта&amp;lt;ref&amp;gt;O&#039;Connor, John J.; Robertson, Edmund F., &amp;quot;Erhard Schmidt&amp;quot;, MacTutor History of Mathematics archive, University of St Andrews.&amp;lt;/ref&amp;gt;, однако ранее уже появлялся в работах Лапласа и Коши. Является частным случаем разложения Ивасавы, так как может быть представлен как разложение невырожденной квадратной матрицы в произведение ортогональной (или унитарной матрицы в случае эрмитова пространства) и верхнетреугольной матрицы с положительными диагональными элементами.&lt;br /&gt;
&lt;br /&gt;
Рассматриваемый алгоритм применяется для борьбы с помехами в адаптивной системе селекции движущихся целей&amp;lt;ref&amp;gt;Орешкин Б.Н., Бакулев П.А. &amp;quot;Быстрая процедура ортогонализации Грамма–Шмидта и ее применение для борьбы с помехами в адаптивной системе селекции движущихся целей&amp;quot; ― Радиотехника / №12 за 2007 г.&amp;lt;/ref&amp;gt;, в протоколах безопасности&amp;lt;ref&amp;gt;Пискова А.В., Менщиков А.А., Коробейников А.Г. &amp;quot;Использование ортогонализации Грама-Шмидта в алгоритме приведения базиса решетки для протоколов безопасности&amp;quot; ― Вопросы кибербезопасности №1(14) 2016&amp;lt;/ref&amp;gt;, для повышения экономичности алгоритмов оценивания параметров моделей объектов управления&amp;lt;ref&amp;gt;Карелин А.Е., Светлаков А.А. &amp;quot;Использование ортогонализации Грама-Шмидта для повышения экономичности многоточечных алгоритмов рекуррентного оценивания параметров моделей объектов управления&amp;quot; ― Известия Томского политехнического университета [Известия ТПУ]. — 2006. — Т. 309, № 8. — [С. 15-19].&amp;lt;/ref&amp;gt; и в других областях.&lt;br /&gt;
&lt;br /&gt;
=== Математическое описание алгоритма ===&lt;br /&gt;
&#039;&#039;&#039;Входные данные.&#039;&#039;&#039; &amp;lt;math&amp;gt;m&amp;lt;/math&amp;gt; линейно независимых векторов &amp;lt;math&amp;gt;\mathbf{a}_1,...,\mathbf{a}_m&amp;lt;/math&amp;gt; c размерностью пространства &amp;lt;math&amp;gt;n&amp;lt;/math&amp;gt;, записанных в матрице &amp;lt;math&amp;gt;A&amp;lt;/math&amp;gt; с элементами &amp;lt;math&amp;gt;\alpha_{ij}&amp;lt;/math&amp;gt;.&lt;br /&gt;
&lt;br /&gt;
&#039;&#039;&#039;Выходные данные.&#039;&#039;&#039; &amp;lt;math&amp;gt;m&amp;lt;/math&amp;gt; ортогональных векторов &amp;lt;math&amp;gt;\mathbf{b}_1,...,\mathbf{b}_m&amp;lt;/math&amp;gt; c размерностью пространства &amp;lt;math&amp;gt;n&amp;lt;/math&amp;gt;, записанных в матрице &amp;lt;math&amp;gt;B&amp;lt;/math&amp;gt; с элементами &amp;lt;math&amp;gt;\beta_{ij}&amp;lt;/math&amp;gt;.&lt;br /&gt;
&lt;br /&gt;
Определим оператор проекции (проецирует вектор &amp;lt;math&amp;gt;\mathbf{a}&amp;lt;/math&amp;gt; коллинеарно вектору &amp;lt;math&amp;gt;\mathbf{b}&amp;lt;/math&amp;gt;) &amp;lt;math&amp;gt;\mathbf{proj_b a = \frac{\left \langle a,b \right \rangle}{\left \langle b,b \right \rangle }b}&amp;lt;/math&amp;gt;, где &amp;lt;math&amp;gt;\mathbf{\left \langle a,b \right \rangle}&amp;lt;/math&amp;gt; ― скалярное произведение векторов &amp;lt;math&amp;gt;\mathbf{a}&amp;lt;/math&amp;gt; и &amp;lt;math&amp;gt;\mathbf{b}&amp;lt;/math&amp;gt;.&lt;br /&gt;
&lt;br /&gt;
Тогда ортогональные векторы вычисляются следующим образом:&lt;br /&gt;
&lt;br /&gt;
&amp;lt;math&amp;gt;\mathbf{b}_1 = \mathbf{a}_1&amp;lt;/math&amp;gt;&lt;br /&gt;
&lt;br /&gt;
&amp;lt;math&amp;gt;\mathbf{b}_2 = \mathbf{a}_2 - \mathbf{proj}_{\mathbf{b}_1} \mathbf{a}_2 &amp;lt;/math&amp;gt;&lt;br /&gt;
&lt;br /&gt;
&amp;lt;math&amp;gt;\mathbf{b}_3 = \mathbf{a}_3 - \mathbf{proj}_{\mathbf{b}_1} \mathbf{a}_3 - \mathbf{proj}_{\mathbf{b}_2} \mathbf{a}_3 &amp;lt;/math&amp;gt;&lt;br /&gt;
&lt;br /&gt;
&amp;lt;math&amp;gt;\vdots&amp;lt;/math&amp;gt;&lt;br /&gt;
&lt;br /&gt;
&amp;lt;math&amp;gt;\mathbf{b}_m = \mathbf{a}_m - \sum_{j=1}^{m-1} \mathbf{proj}_{\mathbf{b}_j} \mathbf{a}_m&amp;lt;/math&amp;gt;&lt;br /&gt;
&lt;br /&gt;
Или поэлементно:&lt;br /&gt;
&lt;br /&gt;
&amp;lt;math&amp;gt;\beta_{1j} = \alpha_{1j}&amp;lt;/math&amp;gt;&lt;br /&gt;
&lt;br /&gt;
&amp;lt;math&amp;gt;\beta_{ij} = \alpha_{ij} - (\sum_{k=1}^{i-1} \mathbf{proj}_{\mathbf{b}_k} \mathbf{a}_i)_j = \alpha_{ij} - \sum_{k=1}^{i-1}\frac{\sum_{s=1}^{n}\alpha_{is}\beta_{ks}}{\sum_{s=1}^{n}\beta_{ks}\beta_{ks}}\beta_{kj} &amp;lt;/math&amp;gt;&lt;br /&gt;
&lt;br /&gt;
=== Вычислительное ядро алгоритма ===&lt;br /&gt;
Основное время работы алгоритма приходится на вычисление сумм &amp;lt;math&amp;gt;\sum_{i=1}^{j-1} \mathbf{proj}_{\mathbf{b}_i} \mathbf{a}_k \forall j: j=\overline{1, m}&amp;lt;/math&amp;gt;.&lt;br /&gt;
&lt;br /&gt;
=== Макроструктура алгоритма ===&lt;br /&gt;
Из описания алгоритма в предыдущих разделов следует, что основную часть данного метода составляют операции вычисления проекций векторов, а также их сумм.&lt;br /&gt;
&lt;br /&gt;
=== Схема реализации последовательного алгоритма ===&lt;br /&gt;
*&lt;br /&gt;
=== Последовательная сложность алгоритма ===&lt;br /&gt;
Рассмотрим &amp;lt;math&amp;gt;m&amp;lt;/math&amp;gt; векторов длины &amp;lt;math&amp;gt;n&amp;lt;/math&amp;gt;.&lt;br /&gt;
&lt;br /&gt;
# Скалярное произведение векторов требует &amp;lt;math&amp;gt;n-1&amp;lt;/math&amp;gt; сложение и &amp;lt;math&amp;gt;n&amp;lt;/math&amp;gt; произведений.&lt;br /&gt;
# Вычитание проекции вектора требует &amp;lt;math&amp;gt;2&amp;lt;/math&amp;gt; скалярных произведения, &amp;lt;math&amp;gt;1&amp;lt;/math&amp;gt; деление, &amp;lt;math&amp;gt;n&amp;lt;/math&amp;gt; умножений и &amp;lt;math&amp;gt;n&amp;lt;/math&amp;gt; сложений, то есть:&lt;br /&gt;
## &amp;lt;math&amp;gt;3n-2&amp;lt;/math&amp;gt; (&amp;lt;math&amp;gt;+&amp;lt;/math&amp;gt;);&lt;br /&gt;
## &amp;lt;math&amp;gt;3n&amp;lt;/math&amp;gt; (&amp;lt;math&amp;gt;\times&amp;lt;/math&amp;gt;);&lt;br /&gt;
## &amp;lt;math&amp;gt;1&amp;lt;/math&amp;gt; (&amp;lt;math&amp;gt;\div&amp;lt;/math&amp;gt;).&lt;br /&gt;
# Вычисление &amp;lt;math&amp;gt;i&amp;lt;/math&amp;gt;-го вектора требует &amp;lt;math&amp;gt;i-1&amp;lt;/math&amp;gt; вычитаний проекций, то есть:&lt;br /&gt;
## &amp;lt;math&amp;gt;(3n-2)(i-1)&amp;lt;/math&amp;gt; (&amp;lt;math&amp;gt;+&amp;lt;/math&amp;gt;);&lt;br /&gt;
## &amp;lt;math&amp;gt;3n(i-1)&amp;lt;/math&amp;gt; (&amp;lt;math&amp;gt;\times&amp;lt;/math&amp;gt;);&lt;br /&gt;
## &amp;lt;math&amp;gt;i-1&amp;lt;/math&amp;gt; (&amp;lt;math&amp;gt;\div&amp;lt;/math&amp;gt;).&lt;br /&gt;
# Мы вычисляем вектора от &amp;lt;math&amp;gt;i=1&amp;lt;/math&amp;gt; до &amp;lt;math&amp;gt;m&amp;lt;/math&amp;gt;, поэтому множители &amp;lt;math&amp;gt;(i-1)&amp;lt;/math&amp;gt; выражаются &#039;&#039;треугольным числом&#039;&#039; &amp;lt;math&amp;gt;(m-1)\frac{m}{2}&amp;lt;/math&amp;gt;.&lt;br /&gt;
## &amp;lt;math&amp;gt;(3n-2)(m-1)\frac{m}{2}&amp;lt;/math&amp;gt; (&amp;lt;math&amp;gt;+&amp;lt;/math&amp;gt;);&lt;br /&gt;
## &amp;lt;math&amp;gt;3n(m-1)\frac{m}{2}&amp;lt;/math&amp;gt; (&amp;lt;math&amp;gt;\times&amp;lt;/math&amp;gt;);&lt;br /&gt;
## &amp;lt;math&amp;gt;(m-1)\frac{m}{2}&amp;lt;/math&amp;gt; (&amp;lt;math&amp;gt;\div&amp;lt;/math&amp;gt;).&lt;br /&gt;
&lt;br /&gt;
Таким образом, cложность алгоритма &amp;lt;math&amp;gt;O(nm^2)&amp;lt;/math&amp;gt;.&lt;br /&gt;
&lt;br /&gt;
=== Информационный граф ===&lt;br /&gt;
*&lt;br /&gt;
=== Ресурс параллелизма алгоритма ===&lt;br /&gt;
*&lt;br /&gt;
=== Входные и выходные данные алгоритма ===&lt;br /&gt;
&#039;&#039;&#039;Входные данные.&#039;&#039;&#039; Матрица &amp;lt;math&amp;gt;A&amp;lt;/math&amp;gt; с элементами &amp;lt;math&amp;gt;\alpha_{ij}&amp;lt;/math&amp;gt;, где &amp;lt;math&amp;gt;i = \overline{1, m}&amp;lt;/math&amp;gt; (количество линейно независимых векторов) и &amp;lt;math&amp;gt;j = \overline{1, n}&amp;lt;/math&amp;gt; (размерность пространства), при этом &amp;lt;math&amp;gt;m \leqslant n&amp;lt;/math&amp;gt;.&lt;br /&gt;
&lt;br /&gt;
&#039;&#039;&#039;Объем входных данных.&#039;&#039;&#039; &amp;lt;math&amp;gt;mn&amp;lt;/math&amp;gt;&lt;br /&gt;
&lt;br /&gt;
&#039;&#039;&#039;Выходные данные.&#039;&#039;&#039; Матрица &amp;lt;math&amp;gt;B&amp;lt;/math&amp;gt; с элементами &amp;lt;math&amp;gt;\beta_{ij}&amp;lt;/math&amp;gt;, где &amp;lt;math&amp;gt;i = \overline{1, m}&amp;lt;/math&amp;gt; и &amp;lt;math&amp;gt;j = \overline{1, n}&amp;lt;/math&amp;gt;, тогда &amp;lt;math&amp;gt;b_{1}, \dots, b_{m}&amp;lt;/math&amp;gt; — система ортогональных векторов.&lt;br /&gt;
&lt;br /&gt;
&#039;&#039;&#039;Объем выходных данных.&#039;&#039;&#039; &amp;lt;math&amp;gt;mn&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;
=== Масштабируемость алгоритма и его реализации ===&lt;br /&gt;
&#039;&#039;Срок сдачи продлен до 15 ноября.&#039;&#039;&lt;br /&gt;
=== Динамические характеристики и эффективность реализации алгоритма ===&lt;br /&gt;
=== Выводы для классов архитектур ===&lt;br /&gt;
=== Существующие реализации алгоритма ===&lt;br /&gt;
Данный алгоритм реализован во множестве библиотек и математических программных пакетах.&lt;br /&gt;
&lt;br /&gt;
# Библиотека [https://github.com/open-epicycle/Epicycle.Math-cs Epicycle] (C#).&lt;br /&gt;
# Библиотека [http://www.spectralpython.net/ Spectral Python (SPy)].&lt;br /&gt;
# Библиотека [https://hackage.haskell.org/package/vect-0.4.7/docs/Data-Vect-Float-GramSchmidt.html vect] (Haskell).&lt;br /&gt;
&lt;br /&gt;
==== Пакет Mathematica ====&lt;br /&gt;
Приведем пример скрипта, предназначенного для пакета Mathematica, который проводит процесс ортогонализации Грама-Шмидта над векторами, заданными в фигурных скобках последней строки. Количество векторов и их координат могут быть произвольными. В данном случае для примера взяты векторы &amp;lt;math&amp;gt;\{-2,\;1,\;0\}&amp;lt;/math&amp;gt;, &amp;lt;math&amp;gt;\{-2,\;0,\;1\}&amp;lt;/math&amp;gt;, &amp;lt;math&amp;gt;\{-0{.}5,\;-1,\;1\}&amp;lt;/math&amp;gt;.&lt;br /&gt;
&amp;lt;source lang=&#039;mathematica&#039;&amp;gt;Projection[v1_, v2_] := (v1.v2*v2)/v2.v2&lt;br /&gt;
MultipleProjection[v1_, vecs_] := Plus @@ (Projection[v1, #1] &amp;amp;) /@ vecs&lt;br /&gt;
GramSchmidt[mat_] := Fold[Join[#1, {#2 - MultipleProjection[#2, #1]}] &amp;amp;, {}, mat]&lt;br /&gt;
GramSchmidt[{{-2, 1, 0}, {-2, 0, 1}, {-0.5, -1, 1}}]&amp;lt;/source&amp;gt;&lt;br /&gt;
&lt;br /&gt;
==== Пакет Maxima ====&lt;br /&gt;
Приведем пример скрипта, предназначенного для пакета Maxima, который проводит процесс ортогонализации Грама-Шмидта над векторами, заданными в фигурных скобках последней строки. Количество векторов и их координат могут быть произвольными. В данном случае для примера взяты векторы &amp;lt;math&amp;gt;\{-2,\;1,\;0\}&amp;lt;/math&amp;gt;, &amp;lt;math&amp;gt;\{-2,\;0,\;1\}&amp;lt;/math&amp;gt;, &amp;lt;math&amp;gt;\{-0{.}5,\;-1,\;1\}&amp;lt;/math&amp;gt;.&lt;br /&gt;
&amp;lt;source lang=&#039;maxima&#039;&amp;gt;&lt;br /&gt;
load(eigen);&lt;br /&gt;
x: matrix ([-2,1,0],[-2,0,1],[-0.5,-1,1]);&lt;br /&gt;
y: gramschmidt(x);&lt;br /&gt;
&amp;lt;/source&amp;gt;&lt;br /&gt;
&lt;br /&gt;
==== Пакет MATLAB ====&lt;br /&gt;
Приведем пример скрипта, предназначенного для пакета MATLAB, который проводит процесс ортогонализации Грама-Шмидта над векторами, заданными в фигурных скобках последней строки. В данном пакете уже существует функция, которая осуществляет данный процесс. Столбцы входной матрицы предполагаются линейно-независимыми, количество векторов и их координат могут быть произвольными. Функция возращает матрицу X с ортонормированными столбцами и обратимую верхне-треугольную матрицу Y.&lt;br /&gt;
&lt;br /&gt;
В данном случае для примера взяты векторы &amp;lt;math&amp;gt;\{-2,\;1,\;0\}&amp;lt;/math&amp;gt;, &amp;lt;math&amp;gt;\{-2,\;0,\;1\}&amp;lt;/math&amp;gt;, &amp;lt;math&amp;gt;\{-0{.}5,\;-1,\;1\}&amp;lt;/math&amp;gt;.&lt;br /&gt;
&amp;lt;source lang=&#039;matlab&#039;&amp;gt;&lt;br /&gt;
[x y]=gschmidt([-2 1 0; -2 0 1; -0.5 -1 1])&lt;br /&gt;
&amp;lt;/source&amp;gt;&lt;br /&gt;
&lt;br /&gt;
== Литература ==&lt;/div&gt;</summary>
		<author><name>BDA</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:BDA/%D0%9E%D1%80%D1%82%D0%BE%D0%B3%D0%BE%D0%BD%D0%B0%D0%BB%D0%B8%D0%B7%D0%B0%D1%86%D0%B8%D1%8F_%D0%93%D1%80%D0%B0%D0%BC%D0%B0-%D0%A8%D0%BC%D0%B8%D0%B4%D1%82%D0%B0&amp;diff=12694</id>
		<title>Участник:BDA/Ортогонализация Грама-Шмидта</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:BDA/%D0%9E%D1%80%D1%82%D0%BE%D0%B3%D0%BE%D0%BD%D0%B0%D0%BB%D0%B8%D0%B7%D0%B0%D1%86%D0%B8%D1%8F_%D0%93%D1%80%D0%B0%D0%BC%D0%B0-%D0%A8%D0%BC%D0%B8%D0%B4%D1%82%D0%B0&amp;diff=12694"/>
		<updated>2016-10-16T17:20:17Z</updated>

		<summary type="html">&lt;p&gt;BDA: /* Последовательная сложность алгоритма */&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(nm^2)&amp;lt;/math&amp;gt;&lt;br /&gt;
| pf_height         = &amp;lt;math&amp;gt;?&amp;lt;/math&amp;gt;&lt;br /&gt;
| pf_width          = &amp;lt;math&amp;gt;?&amp;lt;/math&amp;gt;&lt;br /&gt;
| input_data        = &amp;lt;math&amp;gt;nm&amp;lt;/math&amp;gt;&lt;br /&gt;
| output_data       = &amp;lt;math&amp;gt;nm&amp;lt;/math&amp;gt;&lt;br /&gt;
}}&lt;br /&gt;
&lt;br /&gt;
Основные авторы описания: [[Участник:Zodiac|Белов Н. А.]], [[Участник:BDA|Богомолов Д. А.]].&lt;br /&gt;
&lt;br /&gt;
== Свойства и структура алгоритма ==&lt;br /&gt;
=== Общее описание алгоритма ===&lt;br /&gt;
&lt;br /&gt;
Ортогонализация ― алгоритм построения для данной линейно независимой системы векторов евклидова или эрмитова пространства V ортогональной системы ненулевых векторов, порождающих то же самое подпространство в V.&lt;br /&gt;
&lt;br /&gt;
Ортогонализация Грама–Шмидта&amp;lt;ref&amp;gt;Канатников А.Н., Крищенко А.П. &amp;quot;Линейная алгебра.&amp;quot; ― 3-е изд., стер. ― М.: Изд-во МГТУ им. Н.Э. Баумана, 2002&amp;lt;/ref&amp;gt; (процесс Грама–Шмидта) ― наиболее известный алгоритм ортогонализации. Назван в честь Йоргена Педерсена Грама&amp;lt;ref&amp;gt;O&#039;Connor, John J.; Robertson, Edmund F., &amp;quot;Jørgen Pedersen Gram&amp;quot;, MacTutor History of Mathematics archive, University of St Andrews.&amp;lt;/ref&amp;gt; и Эрхарда Шмидта&amp;lt;ref&amp;gt;O&#039;Connor, John J.; Robertson, Edmund F., &amp;quot;Erhard Schmidt&amp;quot;, MacTutor History of Mathematics archive, University of St Andrews.&amp;lt;/ref&amp;gt;, однако ранее уже появлялся в работах Лапласа и Коши. Является частным случаем разложения Ивасавы, так как может быть представлен как разложение невырожденной квадратной матрицы в произведение ортогональной (или унитарной матрицы в случае эрмитова пространства) и верхнетреугольной матрицы с положительными диагональными элементами.&lt;br /&gt;
&lt;br /&gt;
Рассматриваемый алгоритм применяется для борьбы с помехами в адаптивной системе селекции движущихся целей&amp;lt;ref&amp;gt;Орешкин Б.Н., Бакулев П.А. &amp;quot;Быстрая процедура ортогонализации Грамма–Шмидта и ее применение для борьбы с помехами в адаптивной системе селекции движущихся целей&amp;quot; ― Радиотехника / №12 за 2007 г.&amp;lt;/ref&amp;gt;, в протоколах безопасности&amp;lt;ref&amp;gt;Пискова А.В., Менщиков А.А., Коробейников А.Г. &amp;quot;Использование ортогонализации Грама-Шмидта в алгоритме приведения базиса решетки для протоколов безопасности&amp;quot; ― Вопросы кибербезопасности №1(14) 2016&amp;lt;/ref&amp;gt;, для повышения экономичности алгоритмов оценивания параметров моделей объектов управления&amp;lt;ref&amp;gt;Карелин А.Е., Светлаков А.А. &amp;quot;Использование ортогонализации Грама-Шмидта для повышения экономичности многоточечных алгоритмов рекуррентного оценивания параметров моделей объектов управления&amp;quot; ― Известия Томского политехнического университета [Известия ТПУ]. — 2006. — Т. 309, № 8. — [С. 15-19].&amp;lt;/ref&amp;gt; и в других областях.&lt;br /&gt;
&lt;br /&gt;
=== Математическое описание алгоритма ===&lt;br /&gt;
&#039;&#039;&#039;Входные данные.&#039;&#039;&#039; &amp;lt;math&amp;gt;m&amp;lt;/math&amp;gt; линейно независимых векторов &amp;lt;math&amp;gt;\mathbf{a}_1,...,\mathbf{a}_m&amp;lt;/math&amp;gt; c размерностью пространства &amp;lt;math&amp;gt;n&amp;lt;/math&amp;gt;, записанных в матрице &amp;lt;math&amp;gt;A&amp;lt;/math&amp;gt; с элементами &amp;lt;math&amp;gt;\alpha_{ij}&amp;lt;/math&amp;gt;.&lt;br /&gt;
&lt;br /&gt;
&#039;&#039;&#039;Выходные данные.&#039;&#039;&#039; &amp;lt;math&amp;gt;m&amp;lt;/math&amp;gt; ортогональных векторов &amp;lt;math&amp;gt;\mathbf{b}_1,...,\mathbf{b}_m&amp;lt;/math&amp;gt; c размерностью пространства &amp;lt;math&amp;gt;n&amp;lt;/math&amp;gt;, записанных в матрице &amp;lt;math&amp;gt;B&amp;lt;/math&amp;gt; с элементами &amp;lt;math&amp;gt;\beta_{ij}&amp;lt;/math&amp;gt;.&lt;br /&gt;
&lt;br /&gt;
Определим оператор проекции (проецирует вектор &amp;lt;math&amp;gt;\mathbf{a}&amp;lt;/math&amp;gt; коллинеарно вектору &amp;lt;math&amp;gt;\mathbf{b}&amp;lt;/math&amp;gt;) &amp;lt;math&amp;gt;\mathbf{proj_b a = \frac{\left \langle a,b \right \rangle}{\left \langle b,b \right \rangle }b}&amp;lt;/math&amp;gt;, где &amp;lt;math&amp;gt;\mathbf{\left \langle a,b \right \rangle}&amp;lt;/math&amp;gt; ― скалярное произведение векторов &amp;lt;math&amp;gt;\mathbf{a}&amp;lt;/math&amp;gt; и &amp;lt;math&amp;gt;\mathbf{b}&amp;lt;/math&amp;gt;.&lt;br /&gt;
&lt;br /&gt;
Тогда ортогональные векторы вычисляются следующим образом:&lt;br /&gt;
&lt;br /&gt;
&amp;lt;math&amp;gt;\mathbf{b}_1 = \mathbf{a}_1&amp;lt;/math&amp;gt;&lt;br /&gt;
&lt;br /&gt;
&amp;lt;math&amp;gt;\mathbf{b}_2 = \mathbf{a}_2 - \mathbf{proj}_{\mathbf{b}_1} \mathbf{a}_2 &amp;lt;/math&amp;gt;&lt;br /&gt;
&lt;br /&gt;
&amp;lt;math&amp;gt;\mathbf{b}_3 = \mathbf{a}_3 - \mathbf{proj}_{\mathbf{b}_1} \mathbf{a}_3 - \mathbf{proj}_{\mathbf{b}_2} \mathbf{a}_3 &amp;lt;/math&amp;gt;&lt;br /&gt;
&lt;br /&gt;
&amp;lt;math&amp;gt;\vdots&amp;lt;/math&amp;gt;&lt;br /&gt;
&lt;br /&gt;
&amp;lt;math&amp;gt;\mathbf{b}_m = \mathbf{a}_m - \sum_{j=1}^{m-1} \mathbf{proj}_{\mathbf{b}_j} \mathbf{a}_m&amp;lt;/math&amp;gt;&lt;br /&gt;
&lt;br /&gt;
Или поэлементно:&lt;br /&gt;
&lt;br /&gt;
&amp;lt;math&amp;gt;\beta_{1j} = \alpha_{1j}&amp;lt;/math&amp;gt;&lt;br /&gt;
&lt;br /&gt;
&amp;lt;math&amp;gt;\beta_{ij} = \alpha_{ij} - (\sum_{k=1}^{i-1} \mathbf{proj}_{\mathbf{b}_k} \mathbf{a}_i)_j = \alpha_{ij} - \sum_{k=1}^{i-1}\frac{\sum_{s=1}^{n}\alpha_{is}\beta_{ks}}{\sum_{s=1}^{n}\beta_{ks}\beta_{ks}}\beta_{kj} &amp;lt;/math&amp;gt;&lt;br /&gt;
&lt;br /&gt;
=== Вычислительное ядро алгоритма ===&lt;br /&gt;
Основное время работы алгоритма приходится на вычисление сумм &amp;lt;math&amp;gt;\sum_{i=1}^{j-1} \mathbf{proj}_{\mathbf{b}_i} \mathbf{a}_k \forall j: j=\overline{1, m}&amp;lt;/math&amp;gt;.&lt;br /&gt;
&lt;br /&gt;
=== Макроструктура алгоритма ===&lt;br /&gt;
Из описания алгоритма в предыдущих разделов следует, что основную часть данного метода составляют операции вычисления проекций векторов, а также их сумм.&lt;br /&gt;
&lt;br /&gt;
=== Схема реализации последовательного алгоритма ===&lt;br /&gt;
*&lt;br /&gt;
=== Последовательная сложность алгоритма ===&lt;br /&gt;
Рассмотрим &amp;lt;math&amp;gt;m&amp;lt;/math&amp;gt; векторов длины &amp;lt;math&amp;gt;n&amp;lt;/math&amp;gt;.&lt;br /&gt;
&lt;br /&gt;
# Скалярное произведение векторов требует &amp;lt;math&amp;gt;n-1&amp;lt;/math&amp;gt; сложение и &amp;lt;math&amp;gt;n&amp;lt;/math&amp;gt; произведений.&lt;br /&gt;
# Вычитание проекции вектора требует &amp;lt;math&amp;gt;2&amp;lt;/math&amp;gt; скалярных произведения, &amp;lt;math&amp;gt;1&amp;lt;/math&amp;gt; деление, &amp;lt;math&amp;gt;n&amp;lt;/math&amp;gt; умножений и &amp;lt;math&amp;gt;n&amp;lt;/math&amp;gt; сложений, то есть:&lt;br /&gt;
## &amp;lt;math&amp;gt;3n-2&amp;lt;/math&amp;gt; (&amp;lt;math&amp;gt;+&amp;lt;/math&amp;gt;);&lt;br /&gt;
## &amp;lt;math&amp;gt;3n&amp;lt;/math&amp;gt; (&amp;lt;math&amp;gt;\times&amp;lt;/math&amp;gt;);&lt;br /&gt;
## &amp;lt;math&amp;gt;1&amp;lt;/math&amp;gt; (&amp;lt;math&amp;gt;\div&amp;lt;/math&amp;gt;).&lt;br /&gt;
# Вычисление &amp;lt;math&amp;gt;i&amp;lt;/math&amp;gt;-го вектора требует &amp;lt;math&amp;gt;i-1&amp;lt;/math&amp;gt; вычитаний проекций, то есть:&lt;br /&gt;
## &amp;lt;math&amp;gt;(3n-2)(i-1)&amp;lt;/math&amp;gt; (&amp;lt;math&amp;gt;+&amp;lt;/math&amp;gt;);&lt;br /&gt;
## &amp;lt;math&amp;gt;3n(i-1)&amp;lt;/math&amp;gt; (&amp;lt;math&amp;gt;\times&amp;lt;/math&amp;gt;);&lt;br /&gt;
## &amp;lt;math&amp;gt;i-1&amp;lt;/math&amp;gt; (&amp;lt;math&amp;gt;\div&amp;lt;/math&amp;gt;).&lt;br /&gt;
# Мы вычисляем вектора от &amp;lt;math&amp;gt;i=1&amp;lt;/math&amp;gt; до &amp;lt;math&amp;gt;m&amp;lt;/math&amp;gt;, поэтому &amp;lt;math&amp;gt;i-1&amp;lt;/math&amp;gt; множителей выражаются &#039;&#039;треугольным числом&#039;&#039; &amp;lt;math&amp;gt;(m-1)\frac{m}{2}&amp;lt;/math&amp;gt;.&lt;br /&gt;
## &amp;lt;math&amp;gt;(3n-2)(m-1)\frac{m}{2}&amp;lt;/math&amp;gt; (&amp;lt;math&amp;gt;+&amp;lt;/math&amp;gt;);&lt;br /&gt;
## &amp;lt;math&amp;gt;3n(m-1)\frac{m}{2}&amp;lt;/math&amp;gt; (&amp;lt;math&amp;gt;\times&amp;lt;/math&amp;gt;);&lt;br /&gt;
## &amp;lt;math&amp;gt;(m-1)\frac{m}{2}&amp;lt;/math&amp;gt; (&amp;lt;math&amp;gt;\div&amp;lt;/math&amp;gt;).&lt;br /&gt;
&lt;br /&gt;
Таким образом, cложность алгоритма &amp;lt;math&amp;gt;O(nm^2)&amp;lt;/math&amp;gt;.&lt;br /&gt;
&lt;br /&gt;
=== Информационный граф ===&lt;br /&gt;
*&lt;br /&gt;
=== Ресурс параллелизма алгоритма ===&lt;br /&gt;
*&lt;br /&gt;
=== Входные и выходные данные алгоритма ===&lt;br /&gt;
&#039;&#039;&#039;Входные данные.&#039;&#039;&#039; Матрица &amp;lt;math&amp;gt;A&amp;lt;/math&amp;gt; с элементами &amp;lt;math&amp;gt;\alpha_{ij}&amp;lt;/math&amp;gt;, где &amp;lt;math&amp;gt;i = \overline{1, m}&amp;lt;/math&amp;gt; (количество линейно независимых векторов) и &amp;lt;math&amp;gt;j = \overline{1, n}&amp;lt;/math&amp;gt; (размерность пространства), при этом &amp;lt;math&amp;gt;m \leqslant n&amp;lt;/math&amp;gt;.&lt;br /&gt;
&lt;br /&gt;
&#039;&#039;&#039;Объем входных данных.&#039;&#039;&#039; &amp;lt;math&amp;gt;mn&amp;lt;/math&amp;gt;&lt;br /&gt;
&lt;br /&gt;
&#039;&#039;&#039;Выходные данные.&#039;&#039;&#039; Матрица &amp;lt;math&amp;gt;B&amp;lt;/math&amp;gt; с элементами &amp;lt;math&amp;gt;\beta_{ij}&amp;lt;/math&amp;gt;, где &amp;lt;math&amp;gt;i = \overline{1, m}&amp;lt;/math&amp;gt; и &amp;lt;math&amp;gt;j = \overline{1, n}&amp;lt;/math&amp;gt;, тогда &amp;lt;math&amp;gt;b_{1}, \dots, b_{m}&amp;lt;/math&amp;gt; — система ортогональных векторов.&lt;br /&gt;
&lt;br /&gt;
&#039;&#039;&#039;Объем выходных данных.&#039;&#039;&#039; &amp;lt;math&amp;gt;mn&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;
=== Масштабируемость алгоритма и его реализации ===&lt;br /&gt;
&#039;&#039;Срок сдачи продлен до 15 ноября.&#039;&#039;&lt;br /&gt;
=== Динамические характеристики и эффективность реализации алгоритма ===&lt;br /&gt;
=== Выводы для классов архитектур ===&lt;br /&gt;
=== Существующие реализации алгоритма ===&lt;br /&gt;
Данный алгоритм реализован во множестве библиотек и математических программных пакетах.&lt;br /&gt;
&lt;br /&gt;
# Библиотека [https://github.com/open-epicycle/Epicycle.Math-cs Epicycle] (C#).&lt;br /&gt;
# Библиотека [http://www.spectralpython.net/ Spectral Python (SPy)].&lt;br /&gt;
# Библиотека [https://hackage.haskell.org/package/vect-0.4.7/docs/Data-Vect-Float-GramSchmidt.html vect] (Haskell).&lt;br /&gt;
&lt;br /&gt;
==== Пакет Mathematica ====&lt;br /&gt;
Приведем пример скрипта, предназначенного для пакета Mathematica, который проводит процесс ортогонализации Грама-Шмидта над векторами, заданными в фигурных скобках последней строки. Количество векторов и их координат могут быть произвольными. В данном случае для примера взяты векторы &amp;lt;math&amp;gt;\{-2,\;1,\;0\}&amp;lt;/math&amp;gt;, &amp;lt;math&amp;gt;\{-2,\;0,\;1\}&amp;lt;/math&amp;gt;, &amp;lt;math&amp;gt;\{-0{.}5,\;-1,\;1\}&amp;lt;/math&amp;gt;.&lt;br /&gt;
&amp;lt;source lang=&#039;mathematica&#039;&amp;gt;Projection[v1_, v2_] := (v1.v2*v2)/v2.v2&lt;br /&gt;
MultipleProjection[v1_, vecs_] := Plus @@ (Projection[v1, #1] &amp;amp;) /@ vecs&lt;br /&gt;
GramSchmidt[mat_] := Fold[Join[#1, {#2 - MultipleProjection[#2, #1]}] &amp;amp;, {}, mat]&lt;br /&gt;
GramSchmidt[{{-2, 1, 0}, {-2, 0, 1}, {-0.5, -1, 1}}]&amp;lt;/source&amp;gt;&lt;br /&gt;
&lt;br /&gt;
==== Пакет Maxima ====&lt;br /&gt;
Приведем пример скрипта, предназначенного для пакета Maxima, который проводит процесс ортогонализации Грама-Шмидта над векторами, заданными в фигурных скобках последней строки. Количество векторов и их координат могут быть произвольными. В данном случае для примера взяты векторы &amp;lt;math&amp;gt;\{-2,\;1,\;0\}&amp;lt;/math&amp;gt;, &amp;lt;math&amp;gt;\{-2,\;0,\;1\}&amp;lt;/math&amp;gt;, &amp;lt;math&amp;gt;\{-0{.}5,\;-1,\;1\}&amp;lt;/math&amp;gt;.&lt;br /&gt;
&amp;lt;source lang=&#039;maxima&#039;&amp;gt;&lt;br /&gt;
load(eigen);&lt;br /&gt;
x: matrix ([-2,1,0],[-2,0,1],[-0.5,-1,1]);&lt;br /&gt;
y: gramschmidt(x);&lt;br /&gt;
&amp;lt;/source&amp;gt;&lt;br /&gt;
&lt;br /&gt;
==== Пакет MATLAB ====&lt;br /&gt;
Приведем пример скрипта, предназначенного для пакета MATLAB, который проводит процесс ортогонализации Грама-Шмидта над векторами, заданными в фигурных скобках последней строки. В данном пакете уже существует функция, которая осуществляет данный процесс. Столбцы входной матрицы предполагаются линейно-независимыми, количество векторов и их координат могут быть произвольными. Функция возращает матрицу X с ортонормированными столбцами и обратимую верхне-треугольную матрицу Y.&lt;br /&gt;
&lt;br /&gt;
В данном случае для примера взяты векторы &amp;lt;math&amp;gt;\{-2,\;1,\;0\}&amp;lt;/math&amp;gt;, &amp;lt;math&amp;gt;\{-2,\;0,\;1\}&amp;lt;/math&amp;gt;, &amp;lt;math&amp;gt;\{-0{.}5,\;-1,\;1\}&amp;lt;/math&amp;gt;.&lt;br /&gt;
&amp;lt;source lang=&#039;matlab&#039;&amp;gt;&lt;br /&gt;
[x y]=gschmidt([-2 1 0; -2 0 1; -0.5 -1 1])&lt;br /&gt;
&amp;lt;/source&amp;gt;&lt;br /&gt;
&lt;br /&gt;
== Литература ==&lt;/div&gt;</summary>
		<author><name>BDA</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:BDA/%D0%9E%D1%80%D1%82%D0%BE%D0%B3%D0%BE%D0%BD%D0%B0%D0%BB%D0%B8%D0%B7%D0%B0%D1%86%D0%B8%D1%8F_%D0%93%D1%80%D0%B0%D0%BC%D0%B0-%D0%A8%D0%BC%D0%B8%D0%B4%D1%82%D0%B0&amp;diff=12668</id>
		<title>Участник:BDA/Ортогонализация Грама-Шмидта</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:BDA/%D0%9E%D1%80%D1%82%D0%BE%D0%B3%D0%BE%D0%BD%D0%B0%D0%BB%D0%B8%D0%B7%D0%B0%D1%86%D0%B8%D1%8F_%D0%93%D1%80%D0%B0%D0%BC%D0%B0-%D0%A8%D0%BC%D0%B8%D0%B4%D1%82%D0%B0&amp;diff=12668"/>
		<updated>2016-10-16T16:04:27Z</updated>

		<summary type="html">&lt;p&gt;BDA: /* Входные и выходные данные алгоритма */&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(nm^2)&amp;lt;/math&amp;gt;&lt;br /&gt;
| pf_height         = &amp;lt;math&amp;gt;?&amp;lt;/math&amp;gt;&lt;br /&gt;
| pf_width          = &amp;lt;math&amp;gt;?&amp;lt;/math&amp;gt;&lt;br /&gt;
| input_data        = &amp;lt;math&amp;gt;nm&amp;lt;/math&amp;gt;&lt;br /&gt;
| output_data       = &amp;lt;math&amp;gt;nm&amp;lt;/math&amp;gt;&lt;br /&gt;
}}&lt;br /&gt;
&lt;br /&gt;
Основные авторы описания: [[Участник:Zodiac|Белов Н. А.]], [[Участник:BDA|Богомолов Д. А.]].&lt;br /&gt;
&lt;br /&gt;
== Свойства и структура алгоритма ==&lt;br /&gt;
=== Общее описание алгоритма ===&lt;br /&gt;
&lt;br /&gt;
Ортогонализация ― алгоритм построения для данной линейно независимой системы векторов евклидова или эрмитова пространства V ортогональной системы ненулевых векторов, порождающих то же самое подпространство в V.&lt;br /&gt;
&lt;br /&gt;
Ортогонализация Грама–Шмидта&amp;lt;ref&amp;gt;Канатников А.Н., Крищенко А.П. &amp;quot;Линейная алгебра.&amp;quot; ― 3-е изд., стер. ― М.: Изд-во МГТУ им. Н.Э. Баумана, 2002&amp;lt;/ref&amp;gt; (процесс Грама–Шмидта) ― наиболее известный алгоритм ортогонализации. Назван в честь Йоргена Педерсена Грама&amp;lt;ref&amp;gt;O&#039;Connor, John J.; Robertson, Edmund F., &amp;quot;Jørgen Pedersen Gram&amp;quot;, MacTutor History of Mathematics archive, University of St Andrews.&amp;lt;/ref&amp;gt; и Эрхарда Шмидта&amp;lt;ref&amp;gt;O&#039;Connor, John J.; Robertson, Edmund F., &amp;quot;Erhard Schmidt&amp;quot;, MacTutor History of Mathematics archive, University of St Andrews.&amp;lt;/ref&amp;gt;, однако ранее уже появлялся в работах Лапласа и Коши. Является частным случаем разложения Ивасавы, так как может быть представлен как разложение невырожденной квадратной матрицы в произведение ортогональной (или унитарной матрицы в случае эрмитова пространства) и верхнетреугольной матрицы с положительными диагональными элементами.&lt;br /&gt;
&lt;br /&gt;
Рассматриваемый алгоритм применяется для борьбы с помехами в адаптивной системе селекции движущихся целей&amp;lt;ref&amp;gt;Орешкин Б.Н., Бакулев П.А. &amp;quot;Быстрая процедура ортогонализации Грамма–Шмидта и ее применение для борьбы с помехами в адаптивной системе селекции движущихся целей&amp;quot; ― Радиотехника / №12 за 2007 г.&amp;lt;/ref&amp;gt;, в протоколах безопасности&amp;lt;ref&amp;gt;Пискова А.В., Менщиков А.А., Коробейников А.Г. &amp;quot;Использование ортогонализации Грама-Шмидта в алгоритме приведения базиса решетки для протоколов безопасности&amp;quot; ― Вопросы кибербезопасности №1(14) 2016&amp;lt;/ref&amp;gt;, для повышения экономичности алгоритмов оценивания параметров моделей объектов управления&amp;lt;ref&amp;gt;Карелин А.Е., Светлаков А.А. &amp;quot;Использование ортогонализации Грама-Шмидта для повышения экономичности многоточечных алгоритмов рекуррентного оценивания параметров моделей объектов управления&amp;quot; ― Известия Томского политехнического университета [Известия ТПУ]. — 2006. — Т. 309, № 8. — [С. 15-19].&amp;lt;/ref&amp;gt; и в других областях.&lt;br /&gt;
&lt;br /&gt;
=== Математическое описание алгоритма ===&lt;br /&gt;
&#039;&#039;&#039;Входные данные.&#039;&#039;&#039; &amp;lt;math&amp;gt;m&amp;lt;/math&amp;gt; линейно независимых векторов &amp;lt;math&amp;gt;\mathbf{a}_1,...,\mathbf{a}_m&amp;lt;/math&amp;gt; c размерностью пространства &amp;lt;math&amp;gt;n&amp;lt;/math&amp;gt;, записанных в матрице &amp;lt;math&amp;gt;A&amp;lt;/math&amp;gt; с элементами &amp;lt;math&amp;gt;\alpha_{ij}&amp;lt;/math&amp;gt;.&lt;br /&gt;
&lt;br /&gt;
&#039;&#039;&#039;Выходные данные.&#039;&#039;&#039; &amp;lt;math&amp;gt;m&amp;lt;/math&amp;gt; ортогональных векторов &amp;lt;math&amp;gt;\mathbf{b}_1,...,\mathbf{b}_m&amp;lt;/math&amp;gt; c размерностью пространства &amp;lt;math&amp;gt;n&amp;lt;/math&amp;gt;, записанных в матрице &amp;lt;math&amp;gt;B&amp;lt;/math&amp;gt; с элементами &amp;lt;math&amp;gt;\beta_{ij}&amp;lt;/math&amp;gt;.&lt;br /&gt;
&lt;br /&gt;
Определим оператор проекции (проецирует вектор &amp;lt;math&amp;gt;\mathbf{a}&amp;lt;/math&amp;gt; коллинеарно вектору &amp;lt;math&amp;gt;\mathbf{b}&amp;lt;/math&amp;gt;) &amp;lt;math&amp;gt;\mathbf{proj_b a = \frac{\left \langle a,b \right \rangle}{\left \langle b,b \right \rangle }b}&amp;lt;/math&amp;gt;, где &amp;lt;math&amp;gt;\mathbf{\left \langle a,b \right \rangle}&amp;lt;/math&amp;gt; ― скалярное произведение векторов &amp;lt;math&amp;gt;\mathbf{a}&amp;lt;/math&amp;gt; и &amp;lt;math&amp;gt;\mathbf{b}&amp;lt;/math&amp;gt;.&lt;br /&gt;
&lt;br /&gt;
Тогда ортогональные векторы вычисляются следующим образом:&lt;br /&gt;
&lt;br /&gt;
&amp;lt;math&amp;gt;\mathbf{b}_1 = \mathbf{a}_1&amp;lt;/math&amp;gt;&lt;br /&gt;
&lt;br /&gt;
&amp;lt;math&amp;gt;\mathbf{b}_2 = \mathbf{a}_2 - \mathbf{proj}_{\mathbf{b}_1} \mathbf{a}_2 &amp;lt;/math&amp;gt;&lt;br /&gt;
&lt;br /&gt;
&amp;lt;math&amp;gt;\mathbf{b}_3 = \mathbf{a}_3 - \mathbf{proj}_{\mathbf{b}_1} \mathbf{a}_3 - \mathbf{proj}_{\mathbf{b}_2} \mathbf{a}_3 &amp;lt;/math&amp;gt;&lt;br /&gt;
&lt;br /&gt;
&amp;lt;math&amp;gt;\vdots&amp;lt;/math&amp;gt;&lt;br /&gt;
&lt;br /&gt;
&amp;lt;math&amp;gt;\mathbf{b}_m = \mathbf{a}_m - \sum_{j=1}^{m-1} \mathbf{proj}_{\mathbf{b}_j} \mathbf{a}_m&amp;lt;/math&amp;gt;&lt;br /&gt;
&lt;br /&gt;
Или поэлементно:&lt;br /&gt;
&lt;br /&gt;
&amp;lt;math&amp;gt;\beta_{1j} = \alpha_{1j}&amp;lt;/math&amp;gt;&lt;br /&gt;
&lt;br /&gt;
&amp;lt;math&amp;gt;\beta_{ij} = \alpha_{ij} - (\sum_{k=1}^{i-1} \mathbf{proj}_{\mathbf{b}_k} \mathbf{a}_i)_j = \alpha_{ij} - \sum_{k=1}^{i-1}\frac{\sum_{s=1}^{n}\alpha_{is}\beta_{ks}}{\sum_{s=1}^{n}\beta_{ks}\beta_{ks}}\beta_{kj} &amp;lt;/math&amp;gt;&lt;br /&gt;
&lt;br /&gt;
=== Вычислительное ядро алгоритма ===&lt;br /&gt;
Основное время работы алгоритма приходится на вычисление сумм &amp;lt;math&amp;gt;\sum_{i=1}^{j-1} \mathbf{proj}_{\mathbf{b}_i} \mathbf{a}_k \forall j: j=\overline{1, m}&amp;lt;/math&amp;gt;.&lt;br /&gt;
&lt;br /&gt;
=== Макроструктура алгоритма ===&lt;br /&gt;
Из описания алгоритма в предыдущих разделов следует, что основную часть данного метода составляют операции вычисления проекций векторов, а также их сумм.&lt;br /&gt;
&lt;br /&gt;
=== Схема реализации последовательного алгоритма ===&lt;br /&gt;
*&lt;br /&gt;
=== Последовательная сложность алгоритма ===&lt;br /&gt;
Рассмотрим &amp;lt;math&amp;gt;n&amp;lt;/math&amp;gt; векторов длины &amp;lt;math&amp;gt;m&amp;lt;/math&amp;gt;.&lt;br /&gt;
&lt;br /&gt;
# Скалярное произведение векторов требует &amp;lt;math&amp;gt;n - 1&amp;lt;/math&amp;gt; сложение и &amp;lt;math&amp;gt;n&amp;lt;/math&amp;gt; произведений.&lt;br /&gt;
# Нормализация вектора требует 1 скалярного произведения, 1 вычисления квадратного корня и &amp;lt;math&amp;gt;n&amp;lt;/math&amp;gt; делений, то есть:&lt;br /&gt;
## &amp;lt;math&amp;gt;n-1&amp;lt;/math&amp;gt; (&amp;lt;math&amp;gt;+&amp;lt;/math&amp;gt;);&lt;br /&gt;
## &amp;lt;math&amp;gt;n&amp;lt;/math&amp;gt; (&amp;lt;math&amp;gt;\times&amp;lt;/math&amp;gt;);&lt;br /&gt;
## &amp;lt;math&amp;gt;n&amp;lt;/math&amp;gt; (&amp;lt;math&amp;gt;\div&amp;lt;/math&amp;gt;);&lt;br /&gt;
## &amp;lt;math&amp;gt;1&amp;lt;/math&amp;gt; (&amp;lt;math&amp;gt;\sqrt{}&amp;lt;/math&amp;gt;).&lt;br /&gt;
# Вычитание проекции вектора требует 1 скалярного произведения, &amp;lt;math&amp;gt;n&amp;lt;/math&amp;gt; сложений и &amp;lt;math&amp;gt;n&amp;lt;/math&amp;gt; умножений, то есть:&lt;br /&gt;
## &amp;lt;math&amp;gt;2n-1&amp;lt;/math&amp;gt; (&amp;lt;math&amp;gt;+&amp;lt;/math&amp;gt;);&lt;br /&gt;
## &amp;lt;math&amp;gt;2n&amp;lt;/math&amp;gt; (&amp;lt;math&amp;gt;\times&amp;lt;/math&amp;gt;).&lt;br /&gt;
# Вычисление &amp;lt;math&amp;gt;i&amp;lt;/math&amp;gt;-го вектора требует &amp;lt;math&amp;gt;i-1&amp;lt;/math&amp;gt; вычитаний проекций с нормализацией, то есть:&lt;br /&gt;
## &amp;lt;math&amp;gt;(2n-1)(i-1)+n-1&amp;lt;/math&amp;gt; (&amp;lt;math&amp;gt;+&amp;lt;/math&amp;gt;);&lt;br /&gt;
## &amp;lt;math&amp;gt;2n(i-1)+n&amp;lt;/math&amp;gt; (&amp;lt;math&amp;gt;\times&amp;lt;/math&amp;gt;);&lt;br /&gt;
## &amp;lt;math&amp;gt;n&amp;lt;/math&amp;gt; (&amp;lt;math&amp;gt;\div&amp;lt;/math&amp;gt;);&lt;br /&gt;
## &amp;lt;math&amp;gt;1&amp;lt;/math&amp;gt; (&amp;lt;math&amp;gt;\sqrt{}&amp;lt;/math&amp;gt;).&lt;br /&gt;
# Мы вычисляем вектора от &amp;lt;math&amp;gt;i=1&amp;lt;/math&amp;gt; до &amp;lt;math&amp;gt;m&amp;lt;/math&amp;gt;, поэтому &amp;lt;math&amp;gt;i-1&amp;lt;/math&amp;gt; множителей выражаются &#039;&#039;треугольным числом&#039;&#039; &amp;lt;math&amp;gt;(m-1)\frac{m}{2}&amp;lt;/math&amp;gt;, а элементы независимых &amp;lt;math&amp;gt;i&amp;lt;/math&amp;gt; умножаются на &amp;lt;math&amp;gt;m&amp;lt;/math&amp;gt;.&lt;br /&gt;
## &amp;lt;math&amp;gt;(2n-1)(m-1)\frac{m}{2}+(n-1)m&amp;lt;/math&amp;gt; (&amp;lt;math&amp;gt;+&amp;lt;/math&amp;gt;);&lt;br /&gt;
## &amp;lt;math&amp;gt;2n(m-1)\frac{m}{2}+nm&amp;lt;/math&amp;gt; (&amp;lt;math&amp;gt;\times&amp;lt;/math&amp;gt;);&lt;br /&gt;
## &amp;lt;math&amp;gt;nm&amp;lt;/math&amp;gt; (&amp;lt;math&amp;gt;\div&amp;lt;/math&amp;gt;);&lt;br /&gt;
## &amp;lt;math&amp;gt;m&amp;lt;/math&amp;gt; (&amp;lt;math&amp;gt;\sqrt{}&amp;lt;/math&amp;gt;).&lt;br /&gt;
# В скалярном произведении &amp;lt;math&amp;gt;n&amp;lt;/math&amp;gt; делений могут быть рассмотрены как &amp;lt;math&amp;gt;n&amp;lt;/math&amp;gt; умножений:&lt;br /&gt;
## &amp;lt;math&amp;gt;(2n-1)(m-1)\frac{m}{2}+(n-1)m&amp;lt;/math&amp;gt; (&amp;lt;math&amp;gt;+&amp;lt;/math&amp;gt;);&lt;br /&gt;
## &amp;lt;math&amp;gt;2n(m-1)\frac{m}{2}+2nm&amp;lt;/math&amp;gt; (&amp;lt;math&amp;gt;\times&amp;lt;/math&amp;gt;);&lt;br /&gt;
## &amp;lt;math&amp;gt;m&amp;lt;/math&amp;gt; (&amp;lt;math&amp;gt;\div&amp;lt;/math&amp;gt;);&lt;br /&gt;
## &amp;lt;math&amp;gt;m&amp;lt;/math&amp;gt; (&amp;lt;math&amp;gt;\sqrt{}&amp;lt;/math&amp;gt;).&lt;br /&gt;
&lt;br /&gt;
Таким образом, требуется &amp;lt;math&amp;gt;2nm^2&amp;lt;/math&amp;gt; операций. Сложность алгоритма &amp;lt;math&amp;gt;O(nm^2)&amp;lt;/math&amp;gt;.&lt;br /&gt;
&lt;br /&gt;
=== Информационный граф ===&lt;br /&gt;
*&lt;br /&gt;
=== Ресурс параллелизма алгоритма ===&lt;br /&gt;
*&lt;br /&gt;
=== Входные и выходные данные алгоритма ===&lt;br /&gt;
&#039;&#039;&#039;Входные данные.&#039;&#039;&#039; Матрица &amp;lt;math&amp;gt;A&amp;lt;/math&amp;gt; с элементами &amp;lt;math&amp;gt;\alpha_{ij}&amp;lt;/math&amp;gt;, где &amp;lt;math&amp;gt;i = \overline{1, m}&amp;lt;/math&amp;gt; (количество линейно независимых векторов) и &amp;lt;math&amp;gt;j = \overline{1, n}&amp;lt;/math&amp;gt; (размерность пространства), при этом &amp;lt;math&amp;gt;m \leqslant n&amp;lt;/math&amp;gt;.&lt;br /&gt;
&lt;br /&gt;
&#039;&#039;&#039;Объем входных данных.&#039;&#039;&#039; &amp;lt;math&amp;gt;mn&amp;lt;/math&amp;gt;&lt;br /&gt;
&lt;br /&gt;
&#039;&#039;&#039;Выходные данные.&#039;&#039;&#039; Матрица &amp;lt;math&amp;gt;B&amp;lt;/math&amp;gt; с элементами &amp;lt;math&amp;gt;\beta_{ij}&amp;lt;/math&amp;gt;, где &amp;lt;math&amp;gt;i = \overline{1, m}&amp;lt;/math&amp;gt; и &amp;lt;math&amp;gt;j = \overline{1, n}&amp;lt;/math&amp;gt;, тогда &amp;lt;math&amp;gt;b_{1}, \dots, b_{m}&amp;lt;/math&amp;gt; — система ортогональных векторов.&lt;br /&gt;
&lt;br /&gt;
&#039;&#039;&#039;Объем выходных данных.&#039;&#039;&#039; &amp;lt;math&amp;gt;mn&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;
=== Масштабируемость алгоритма и его реализации ===&lt;br /&gt;
&#039;&#039;Срок сдачи продлен до 15 ноября.&#039;&#039;&lt;br /&gt;
=== Динамические характеристики и эффективность реализации алгоритма ===&lt;br /&gt;
=== Выводы для классов архитектур ===&lt;br /&gt;
=== Существующие реализации алгоритма ===&lt;br /&gt;
*&lt;br /&gt;
== Литература ==&lt;/div&gt;</summary>
		<author><name>BDA</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:BDA/%D0%9E%D1%80%D1%82%D0%BE%D0%B3%D0%BE%D0%BD%D0%B0%D0%BB%D0%B8%D0%B7%D0%B0%D1%86%D0%B8%D1%8F_%D0%93%D1%80%D0%B0%D0%BC%D0%B0-%D0%A8%D0%BC%D0%B8%D0%B4%D1%82%D0%B0&amp;diff=12661</id>
		<title>Участник:BDA/Ортогонализация Грама-Шмидта</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:BDA/%D0%9E%D1%80%D1%82%D0%BE%D0%B3%D0%BE%D0%BD%D0%B0%D0%BB%D0%B8%D0%B7%D0%B0%D1%86%D0%B8%D1%8F_%D0%93%D1%80%D0%B0%D0%BC%D0%B0-%D0%A8%D0%BC%D0%B8%D0%B4%D1%82%D0%B0&amp;diff=12661"/>
		<updated>2016-10-16T15:52:31Z</updated>

		<summary type="html">&lt;p&gt;BDA: /* Вычислительное ядро алгоритма */&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(nm^2)&amp;lt;/math&amp;gt;&lt;br /&gt;
| pf_height         = &amp;lt;math&amp;gt;?&amp;lt;/math&amp;gt;&lt;br /&gt;
| pf_width          = &amp;lt;math&amp;gt;?&amp;lt;/math&amp;gt;&lt;br /&gt;
| input_data        = &amp;lt;math&amp;gt;nm&amp;lt;/math&amp;gt;&lt;br /&gt;
| output_data       = &amp;lt;math&amp;gt;nm&amp;lt;/math&amp;gt;&lt;br /&gt;
}}&lt;br /&gt;
&lt;br /&gt;
Основные авторы описания: [[Участник:Zodiac|Белов Н. А.]], [[Участник:BDA|Богомолов Д. А.]].&lt;br /&gt;
&lt;br /&gt;
== Свойства и структура алгоритма ==&lt;br /&gt;
=== Общее описание алгоритма ===&lt;br /&gt;
&lt;br /&gt;
Ортогонализация ― алгоритм построения для данной линейно независимой системы векторов евклидова или эрмитова пространства V ортогональной системы ненулевых векторов, порождающих то же самое подпространство в V.&lt;br /&gt;
&lt;br /&gt;
Ортогонализация Грама–Шмидта&amp;lt;ref&amp;gt;Канатников А.Н., Крищенко А.П. &amp;quot;Линейная алгебра.&amp;quot; ― 3-е изд., стер. ― М.: Изд-во МГТУ им. Н.Э. Баумана, 2002&amp;lt;/ref&amp;gt; (процесс Грама–Шмидта) ― наиболее известный алгоритм ортогонализации. Назван в честь Йоргена Педерсена Грама&amp;lt;ref&amp;gt;O&#039;Connor, John J.; Robertson, Edmund F., &amp;quot;Jørgen Pedersen Gram&amp;quot;, MacTutor History of Mathematics archive, University of St Andrews.&amp;lt;/ref&amp;gt; и Эрхарда Шмидта&amp;lt;ref&amp;gt;O&#039;Connor, John J.; Robertson, Edmund F., &amp;quot;Erhard Schmidt&amp;quot;, MacTutor History of Mathematics archive, University of St Andrews.&amp;lt;/ref&amp;gt;, однако ранее уже появлялся в работах Лапласа и Коши. Является частным случаем разложения Ивасавы, так как может быть представлен как разложение невырожденной квадратной матрицы в произведение ортогональной (или унитарной матрицы в случае эрмитова пространства) и верхнетреугольной матрицы с положительными диагональными элементами.&lt;br /&gt;
&lt;br /&gt;
Рассматриваемый алгоритм применяется для борьбы с помехами в адаптивной системе селекции движущихся целей&amp;lt;ref&amp;gt;Орешкин Б.Н., Бакулев П.А. &amp;quot;Быстрая процедура ортогонализации Грамма–Шмидта и ее применение для борьбы с помехами в адаптивной системе селекции движущихся целей&amp;quot; ― Радиотехника / №12 за 2007 г.&amp;lt;/ref&amp;gt;, в протоколах безопасности&amp;lt;ref&amp;gt;Пискова А.В., Менщиков А.А., Коробейников А.Г. &amp;quot;Использование ортогонализации Грама-Шмидта в алгоритме приведения базиса решетки для протоколов безопасности&amp;quot; ― Вопросы кибербезопасности №1(14) 2016&amp;lt;/ref&amp;gt;, для повышения экономичности алгоритмов оценивания параметров моделей объектов управления&amp;lt;ref&amp;gt;Карелин А.Е., Светлаков А.А. &amp;quot;Использование ортогонализации Грама-Шмидта для повышения экономичности многоточечных алгоритмов рекуррентного оценивания параметров моделей объектов управления&amp;quot; ― Известия Томского политехнического университета [Известия ТПУ]. — 2006. — Т. 309, № 8. — [С. 15-19].&amp;lt;/ref&amp;gt; и в других областях.&lt;br /&gt;
&lt;br /&gt;
=== Математическое описание алгоритма ===&lt;br /&gt;
&#039;&#039;&#039;Входные данные.&#039;&#039;&#039; &amp;lt;math&amp;gt;m&amp;lt;/math&amp;gt; линейно независимых векторов &amp;lt;math&amp;gt;\mathbf{a}_1,...,\mathbf{a}_m&amp;lt;/math&amp;gt; c размерностью пространства &amp;lt;math&amp;gt;n&amp;lt;/math&amp;gt;, записанных в матрице &amp;lt;math&amp;gt;A&amp;lt;/math&amp;gt; с элементами &amp;lt;math&amp;gt;\alpha_{ij}&amp;lt;/math&amp;gt;.&lt;br /&gt;
&lt;br /&gt;
&#039;&#039;&#039;Выходные данные.&#039;&#039;&#039; &amp;lt;math&amp;gt;m&amp;lt;/math&amp;gt; ортогональных векторов &amp;lt;math&amp;gt;\mathbf{b}_1,...,\mathbf{b}_m&amp;lt;/math&amp;gt; c размерностью пространства &amp;lt;math&amp;gt;n&amp;lt;/math&amp;gt;, записанных в матрице &amp;lt;math&amp;gt;B&amp;lt;/math&amp;gt; с элементами &amp;lt;math&amp;gt;\beta_{ij}&amp;lt;/math&amp;gt;.&lt;br /&gt;
&lt;br /&gt;
Определим оператор проекции (проецирует вектор &amp;lt;math&amp;gt;\mathbf{a}&amp;lt;/math&amp;gt; коллинеарно вектору &amp;lt;math&amp;gt;\mathbf{b}&amp;lt;/math&amp;gt;) &amp;lt;math&amp;gt;\mathbf{proj_b a = \frac{\left \langle a,b \right \rangle}{\left \langle b,b \right \rangle }b}&amp;lt;/math&amp;gt;, где &amp;lt;math&amp;gt;\mathbf{\left \langle a,b \right \rangle}&amp;lt;/math&amp;gt; ― скалярное произведение векторов &amp;lt;math&amp;gt;\mathbf{a}&amp;lt;/math&amp;gt; и &amp;lt;math&amp;gt;\mathbf{b}&amp;lt;/math&amp;gt;.&lt;br /&gt;
&lt;br /&gt;
Тогда ортогональные векторы вычисляются следующим образом:&lt;br /&gt;
&lt;br /&gt;
&amp;lt;math&amp;gt;\mathbf{b}_1 = \mathbf{a}_1&amp;lt;/math&amp;gt;&lt;br /&gt;
&lt;br /&gt;
&amp;lt;math&amp;gt;\mathbf{b}_2 = \mathbf{a}_2 - \mathbf{proj}_{\mathbf{b}_1} \mathbf{a}_2 &amp;lt;/math&amp;gt;&lt;br /&gt;
&lt;br /&gt;
&amp;lt;math&amp;gt;\mathbf{b}_3 = \mathbf{a}_3 - \mathbf{proj}_{\mathbf{b}_1} \mathbf{a}_3 - \mathbf{proj}_{\mathbf{b}_2} \mathbf{a}_3 &amp;lt;/math&amp;gt;&lt;br /&gt;
&lt;br /&gt;
&amp;lt;math&amp;gt;\vdots&amp;lt;/math&amp;gt;&lt;br /&gt;
&lt;br /&gt;
&amp;lt;math&amp;gt;\mathbf{b}_m = \mathbf{a}_m - \sum_{j=1}^{m-1} \mathbf{proj}_{\mathbf{b}_j} \mathbf{a}_m&amp;lt;/math&amp;gt;&lt;br /&gt;
&lt;br /&gt;
Или поэлементно:&lt;br /&gt;
&lt;br /&gt;
&amp;lt;math&amp;gt;\beta_{1j} = \alpha_{1j}&amp;lt;/math&amp;gt;&lt;br /&gt;
&lt;br /&gt;
&amp;lt;math&amp;gt;\beta_{ij} = \alpha_{ij} - (\sum_{k=1}^{i-1} \mathbf{proj}_{\mathbf{b}_k} \mathbf{a}_i)_j = \alpha_{ij} - \sum_{k=1}^{i-1}\frac{\sum_{s=1}^{n}\alpha_{is}\beta_{ks}}{\sum_{s=1}^{n}\beta_{ks}\beta_{ks}}\beta_{kj} &amp;lt;/math&amp;gt;&lt;br /&gt;
&lt;br /&gt;
=== Вычислительное ядро алгоритма ===&lt;br /&gt;
Основное время работы алгоритма приходится на вычисление сумм &amp;lt;math&amp;gt;\sum_{i=1}^{j-1} \mathbf{proj}_{\mathbf{b}_i} \mathbf{a}_k \forall j: j=\overline{1, m}&amp;lt;/math&amp;gt;.&lt;br /&gt;
&lt;br /&gt;
=== Макроструктура алгоритма ===&lt;br /&gt;
Из описания алгоритма в предыдущих разделов следует, что основную часть данного метода составляют операции вычисления проекций векторов, а также их сумм.&lt;br /&gt;
&lt;br /&gt;
=== Схема реализации последовательного алгоритма ===&lt;br /&gt;
*&lt;br /&gt;
=== Последовательная сложность алгоритма ===&lt;br /&gt;
Рассмотрим &amp;lt;math&amp;gt;n&amp;lt;/math&amp;gt; векторов длины &amp;lt;math&amp;gt;m&amp;lt;/math&amp;gt;.&lt;br /&gt;
&lt;br /&gt;
# Скалярное произведение векторов требует &amp;lt;math&amp;gt;n - 1&amp;lt;/math&amp;gt; сложение и &amp;lt;math&amp;gt;n&amp;lt;/math&amp;gt; произведений.&lt;br /&gt;
# Нормализация вектора требует 1 скалярного произведения, 1 вычисления квадратного корня и &amp;lt;math&amp;gt;n&amp;lt;/math&amp;gt; делений, то есть:&lt;br /&gt;
## &amp;lt;math&amp;gt;n-1&amp;lt;/math&amp;gt; (&amp;lt;math&amp;gt;+&amp;lt;/math&amp;gt;);&lt;br /&gt;
## &amp;lt;math&amp;gt;n&amp;lt;/math&amp;gt; (&amp;lt;math&amp;gt;\times&amp;lt;/math&amp;gt;);&lt;br /&gt;
## &amp;lt;math&amp;gt;n&amp;lt;/math&amp;gt; (&amp;lt;math&amp;gt;\div&amp;lt;/math&amp;gt;);&lt;br /&gt;
## &amp;lt;math&amp;gt;1&amp;lt;/math&amp;gt; (&amp;lt;math&amp;gt;\sqrt{}&amp;lt;/math&amp;gt;).&lt;br /&gt;
# Вычитание проекции вектора требует 1 скалярного произведения, &amp;lt;math&amp;gt;n&amp;lt;/math&amp;gt; сложений и &amp;lt;math&amp;gt;n&amp;lt;/math&amp;gt; умножений, то есть:&lt;br /&gt;
## &amp;lt;math&amp;gt;2n-1&amp;lt;/math&amp;gt; (&amp;lt;math&amp;gt;+&amp;lt;/math&amp;gt;);&lt;br /&gt;
## &amp;lt;math&amp;gt;2n&amp;lt;/math&amp;gt; (&amp;lt;math&amp;gt;\times&amp;lt;/math&amp;gt;).&lt;br /&gt;
# Вычисление &amp;lt;math&amp;gt;i&amp;lt;/math&amp;gt;-го вектора требует &amp;lt;math&amp;gt;i-1&amp;lt;/math&amp;gt; вычитаний проекций с нормализацией, то есть:&lt;br /&gt;
## &amp;lt;math&amp;gt;(2n-1)(i-1)+n-1&amp;lt;/math&amp;gt; (&amp;lt;math&amp;gt;+&amp;lt;/math&amp;gt;);&lt;br /&gt;
## &amp;lt;math&amp;gt;2n(i-1)+n&amp;lt;/math&amp;gt; (&amp;lt;math&amp;gt;\times&amp;lt;/math&amp;gt;);&lt;br /&gt;
## &amp;lt;math&amp;gt;n&amp;lt;/math&amp;gt; (&amp;lt;math&amp;gt;\div&amp;lt;/math&amp;gt;);&lt;br /&gt;
## &amp;lt;math&amp;gt;1&amp;lt;/math&amp;gt; (&amp;lt;math&amp;gt;\sqrt{}&amp;lt;/math&amp;gt;).&lt;br /&gt;
# Мы вычисляем вектора от &amp;lt;math&amp;gt;i=1&amp;lt;/math&amp;gt; до &amp;lt;math&amp;gt;m&amp;lt;/math&amp;gt;, поэтому &amp;lt;math&amp;gt;i-1&amp;lt;/math&amp;gt; множителей выражаются &#039;&#039;треугольным числом&#039;&#039; &amp;lt;math&amp;gt;(m-1)\frac{m}{2}&amp;lt;/math&amp;gt;, а элементы независимых &amp;lt;math&amp;gt;i&amp;lt;/math&amp;gt; умножаются на &amp;lt;math&amp;gt;m&amp;lt;/math&amp;gt;.&lt;br /&gt;
## &amp;lt;math&amp;gt;(2n-1)(m-1)\frac{m}{2}+(n-1)m&amp;lt;/math&amp;gt; (&amp;lt;math&amp;gt;+&amp;lt;/math&amp;gt;);&lt;br /&gt;
## &amp;lt;math&amp;gt;2n(m-1)\frac{m}{2}+nm&amp;lt;/math&amp;gt; (&amp;lt;math&amp;gt;\times&amp;lt;/math&amp;gt;);&lt;br /&gt;
## &amp;lt;math&amp;gt;nm&amp;lt;/math&amp;gt; (&amp;lt;math&amp;gt;\div&amp;lt;/math&amp;gt;);&lt;br /&gt;
## &amp;lt;math&amp;gt;m&amp;lt;/math&amp;gt; (&amp;lt;math&amp;gt;\sqrt{}&amp;lt;/math&amp;gt;).&lt;br /&gt;
# В скалярном произведении &amp;lt;math&amp;gt;n&amp;lt;/math&amp;gt; делений могут быть рассмотрены как &amp;lt;math&amp;gt;n&amp;lt;/math&amp;gt; умножений:&lt;br /&gt;
## &amp;lt;math&amp;gt;(2n-1)(m-1)\frac{m}{2}+(n-1)m&amp;lt;/math&amp;gt; (&amp;lt;math&amp;gt;+&amp;lt;/math&amp;gt;);&lt;br /&gt;
## &amp;lt;math&amp;gt;2n(m-1)\frac{m}{2}+2nm&amp;lt;/math&amp;gt; (&amp;lt;math&amp;gt;\times&amp;lt;/math&amp;gt;);&lt;br /&gt;
## &amp;lt;math&amp;gt;m&amp;lt;/math&amp;gt; (&amp;lt;math&amp;gt;\div&amp;lt;/math&amp;gt;);&lt;br /&gt;
## &amp;lt;math&amp;gt;m&amp;lt;/math&amp;gt; (&amp;lt;math&amp;gt;\sqrt{}&amp;lt;/math&amp;gt;).&lt;br /&gt;
&lt;br /&gt;
Таким образом, требуется &amp;lt;math&amp;gt;2nm^2&amp;lt;/math&amp;gt; операций. Сложность алгоритма &amp;lt;math&amp;gt;O(nm^2)&amp;lt;/math&amp;gt;.&lt;br /&gt;
&lt;br /&gt;
=== Информационный граф ===&lt;br /&gt;
*&lt;br /&gt;
=== Ресурс параллелизма алгоритма ===&lt;br /&gt;
*&lt;br /&gt;
=== Входные и выходные данные алгоритма ===&lt;br /&gt;
&#039;&#039;&#039;Входные данные.&#039;&#039;&#039; Матрица &amp;lt;math&amp;gt;A&amp;lt;/math&amp;gt; с элементами &amp;lt;math&amp;gt;\alpha_{ij}&amp;lt;/math&amp;gt;, где &amp;lt;math&amp;gt;i = \overline{1, n}&amp;lt;/math&amp;gt; (размерность пространства) и &amp;lt;math&amp;gt;j = \overline{1, m}&amp;lt;/math&amp;gt; (количество линейно-независимых векторов), при этом &amp;lt;math&amp;gt;n \leqslant m&amp;lt;/math&amp;gt;.&lt;br /&gt;
&lt;br /&gt;
&#039;&#039;&#039;Объем входных данных.&#039;&#039;&#039; &amp;lt;math&amp;gt;nm&amp;lt;/math&amp;gt;&lt;br /&gt;
&lt;br /&gt;
&#039;&#039;&#039;Выходные данные.&#039;&#039;&#039; Матрица &amp;lt;math&amp;gt;B&amp;lt;/math&amp;gt; с элементами &amp;lt;math&amp;gt;\beta_{ij}&amp;lt;/math&amp;gt;, где &amp;lt;math&amp;gt;i = \overline{1, n}&amp;lt;/math&amp;gt; и &amp;lt;math&amp;gt;j = \overline{1, m}&amp;lt;/math&amp;gt;, тогда &amp;lt;math&amp;gt;b_{i1}, \dots, b_{im}&amp;lt;/math&amp;gt; — система ортогональных векторов.&lt;br /&gt;
&lt;br /&gt;
&#039;&#039;&#039;Объем выходных данных.&#039;&#039;&#039; &amp;lt;math&amp;gt;nm&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;
=== Масштабируемость алгоритма и его реализации ===&lt;br /&gt;
&#039;&#039;Срок сдачи продлен до 15 ноября.&#039;&#039;&lt;br /&gt;
=== Динамические характеристики и эффективность реализации алгоритма ===&lt;br /&gt;
=== Выводы для классов архитектур ===&lt;br /&gt;
=== Существующие реализации алгоритма ===&lt;br /&gt;
*&lt;br /&gt;
== Литература ==&lt;/div&gt;</summary>
		<author><name>BDA</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:BDA/%D0%9E%D1%80%D1%82%D0%BE%D0%B3%D0%BE%D0%BD%D0%B0%D0%BB%D0%B8%D0%B7%D0%B0%D1%86%D0%B8%D1%8F_%D0%93%D1%80%D0%B0%D0%BC%D0%B0-%D0%A8%D0%BC%D0%B8%D0%B4%D1%82%D0%B0&amp;diff=12557</id>
		<title>Участник:BDA/Ортогонализация Грама-Шмидта</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:BDA/%D0%9E%D1%80%D1%82%D0%BE%D0%B3%D0%BE%D0%BD%D0%B0%D0%BB%D0%B8%D0%B7%D0%B0%D1%86%D0%B8%D1%8F_%D0%93%D1%80%D0%B0%D0%BC%D0%B0-%D0%A8%D0%BC%D0%B8%D0%B4%D1%82%D0%B0&amp;diff=12557"/>
		<updated>2016-10-16T13:58:14Z</updated>

		<summary type="html">&lt;p&gt;BDA: /* Математическое описание алгоритма */&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(nm^2)&amp;lt;/math&amp;gt;&lt;br /&gt;
| pf_height         = &amp;lt;math&amp;gt;?&amp;lt;/math&amp;gt;&lt;br /&gt;
| pf_width          = &amp;lt;math&amp;gt;?&amp;lt;/math&amp;gt;&lt;br /&gt;
| input_data        = &amp;lt;math&amp;gt;nm&amp;lt;/math&amp;gt;&lt;br /&gt;
| output_data       = &amp;lt;math&amp;gt;nm&amp;lt;/math&amp;gt;&lt;br /&gt;
}}&lt;br /&gt;
&lt;br /&gt;
Основные авторы описания: [[Участник:Zodiac|Белов Н. А.]], [[Участник:BDA|Богомолов Д. А.]].&lt;br /&gt;
&lt;br /&gt;
== Свойства и структура алгоритма ==&lt;br /&gt;
=== Общее описание алгоритма ===&lt;br /&gt;
&lt;br /&gt;
Ортогонализация ― алгоритм построения для данной линейно независимой системы векторов евклидова или эрмитова пространства V ортогональной системы ненулевых векторов, порождающих то же самое подпространство в V.&lt;br /&gt;
&lt;br /&gt;
Ортогонализация Грама–Шмидта&amp;lt;ref&amp;gt;Канатников А.Н., Крищенко А.П. &amp;quot;Линейная алгебра.&amp;quot; ― 3-е изд., стер. ― М.: Изд-во МГТУ им. Н.Э. Баумана, 2002&amp;lt;/ref&amp;gt; (процесс Грама–Шмидта) ― наиболее известный алгоритм ортогонализации. Назван в честь Йоргена Педерсена Грама&amp;lt;ref&amp;gt;O&#039;Connor, John J.; Robertson, Edmund F., &amp;quot;Jørgen Pedersen Gram&amp;quot;, MacTutor History of Mathematics archive, University of St Andrews.&amp;lt;/ref&amp;gt; и Эрхарда Шмидта&amp;lt;ref&amp;gt;O&#039;Connor, John J.; Robertson, Edmund F., &amp;quot;Erhard Schmidt&amp;quot;, MacTutor History of Mathematics archive, University of St Andrews.&amp;lt;/ref&amp;gt;, однако ранее уже появлялся в работах Лапласа и Коши. Является частным случаем разложения Ивасавы, так как может быть представлен как разложение невырожденной квадратной матрицы в произведение ортогональной (или унитарной матрицы в случае эрмитова пространства) и верхнетреугольной матрицы с положительными диагональными элементами.&lt;br /&gt;
&lt;br /&gt;
Рассматриваемый алгоритм применяется для борьбы с помехами в адаптивной системе селекции движущихся целей&amp;lt;ref&amp;gt;Орешкин Б.Н., Бакулев П.А. &amp;quot;Быстрая процедура ортогонализации Грамма–Шмидта и ее применение для борьбы с помехами в адаптивной системе селекции движущихся целей&amp;quot; ― Радиотехника / №12 за 2007 г.&amp;lt;/ref&amp;gt;, в протоколах безопасности&amp;lt;ref&amp;gt;Пискова А.В., Менщиков А.А., Коробейников А.Г. &amp;quot;Использование ортогонализации Грама-Шмидта в алгоритме приведения базиса решетки для протоколов безопасности&amp;quot; ― Вопросы кибербезопасности №1(14) 2016&amp;lt;/ref&amp;gt;, для повышения экономичности алгоритмов оценивания параметров моделей объектов управления&amp;lt;ref&amp;gt;Карелин А.Е., Светлаков А.А. &amp;quot;Использование ортогонализации Грама-Шмидта для повышения экономичности многоточечных алгоритмов рекуррентного оценивания параметров моделей объектов управления&amp;quot; ― Известия Томского политехнического университета [Известия ТПУ]. — 2006. — Т. 309, № 8. — [С. 15-19].&amp;lt;/ref&amp;gt; и в других областях.&lt;br /&gt;
&lt;br /&gt;
=== Математическое описание алгоритма ===&lt;br /&gt;
&#039;&#039;&#039;Входные данные.&#039;&#039;&#039; &amp;lt;math&amp;gt;m&amp;lt;/math&amp;gt; линейно независимых векторов &amp;lt;math&amp;gt;\mathbf{a}_1,...,\mathbf{a}_m&amp;lt;/math&amp;gt; c размерностью пространства &amp;lt;math&amp;gt;n&amp;lt;/math&amp;gt;, записанных в матрице &amp;lt;math&amp;gt;A&amp;lt;/math&amp;gt; с элементами &amp;lt;math&amp;gt;\alpha_{ij}&amp;lt;/math&amp;gt;.&lt;br /&gt;
&lt;br /&gt;
&#039;&#039;&#039;Выходные данные.&#039;&#039;&#039; &amp;lt;math&amp;gt;m&amp;lt;/math&amp;gt; ортогональных векторов &amp;lt;math&amp;gt;\mathbf{b}_1,...,\mathbf{b}_m&amp;lt;/math&amp;gt; c размерностью пространства &amp;lt;math&amp;gt;n&amp;lt;/math&amp;gt;, записанных в матрице &amp;lt;math&amp;gt;B&amp;lt;/math&amp;gt; с элементами &amp;lt;math&amp;gt;\beta_{ij}&amp;lt;/math&amp;gt;.&lt;br /&gt;
&lt;br /&gt;
Определим оператор проекции (проецирует вектор &amp;lt;math&amp;gt;\mathbf{a}&amp;lt;/math&amp;gt; коллинеарно вектору &amp;lt;math&amp;gt;\mathbf{b}&amp;lt;/math&amp;gt;) &amp;lt;math&amp;gt;\mathbf{proj_b a = \frac{\left \langle a,b \right \rangle}{\left \langle b,b \right \rangle }b}&amp;lt;/math&amp;gt;, где &amp;lt;math&amp;gt;\mathbf{\left \langle a,b \right \rangle}&amp;lt;/math&amp;gt; ― скалярное произведение векторов &amp;lt;math&amp;gt;\mathbf{a}&amp;lt;/math&amp;gt; и &amp;lt;math&amp;gt;\mathbf{b}&amp;lt;/math&amp;gt;.&lt;br /&gt;
&lt;br /&gt;
Тогда ортогональные векторы вычисляются следующим образом:&lt;br /&gt;
&lt;br /&gt;
&amp;lt;math&amp;gt;\mathbf{b}_1 = \mathbf{a}_1&amp;lt;/math&amp;gt;&lt;br /&gt;
&lt;br /&gt;
&amp;lt;math&amp;gt;\mathbf{b}_2 = \mathbf{a}_2 - \mathbf{proj}_{\mathbf{b}_1} \mathbf{a}_2 &amp;lt;/math&amp;gt;&lt;br /&gt;
&lt;br /&gt;
&amp;lt;math&amp;gt;\mathbf{b}_3 = \mathbf{a}_3 - \mathbf{proj}_{\mathbf{b}_1} \mathbf{a}_3 - \mathbf{proj}_{\mathbf{b}_2} \mathbf{a}_3 &amp;lt;/math&amp;gt;&lt;br /&gt;
&lt;br /&gt;
&amp;lt;math&amp;gt;\vdots&amp;lt;/math&amp;gt;&lt;br /&gt;
&lt;br /&gt;
&amp;lt;math&amp;gt;\mathbf{b}_m = \mathbf{a}_m - \sum_{j=1}^{m-1} \mathbf{proj}_{\mathbf{b}_j} \mathbf{a}_m&amp;lt;/math&amp;gt;&lt;br /&gt;
&lt;br /&gt;
Или поэлементно:&lt;br /&gt;
&lt;br /&gt;
&amp;lt;math&amp;gt;\beta_{1j} = \alpha_{1j}&amp;lt;/math&amp;gt;&lt;br /&gt;
&lt;br /&gt;
&amp;lt;math&amp;gt;\beta_{ij} = \alpha_{ij} - (\sum_{k=1}^{i-1} \mathbf{proj}_{\mathbf{b}_k} \mathbf{a}_i)_j = \alpha_{ij} - \sum_{k=1}^{i-1}\frac{\sum_{s=1}^{n}\alpha_{is}\beta_{ks}}{\sum_{s=1}^{n}\beta_{ks}\beta_{ks}}\beta_{kj} &amp;lt;/math&amp;gt;&lt;br /&gt;
&lt;br /&gt;
=== Вычислительное ядро алгоритма ===&lt;br /&gt;
Основное время работы алгоритма приходится на вычисление сумм &amp;lt;math&amp;gt;\sum_{i=1}^{j-1} \mathbf{proj}_{\mathbf{b}_i} \mathbf{a}_i \forall j: j=\overline{1, m}&amp;lt;/math&amp;gt;.&lt;br /&gt;
&lt;br /&gt;
=== Макроструктура алгоритма ===&lt;br /&gt;
Из описания алгоритма в предыдущих разделов следует, что основную часть данного метода составляют операции вычисления проекций векторов, а также их сумм.&lt;br /&gt;
&lt;br /&gt;
=== Схема реализации последовательного алгоритма ===&lt;br /&gt;
*&lt;br /&gt;
=== Последовательная сложность алгоритма ===&lt;br /&gt;
Рассмотрим &amp;lt;math&amp;gt;n&amp;lt;/math&amp;gt; векторов длины &amp;lt;math&amp;gt;m&amp;lt;/math&amp;gt;.&lt;br /&gt;
&lt;br /&gt;
# Скалярное произведение векторов требует &amp;lt;math&amp;gt;n - 1&amp;lt;/math&amp;gt; сложение и &amp;lt;math&amp;gt;n&amp;lt;/math&amp;gt; произведений.&lt;br /&gt;
# Нормализация вектора требует 1 скалярного произведения, 1 вычисления квадратного корня и &amp;lt;math&amp;gt;n&amp;lt;/math&amp;gt; делений, то есть:&lt;br /&gt;
## &amp;lt;math&amp;gt;n-1&amp;lt;/math&amp;gt; (&amp;lt;math&amp;gt;+&amp;lt;/math&amp;gt;);&lt;br /&gt;
## &amp;lt;math&amp;gt;n&amp;lt;/math&amp;gt; (&amp;lt;math&amp;gt;\times&amp;lt;/math&amp;gt;);&lt;br /&gt;
## &amp;lt;math&amp;gt;n&amp;lt;/math&amp;gt; (&amp;lt;math&amp;gt;\div&amp;lt;/math&amp;gt;);&lt;br /&gt;
## &amp;lt;math&amp;gt;1&amp;lt;/math&amp;gt; (&amp;lt;math&amp;gt;\sqrt{}&amp;lt;/math&amp;gt;).&lt;br /&gt;
# Вычитание проекции вектора требует 1 скалярного произведения, &amp;lt;math&amp;gt;n&amp;lt;/math&amp;gt; сложений и &amp;lt;math&amp;gt;n&amp;lt;/math&amp;gt; умножений, то есть:&lt;br /&gt;
## &amp;lt;math&amp;gt;2n-1&amp;lt;/math&amp;gt; (&amp;lt;math&amp;gt;+&amp;lt;/math&amp;gt;);&lt;br /&gt;
## &amp;lt;math&amp;gt;2n&amp;lt;/math&amp;gt; (&amp;lt;math&amp;gt;\times&amp;lt;/math&amp;gt;).&lt;br /&gt;
# Вычисление &amp;lt;math&amp;gt;i&amp;lt;/math&amp;gt;-го вектора требует &amp;lt;math&amp;gt;i-1&amp;lt;/math&amp;gt; вычитаний проекций с нормализацией, то есть:&lt;br /&gt;
## &amp;lt;math&amp;gt;(2n-1)(i-1)+n-1&amp;lt;/math&amp;gt; (&amp;lt;math&amp;gt;+&amp;lt;/math&amp;gt;);&lt;br /&gt;
## &amp;lt;math&amp;gt;2n(i-1)+n&amp;lt;/math&amp;gt; (&amp;lt;math&amp;gt;\times&amp;lt;/math&amp;gt;);&lt;br /&gt;
## &amp;lt;math&amp;gt;n&amp;lt;/math&amp;gt; (&amp;lt;math&amp;gt;\div&amp;lt;/math&amp;gt;);&lt;br /&gt;
## &amp;lt;math&amp;gt;1&amp;lt;/math&amp;gt; (&amp;lt;math&amp;gt;\sqrt{}&amp;lt;/math&amp;gt;).&lt;br /&gt;
# Мы вычисляем вектора от &amp;lt;math&amp;gt;i=1&amp;lt;/math&amp;gt; до &amp;lt;math&amp;gt;m&amp;lt;/math&amp;gt;, поэтому &amp;lt;math&amp;gt;i-1&amp;lt;/math&amp;gt; множителей выражаются &#039;&#039;треугольным числом&#039;&#039; &amp;lt;math&amp;gt;(m-1)\frac{m}{2}&amp;lt;/math&amp;gt;, а элементы независимых &amp;lt;math&amp;gt;i&amp;lt;/math&amp;gt; умножаются на &amp;lt;math&amp;gt;m&amp;lt;/math&amp;gt;.&lt;br /&gt;
## &amp;lt;math&amp;gt;(2n-1)(m-1)\frac{m}{2}+(n-1)m&amp;lt;/math&amp;gt; (&amp;lt;math&amp;gt;+&amp;lt;/math&amp;gt;);&lt;br /&gt;
## &amp;lt;math&amp;gt;2n(m-1)\frac{m}{2}+nm&amp;lt;/math&amp;gt; (&amp;lt;math&amp;gt;\times&amp;lt;/math&amp;gt;);&lt;br /&gt;
## &amp;lt;math&amp;gt;nm&amp;lt;/math&amp;gt; (&amp;lt;math&amp;gt;\div&amp;lt;/math&amp;gt;);&lt;br /&gt;
## &amp;lt;math&amp;gt;m&amp;lt;/math&amp;gt; (&amp;lt;math&amp;gt;\sqrt{}&amp;lt;/math&amp;gt;).&lt;br /&gt;
# В скалярном произведении &amp;lt;math&amp;gt;n&amp;lt;/math&amp;gt; делений могут быть рассмотрены как &amp;lt;math&amp;gt;n&amp;lt;/math&amp;gt; умножений:&lt;br /&gt;
## &amp;lt;math&amp;gt;(2n-1)(m-1)\frac{m}{2}+(n-1)m&amp;lt;/math&amp;gt; (&amp;lt;math&amp;gt;+&amp;lt;/math&amp;gt;);&lt;br /&gt;
## &amp;lt;math&amp;gt;2n(m-1)\frac{m}{2}+2nm&amp;lt;/math&amp;gt; (&amp;lt;math&amp;gt;\times&amp;lt;/math&amp;gt;);&lt;br /&gt;
## &amp;lt;math&amp;gt;m&amp;lt;/math&amp;gt; (&amp;lt;math&amp;gt;\div&amp;lt;/math&amp;gt;);&lt;br /&gt;
## &amp;lt;math&amp;gt;m&amp;lt;/math&amp;gt; (&amp;lt;math&amp;gt;\sqrt{}&amp;lt;/math&amp;gt;).&lt;br /&gt;
&lt;br /&gt;
Таким образом, требуется &amp;lt;math&amp;gt;2nm^2&amp;lt;/math&amp;gt; операций. Сложность алгоритма &amp;lt;math&amp;gt;O(nm^2)&amp;lt;/math&amp;gt;.&lt;br /&gt;
&lt;br /&gt;
=== Информационный граф ===&lt;br /&gt;
*&lt;br /&gt;
=== Ресурс параллелизма алгоритма ===&lt;br /&gt;
*&lt;br /&gt;
=== Входные и выходные данные алгоритма ===&lt;br /&gt;
&#039;&#039;&#039;Входные данные.&#039;&#039;&#039; Матрица &amp;lt;math&amp;gt;A&amp;lt;/math&amp;gt; с элементами &amp;lt;math&amp;gt;\alpha_{ij}&amp;lt;/math&amp;gt;, где &amp;lt;math&amp;gt;i = \overline{1, n}&amp;lt;/math&amp;gt; (размерность пространства) и &amp;lt;math&amp;gt;j = \overline{1, m}&amp;lt;/math&amp;gt; (количество линейно-независимых векторов), при этом &amp;lt;math&amp;gt;n \leqslant m&amp;lt;/math&amp;gt;.&lt;br /&gt;
&lt;br /&gt;
&#039;&#039;&#039;Объем входных данных.&#039;&#039;&#039; &amp;lt;math&amp;gt;nm&amp;lt;/math&amp;gt;&lt;br /&gt;
&lt;br /&gt;
&#039;&#039;&#039;Выходные данные.&#039;&#039;&#039; Матрица &amp;lt;math&amp;gt;B&amp;lt;/math&amp;gt; с элементами &amp;lt;math&amp;gt;\beta_{ij}&amp;lt;/math&amp;gt;, где &amp;lt;math&amp;gt;i = \overline{1, n}&amp;lt;/math&amp;gt; и &amp;lt;math&amp;gt;j = \overline{1, m}&amp;lt;/math&amp;gt;, тогда &amp;lt;math&amp;gt;b_{i1}, \dots, b_{im}&amp;lt;/math&amp;gt; — система ортогональных векторов.&lt;br /&gt;
&lt;br /&gt;
&#039;&#039;&#039;Объем выходных данных.&#039;&#039;&#039; &amp;lt;math&amp;gt;nm&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;
=== Масштабируемость алгоритма и его реализации ===&lt;br /&gt;
&#039;&#039;Срок сдачи продлен до 15 ноября.&#039;&#039;&lt;br /&gt;
=== Динамические характеристики и эффективность реализации алгоритма ===&lt;br /&gt;
=== Выводы для классов архитектур ===&lt;br /&gt;
=== Существующие реализации алгоритма ===&lt;br /&gt;
*&lt;br /&gt;
== Литература ==&lt;/div&gt;</summary>
		<author><name>BDA</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:BDA/%D0%9E%D1%80%D1%82%D0%BE%D0%B3%D0%BE%D0%BD%D0%B0%D0%BB%D0%B8%D0%B7%D0%B0%D1%86%D0%B8%D1%8F_%D0%93%D1%80%D0%B0%D0%BC%D0%B0-%D0%A8%D0%BC%D0%B8%D0%B4%D1%82%D0%B0&amp;diff=12534</id>
		<title>Участник:BDA/Ортогонализация Грама-Шмидта</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:BDA/%D0%9E%D1%80%D1%82%D0%BE%D0%B3%D0%BE%D0%BD%D0%B0%D0%BB%D0%B8%D0%B7%D0%B0%D1%86%D0%B8%D1%8F_%D0%93%D1%80%D0%B0%D0%BC%D0%B0-%D0%A8%D0%BC%D0%B8%D0%B4%D1%82%D0%B0&amp;diff=12534"/>
		<updated>2016-10-16T13:27:28Z</updated>

		<summary type="html">&lt;p&gt;BDA: /* Математическое описание алгоритма */&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(nm^2)&amp;lt;/math&amp;gt;&lt;br /&gt;
| pf_height         = &amp;lt;math&amp;gt;?&amp;lt;/math&amp;gt;&lt;br /&gt;
| pf_width          = &amp;lt;math&amp;gt;?&amp;lt;/math&amp;gt;&lt;br /&gt;
| input_data        = &amp;lt;math&amp;gt;nm&amp;lt;/math&amp;gt;&lt;br /&gt;
| output_data       = &amp;lt;math&amp;gt;nm&amp;lt;/math&amp;gt;&lt;br /&gt;
}}&lt;br /&gt;
&lt;br /&gt;
Основные авторы описания: [[Участник:Zodiac|Белов Н. А.]], [[Участник:BDA|Богомолов Д. А.]].&lt;br /&gt;
&lt;br /&gt;
== Свойства и структура алгоритма ==&lt;br /&gt;
=== Общее описание алгоритма ===&lt;br /&gt;
&lt;br /&gt;
Ортогонализация ― алгоритм построения для данной линейно независимой системы векторов евклидова или эрмитова пространства V ортогональной системы ненулевых векторов, порождающих то же самое подпространство в V.&lt;br /&gt;
&lt;br /&gt;
Ортогонализация Грама–Шмидта&amp;lt;ref&amp;gt;Канатников А.Н., Крищенко А.П. &amp;quot;Линейная алгебра.&amp;quot; ― 3-е изд., стер. ― М.: Изд-во МГТУ им. Н.Э. Баумана, 2002&amp;lt;/ref&amp;gt; (процесс Грама–Шмидта) ― наиболее известный алгоритм ортогонализации. Назван в честь Йоргена Педерсена Грама&amp;lt;ref&amp;gt;O&#039;Connor, John J.; Robertson, Edmund F., &amp;quot;Jørgen Pedersen Gram&amp;quot;, MacTutor History of Mathematics archive, University of St Andrews.&amp;lt;/ref&amp;gt; и Эрхарда Шмидта&amp;lt;ref&amp;gt;O&#039;Connor, John J.; Robertson, Edmund F., &amp;quot;Erhard Schmidt&amp;quot;, MacTutor History of Mathematics archive, University of St Andrews.&amp;lt;/ref&amp;gt;, однако ранее уже появлялся в работах Лапласа и Коши. Является частным случаем разложения Ивасавы, так как может быть представлен как разложение невырожденной квадратной матрицы в произведение ортогональной (или унитарной матрицы в случае эрмитова пространства) и верхнетреугольной матрицы с положительными диагональными элементами.&lt;br /&gt;
&lt;br /&gt;
Рассматриваемый алгоритм применяется для борьбы с помехами в адаптивной системе селекции движущихся целей&amp;lt;ref&amp;gt;Орешкин Б.Н., Бакулев П.А. &amp;quot;Быстрая процедура ортогонализации Грамма–Шмидта и ее применение для борьбы с помехами в адаптивной системе селекции движущихся целей&amp;quot; ― Радиотехника / №12 за 2007 г.&amp;lt;/ref&amp;gt;, в протоколах безопасности&amp;lt;ref&amp;gt;Пискова А.В., Менщиков А.А., Коробейников А.Г. &amp;quot;Использование ортогонализации Грама-Шмидта в алгоритме приведения базиса решетки для протоколов безопасности&amp;quot; ― Вопросы кибербезопасности №1(14) 2016&amp;lt;/ref&amp;gt;, для повышения экономичности алгоритмов оценивания параметров моделей объектов управления&amp;lt;ref&amp;gt;Карелин А.Е., Светлаков А.А. &amp;quot;Использование ортогонализации Грама-Шмидта для повышения экономичности многоточечных алгоритмов рекуррентного оценивания параметров моделей объектов управления&amp;quot; ― Известия Томского политехнического университета [Известия ТПУ]. — 2006. — Т. 309, № 8. — [С. 15-19].&amp;lt;/ref&amp;gt; и в других областях.&lt;br /&gt;
&lt;br /&gt;
=== Математическое описание алгоритма ===&lt;br /&gt;
&#039;&#039;&#039;Входные данные.&#039;&#039;&#039; &amp;lt;math&amp;gt;m&amp;lt;/math&amp;gt; линейно независимых векторов &amp;lt;math&amp;gt;\mathbf{a}_1,...,\mathbf{a}_m&amp;lt;/math&amp;gt; c размерностью пространства &amp;lt;math&amp;gt;n&amp;lt;/math&amp;gt;, записанных в матрице &amp;lt;math&amp;gt;A&amp;lt;/math&amp;gt; с элементами &amp;lt;math&amp;gt;\alpha_{ij}&amp;lt;/math&amp;gt;.&lt;br /&gt;
&lt;br /&gt;
&#039;&#039;&#039;Выходные данные.&#039;&#039;&#039; &amp;lt;math&amp;gt;m&amp;lt;/math&amp;gt; ортогональных векторов &amp;lt;math&amp;gt;\mathbf{b}_1,...,\mathbf{b}_m&amp;lt;/math&amp;gt; c размерностью пространства &amp;lt;math&amp;gt;n&amp;lt;/math&amp;gt;, записанных в матрице &amp;lt;math&amp;gt;B&amp;lt;/math&amp;gt; с элементами &amp;lt;math&amp;gt;\beta_{ij}&amp;lt;/math&amp;gt;.&lt;br /&gt;
&lt;br /&gt;
Определим оператор проекции (проецирует вектор &amp;lt;math&amp;gt;\mathbf{a}&amp;lt;/math&amp;gt; коллинеарно вектору &amp;lt;math&amp;gt;\mathbf{b}&amp;lt;/math&amp;gt;) &amp;lt;math&amp;gt;\mathbf{proj_b a = \frac{\left \langle a,b \right \rangle}{\left \langle b,b \right \rangle }b}&amp;lt;/math&amp;gt;, где &amp;lt;math&amp;gt;\mathbf{\left \langle a,b \right \rangle}&amp;lt;/math&amp;gt; ― скалярное произведение векторов &amp;lt;math&amp;gt;\mathbf{a}&amp;lt;/math&amp;gt; и &amp;lt;math&amp;gt;\mathbf{b}&amp;lt;/math&amp;gt;.&lt;br /&gt;
&lt;br /&gt;
=== Вычислительное ядро алгоритма ===&lt;br /&gt;
Основное время работы алгоритма приходится на вычисление сумм &amp;lt;math&amp;gt;\sum_{i=1}^{j-1} \mathbf{proj}_{\mathbf{b}_i} \mathbf{a}_i \forall j: j=\overline{1, m}&amp;lt;/math&amp;gt;.&lt;br /&gt;
&lt;br /&gt;
=== Макроструктура алгоритма ===&lt;br /&gt;
Из описания алгоритма в предыдущих разделов следует, что основную часть данного метода составляют операции вычисления проекций векторов, а также их сумм.&lt;br /&gt;
&lt;br /&gt;
=== Схема реализации последовательного алгоритма ===&lt;br /&gt;
*&lt;br /&gt;
=== Последовательная сложность алгоритма ===&lt;br /&gt;
Рассмотрим &amp;lt;math&amp;gt;n&amp;lt;/math&amp;gt; векторов длины &amp;lt;math&amp;gt;m&amp;lt;/math&amp;gt;.&lt;br /&gt;
&lt;br /&gt;
# Скалярное произведение векторов требует &amp;lt;math&amp;gt;n - 1&amp;lt;/math&amp;gt; сложение и &amp;lt;math&amp;gt;n&amp;lt;/math&amp;gt; произведений.&lt;br /&gt;
# Нормализация вектора требует 1 скалярного произведения, 1 вычисления квадратного корня и &amp;lt;math&amp;gt;n&amp;lt;/math&amp;gt; делений, то есть:&lt;br /&gt;
## &amp;lt;math&amp;gt;n-1&amp;lt;/math&amp;gt; (&amp;lt;math&amp;gt;+&amp;lt;/math&amp;gt;);&lt;br /&gt;
## &amp;lt;math&amp;gt;n&amp;lt;/math&amp;gt; (&amp;lt;math&amp;gt;\times&amp;lt;/math&amp;gt;);&lt;br /&gt;
## &amp;lt;math&amp;gt;n&amp;lt;/math&amp;gt; (&amp;lt;math&amp;gt;\div&amp;lt;/math&amp;gt;);&lt;br /&gt;
## &amp;lt;math&amp;gt;1&amp;lt;/math&amp;gt; (&amp;lt;math&amp;gt;\sqrt{}&amp;lt;/math&amp;gt;).&lt;br /&gt;
# Вычитание проекции вектора требует 1 скалярного произведения, &amp;lt;math&amp;gt;n&amp;lt;/math&amp;gt; сложений и &amp;lt;math&amp;gt;n&amp;lt;/math&amp;gt; умножений, то есть:&lt;br /&gt;
## &amp;lt;math&amp;gt;2n-1&amp;lt;/math&amp;gt; (&amp;lt;math&amp;gt;+&amp;lt;/math&amp;gt;);&lt;br /&gt;
## &amp;lt;math&amp;gt;2n&amp;lt;/math&amp;gt; (&amp;lt;math&amp;gt;\times&amp;lt;/math&amp;gt;).&lt;br /&gt;
# Вычисление &amp;lt;math&amp;gt;i&amp;lt;/math&amp;gt;-го вектора требует &amp;lt;math&amp;gt;i-1&amp;lt;/math&amp;gt; вычитаний проекций с нормализацией, то есть:&lt;br /&gt;
## &amp;lt;math&amp;gt;(2n-1)(i-1)+n-1&amp;lt;/math&amp;gt; (&amp;lt;math&amp;gt;+&amp;lt;/math&amp;gt;);&lt;br /&gt;
## &amp;lt;math&amp;gt;2n(i-1)+n&amp;lt;/math&amp;gt; (&amp;lt;math&amp;gt;\times&amp;lt;/math&amp;gt;);&lt;br /&gt;
## &amp;lt;math&amp;gt;n&amp;lt;/math&amp;gt; (&amp;lt;math&amp;gt;\div&amp;lt;/math&amp;gt;);&lt;br /&gt;
## &amp;lt;math&amp;gt;1&amp;lt;/math&amp;gt; (&amp;lt;math&amp;gt;\sqrt{}&amp;lt;/math&amp;gt;).&lt;br /&gt;
# Мы вычисляем вектора от &amp;lt;math&amp;gt;i=1&amp;lt;/math&amp;gt; до &amp;lt;math&amp;gt;m&amp;lt;/math&amp;gt;, поэтому &amp;lt;math&amp;gt;i-1&amp;lt;/math&amp;gt; множителей выражаются &#039;&#039;треугольным числом&#039;&#039; &amp;lt;math&amp;gt;(m-1)\frac{m}{2}&amp;lt;/math&amp;gt;, а элементы независимых &amp;lt;math&amp;gt;i&amp;lt;/math&amp;gt; умножаются на &amp;lt;math&amp;gt;m&amp;lt;/math&amp;gt;.&lt;br /&gt;
## &amp;lt;math&amp;gt;(2n-1)(m-1)\frac{m}{2}+(n-1)m&amp;lt;/math&amp;gt; (&amp;lt;math&amp;gt;+&amp;lt;/math&amp;gt;);&lt;br /&gt;
## &amp;lt;math&amp;gt;2n(m-1)\frac{m}{2}+nm&amp;lt;/math&amp;gt; (&amp;lt;math&amp;gt;\times&amp;lt;/math&amp;gt;);&lt;br /&gt;
## &amp;lt;math&amp;gt;nm&amp;lt;/math&amp;gt; (&amp;lt;math&amp;gt;\div&amp;lt;/math&amp;gt;);&lt;br /&gt;
## &amp;lt;math&amp;gt;m&amp;lt;/math&amp;gt; (&amp;lt;math&amp;gt;\sqrt{}&amp;lt;/math&amp;gt;).&lt;br /&gt;
# В скалярном произведении &amp;lt;math&amp;gt;n&amp;lt;/math&amp;gt; делений могут быть рассмотрены как &amp;lt;math&amp;gt;n&amp;lt;/math&amp;gt; умножений:&lt;br /&gt;
## &amp;lt;math&amp;gt;(2n-1)(m-1)\frac{m}{2}+(n-1)m&amp;lt;/math&amp;gt; (&amp;lt;math&amp;gt;+&amp;lt;/math&amp;gt;);&lt;br /&gt;
## &amp;lt;math&amp;gt;2n(m-1)\frac{m}{2}+2nm&amp;lt;/math&amp;gt; (&amp;lt;math&amp;gt;\times&amp;lt;/math&amp;gt;);&lt;br /&gt;
## &amp;lt;math&amp;gt;m&amp;lt;/math&amp;gt; (&amp;lt;math&amp;gt;\div&amp;lt;/math&amp;gt;);&lt;br /&gt;
## &amp;lt;math&amp;gt;m&amp;lt;/math&amp;gt; (&amp;lt;math&amp;gt;\sqrt{}&amp;lt;/math&amp;gt;).&lt;br /&gt;
&lt;br /&gt;
Таким образом, требуется &amp;lt;math&amp;gt;2nm^2&amp;lt;/math&amp;gt; операций. Сложность алгоритма &amp;lt;math&amp;gt;O(nm^2)&amp;lt;/math&amp;gt;.&lt;br /&gt;
&lt;br /&gt;
=== Информационный граф ===&lt;br /&gt;
*&lt;br /&gt;
=== Ресурс параллелизма алгоритма ===&lt;br /&gt;
*&lt;br /&gt;
=== Входные и выходные данные алгоритма ===&lt;br /&gt;
&#039;&#039;&#039;Входные данные.&#039;&#039;&#039; Матрица &amp;lt;math&amp;gt;A&amp;lt;/math&amp;gt; с элементами &amp;lt;math&amp;gt;\alpha_{ij}&amp;lt;/math&amp;gt;, где &amp;lt;math&amp;gt;i = \overline{1, n}&amp;lt;/math&amp;gt; (размерность пространства) и &amp;lt;math&amp;gt;j = \overline{1, m}&amp;lt;/math&amp;gt; (количество линейно-независимых векторов), при этом &amp;lt;math&amp;gt;n \leqslant m&amp;lt;/math&amp;gt;.&lt;br /&gt;
&lt;br /&gt;
&#039;&#039;&#039;Объем входных данных.&#039;&#039;&#039; &amp;lt;math&amp;gt;nm&amp;lt;/math&amp;gt;&lt;br /&gt;
&lt;br /&gt;
&#039;&#039;&#039;Выходные данные.&#039;&#039;&#039; Матрица &amp;lt;math&amp;gt;B&amp;lt;/math&amp;gt; с элементами &amp;lt;math&amp;gt;\beta_{ij}&amp;lt;/math&amp;gt;, где &amp;lt;math&amp;gt;i = \overline{1, n}&amp;lt;/math&amp;gt; и &amp;lt;math&amp;gt;j = \overline{1, m}&amp;lt;/math&amp;gt;, тогда &amp;lt;math&amp;gt;b_{i1}, \dots, b_{im}&amp;lt;/math&amp;gt; — система ортогональных векторов.&lt;br /&gt;
&lt;br /&gt;
&#039;&#039;&#039;Объем выходных данных.&#039;&#039;&#039; &amp;lt;math&amp;gt;nm&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;
=== Масштабируемость алгоритма и его реализации ===&lt;br /&gt;
&#039;&#039;Срок сдачи продлен до 15 ноября.&#039;&#039;&lt;br /&gt;
=== Динамические характеристики и эффективность реализации алгоритма ===&lt;br /&gt;
=== Выводы для классов архитектур ===&lt;br /&gt;
=== Существующие реализации алгоритма ===&lt;br /&gt;
*&lt;br /&gt;
== Литература ==&lt;/div&gt;</summary>
		<author><name>BDA</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:BDA/%D0%9E%D1%80%D1%82%D0%BE%D0%B3%D0%BE%D0%BD%D0%B0%D0%BB%D0%B8%D0%B7%D0%B0%D1%86%D0%B8%D1%8F_%D0%93%D1%80%D0%B0%D0%BC%D0%B0-%D0%A8%D0%BC%D0%B8%D0%B4%D1%82%D0%B0&amp;diff=12532</id>
		<title>Участник:BDA/Ортогонализация Грама-Шмидта</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:BDA/%D0%9E%D1%80%D1%82%D0%BE%D0%B3%D0%BE%D0%BD%D0%B0%D0%BB%D0%B8%D0%B7%D0%B0%D1%86%D0%B8%D1%8F_%D0%93%D1%80%D0%B0%D0%BC%D0%B0-%D0%A8%D0%BC%D0%B8%D0%B4%D1%82%D0%B0&amp;diff=12532"/>
		<updated>2016-10-16T13:24:46Z</updated>

		<summary type="html">&lt;p&gt;BDA: /* Математическое описание алгоритма */&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(nm^2)&amp;lt;/math&amp;gt;&lt;br /&gt;
| pf_height         = &amp;lt;math&amp;gt;?&amp;lt;/math&amp;gt;&lt;br /&gt;
| pf_width          = &amp;lt;math&amp;gt;?&amp;lt;/math&amp;gt;&lt;br /&gt;
| input_data        = &amp;lt;math&amp;gt;nm&amp;lt;/math&amp;gt;&lt;br /&gt;
| output_data       = &amp;lt;math&amp;gt;nm&amp;lt;/math&amp;gt;&lt;br /&gt;
}}&lt;br /&gt;
&lt;br /&gt;
Основные авторы описания: [[Участник:Zodiac|Белов Н. А.]], [[Участник:BDA|Богомолов Д. А.]].&lt;br /&gt;
&lt;br /&gt;
== Свойства и структура алгоритма ==&lt;br /&gt;
=== Общее описание алгоритма ===&lt;br /&gt;
&lt;br /&gt;
Ортогонализация ― алгоритм построения для данной линейно независимой системы векторов евклидова или эрмитова пространства V ортогональной системы ненулевых векторов, порождающих то же самое подпространство в V.&lt;br /&gt;
&lt;br /&gt;
Ортогонализация Грама–Шмидта&amp;lt;ref&amp;gt;Канатников А.Н., Крищенко А.П. &amp;quot;Линейная алгебра.&amp;quot; ― 3-е изд., стер. ― М.: Изд-во МГТУ им. Н.Э. Баумана, 2002&amp;lt;/ref&amp;gt; (процесс Грама–Шмидта) ― наиболее известный алгоритм ортогонализации. Назван в честь Йоргена Педерсена Грама&amp;lt;ref&amp;gt;O&#039;Connor, John J.; Robertson, Edmund F., &amp;quot;Jørgen Pedersen Gram&amp;quot;, MacTutor History of Mathematics archive, University of St Andrews.&amp;lt;/ref&amp;gt; и Эрхарда Шмидта&amp;lt;ref&amp;gt;O&#039;Connor, John J.; Robertson, Edmund F., &amp;quot;Erhard Schmidt&amp;quot;, MacTutor History of Mathematics archive, University of St Andrews.&amp;lt;/ref&amp;gt;, однако ранее уже появлялся в работах Лапласа и Коши. Является частным случаем разложения Ивасавы, так как может быть представлен как разложение невырожденной квадратной матрицы в произведение ортогональной (или унитарной матрицы в случае эрмитова пространства) и верхнетреугольной матрицы с положительными диагональными элементами.&lt;br /&gt;
&lt;br /&gt;
Рассматриваемый алгоритм применяется для борьбы с помехами в адаптивной системе селекции движущихся целей&amp;lt;ref&amp;gt;Орешкин Б.Н., Бакулев П.А. &amp;quot;Быстрая процедура ортогонализации Грамма–Шмидта и ее применение для борьбы с помехами в адаптивной системе селекции движущихся целей&amp;quot; ― Радиотехника / №12 за 2007 г.&amp;lt;/ref&amp;gt;, в протоколах безопасности&amp;lt;ref&amp;gt;Пискова А.В., Менщиков А.А., Коробейников А.Г. &amp;quot;Использование ортогонализации Грама-Шмидта в алгоритме приведения базиса решетки для протоколов безопасности&amp;quot; ― Вопросы кибербезопасности №1(14) 2016&amp;lt;/ref&amp;gt;, для повышения экономичности алгоритмов оценивания параметров моделей объектов управления&amp;lt;ref&amp;gt;Карелин А.Е., Светлаков А.А. &amp;quot;Использование ортогонализации Грама-Шмидта для повышения экономичности многоточечных алгоритмов рекуррентного оценивания параметров моделей объектов управления&amp;quot; ― Известия Томского политехнического университета [Известия ТПУ]. — 2006. — Т. 309, № 8. — [С. 15-19].&amp;lt;/ref&amp;gt; и в других областях.&lt;br /&gt;
&lt;br /&gt;
=== Математическое описание алгоритма ===&lt;br /&gt;
&#039;&#039;&#039;Входные данные.&#039;&#039;&#039; &amp;lt;math&amp;gt;m&amp;lt;/math&amp;gt; линейно независимых векторов &amp;lt;math&amp;gt;\mathbf{a}_1,...,\mathbf{a}_m&amp;lt;/math&amp;gt; c размерностью пространства &amp;lt;math&amp;gt;n&amp;lt;/math&amp;gt;, записанных в матрице &amp;lt;math&amp;gt;A&amp;lt;/math&amp;gt; с элементами &amp;lt;math&amp;gt;\alpha_{ij}&amp;lt;/math&amp;gt;.&lt;br /&gt;
&lt;br /&gt;
&#039;&#039;&#039;Выходные данные.&#039;&#039;&#039; &amp;lt;math&amp;gt;m&amp;lt;/math&amp;gt; ортогональных векторов &amp;lt;math&amp;gt;\mathbf{b}_1,...,\mathbf{b}_m&amp;lt;/math&amp;gt; c размерностью пространства &amp;lt;math&amp;gt;n&amp;lt;/math&amp;gt;, записанных в матрице &amp;lt;math&amp;gt;B&amp;lt;/math&amp;gt; с элементами &amp;lt;math&amp;gt;\beta_{ij}&amp;lt;/math&amp;gt;.&lt;br /&gt;
&lt;br /&gt;
Определим оператор проекции (проецирует вектор &amp;lt;math&amp;gt;\mathbf{a}&amp;lt;/math&amp;gt; коллинеарно вектору &amp;lt;math&amp;gt;\mathbf{b}&amp;lt;/math&amp;gt;) &amp;lt;math&amp;gt;\mathbf{proj}_b a = \frac{\left \langle a,b \right \rangle}{\left \langle b,b \right \rangle }b&amp;lt;/math&amp;gt;, где &amp;lt;math&amp;gt;\left \langle a,b \right \rangle&amp;lt;/math&amp;gt; ― скалярное произведение векторов &amp;lt;math&amp;gt;\mathbf{a}&amp;lt;/math&amp;gt; и &amp;lt;math&amp;gt;\mathbf{b}&amp;lt;/math&amp;gt;.&lt;br /&gt;
&lt;br /&gt;
=== Вычислительное ядро алгоритма ===&lt;br /&gt;
Основное время работы алгоритма приходится на вычисление сумм &amp;lt;math&amp;gt;\sum_{i=1}^{j-1} \mathbf{proj}_{\mathbf{b}_i} \mathbf{a}_i \forall j: j=\overline{1, m}&amp;lt;/math&amp;gt;.&lt;br /&gt;
&lt;br /&gt;
=== Макроструктура алгоритма ===&lt;br /&gt;
Из описания алгоритма в предыдущих разделов следует, что основную часть данного метода составляют операции вычисления проекций векторов, а также их сумм.&lt;br /&gt;
&lt;br /&gt;
=== Схема реализации последовательного алгоритма ===&lt;br /&gt;
*&lt;br /&gt;
=== Последовательная сложность алгоритма ===&lt;br /&gt;
Рассмотрим &amp;lt;math&amp;gt;n&amp;lt;/math&amp;gt; векторов длины &amp;lt;math&amp;gt;m&amp;lt;/math&amp;gt;.&lt;br /&gt;
&lt;br /&gt;
# Скалярное произведение векторов требует &amp;lt;math&amp;gt;n - 1&amp;lt;/math&amp;gt; сложение и &amp;lt;math&amp;gt;n&amp;lt;/math&amp;gt; произведений.&lt;br /&gt;
# Нормализация вектора требует 1 скалярного произведения, 1 вычисления квадратного корня и &amp;lt;math&amp;gt;n&amp;lt;/math&amp;gt; делений, то есть:&lt;br /&gt;
## &amp;lt;math&amp;gt;n-1&amp;lt;/math&amp;gt; (&amp;lt;math&amp;gt;+&amp;lt;/math&amp;gt;);&lt;br /&gt;
## &amp;lt;math&amp;gt;n&amp;lt;/math&amp;gt; (&amp;lt;math&amp;gt;\times&amp;lt;/math&amp;gt;);&lt;br /&gt;
## &amp;lt;math&amp;gt;n&amp;lt;/math&amp;gt; (&amp;lt;math&amp;gt;\div&amp;lt;/math&amp;gt;);&lt;br /&gt;
## &amp;lt;math&amp;gt;1&amp;lt;/math&amp;gt; (&amp;lt;math&amp;gt;\sqrt{}&amp;lt;/math&amp;gt;).&lt;br /&gt;
# Вычитание проекции вектора требует 1 скалярного произведения, &amp;lt;math&amp;gt;n&amp;lt;/math&amp;gt; сложений и &amp;lt;math&amp;gt;n&amp;lt;/math&amp;gt; умножений, то есть:&lt;br /&gt;
## &amp;lt;math&amp;gt;2n-1&amp;lt;/math&amp;gt; (&amp;lt;math&amp;gt;+&amp;lt;/math&amp;gt;);&lt;br /&gt;
## &amp;lt;math&amp;gt;2n&amp;lt;/math&amp;gt; (&amp;lt;math&amp;gt;\times&amp;lt;/math&amp;gt;).&lt;br /&gt;
# Вычисление &amp;lt;math&amp;gt;i&amp;lt;/math&amp;gt;-го вектора требует &amp;lt;math&amp;gt;i-1&amp;lt;/math&amp;gt; вычитаний проекций с нормализацией, то есть:&lt;br /&gt;
## &amp;lt;math&amp;gt;(2n-1)(i-1)+n-1&amp;lt;/math&amp;gt; (&amp;lt;math&amp;gt;+&amp;lt;/math&amp;gt;);&lt;br /&gt;
## &amp;lt;math&amp;gt;2n(i-1)+n&amp;lt;/math&amp;gt; (&amp;lt;math&amp;gt;\times&amp;lt;/math&amp;gt;);&lt;br /&gt;
## &amp;lt;math&amp;gt;n&amp;lt;/math&amp;gt; (&amp;lt;math&amp;gt;\div&amp;lt;/math&amp;gt;);&lt;br /&gt;
## &amp;lt;math&amp;gt;1&amp;lt;/math&amp;gt; (&amp;lt;math&amp;gt;\sqrt{}&amp;lt;/math&amp;gt;).&lt;br /&gt;
# Мы вычисляем вектора от &amp;lt;math&amp;gt;i=1&amp;lt;/math&amp;gt; до &amp;lt;math&amp;gt;m&amp;lt;/math&amp;gt;, поэтому &amp;lt;math&amp;gt;i-1&amp;lt;/math&amp;gt; множителей выражаются &#039;&#039;треугольным числом&#039;&#039; &amp;lt;math&amp;gt;(m-1)\frac{m}{2}&amp;lt;/math&amp;gt;, а элементы независимых &amp;lt;math&amp;gt;i&amp;lt;/math&amp;gt; умножаются на &amp;lt;math&amp;gt;m&amp;lt;/math&amp;gt;.&lt;br /&gt;
## &amp;lt;math&amp;gt;(2n-1)(m-1)\frac{m}{2}+(n-1)m&amp;lt;/math&amp;gt; (&amp;lt;math&amp;gt;+&amp;lt;/math&amp;gt;);&lt;br /&gt;
## &amp;lt;math&amp;gt;2n(m-1)\frac{m}{2}+nm&amp;lt;/math&amp;gt; (&amp;lt;math&amp;gt;\times&amp;lt;/math&amp;gt;);&lt;br /&gt;
## &amp;lt;math&amp;gt;nm&amp;lt;/math&amp;gt; (&amp;lt;math&amp;gt;\div&amp;lt;/math&amp;gt;);&lt;br /&gt;
## &amp;lt;math&amp;gt;m&amp;lt;/math&amp;gt; (&amp;lt;math&amp;gt;\sqrt{}&amp;lt;/math&amp;gt;).&lt;br /&gt;
# В скалярном произведении &amp;lt;math&amp;gt;n&amp;lt;/math&amp;gt; делений могут быть рассмотрены как &amp;lt;math&amp;gt;n&amp;lt;/math&amp;gt; умножений:&lt;br /&gt;
## &amp;lt;math&amp;gt;(2n-1)(m-1)\frac{m}{2}+(n-1)m&amp;lt;/math&amp;gt; (&amp;lt;math&amp;gt;+&amp;lt;/math&amp;gt;);&lt;br /&gt;
## &amp;lt;math&amp;gt;2n(m-1)\frac{m}{2}+2nm&amp;lt;/math&amp;gt; (&amp;lt;math&amp;gt;\times&amp;lt;/math&amp;gt;);&lt;br /&gt;
## &amp;lt;math&amp;gt;m&amp;lt;/math&amp;gt; (&amp;lt;math&amp;gt;\div&amp;lt;/math&amp;gt;);&lt;br /&gt;
## &amp;lt;math&amp;gt;m&amp;lt;/math&amp;gt; (&amp;lt;math&amp;gt;\sqrt{}&amp;lt;/math&amp;gt;).&lt;br /&gt;
&lt;br /&gt;
Таким образом, требуется &amp;lt;math&amp;gt;2nm^2&amp;lt;/math&amp;gt; операций. Сложность алгоритма &amp;lt;math&amp;gt;O(nm^2)&amp;lt;/math&amp;gt;.&lt;br /&gt;
&lt;br /&gt;
=== Информационный граф ===&lt;br /&gt;
*&lt;br /&gt;
=== Ресурс параллелизма алгоритма ===&lt;br /&gt;
*&lt;br /&gt;
=== Входные и выходные данные алгоритма ===&lt;br /&gt;
&#039;&#039;&#039;Входные данные.&#039;&#039;&#039; Матрица &amp;lt;math&amp;gt;A&amp;lt;/math&amp;gt; с элементами &amp;lt;math&amp;gt;\alpha_{ij}&amp;lt;/math&amp;gt;, где &amp;lt;math&amp;gt;i = \overline{1, n}&amp;lt;/math&amp;gt; (размерность пространства) и &amp;lt;math&amp;gt;j = \overline{1, m}&amp;lt;/math&amp;gt; (количество линейно-независимых векторов), при этом &amp;lt;math&amp;gt;n \leqslant m&amp;lt;/math&amp;gt;.&lt;br /&gt;
&lt;br /&gt;
&#039;&#039;&#039;Объем входных данных.&#039;&#039;&#039; &amp;lt;math&amp;gt;nm&amp;lt;/math&amp;gt;&lt;br /&gt;
&lt;br /&gt;
&#039;&#039;&#039;Выходные данные.&#039;&#039;&#039; Матрица &amp;lt;math&amp;gt;B&amp;lt;/math&amp;gt; с элементами &amp;lt;math&amp;gt;\beta_{ij}&amp;lt;/math&amp;gt;, где &amp;lt;math&amp;gt;i = \overline{1, n}&amp;lt;/math&amp;gt; и &amp;lt;math&amp;gt;j = \overline{1, m}&amp;lt;/math&amp;gt;, тогда &amp;lt;math&amp;gt;b_{i1}, \dots, b_{im}&amp;lt;/math&amp;gt; — система ортогональных векторов.&lt;br /&gt;
&lt;br /&gt;
&#039;&#039;&#039;Объем выходных данных.&#039;&#039;&#039; &amp;lt;math&amp;gt;nm&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;
=== Масштабируемость алгоритма и его реализации ===&lt;br /&gt;
&#039;&#039;Срок сдачи продлен до 15 ноября.&#039;&#039;&lt;br /&gt;
=== Динамические характеристики и эффективность реализации алгоритма ===&lt;br /&gt;
=== Выводы для классов архитектур ===&lt;br /&gt;
=== Существующие реализации алгоритма ===&lt;br /&gt;
*&lt;br /&gt;
== Литература ==&lt;/div&gt;</summary>
		<author><name>BDA</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:BDA/%D0%9E%D1%80%D1%82%D0%BE%D0%B3%D0%BE%D0%BD%D0%B0%D0%BB%D0%B8%D0%B7%D0%B0%D1%86%D0%B8%D1%8F_%D0%93%D1%80%D0%B0%D0%BC%D0%B0-%D0%A8%D0%BC%D0%B8%D0%B4%D1%82%D0%B0&amp;diff=12522</id>
		<title>Участник:BDA/Ортогонализация Грама-Шмидта</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:BDA/%D0%9E%D1%80%D1%82%D0%BE%D0%B3%D0%BE%D0%BD%D0%B0%D0%BB%D0%B8%D0%B7%D0%B0%D1%86%D0%B8%D1%8F_%D0%93%D1%80%D0%B0%D0%BC%D0%B0-%D0%A8%D0%BC%D0%B8%D0%B4%D1%82%D0%B0&amp;diff=12522"/>
		<updated>2016-10-16T13:10:32Z</updated>

		<summary type="html">&lt;p&gt;BDA: /* Математическое описание алгоритма */&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(nm^2)&amp;lt;/math&amp;gt;&lt;br /&gt;
| pf_height         = &amp;lt;math&amp;gt;?&amp;lt;/math&amp;gt;&lt;br /&gt;
| pf_width          = &amp;lt;math&amp;gt;?&amp;lt;/math&amp;gt;&lt;br /&gt;
| input_data        = &amp;lt;math&amp;gt;nm&amp;lt;/math&amp;gt;&lt;br /&gt;
| output_data       = &amp;lt;math&amp;gt;nm&amp;lt;/math&amp;gt;&lt;br /&gt;
}}&lt;br /&gt;
&lt;br /&gt;
Основные авторы описания: [[Участник:Zodiac|Белов Н. А.]], [[Участник:BDA|Богомолов Д. А.]].&lt;br /&gt;
&lt;br /&gt;
== Свойства и структура алгоритма ==&lt;br /&gt;
=== Общее описание алгоритма ===&lt;br /&gt;
&lt;br /&gt;
Ортогонализация ― алгоритм построения для данной линейно независимой системы векторов евклидова или эрмитова пространства V ортогональной системы ненулевых векторов, порождающих то же самое подпространство в V.&lt;br /&gt;
&lt;br /&gt;
Ортогонализация Грама–Шмидта&amp;lt;ref&amp;gt;Канатников А.Н., Крищенко А.П. &amp;quot;Линейная алгебра.&amp;quot; ― 3-е изд., стер. ― М.: Изд-во МГТУ им. Н.Э. Баумана, 2002&amp;lt;/ref&amp;gt; (процесс Грама–Шмидта) ― наиболее известный алгоритм ортогонализации. Назван в честь Йоргена Педерсена Грама&amp;lt;ref&amp;gt;O&#039;Connor, John J.; Robertson, Edmund F., &amp;quot;Jørgen Pedersen Gram&amp;quot;, MacTutor History of Mathematics archive, University of St Andrews.&amp;lt;/ref&amp;gt; и Эрхарда Шмидта&amp;lt;ref&amp;gt;O&#039;Connor, John J.; Robertson, Edmund F., &amp;quot;Erhard Schmidt&amp;quot;, MacTutor History of Mathematics archive, University of St Andrews.&amp;lt;/ref&amp;gt;, однако ранее уже появлялся в работах Лапласа и Коши. Является частным случаем разложения Ивасавы, так как может быть представлен как разложение невырожденной квадратной матрицы в произведение ортогональной (или унитарной матрицы в случае эрмитова пространства) и верхнетреугольной матрицы с положительными диагональными элементами.&lt;br /&gt;
&lt;br /&gt;
Рассматриваемый алгоритм применяется для борьбы с помехами в адаптивной системе селекции движущихся целей&amp;lt;ref&amp;gt;Орешкин Б.Н., Бакулев П.А. &amp;quot;Быстрая процедура ортогонализации Грамма–Шмидта и ее применение для борьбы с помехами в адаптивной системе селекции движущихся целей&amp;quot; ― Радиотехника / №12 за 2007 г.&amp;lt;/ref&amp;gt;, в протоколах безопасности&amp;lt;ref&amp;gt;Пискова А.В., Менщиков А.А., Коробейников А.Г. &amp;quot;Использование ортогонализации Грама-Шмидта в алгоритме приведения базиса решетки для протоколов безопасности&amp;quot; ― Вопросы кибербезопасности №1(14) 2016&amp;lt;/ref&amp;gt;, для повышения экономичности алгоритмов оценивания параметров моделей объектов управления&amp;lt;ref&amp;gt;Карелин А.Е., Светлаков А.А. &amp;quot;Использование ортогонализации Грама-Шмидта для повышения экономичности многоточечных алгоритмов рекуррентного оценивания параметров моделей объектов управления&amp;quot; ― Известия Томского политехнического университета [Известия ТПУ]. — 2006. — Т. 309, № 8. — [С. 15-19].&amp;lt;/ref&amp;gt; и в других областях.&lt;br /&gt;
&lt;br /&gt;
=== Математическое описание алгоритма ===&lt;br /&gt;
&#039;&#039;&#039;Входные данные.&#039;&#039;&#039; &amp;lt;math&amp;gt;m&amp;lt;/math&amp;gt; линейно независимых векторов &amp;lt;math&amp;gt;\mathbf{a}_1,...,\mathbf{a}_m&amp;lt;/math&amp;gt; c размерностью пространства &amp;lt;math&amp;gt;n&amp;lt;/math&amp;gt;, записанных в матрице &amp;lt;math&amp;gt;A&amp;lt;/math&amp;gt; с элементами &amp;lt;math&amp;gt;\alpha_{ij}&amp;lt;/math&amp;gt;.&lt;br /&gt;
&lt;br /&gt;
&#039;&#039;&#039;Выходные данные.&#039;&#039;&#039; &amp;lt;math&amp;gt;m&amp;lt;/math&amp;gt; ортогональных векторов &amp;lt;math&amp;gt;\mathbf{b}_1,...,\mathbf{b}_m&amp;lt;/math&amp;gt; c размерностью пространства &amp;lt;math&amp;gt;n&amp;lt;/math&amp;gt;, записанных в матрице &amp;lt;math&amp;gt;B&amp;lt;/math&amp;gt; с элементами &amp;lt;math&amp;gt;\beta_{ij}&amp;lt;/math&amp;gt;.&lt;br /&gt;
&lt;br /&gt;
=== Вычислительное ядро алгоритма ===&lt;br /&gt;
Основное время работы алгоритма приходится на вычисление сумм &amp;lt;math&amp;gt;\sum_{i=1}^{j-1} \mathbf{proj}_{\mathbf{b}_i} \mathbf{a}_i \forall j: j=\overline{1, m}&amp;lt;/math&amp;gt;.&lt;br /&gt;
&lt;br /&gt;
=== Макроструктура алгоритма ===&lt;br /&gt;
Из описания алгоритма в предыдущих разделов следует, что основную часть данного метода составляют операции вычисления проекций векторов, а также их сумм.&lt;br /&gt;
&lt;br /&gt;
=== Схема реализации последовательного алгоритма ===&lt;br /&gt;
*&lt;br /&gt;
=== Последовательная сложность алгоритма ===&lt;br /&gt;
Рассмотрим &amp;lt;math&amp;gt;n&amp;lt;/math&amp;gt; векторов длины &amp;lt;math&amp;gt;m&amp;lt;/math&amp;gt;.&lt;br /&gt;
&lt;br /&gt;
# Скалярное произведение векторов требует &amp;lt;math&amp;gt;n - 1&amp;lt;/math&amp;gt; сложение и &amp;lt;math&amp;gt;n&amp;lt;/math&amp;gt; произведений.&lt;br /&gt;
# Нормализация вектора требует 1 скалярного произведения, 1 вычисления квадратного корня и &amp;lt;math&amp;gt;n&amp;lt;/math&amp;gt; делений, то есть:&lt;br /&gt;
## &amp;lt;math&amp;gt;n-1&amp;lt;/math&amp;gt; (&amp;lt;math&amp;gt;+&amp;lt;/math&amp;gt;);&lt;br /&gt;
## &amp;lt;math&amp;gt;n&amp;lt;/math&amp;gt; (&amp;lt;math&amp;gt;\times&amp;lt;/math&amp;gt;);&lt;br /&gt;
## &amp;lt;math&amp;gt;n&amp;lt;/math&amp;gt; (&amp;lt;math&amp;gt;\div&amp;lt;/math&amp;gt;);&lt;br /&gt;
## &amp;lt;math&amp;gt;1&amp;lt;/math&amp;gt; (&amp;lt;math&amp;gt;\sqrt{}&amp;lt;/math&amp;gt;).&lt;br /&gt;
# Вычитание проекции вектора требует 1 скалярного произведения, &amp;lt;math&amp;gt;n&amp;lt;/math&amp;gt; сложений и &amp;lt;math&amp;gt;n&amp;lt;/math&amp;gt; умножений, то есть:&lt;br /&gt;
## &amp;lt;math&amp;gt;2n-1&amp;lt;/math&amp;gt; (&amp;lt;math&amp;gt;+&amp;lt;/math&amp;gt;);&lt;br /&gt;
## &amp;lt;math&amp;gt;2n&amp;lt;/math&amp;gt; (&amp;lt;math&amp;gt;\times&amp;lt;/math&amp;gt;).&lt;br /&gt;
# Вычисление &amp;lt;math&amp;gt;i&amp;lt;/math&amp;gt;-го вектора требует &amp;lt;math&amp;gt;i-1&amp;lt;/math&amp;gt; вычитаний проекций с нормализацией, то есть:&lt;br /&gt;
## &amp;lt;math&amp;gt;(2n-1)(i-1)+n-1&amp;lt;/math&amp;gt; (&amp;lt;math&amp;gt;+&amp;lt;/math&amp;gt;);&lt;br /&gt;
## &amp;lt;math&amp;gt;2n(i-1)+n&amp;lt;/math&amp;gt; (&amp;lt;math&amp;gt;\times&amp;lt;/math&amp;gt;);&lt;br /&gt;
## &amp;lt;math&amp;gt;n&amp;lt;/math&amp;gt; (&amp;lt;math&amp;gt;\div&amp;lt;/math&amp;gt;);&lt;br /&gt;
## &amp;lt;math&amp;gt;1&amp;lt;/math&amp;gt; (&amp;lt;math&amp;gt;\sqrt{}&amp;lt;/math&amp;gt;).&lt;br /&gt;
# Мы вычисляем вектора от &amp;lt;math&amp;gt;i=1&amp;lt;/math&amp;gt; до &amp;lt;math&amp;gt;m&amp;lt;/math&amp;gt;, поэтому &amp;lt;math&amp;gt;i-1&amp;lt;/math&amp;gt; множителей выражаются &#039;&#039;треугольным числом&#039;&#039; &amp;lt;math&amp;gt;(m-1)\frac{m}{2}&amp;lt;/math&amp;gt;, а элементы независимых &amp;lt;math&amp;gt;i&amp;lt;/math&amp;gt; умножаются на &amp;lt;math&amp;gt;m&amp;lt;/math&amp;gt;.&lt;br /&gt;
## &amp;lt;math&amp;gt;(2n-1)(m-1)\frac{m}{2}+(n-1)m&amp;lt;/math&amp;gt; (&amp;lt;math&amp;gt;+&amp;lt;/math&amp;gt;);&lt;br /&gt;
## &amp;lt;math&amp;gt;2n(m-1)\frac{m}{2}+nm&amp;lt;/math&amp;gt; (&amp;lt;math&amp;gt;\times&amp;lt;/math&amp;gt;);&lt;br /&gt;
## &amp;lt;math&amp;gt;nm&amp;lt;/math&amp;gt; (&amp;lt;math&amp;gt;\div&amp;lt;/math&amp;gt;);&lt;br /&gt;
## &amp;lt;math&amp;gt;m&amp;lt;/math&amp;gt; (&amp;lt;math&amp;gt;\sqrt{}&amp;lt;/math&amp;gt;).&lt;br /&gt;
# В скалярном произведении &amp;lt;math&amp;gt;n&amp;lt;/math&amp;gt; делений могут быть рассмотрены как &amp;lt;math&amp;gt;n&amp;lt;/math&amp;gt; умножений:&lt;br /&gt;
## &amp;lt;math&amp;gt;(2n-1)(m-1)\frac{m}{2}+(n-1)m&amp;lt;/math&amp;gt; (&amp;lt;math&amp;gt;+&amp;lt;/math&amp;gt;);&lt;br /&gt;
## &amp;lt;math&amp;gt;2n(m-1)\frac{m}{2}+2nm&amp;lt;/math&amp;gt; (&amp;lt;math&amp;gt;\times&amp;lt;/math&amp;gt;);&lt;br /&gt;
## &amp;lt;math&amp;gt;m&amp;lt;/math&amp;gt; (&amp;lt;math&amp;gt;\div&amp;lt;/math&amp;gt;);&lt;br /&gt;
## &amp;lt;math&amp;gt;m&amp;lt;/math&amp;gt; (&amp;lt;math&amp;gt;\sqrt{}&amp;lt;/math&amp;gt;).&lt;br /&gt;
&lt;br /&gt;
Таким образом, требуется &amp;lt;math&amp;gt;2nm^2&amp;lt;/math&amp;gt; операций. Сложность алгоритма &amp;lt;math&amp;gt;O(nm^2)&amp;lt;/math&amp;gt;.&lt;br /&gt;
&lt;br /&gt;
=== Информационный граф ===&lt;br /&gt;
*&lt;br /&gt;
=== Ресурс параллелизма алгоритма ===&lt;br /&gt;
*&lt;br /&gt;
=== Входные и выходные данные алгоритма ===&lt;br /&gt;
&#039;&#039;&#039;Входные данные.&#039;&#039;&#039; Матрица &amp;lt;math&amp;gt;A&amp;lt;/math&amp;gt; с элементами &amp;lt;math&amp;gt;\alpha_{ij}&amp;lt;/math&amp;gt;, где &amp;lt;math&amp;gt;i = \overline{1, n}&amp;lt;/math&amp;gt; (размерность пространства) и &amp;lt;math&amp;gt;j = \overline{1, m}&amp;lt;/math&amp;gt; (количество линейно-независимых векторов), при этом &amp;lt;math&amp;gt;n \leqslant m&amp;lt;/math&amp;gt;.&lt;br /&gt;
&lt;br /&gt;
&#039;&#039;&#039;Объем входных данных.&#039;&#039;&#039; &amp;lt;math&amp;gt;nm&amp;lt;/math&amp;gt;&lt;br /&gt;
&lt;br /&gt;
&#039;&#039;&#039;Выходные данные.&#039;&#039;&#039; Матрица &amp;lt;math&amp;gt;B&amp;lt;/math&amp;gt; с элементами &amp;lt;math&amp;gt;\beta_{ij}&amp;lt;/math&amp;gt;, где &amp;lt;math&amp;gt;i = \overline{1, n}&amp;lt;/math&amp;gt; и &amp;lt;math&amp;gt;j = \overline{1, m}&amp;lt;/math&amp;gt;, тогда &amp;lt;math&amp;gt;b_{i1}, \dots, b_{im}&amp;lt;/math&amp;gt; — система ортогональных векторов.&lt;br /&gt;
&lt;br /&gt;
&#039;&#039;&#039;Объем выходных данных.&#039;&#039;&#039; &amp;lt;math&amp;gt;nm&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;
=== Масштабируемость алгоритма и его реализации ===&lt;br /&gt;
&#039;&#039;Срок сдачи продлен до 15 ноября.&#039;&#039;&lt;br /&gt;
=== Динамические характеристики и эффективность реализации алгоритма ===&lt;br /&gt;
=== Выводы для классов архитектур ===&lt;br /&gt;
=== Существующие реализации алгоритма ===&lt;br /&gt;
*&lt;br /&gt;
== Литература ==&lt;/div&gt;</summary>
		<author><name>BDA</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:BDA/%D0%9E%D1%80%D1%82%D0%BE%D0%B3%D0%BE%D0%BD%D0%B0%D0%BB%D0%B8%D0%B7%D0%B0%D1%86%D0%B8%D1%8F_%D0%93%D1%80%D0%B0%D0%BC%D0%B0-%D0%A8%D0%BC%D0%B8%D0%B4%D1%82%D0%B0&amp;diff=12462</id>
		<title>Участник:BDA/Ортогонализация Грама-Шмидта</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:BDA/%D0%9E%D1%80%D1%82%D0%BE%D0%B3%D0%BE%D0%BD%D0%B0%D0%BB%D0%B8%D0%B7%D0%B0%D1%86%D0%B8%D1%8F_%D0%93%D1%80%D0%B0%D0%BC%D0%B0-%D0%A8%D0%BC%D0%B8%D0%B4%D1%82%D0%B0&amp;diff=12462"/>
		<updated>2016-10-16T10:53:14Z</updated>

		<summary type="html">&lt;p&gt;BDA: /* Общее описание алгоритма */&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(nm^2)&amp;lt;/math&amp;gt;&lt;br /&gt;
| pf_height         = &amp;lt;math&amp;gt;?&amp;lt;/math&amp;gt;&lt;br /&gt;
| pf_width          = &amp;lt;math&amp;gt;?&amp;lt;/math&amp;gt;&lt;br /&gt;
| input_data        = &amp;lt;math&amp;gt;nm&amp;lt;/math&amp;gt;&lt;br /&gt;
| output_data       = &amp;lt;math&amp;gt;nm&amp;lt;/math&amp;gt;&lt;br /&gt;
}}&lt;br /&gt;
&lt;br /&gt;
Основные авторы описания: [[Участник:Zodiac|Белов Н. А.]], [[Участник:BDA|Богомолов Д. А.]].&lt;br /&gt;
&lt;br /&gt;
== Свойства и структура алгоритма ==&lt;br /&gt;
=== Общее описание алгоритма ===&lt;br /&gt;
&lt;br /&gt;
Ортогонализация ― алгоритм построения для данной линейно независимой системы векторов евклидова или эрмитова пространства V ортогональной системы ненулевых векторов, порождающих то же самое подпространство в V.&lt;br /&gt;
&lt;br /&gt;
Ортогонализация Грама–Шмидта&amp;lt;ref&amp;gt;Канатников А.Н., Крищенко А.П. &amp;quot;Линейная алгебра.&amp;quot; ― 3-е изд., стер. ― М.: Изд-во МГТУ им. Н.Э. Баумана, 2002&amp;lt;/ref&amp;gt; (процесс Грама–Шмидта) ― наиболее известный алгоритм ортогонализации. Назван в честь Йоргена Педерсена Грама&amp;lt;ref&amp;gt;O&#039;Connor, John J.; Robertson, Edmund F., &amp;quot;Jørgen Pedersen Gram&amp;quot;, MacTutor History of Mathematics archive, University of St Andrews.&amp;lt;/ref&amp;gt; и Эрхарда Шмидта&amp;lt;ref&amp;gt;O&#039;Connor, John J.; Robertson, Edmund F., &amp;quot;Erhard Schmidt&amp;quot;, MacTutor History of Mathematics archive, University of St Andrews.&amp;lt;/ref&amp;gt;, однако ранее уже появлялся в работах Лапласа и Коши. Является частным случаем разложения Ивасавы, так как может быть представлен как разложение невырожденной квадратной матрицы в произведение ортогональной (или унитарной матрицы в случае эрмитова пространства) и верхнетреугольной матрицы с положительными диагональными элементами.&lt;br /&gt;
&lt;br /&gt;
Рассматриваемый алгоритм применяется для борьбы с помехами в адаптивной системе селекции движущихся целей&amp;lt;ref&amp;gt;Орешкин Б.Н., Бакулев П.А. &amp;quot;Быстрая процедура ортогонализации Грамма–Шмидта и ее применение для борьбы с помехами в адаптивной системе селекции движущихся целей&amp;quot; ― Радиотехника / №12 за 2007 г.&amp;lt;/ref&amp;gt;, в протоколах безопасности&amp;lt;ref&amp;gt;Пискова А.В., Менщиков А.А., Коробейников А.Г. &amp;quot;Использование ортогонализации Грама-Шмидта в алгоритме приведения базиса решетки для протоколов безопасности&amp;quot; ― Вопросы кибербезопасности №1(14) 2016&amp;lt;/ref&amp;gt;, для повышения экономичности алгоритмов оценивания параметров моделей объектов управления&amp;lt;ref&amp;gt;Карелин А.Е., Светлаков А.А. &amp;quot;Использование ортогонализации Грама-Шмидта для повышения экономичности многоточечных алгоритмов рекуррентного оценивания параметров моделей объектов управления&amp;quot; ― Известия Томского политехнического университета [Известия ТПУ]. — 2006. — Т. 309, № 8. — [С. 15-19].&amp;lt;/ref&amp;gt; и в других областях.&lt;br /&gt;
&lt;br /&gt;
=== Математическое описание алгоритма ===&lt;br /&gt;
*&lt;br /&gt;
=== Вычислительное ядро алгоритма ===&lt;br /&gt;
Основное время работы алгоритма приходится на вычисление сумм &amp;lt;math&amp;gt;\sum_{i=1}^{j-1} \mathbf{proj}_{\mathbf{b}_i} \mathbf{a}_i \forall j: j=\overline{1, m}&amp;lt;/math&amp;gt;.&lt;br /&gt;
&lt;br /&gt;
=== Макроструктура алгоритма ===&lt;br /&gt;
Из описания алгоритма в предыдущих разделов следует, что основную часть данного метода составляют операции вычисления проекций векторов, а также их сумм.&lt;br /&gt;
&lt;br /&gt;
=== Схема реализации последовательного алгоритма ===&lt;br /&gt;
*&lt;br /&gt;
=== Последовательная сложность алгоритма ===&lt;br /&gt;
Рассмотрим &amp;lt;math&amp;gt;n&amp;lt;/math&amp;gt; векторов длины &amp;lt;math&amp;gt;m&amp;lt;/math&amp;gt;.&lt;br /&gt;
&lt;br /&gt;
# Скалярное произведение векторов требует &amp;lt;math&amp;gt;n - 1&amp;lt;/math&amp;gt; сложение и &amp;lt;math&amp;gt;n&amp;lt;/math&amp;gt; произведений.&lt;br /&gt;
# Нормализация вектора требует 1 скалярного произведения, 1 вычисления квадратного корня и &amp;lt;math&amp;gt;n&amp;lt;/math&amp;gt; делений, то есть:&lt;br /&gt;
## &amp;lt;math&amp;gt;n-1&amp;lt;/math&amp;gt; (&amp;lt;math&amp;gt;+&amp;lt;/math&amp;gt;);&lt;br /&gt;
## &amp;lt;math&amp;gt;n&amp;lt;/math&amp;gt; (&amp;lt;math&amp;gt;\times&amp;lt;/math&amp;gt;);&lt;br /&gt;
## &amp;lt;math&amp;gt;n&amp;lt;/math&amp;gt; (&amp;lt;math&amp;gt;\div&amp;lt;/math&amp;gt;);&lt;br /&gt;
## &amp;lt;math&amp;gt;1&amp;lt;/math&amp;gt; (&amp;lt;math&amp;gt;\sqrt{}&amp;lt;/math&amp;gt;).&lt;br /&gt;
# Вычитание проекции вектора требует 1 скалярного произведения, &amp;lt;math&amp;gt;n&amp;lt;/math&amp;gt; сложений и &amp;lt;math&amp;gt;n&amp;lt;/math&amp;gt; умножений, то есть:&lt;br /&gt;
## &amp;lt;math&amp;gt;2n-1&amp;lt;/math&amp;gt; (&amp;lt;math&amp;gt;+&amp;lt;/math&amp;gt;);&lt;br /&gt;
## &amp;lt;math&amp;gt;2n&amp;lt;/math&amp;gt; (&amp;lt;math&amp;gt;\times&amp;lt;/math&amp;gt;).&lt;br /&gt;
# Вычисление &amp;lt;math&amp;gt;i&amp;lt;/math&amp;gt;-го вектора требует &amp;lt;math&amp;gt;i-1&amp;lt;/math&amp;gt; вычитаний проекций с нормализацией, то есть:&lt;br /&gt;
## &amp;lt;math&amp;gt;(2n-1)(i-1)+n-1&amp;lt;/math&amp;gt; (&amp;lt;math&amp;gt;+&amp;lt;/math&amp;gt;);&lt;br /&gt;
## &amp;lt;math&amp;gt;2n(i-1)+n&amp;lt;/math&amp;gt; (&amp;lt;math&amp;gt;\times&amp;lt;/math&amp;gt;);&lt;br /&gt;
## &amp;lt;math&amp;gt;n&amp;lt;/math&amp;gt; (&amp;lt;math&amp;gt;\div&amp;lt;/math&amp;gt;);&lt;br /&gt;
## &amp;lt;math&amp;gt;1&amp;lt;/math&amp;gt; (&amp;lt;math&amp;gt;\sqrt{}&amp;lt;/math&amp;gt;).&lt;br /&gt;
# Мы вычисляем вектора от &amp;lt;math&amp;gt;i=1&amp;lt;/math&amp;gt; до &amp;lt;math&amp;gt;m&amp;lt;/math&amp;gt;, поэтому &amp;lt;math&amp;gt;i-1&amp;lt;/math&amp;gt; множителей выражаются &#039;&#039;треугольным числом&#039;&#039; &amp;lt;math&amp;gt;(m-1)\frac{m}{2}&amp;lt;/math&amp;gt;, а элементы независимых &amp;lt;math&amp;gt;i&amp;lt;/math&amp;gt; умножаются на &amp;lt;math&amp;gt;m&amp;lt;/math&amp;gt;.&lt;br /&gt;
## &amp;lt;math&amp;gt;(2n-1)(m-1)\frac{m}{2}+(n-1)m&amp;lt;/math&amp;gt; (&amp;lt;math&amp;gt;+&amp;lt;/math&amp;gt;);&lt;br /&gt;
## &amp;lt;math&amp;gt;2n(m-1)\frac{m}{2}+nm&amp;lt;/math&amp;gt; (&amp;lt;math&amp;gt;\times&amp;lt;/math&amp;gt;);&lt;br /&gt;
## &amp;lt;math&amp;gt;nm&amp;lt;/math&amp;gt; (&amp;lt;math&amp;gt;\div&amp;lt;/math&amp;gt;);&lt;br /&gt;
## &amp;lt;math&amp;gt;m&amp;lt;/math&amp;gt; (&amp;lt;math&amp;gt;\sqrt{}&amp;lt;/math&amp;gt;).&lt;br /&gt;
# В скалярном произведении &amp;lt;math&amp;gt;n&amp;lt;/math&amp;gt; делений могут быть рассмотрены как &amp;lt;math&amp;gt;n&amp;lt;/math&amp;gt; умножений:&lt;br /&gt;
## &amp;lt;math&amp;gt;(2n-1)(m-1)\frac{m}{2}+(n-1)m&amp;lt;/math&amp;gt; (&amp;lt;math&amp;gt;+&amp;lt;/math&amp;gt;);&lt;br /&gt;
## &amp;lt;math&amp;gt;2n(m-1)\frac{m}{2}+2nm&amp;lt;/math&amp;gt; (&amp;lt;math&amp;gt;\times&amp;lt;/math&amp;gt;);&lt;br /&gt;
## &amp;lt;math&amp;gt;m&amp;lt;/math&amp;gt; (&amp;lt;math&amp;gt;\div&amp;lt;/math&amp;gt;);&lt;br /&gt;
## &amp;lt;math&amp;gt;m&amp;lt;/math&amp;gt; (&amp;lt;math&amp;gt;\sqrt{}&amp;lt;/math&amp;gt;).&lt;br /&gt;
&lt;br /&gt;
Таким образом, требуется &amp;lt;math&amp;gt;2nm^2&amp;lt;/math&amp;gt; операций. Сложность алгоритма &amp;lt;math&amp;gt;O(nm^2)&amp;lt;/math&amp;gt;.&lt;br /&gt;
&lt;br /&gt;
=== Информационный граф ===&lt;br /&gt;
*&lt;br /&gt;
=== Ресурс параллелизма алгоритма ===&lt;br /&gt;
*&lt;br /&gt;
=== Входные и выходные данные алгоритма ===&lt;br /&gt;
&#039;&#039;&#039;Входные данные.&#039;&#039;&#039; Матрица &amp;lt;math&amp;gt;A&amp;lt;/math&amp;gt; с элементами &amp;lt;math&amp;gt;\alpha_{ij}&amp;lt;/math&amp;gt;, где &amp;lt;math&amp;gt;i = \overline{1, n}&amp;lt;/math&amp;gt; (размерность пространства) и &amp;lt;math&amp;gt;j = \overline{1, m}&amp;lt;/math&amp;gt; (количество линейно-независимых векторов), при этом &amp;lt;math&amp;gt;n \leqslant m&amp;lt;/math&amp;gt;.&lt;br /&gt;
&lt;br /&gt;
&#039;&#039;&#039;Объем входных данных.&#039;&#039;&#039; &amp;lt;math&amp;gt;nm&amp;lt;/math&amp;gt;&lt;br /&gt;
&lt;br /&gt;
&#039;&#039;&#039;Выходные данные.&#039;&#039;&#039; Матрица &amp;lt;math&amp;gt;B&amp;lt;/math&amp;gt; с элементами &amp;lt;math&amp;gt;\beta_{ij}&amp;lt;/math&amp;gt;, где &amp;lt;math&amp;gt;i = \overline{1, n}&amp;lt;/math&amp;gt; и &amp;lt;math&amp;gt;j = \overline{1, m}&amp;lt;/math&amp;gt;, тогда &amp;lt;math&amp;gt;b_{i1}, \dots, b_{im}&amp;lt;/math&amp;gt; — система ортогональных векторов.&lt;br /&gt;
&lt;br /&gt;
&#039;&#039;&#039;Объем выходных данных.&#039;&#039;&#039; &amp;lt;math&amp;gt;nm&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;
=== Масштабируемость алгоритма и его реализации ===&lt;br /&gt;
&#039;&#039;Срок сдачи продлен до 15 ноября.&#039;&#039;&lt;br /&gt;
=== Динамические характеристики и эффективность реализации алгоритма ===&lt;br /&gt;
=== Выводы для классов архитектур ===&lt;br /&gt;
=== Существующие реализации алгоритма ===&lt;br /&gt;
*&lt;br /&gt;
== Литература ==&lt;/div&gt;</summary>
		<author><name>BDA</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:BDA/%D0%9E%D1%80%D1%82%D0%BE%D0%B3%D0%BE%D0%BD%D0%B0%D0%BB%D0%B8%D0%B7%D0%B0%D1%86%D0%B8%D1%8F_%D0%93%D1%80%D0%B0%D0%BC%D0%B0-%D0%A8%D0%BC%D0%B8%D0%B4%D1%82%D0%B0&amp;diff=12461</id>
		<title>Участник:BDA/Ортогонализация Грама-Шмидта</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:BDA/%D0%9E%D1%80%D1%82%D0%BE%D0%B3%D0%BE%D0%BD%D0%B0%D0%BB%D0%B8%D0%B7%D0%B0%D1%86%D0%B8%D1%8F_%D0%93%D1%80%D0%B0%D0%BC%D0%B0-%D0%A8%D0%BC%D0%B8%D0%B4%D1%82%D0%B0&amp;diff=12461"/>
		<updated>2016-10-16T10:49:23Z</updated>

		<summary type="html">&lt;p&gt;BDA: /* Свойства и структура алгоритма */&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(nm^2)&amp;lt;/math&amp;gt;&lt;br /&gt;
| pf_height         = &amp;lt;math&amp;gt;?&amp;lt;/math&amp;gt;&lt;br /&gt;
| pf_width          = &amp;lt;math&amp;gt;?&amp;lt;/math&amp;gt;&lt;br /&gt;
| input_data        = &amp;lt;math&amp;gt;nm&amp;lt;/math&amp;gt;&lt;br /&gt;
| output_data       = &amp;lt;math&amp;gt;nm&amp;lt;/math&amp;gt;&lt;br /&gt;
}}&lt;br /&gt;
&lt;br /&gt;
Основные авторы описания: [[Участник:Zodiac|Белов Н. А.]], [[Участник:BDA|Богомолов Д. А.]].&lt;br /&gt;
&lt;br /&gt;
== Свойства и структура алгоритма ==&lt;br /&gt;
=== Общее описание алгоритма ===&lt;br /&gt;
&lt;br /&gt;
Ортогонализация ― алгоритм построения для данной линейно независимой системы векторов евклидова или эрмитова пространства V ортогональной системы ненулевых векторов, порождающих то же самое подпространство в V.&lt;br /&gt;
&lt;br /&gt;
Ортогонализация Грама–Шмидта&amp;lt;ref&amp;gt;Канатников А.Н., Крищенко А.П. &amp;quot;Линейная алгебра.&amp;quot; ― 3-е изд., стер. ― М.: Изд-во МГТУ им. Н.Э. Баумана, 2002&amp;lt;/ref&amp;gt; (процесс Грама–Шмидта) ― наиболее известный алгоритм ортогонализации. Назван в честь Йоргена Педерсена Грама&amp;lt;ref&amp;gt;O&#039;Connor, John J.; Robertson, Edmund F., &amp;quot;Jørgen Pedersen Gram&amp;quot;, MacTutor History of Mathematics archive, University of St Andrews.&amp;lt;/ref&amp;gt; и Эрхарда Шмидта&amp;lt;ref&amp;gt;O&#039;Connor, John J.; Robertson, Edmund F., &amp;quot;Erhard Schmidt&amp;quot;, MacTutor History of Mathematics archive, University of St Andrews.&amp;lt;/ref&amp;gt;, однако ранее уже появлялся в работах Лапласа и Коши. Является частным случаем разложения Ивасавы, так как может быть представлен как разложение невырожденной квадратной матрицы в произведение ортогональной (или унитарной матрицы в случае эрмитова пространства) и верхнетреугольной матрицы с положительными диагональными элементами.&lt;br /&gt;
&lt;br /&gt;
Рассматриваемый алгоритм применяется для борьбы с помехами в адаптивной системе селекции движущихся целей&amp;lt;ref&amp;gt;Орешкин Б.Н., Бакулев П.А. &amp;quot;Быстрая процедура ортогонализации Грамма – Шмидта и ее применение для борьбы с помехами в адаптивной системе селекции движущихся целей&amp;quot; ― Радиотехника / №12 за 2007 г.&amp;lt;/ref&amp;gt;, в протоколах безопасности&amp;lt;ref&amp;gt;Пискова А.В., Менщиков А.А., Коробейников А.Г. &amp;quot;Использование ортогонализации Грама-Шмидта в алгоритме приведения базиса решетки для протоколов безопасности&amp;quot;&amp;lt;/ref&amp;gt;, для повышения экономичности алгоритмов оценивания параметров моделей объектов управления&amp;lt;ref&amp;gt;Карелин А.Е., Светлаков А.А. &amp;quot;Использование ортогонализации Грама-Шмидта для повышения экономичности многоточечных алгоритмов рекуррентного оценивания параметров моделей объектов управления&amp;quot; ― Известия Томского политехнического университета [Известия ТПУ]. — 2006. — Т. 309, № 8. — [С. 15-19].&amp;lt;/ref&amp;gt; и в других областях.&lt;br /&gt;
&lt;br /&gt;
=== Математическое описание алгоритма ===&lt;br /&gt;
*&lt;br /&gt;
=== Вычислительное ядро алгоритма ===&lt;br /&gt;
Основное время работы алгоритма приходится на вычисление сумм &amp;lt;math&amp;gt;\sum_{i=1}^{j-1} \mathbf{proj}_{\mathbf{b}_i} \mathbf{a}_i \forall j: j=\overline{1, m}&amp;lt;/math&amp;gt;.&lt;br /&gt;
&lt;br /&gt;
=== Макроструктура алгоритма ===&lt;br /&gt;
Из описания алгоритма в предыдущих разделов следует, что основную часть данного метода составляют операции вычисления проекций векторов, а также их сумм.&lt;br /&gt;
&lt;br /&gt;
=== Схема реализации последовательного алгоритма ===&lt;br /&gt;
*&lt;br /&gt;
=== Последовательная сложность алгоритма ===&lt;br /&gt;
Рассмотрим &amp;lt;math&amp;gt;n&amp;lt;/math&amp;gt; векторов длины &amp;lt;math&amp;gt;m&amp;lt;/math&amp;gt;.&lt;br /&gt;
&lt;br /&gt;
# Скалярное произведение векторов требует &amp;lt;math&amp;gt;n - 1&amp;lt;/math&amp;gt; сложение и &amp;lt;math&amp;gt;n&amp;lt;/math&amp;gt; произведений.&lt;br /&gt;
# Нормализация вектора требует 1 скалярного произведения, 1 вычисления квадратного корня и &amp;lt;math&amp;gt;n&amp;lt;/math&amp;gt; делений, то есть:&lt;br /&gt;
## &amp;lt;math&amp;gt;n-1&amp;lt;/math&amp;gt; (&amp;lt;math&amp;gt;+&amp;lt;/math&amp;gt;);&lt;br /&gt;
## &amp;lt;math&amp;gt;n&amp;lt;/math&amp;gt; (&amp;lt;math&amp;gt;\times&amp;lt;/math&amp;gt;);&lt;br /&gt;
## &amp;lt;math&amp;gt;n&amp;lt;/math&amp;gt; (&amp;lt;math&amp;gt;\div&amp;lt;/math&amp;gt;);&lt;br /&gt;
## &amp;lt;math&amp;gt;1&amp;lt;/math&amp;gt; (&amp;lt;math&amp;gt;\sqrt{}&amp;lt;/math&amp;gt;).&lt;br /&gt;
# Вычитание проекции вектора требует 1 скалярного произведения, &amp;lt;math&amp;gt;n&amp;lt;/math&amp;gt; сложений и &amp;lt;math&amp;gt;n&amp;lt;/math&amp;gt; умножений, то есть:&lt;br /&gt;
## &amp;lt;math&amp;gt;2n-1&amp;lt;/math&amp;gt; (&amp;lt;math&amp;gt;+&amp;lt;/math&amp;gt;);&lt;br /&gt;
## &amp;lt;math&amp;gt;2n&amp;lt;/math&amp;gt; (&amp;lt;math&amp;gt;\times&amp;lt;/math&amp;gt;).&lt;br /&gt;
# Вычисление &amp;lt;math&amp;gt;i&amp;lt;/math&amp;gt;-го вектора требует &amp;lt;math&amp;gt;i-1&amp;lt;/math&amp;gt; вычитаний проекций с нормализацией, то есть:&lt;br /&gt;
## &amp;lt;math&amp;gt;(2n-1)(i-1)+n-1&amp;lt;/math&amp;gt; (&amp;lt;math&amp;gt;+&amp;lt;/math&amp;gt;);&lt;br /&gt;
## &amp;lt;math&amp;gt;2n(i-1)+n&amp;lt;/math&amp;gt; (&amp;lt;math&amp;gt;\times&amp;lt;/math&amp;gt;);&lt;br /&gt;
## &amp;lt;math&amp;gt;n&amp;lt;/math&amp;gt; (&amp;lt;math&amp;gt;\div&amp;lt;/math&amp;gt;);&lt;br /&gt;
## &amp;lt;math&amp;gt;1&amp;lt;/math&amp;gt; (&amp;lt;math&amp;gt;\sqrt{}&amp;lt;/math&amp;gt;).&lt;br /&gt;
# Мы вычисляем вектора от &amp;lt;math&amp;gt;i=1&amp;lt;/math&amp;gt; до &amp;lt;math&amp;gt;m&amp;lt;/math&amp;gt;, поэтому &amp;lt;math&amp;gt;i-1&amp;lt;/math&amp;gt; множителей выражаются &#039;&#039;треугольным числом&#039;&#039; &amp;lt;math&amp;gt;(m-1)\frac{m}{2}&amp;lt;/math&amp;gt;, а элементы независимых &amp;lt;math&amp;gt;i&amp;lt;/math&amp;gt; умножаются на &amp;lt;math&amp;gt;m&amp;lt;/math&amp;gt;.&lt;br /&gt;
## &amp;lt;math&amp;gt;(2n-1)(m-1)\frac{m}{2}+(n-1)m&amp;lt;/math&amp;gt; (&amp;lt;math&amp;gt;+&amp;lt;/math&amp;gt;);&lt;br /&gt;
## &amp;lt;math&amp;gt;2n(m-1)\frac{m}{2}+nm&amp;lt;/math&amp;gt; (&amp;lt;math&amp;gt;\times&amp;lt;/math&amp;gt;);&lt;br /&gt;
## &amp;lt;math&amp;gt;nm&amp;lt;/math&amp;gt; (&amp;lt;math&amp;gt;\div&amp;lt;/math&amp;gt;);&lt;br /&gt;
## &amp;lt;math&amp;gt;m&amp;lt;/math&amp;gt; (&amp;lt;math&amp;gt;\sqrt{}&amp;lt;/math&amp;gt;).&lt;br /&gt;
# В скалярном произведении &amp;lt;math&amp;gt;n&amp;lt;/math&amp;gt; делений могут быть рассмотрены как &amp;lt;math&amp;gt;n&amp;lt;/math&amp;gt; умножений:&lt;br /&gt;
## &amp;lt;math&amp;gt;(2n-1)(m-1)\frac{m}{2}+(n-1)m&amp;lt;/math&amp;gt; (&amp;lt;math&amp;gt;+&amp;lt;/math&amp;gt;);&lt;br /&gt;
## &amp;lt;math&amp;gt;2n(m-1)\frac{m}{2}+2nm&amp;lt;/math&amp;gt; (&amp;lt;math&amp;gt;\times&amp;lt;/math&amp;gt;);&lt;br /&gt;
## &amp;lt;math&amp;gt;m&amp;lt;/math&amp;gt; (&amp;lt;math&amp;gt;\div&amp;lt;/math&amp;gt;);&lt;br /&gt;
## &amp;lt;math&amp;gt;m&amp;lt;/math&amp;gt; (&amp;lt;math&amp;gt;\sqrt{}&amp;lt;/math&amp;gt;).&lt;br /&gt;
&lt;br /&gt;
Таким образом, требуется &amp;lt;math&amp;gt;2nm^2&amp;lt;/math&amp;gt; операций. Сложность алгоритма &amp;lt;math&amp;gt;O(nm^2)&amp;lt;/math&amp;gt;.&lt;br /&gt;
&lt;br /&gt;
=== Информационный граф ===&lt;br /&gt;
*&lt;br /&gt;
=== Ресурс параллелизма алгоритма ===&lt;br /&gt;
*&lt;br /&gt;
=== Входные и выходные данные алгоритма ===&lt;br /&gt;
&#039;&#039;&#039;Входные данные.&#039;&#039;&#039; Матрица &amp;lt;math&amp;gt;A&amp;lt;/math&amp;gt; с элементами &amp;lt;math&amp;gt;\alpha_{ij}&amp;lt;/math&amp;gt;, где &amp;lt;math&amp;gt;i = \overline{1, n}&amp;lt;/math&amp;gt; (размерность пространства) и &amp;lt;math&amp;gt;j = \overline{1, m}&amp;lt;/math&amp;gt; (количество линейно-независимых векторов), при этом &amp;lt;math&amp;gt;n \leqslant m&amp;lt;/math&amp;gt;.&lt;br /&gt;
&lt;br /&gt;
&#039;&#039;&#039;Объем входных данных.&#039;&#039;&#039; &amp;lt;math&amp;gt;nm&amp;lt;/math&amp;gt;&lt;br /&gt;
&lt;br /&gt;
&#039;&#039;&#039;Выходные данные.&#039;&#039;&#039; Матрица &amp;lt;math&amp;gt;B&amp;lt;/math&amp;gt; с элементами &amp;lt;math&amp;gt;\beta_{ij}&amp;lt;/math&amp;gt;, где &amp;lt;math&amp;gt;i = \overline{1, n}&amp;lt;/math&amp;gt; и &amp;lt;math&amp;gt;j = \overline{1, m}&amp;lt;/math&amp;gt;, тогда &amp;lt;math&amp;gt;b_{i1}, \dots, b_{im}&amp;lt;/math&amp;gt; — система ортогональных векторов.&lt;br /&gt;
&lt;br /&gt;
&#039;&#039;&#039;Объем выходных данных.&#039;&#039;&#039; &amp;lt;math&amp;gt;nm&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;
=== Масштабируемость алгоритма и его реализации ===&lt;br /&gt;
&#039;&#039;Срок сдачи продлен до 15 ноября.&#039;&#039;&lt;br /&gt;
=== Динамические характеристики и эффективность реализации алгоритма ===&lt;br /&gt;
=== Выводы для классов архитектур ===&lt;br /&gt;
=== Существующие реализации алгоритма ===&lt;br /&gt;
*&lt;br /&gt;
== Литература ==&lt;/div&gt;</summary>
		<author><name>BDA</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:BDA/%D0%9E%D1%80%D1%82%D0%BE%D0%B3%D0%BE%D0%BD%D0%B0%D0%BB%D0%B8%D0%B7%D0%B0%D1%86%D0%B8%D1%8F_%D0%93%D1%80%D0%B0%D0%BC%D0%B0-%D0%A8%D0%BC%D0%B8%D0%B4%D1%82%D0%B0&amp;diff=12459</id>
		<title>Участник:BDA/Ортогонализация Грама-Шмидта</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:BDA/%D0%9E%D1%80%D1%82%D0%BE%D0%B3%D0%BE%D0%BD%D0%B0%D0%BB%D0%B8%D0%B7%D0%B0%D1%86%D0%B8%D1%8F_%D0%93%D1%80%D0%B0%D0%BC%D0%B0-%D0%A8%D0%BC%D0%B8%D0%B4%D1%82%D0%B0&amp;diff=12459"/>
		<updated>2016-10-16T10:48:12Z</updated>

		<summary type="html">&lt;p&gt;BDA: &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(nm^2)&amp;lt;/math&amp;gt;&lt;br /&gt;
| pf_height         = &amp;lt;math&amp;gt;?&amp;lt;/math&amp;gt;&lt;br /&gt;
| pf_width          = &amp;lt;math&amp;gt;?&amp;lt;/math&amp;gt;&lt;br /&gt;
| input_data        = &amp;lt;math&amp;gt;nm&amp;lt;/math&amp;gt;&lt;br /&gt;
| output_data       = &amp;lt;math&amp;gt;nm&amp;lt;/math&amp;gt;&lt;br /&gt;
}}&lt;br /&gt;
&lt;br /&gt;
Основные авторы описания: [[Участник:Zodiac|Белов Н. А.]], [[Участник:BDA|Богомолов Д. А.]].&lt;br /&gt;
&lt;br /&gt;
== Свойства и структура алгоритма ==&lt;br /&gt;
=== Общее описание алгоритма ===&lt;br /&gt;
&lt;br /&gt;
Ортогонализация ― алгоритм построения для данной линейно независимой системы векторов евклидова или эрмитова пространства V ортогональной системы ненулевых векторов, порождающих то же самое подпространство в V.&lt;br /&gt;
&lt;br /&gt;
Ортогонализация Грама–Шмидта&amp;lt;ref&amp;gt;Канатников А.Н., Крищенко А.П. &amp;quot;Линейная алгебра.&amp;quot; ― 3-е изд., стер. ― М.: Изд-во МГТУ им. Н.Э. Баумана, 2002&amp;lt;/ref&amp;gt; (процесс Грама–Шмидта) ― наиболее известный алгоритм ортогонализации. Назван в честь Йоргена Педерсена Грама&amp;lt;ref&amp;gt;O&#039;Connor, John J.; Robertson, Edmund F., &amp;quot;Jørgen Pedersen Gram&amp;quot;, MacTutor History of Mathematics archive, University of St Andrews.&amp;lt;/ref&amp;gt; и Эрхарда Шмидта&amp;lt;ref&amp;gt;O&#039;Connor, John J.; Robertson, Edmund F., &amp;quot;Erhard Schmidt&amp;quot;, MacTutor History of Mathematics archive, University of St Andrews.&amp;lt;/ref&amp;gt;, однако ранее уже появлялся в работах Лапласа и Коши. Является частным случаем разложения Ивасавы, так как может быть представлен как разложение невырожденной квадратной матрицы в произведение ортогональной (или унитарной матрицы в случае эрмитова пространства) и верхнетреугольной матрицы с положительными диагональными элементами.&lt;br /&gt;
&lt;br /&gt;
Рассматриваемый алгоритм применяется для борьбы с помехами в адаптивной системе селекции движущихся целей&amp;lt;ref&amp;gt;Орешкин Б.Н., Бакулев П.А. &amp;quot;Быстрая процедура ортогонализации Грамма – Шмидта и ее применение для борьбы с помехами в адаптивной системе селекции движущихся целей&amp;quot; ― Радиотехника / №12 за 2007 г.&amp;lt;/ref&amp;gt;, в протоколах безопасности&amp;lt;ref&amp;gt;Пискова А.В., Менщиков А.А., Коробейников А.Г &amp;quot;Использование ортогонализации Грама-Шмидта в алгоритме приведения базиса решетки для протоколов безопасности&amp;quot;&amp;lt;/ref&amp;gt;, для повышения экономичности алгоритмов оценивания параметров моделей объектов управления&amp;lt;ref&amp;gt;А.Е. Карелин, А.А. Светлаков &amp;quot;Использование ортогонализации Грама-Шмидта для повышения экономичности многоточечных алгоритмов рекуррентного оценивания параметров моделей объектов управления&amp;quot; ― Известия Томского политехнического университета [Известия ТПУ]. — 2006. — Т. 309, № 8. — [С. 15-19].&amp;lt;/ref&amp;gt; и в других областях.&lt;br /&gt;
&lt;br /&gt;
=== Математическое описание алгоритма ===&lt;br /&gt;
*&lt;br /&gt;
=== Вычислительное ядро алгоритма ===&lt;br /&gt;
Основное время работы алгоритма приходится на вычисление сумм &amp;lt;math&amp;gt;\sum_{i=1}^{j-1} \mathbf{proj}_{\mathbf{b}_i} \mathbf{a}_i \forall j: j=\overline{1, m}&amp;lt;/math&amp;gt;.&lt;br /&gt;
&lt;br /&gt;
=== Макроструктура алгоритма ===&lt;br /&gt;
Из описания алгоритма в предыдущих разделов следует, что основную часть данного метода составляют операции вычисления проекций векторов, а также их сумм.&lt;br /&gt;
&lt;br /&gt;
=== Схема реализации последовательного алгоритма ===&lt;br /&gt;
*&lt;br /&gt;
=== Последовательная сложность алгоритма ===&lt;br /&gt;
Рассмотрим &amp;lt;math&amp;gt;n&amp;lt;/math&amp;gt; векторов длины &amp;lt;math&amp;gt;m&amp;lt;/math&amp;gt;.&lt;br /&gt;
&lt;br /&gt;
# Скалярное произведение векторов требует &amp;lt;math&amp;gt;n - 1&amp;lt;/math&amp;gt; сложение и &amp;lt;math&amp;gt;n&amp;lt;/math&amp;gt; произведений.&lt;br /&gt;
# Нормализация вектора требует 1 скалярного произведения, 1 вычисления квадратного корня и &amp;lt;math&amp;gt;n&amp;lt;/math&amp;gt; делений, то есть:&lt;br /&gt;
## &amp;lt;math&amp;gt;n-1&amp;lt;/math&amp;gt; (&amp;lt;math&amp;gt;+&amp;lt;/math&amp;gt;);&lt;br /&gt;
## &amp;lt;math&amp;gt;n&amp;lt;/math&amp;gt; (&amp;lt;math&amp;gt;\times&amp;lt;/math&amp;gt;);&lt;br /&gt;
## &amp;lt;math&amp;gt;n&amp;lt;/math&amp;gt; (&amp;lt;math&amp;gt;\div&amp;lt;/math&amp;gt;);&lt;br /&gt;
## &amp;lt;math&amp;gt;1&amp;lt;/math&amp;gt; (&amp;lt;math&amp;gt;\sqrt{}&amp;lt;/math&amp;gt;).&lt;br /&gt;
# Вычитание проекции вектора требует 1 скалярного произведения, &amp;lt;math&amp;gt;n&amp;lt;/math&amp;gt; сложений и &amp;lt;math&amp;gt;n&amp;lt;/math&amp;gt; умножений, то есть:&lt;br /&gt;
## &amp;lt;math&amp;gt;2n-1&amp;lt;/math&amp;gt; (&amp;lt;math&amp;gt;+&amp;lt;/math&amp;gt;);&lt;br /&gt;
## &amp;lt;math&amp;gt;2n&amp;lt;/math&amp;gt; (&amp;lt;math&amp;gt;\times&amp;lt;/math&amp;gt;).&lt;br /&gt;
# Вычисление &amp;lt;math&amp;gt;i&amp;lt;/math&amp;gt;-го вектора требует &amp;lt;math&amp;gt;i-1&amp;lt;/math&amp;gt; вычитаний проекций с нормализацией, то есть:&lt;br /&gt;
## &amp;lt;math&amp;gt;(2n-1)(i-1)+n-1&amp;lt;/math&amp;gt; (&amp;lt;math&amp;gt;+&amp;lt;/math&amp;gt;);&lt;br /&gt;
## &amp;lt;math&amp;gt;2n(i-1)+n&amp;lt;/math&amp;gt; (&amp;lt;math&amp;gt;\times&amp;lt;/math&amp;gt;);&lt;br /&gt;
## &amp;lt;math&amp;gt;n&amp;lt;/math&amp;gt; (&amp;lt;math&amp;gt;\div&amp;lt;/math&amp;gt;);&lt;br /&gt;
## &amp;lt;math&amp;gt;1&amp;lt;/math&amp;gt; (&amp;lt;math&amp;gt;\sqrt{}&amp;lt;/math&amp;gt;).&lt;br /&gt;
# Мы вычисляем вектора от &amp;lt;math&amp;gt;i=1&amp;lt;/math&amp;gt; до &amp;lt;math&amp;gt;m&amp;lt;/math&amp;gt;, поэтому &amp;lt;math&amp;gt;i-1&amp;lt;/math&amp;gt; множителей выражаются &#039;&#039;треугольным числом&#039;&#039; &amp;lt;math&amp;gt;(m-1)\frac{m}{2}&amp;lt;/math&amp;gt;, а элементы независимых &amp;lt;math&amp;gt;i&amp;lt;/math&amp;gt; умножаются на &amp;lt;math&amp;gt;m&amp;lt;/math&amp;gt;.&lt;br /&gt;
## &amp;lt;math&amp;gt;(2n-1)(m-1)\frac{m}{2}+(n-1)m&amp;lt;/math&amp;gt; (&amp;lt;math&amp;gt;+&amp;lt;/math&amp;gt;);&lt;br /&gt;
## &amp;lt;math&amp;gt;2n(m-1)\frac{m}{2}+nm&amp;lt;/math&amp;gt; (&amp;lt;math&amp;gt;\times&amp;lt;/math&amp;gt;);&lt;br /&gt;
## &amp;lt;math&amp;gt;nm&amp;lt;/math&amp;gt; (&amp;lt;math&amp;gt;\div&amp;lt;/math&amp;gt;);&lt;br /&gt;
## &amp;lt;math&amp;gt;m&amp;lt;/math&amp;gt; (&amp;lt;math&amp;gt;\sqrt{}&amp;lt;/math&amp;gt;).&lt;br /&gt;
# В скалярном произведении &amp;lt;math&amp;gt;n&amp;lt;/math&amp;gt; делений могут быть рассмотрены как &amp;lt;math&amp;gt;n&amp;lt;/math&amp;gt; умножений:&lt;br /&gt;
## &amp;lt;math&amp;gt;(2n-1)(m-1)\frac{m}{2}+(n-1)m&amp;lt;/math&amp;gt; (&amp;lt;math&amp;gt;+&amp;lt;/math&amp;gt;);&lt;br /&gt;
## &amp;lt;math&amp;gt;2n(m-1)\frac{m}{2}+2nm&amp;lt;/math&amp;gt; (&amp;lt;math&amp;gt;\times&amp;lt;/math&amp;gt;);&lt;br /&gt;
## &amp;lt;math&amp;gt;m&amp;lt;/math&amp;gt; (&amp;lt;math&amp;gt;\div&amp;lt;/math&amp;gt;);&lt;br /&gt;
## &amp;lt;math&amp;gt;m&amp;lt;/math&amp;gt; (&amp;lt;math&amp;gt;\sqrt{}&amp;lt;/math&amp;gt;).&lt;br /&gt;
&lt;br /&gt;
Таким образом, требуется &amp;lt;math&amp;gt;2nm^2&amp;lt;/math&amp;gt; операций. Сложность алгоритма &amp;lt;math&amp;gt;O(nm^2)&amp;lt;/math&amp;gt;.&lt;br /&gt;
&lt;br /&gt;
=== Информационный граф ===&lt;br /&gt;
*&lt;br /&gt;
=== Ресурс параллелизма алгоритма ===&lt;br /&gt;
*&lt;br /&gt;
=== Входные и выходные данные алгоритма ===&lt;br /&gt;
&#039;&#039;&#039;Входные данные.&#039;&#039;&#039; Матрица &amp;lt;math&amp;gt;A&amp;lt;/math&amp;gt; с элементами &amp;lt;math&amp;gt;\alpha_{ij}&amp;lt;/math&amp;gt;, где &amp;lt;math&amp;gt;i = \overline{1, n}&amp;lt;/math&amp;gt; (размерность пространства) и &amp;lt;math&amp;gt;j = \overline{1, m}&amp;lt;/math&amp;gt; (количество линейно-независимых векторов), при этом &amp;lt;math&amp;gt;n \leqslant m&amp;lt;/math&amp;gt;.&lt;br /&gt;
&lt;br /&gt;
&#039;&#039;&#039;Объем входных данных.&#039;&#039;&#039; &amp;lt;math&amp;gt;nm&amp;lt;/math&amp;gt;&lt;br /&gt;
&lt;br /&gt;
&#039;&#039;&#039;Выходные данные.&#039;&#039;&#039; Матрица &amp;lt;math&amp;gt;B&amp;lt;/math&amp;gt; с элементами &amp;lt;math&amp;gt;\beta_{ij}&amp;lt;/math&amp;gt;, где &amp;lt;math&amp;gt;i = \overline{1, n}&amp;lt;/math&amp;gt; и &amp;lt;math&amp;gt;j = \overline{1, m}&amp;lt;/math&amp;gt;, тогда &amp;lt;math&amp;gt;b_{i1}, \dots, b_{im}&amp;lt;/math&amp;gt; — система ортогональных векторов.&lt;br /&gt;
&lt;br /&gt;
&#039;&#039;&#039;Объем выходных данных.&#039;&#039;&#039; &amp;lt;math&amp;gt;nm&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;Срок сдачи продлен до 15 ноября.&#039;&#039;&lt;br /&gt;
=== Динамические характеристики и эффективность реализации алгоритма ===&lt;br /&gt;
=== Выводы для классов архитектур ===&lt;br /&gt;
=== Существующие реализации алгоритма ===&lt;br /&gt;
*&lt;br /&gt;
== Литература ==&lt;/div&gt;</summary>
		<author><name>BDA</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:BDA/%D0%9E%D1%80%D1%82%D0%BE%D0%B3%D0%BE%D0%BD%D0%B0%D0%BB%D0%B8%D0%B7%D0%B0%D1%86%D0%B8%D1%8F_%D0%93%D1%80%D0%B0%D0%BC%D0%B0-%D0%A8%D0%BC%D0%B8%D0%B4%D1%82%D0%B0&amp;diff=12453</id>
		<title>Участник:BDA/Ортогонализация Грама-Шмидта</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:BDA/%D0%9E%D1%80%D1%82%D0%BE%D0%B3%D0%BE%D0%BD%D0%B0%D0%BB%D0%B8%D0%B7%D0%B0%D1%86%D0%B8%D1%8F_%D0%93%D1%80%D0%B0%D0%BC%D0%B0-%D0%A8%D0%BC%D0%B8%D0%B4%D1%82%D0%B0&amp;diff=12453"/>
		<updated>2016-10-16T10:33:19Z</updated>

		<summary type="html">&lt;p&gt;BDA: &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(nm^2)&amp;lt;/math&amp;gt;&lt;br /&gt;
| pf_height         = &amp;lt;math&amp;gt;?&amp;lt;/math&amp;gt;&lt;br /&gt;
| pf_width          = &amp;lt;math&amp;gt;?&amp;lt;/math&amp;gt;&lt;br /&gt;
| input_data        = &amp;lt;math&amp;gt;nm&amp;lt;/math&amp;gt;&lt;br /&gt;
| output_data       = &amp;lt;math&amp;gt;nm&amp;lt;/math&amp;gt;&lt;br /&gt;
}}&lt;br /&gt;
&lt;br /&gt;
Основные авторы описания: [[Участник:Zodiac|Белов Н. А.]], [[Участник:BDA|Богомолов Д. А.]].&lt;br /&gt;
&lt;br /&gt;
== Свойства и структура алгоритма ==&lt;br /&gt;
=== Общее описание алгоритма ===&lt;br /&gt;
&lt;br /&gt;
Ортогонализация ― алгоритм построения для данной линейно независимой системы векторов евклидова или эрмитова пространства V ортогональной системы ненулевых векторов, порождающих то же самое подпространство в V.&lt;br /&gt;
&lt;br /&gt;
Ортогонализация Грама–Шмидта (процесс Грама–Шмидта) ― наиболее известный алгоритм ортогонализации. Назван в честь Йоргена Педерсена Грама&amp;lt;ref&amp;gt;O&#039;Connor, John J.; Robertson, Edmund F., &amp;quot;Jørgen Pedersen Gram&amp;quot;, MacTutor History of Mathematics archive, University of St Andrews.&amp;lt;/ref&amp;gt; и Эрхарда Шмидта&amp;lt;ref&amp;gt;O&#039;Connor, John J.; Robertson, Edmund F., &amp;quot;Erhard Schmidt&amp;quot;, MacTutor History of Mathematics archive, University of St Andrews.&amp;lt;/ref&amp;gt;, однако ранее уже появлялся в работах Лапласа и Коши. Является частным случаем разложения Ивасавы, так как может быть представлен как разложение невырожденной квадратной матрицы в произведение ортогональной (или унитарной матрицы в случае эрмитова пространства) и верхнетреугольной матрицы с положительными диагональными элементами.&lt;br /&gt;
&lt;br /&gt;
=== Математическое описание алгоритма ===&lt;br /&gt;
*&lt;br /&gt;
=== Вычислительное ядро алгоритма ===&lt;br /&gt;
Основное время работы алгоритма приходится на вычисление сумм &amp;lt;math&amp;gt;\sum_{i=1}^{j-1} \mathbf{proj}_{\mathbf{b}_i} \mathbf{a}_i \forall j: j=\overline{1, m}&amp;lt;/math&amp;gt;.&lt;br /&gt;
&lt;br /&gt;
=== Макроструктура алгоритма ===&lt;br /&gt;
Из описания алгоритма в предыдущих разделов следует, что основную часть данного метода составляют операции вычисления проекций векторов, а также их сумм.&lt;br /&gt;
&lt;br /&gt;
=== Схема реализации последовательного алгоритма ===&lt;br /&gt;
*&lt;br /&gt;
=== Последовательная сложность алгоритма ===&lt;br /&gt;
Рассмотрим &amp;lt;math&amp;gt;n&amp;lt;/math&amp;gt; векторов длины &amp;lt;math&amp;gt;m&amp;lt;/math&amp;gt;.&lt;br /&gt;
&lt;br /&gt;
# Скалярное произведение векторов требует &amp;lt;math&amp;gt;n - 1&amp;lt;/math&amp;gt; сложение и &amp;lt;math&amp;gt;n&amp;lt;/math&amp;gt; произведений.&lt;br /&gt;
# Нормализация вектора требует 1 скалярного произведения, 1 вычисления квадратного корня и &amp;lt;math&amp;gt;n&amp;lt;/math&amp;gt; делений, то есть:&lt;br /&gt;
## &amp;lt;math&amp;gt;n-1&amp;lt;/math&amp;gt; (&amp;lt;math&amp;gt;+&amp;lt;/math&amp;gt;);&lt;br /&gt;
## &amp;lt;math&amp;gt;n&amp;lt;/math&amp;gt; (&amp;lt;math&amp;gt;\times&amp;lt;/math&amp;gt;);&lt;br /&gt;
## &amp;lt;math&amp;gt;n&amp;lt;/math&amp;gt; (&amp;lt;math&amp;gt;\div&amp;lt;/math&amp;gt;);&lt;br /&gt;
## &amp;lt;math&amp;gt;1&amp;lt;/math&amp;gt; (&amp;lt;math&amp;gt;\sqrt{}&amp;lt;/math&amp;gt;).&lt;br /&gt;
# Вычитание проекции вектора требует 1 скалярного произведения, &amp;lt;math&amp;gt;n&amp;lt;/math&amp;gt; сложений и &amp;lt;math&amp;gt;n&amp;lt;/math&amp;gt; умножений, то есть:&lt;br /&gt;
## &amp;lt;math&amp;gt;2n-1&amp;lt;/math&amp;gt; (&amp;lt;math&amp;gt;+&amp;lt;/math&amp;gt;);&lt;br /&gt;
## &amp;lt;math&amp;gt;2n&amp;lt;/math&amp;gt; (&amp;lt;math&amp;gt;\times&amp;lt;/math&amp;gt;).&lt;br /&gt;
# Вычисление &amp;lt;math&amp;gt;i&amp;lt;/math&amp;gt;-го вектора требует &amp;lt;math&amp;gt;i-1&amp;lt;/math&amp;gt; вычитаний проекций с нормализацией, то есть:&lt;br /&gt;
## &amp;lt;math&amp;gt;(2n-1)(i-1)+n-1&amp;lt;/math&amp;gt; (&amp;lt;math&amp;gt;+&amp;lt;/math&amp;gt;);&lt;br /&gt;
## &amp;lt;math&amp;gt;2n(i-1)+n&amp;lt;/math&amp;gt; (&amp;lt;math&amp;gt;\times&amp;lt;/math&amp;gt;);&lt;br /&gt;
## &amp;lt;math&amp;gt;n&amp;lt;/math&amp;gt; (&amp;lt;math&amp;gt;\div&amp;lt;/math&amp;gt;);&lt;br /&gt;
## &amp;lt;math&amp;gt;1&amp;lt;/math&amp;gt; (&amp;lt;math&amp;gt;\sqrt{}&amp;lt;/math&amp;gt;).&lt;br /&gt;
# Мы вычисляем вектора от &amp;lt;math&amp;gt;i=1&amp;lt;/math&amp;gt; до &amp;lt;math&amp;gt;m&amp;lt;/math&amp;gt;, поэтому &amp;lt;math&amp;gt;i-1&amp;lt;/math&amp;gt; множителей выражаются &#039;&#039;треугольным числом&#039;&#039; &amp;lt;math&amp;gt;(m-1)\frac{m}{2}&amp;lt;/math&amp;gt;, а элементы независимых &amp;lt;math&amp;gt;i&amp;lt;/math&amp;gt; умножаются на &amp;lt;math&amp;gt;m&amp;lt;/math&amp;gt;.&lt;br /&gt;
## &amp;lt;math&amp;gt;(2n-1)(m-1)\frac{m}{2}+(n-1)m&amp;lt;/math&amp;gt; (&amp;lt;math&amp;gt;+&amp;lt;/math&amp;gt;);&lt;br /&gt;
## &amp;lt;math&amp;gt;2n(m-1)\frac{m}{2}+nm&amp;lt;/math&amp;gt; (&amp;lt;math&amp;gt;\times&amp;lt;/math&amp;gt;);&lt;br /&gt;
## &amp;lt;math&amp;gt;nm&amp;lt;/math&amp;gt; (&amp;lt;math&amp;gt;\div&amp;lt;/math&amp;gt;);&lt;br /&gt;
## &amp;lt;math&amp;gt;m&amp;lt;/math&amp;gt; (&amp;lt;math&amp;gt;\sqrt{}&amp;lt;/math&amp;gt;).&lt;br /&gt;
# В скалярном произведении &amp;lt;math&amp;gt;n&amp;lt;/math&amp;gt; делений могут быть рассмотрены как &amp;lt;math&amp;gt;n&amp;lt;/math&amp;gt; умножений:&lt;br /&gt;
## &amp;lt;math&amp;gt;(2n-1)(m-1)\frac{m}{2}+(n-1)m&amp;lt;/math&amp;gt; (&amp;lt;math&amp;gt;+&amp;lt;/math&amp;gt;);&lt;br /&gt;
## &amp;lt;math&amp;gt;2n(m-1)\frac{m}{2}+2nm&amp;lt;/math&amp;gt; (&amp;lt;math&amp;gt;\times&amp;lt;/math&amp;gt;);&lt;br /&gt;
## &amp;lt;math&amp;gt;m&amp;lt;/math&amp;gt; (&amp;lt;math&amp;gt;\div&amp;lt;/math&amp;gt;);&lt;br /&gt;
## &amp;lt;math&amp;gt;m&amp;lt;/math&amp;gt; (&amp;lt;math&amp;gt;\sqrt{}&amp;lt;/math&amp;gt;).&lt;br /&gt;
&lt;br /&gt;
Таким образом, требуется &amp;lt;math&amp;gt;2nm^2&amp;lt;/math&amp;gt; операций. Сложность алгоритма &amp;lt;math&amp;gt;O(nm^2)&amp;lt;/math&amp;gt;.&lt;br /&gt;
&lt;br /&gt;
=== Информационный граф ===&lt;br /&gt;
*&lt;br /&gt;
=== Ресурс параллелизма алгоритма ===&lt;br /&gt;
*&lt;br /&gt;
=== Входные и выходные данные алгоритма ===&lt;br /&gt;
&#039;&#039;&#039;Входные данные.&#039;&#039;&#039; Матрица &amp;lt;math&amp;gt;A&amp;lt;/math&amp;gt; с элементами &amp;lt;math&amp;gt;\alpha_{ij}&amp;lt;/math&amp;gt;, где &amp;lt;math&amp;gt;i = \overline{1, n}&amp;lt;/math&amp;gt; (размерность пространства) и &amp;lt;math&amp;gt;j = \overline{1, m}&amp;lt;/math&amp;gt; (количество линейно-независимых векторов), при этом &amp;lt;math&amp;gt;n \leqslant m&amp;lt;/math&amp;gt;.&lt;br /&gt;
&lt;br /&gt;
&#039;&#039;&#039;Объем входных данных.&#039;&#039;&#039; &amp;lt;math&amp;gt;nm&amp;lt;/math&amp;gt;&lt;br /&gt;
&lt;br /&gt;
&#039;&#039;&#039;Выходные данные.&#039;&#039;&#039; Матрица &amp;lt;math&amp;gt;B&amp;lt;/math&amp;gt; с элементами &amp;lt;math&amp;gt;\beta_{ij}&amp;lt;/math&amp;gt;, где &amp;lt;math&amp;gt;i = \overline{1, n}&amp;lt;/math&amp;gt; и &amp;lt;math&amp;gt;j = \overline{1, m}&amp;lt;/math&amp;gt;, тогда &amp;lt;math&amp;gt;b_{i1}, \dots, b_{im}&amp;lt;/math&amp;gt; — система ортогональных векторов.&lt;br /&gt;
&lt;br /&gt;
&#039;&#039;&#039;Объем выходных данных.&#039;&#039;&#039; &amp;lt;math&amp;gt;nm&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;Срок сдачи продлен до 15 ноября.&#039;&#039;&lt;br /&gt;
=== Динамические характеристики и эффективность реализации алгоритма ===&lt;br /&gt;
=== Выводы для классов архитектур ===&lt;br /&gt;
=== Существующие реализации алгоритма ===&lt;br /&gt;
*&lt;br /&gt;
== Литература ==&lt;/div&gt;</summary>
		<author><name>BDA</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:BDA/%D0%9E%D1%80%D1%82%D0%BE%D0%B3%D0%BE%D0%BD%D0%B0%D0%BB%D0%B8%D0%B7%D0%B0%D1%86%D0%B8%D1%8F_%D0%93%D1%80%D0%B0%D0%BC%D0%B0-%D0%A8%D0%BC%D0%B8%D0%B4%D1%82%D0%B0&amp;diff=12438</id>
		<title>Участник:BDA/Ортогонализация Грама-Шмидта</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:BDA/%D0%9E%D1%80%D1%82%D0%BE%D0%B3%D0%BE%D0%BD%D0%B0%D0%BB%D0%B8%D0%B7%D0%B0%D1%86%D0%B8%D1%8F_%D0%93%D1%80%D0%B0%D0%BC%D0%B0-%D0%A8%D0%BC%D0%B8%D0%B4%D1%82%D0%B0&amp;diff=12438"/>
		<updated>2016-10-16T09:58:16Z</updated>

		<summary type="html">&lt;p&gt;BDA: Общее описание алгоритма&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(nm^2)&amp;lt;/math&amp;gt;&lt;br /&gt;
| pf_height         = &amp;lt;math&amp;gt;?&amp;lt;/math&amp;gt;&lt;br /&gt;
| pf_width          = &amp;lt;math&amp;gt;?&amp;lt;/math&amp;gt;&lt;br /&gt;
| input_data        = &amp;lt;math&amp;gt;nm&amp;lt;/math&amp;gt;&lt;br /&gt;
| output_data       = &amp;lt;math&amp;gt;nm&amp;lt;/math&amp;gt;&lt;br /&gt;
}}&lt;br /&gt;
&lt;br /&gt;
Основные авторы описания: [[Участник:Zodiac|Белов Н. А.]], [[Участник:BDA|Богомолов Д. А.]].&lt;br /&gt;
&lt;br /&gt;
== Свойства и структура алгоритма ==&lt;br /&gt;
=== Общее описание алгоритма ===&lt;br /&gt;
&lt;br /&gt;
Ортогонализация ― алгоритм построения для данной линейно независимой системы векторов евклидова или эрмитова пространства V ортогональной системы ненулевых векторов, порождающих то же самое подпространство в V.&lt;br /&gt;
&lt;br /&gt;
Ортогонализация Грама–Шмидта (процесс Грама–Шмидта) ― наиболее известный алгоритм ортогонализации. Назван в честь Йоргена Педерсена Грама&amp;lt;ref&amp;gt;O&#039;Connor, John J.; Robertson, Edmund F., &amp;quot;Jørgen Pedersen Gram&amp;quot;, MacTutor History of Mathematics archive, University of St Andrews.&amp;lt;/ref&amp;gt; и Эрхарда Шмидта &amp;lt;ref&amp;gt;O&#039;Connor, John J.; Robertson, Edmund F., &amp;quot;Erhard Schmidt&amp;quot;, MacTutor History of Mathematics archive, University of St Andrews.&amp;lt;/ref&amp;gt;, однако ранее уже появлялся в работах Лапласа и Коши. Является частным случаем разложения Ивасавы, так как может быть представлен как разложение невырожденной квадратной матрицы в произведение ортогональной (или унитарной матрицы в случае эрмитова пространства) и верхнетреугольной матрицы с положительными диагональными элементами.&lt;br /&gt;
&lt;br /&gt;
=== Математическое описание алгоритма ===&lt;br /&gt;
*&lt;br /&gt;
=== Вычислительное ядро алгоритма ===&lt;br /&gt;
Основное время работы алгоритма приходится на вычисление сумм &amp;lt;math&amp;gt;\sum_{i=1}^{j-1} \mathbf{proj}_{\mathbf{b}_i} \mathbf{a}_i \forall j: j=\overline{1, m}&amp;lt;/math&amp;gt;.&lt;br /&gt;
&lt;br /&gt;
=== Макроструктура алгоритма ===&lt;br /&gt;
Из описания алгоритма в предыдущих разделов следует, что основную часть данного метода составляют операции вычисления проекций векторов, а также их сумм.&lt;br /&gt;
&lt;br /&gt;
=== Схема реализации последовательного алгоритма ===&lt;br /&gt;
*&lt;br /&gt;
=== Последовательная сложность алгоритма ===&lt;br /&gt;
Рассмотрим &amp;lt;math&amp;gt;n&amp;lt;/math&amp;gt; векторов длины &amp;lt;math&amp;gt;m&amp;lt;/math&amp;gt;.&lt;br /&gt;
&lt;br /&gt;
# Скалярное произведение векторов требует &amp;lt;math&amp;gt;n - 1&amp;lt;/math&amp;gt; сложение и &amp;lt;math&amp;gt;n&amp;lt;/math&amp;gt; произведений.&lt;br /&gt;
# Нормализация вектора требует 1 скалярного произведения, 1 вычисления квадратного корня и &amp;lt;math&amp;gt;n&amp;lt;/math&amp;gt; делений, то есть:&lt;br /&gt;
## &amp;lt;math&amp;gt;n-1&amp;lt;/math&amp;gt; (&amp;lt;math&amp;gt;+&amp;lt;/math&amp;gt;);&lt;br /&gt;
## &amp;lt;math&amp;gt;n&amp;lt;/math&amp;gt; (&amp;lt;math&amp;gt;\times&amp;lt;/math&amp;gt;);&lt;br /&gt;
## &amp;lt;math&amp;gt;n&amp;lt;/math&amp;gt; (&amp;lt;math&amp;gt;\div&amp;lt;/math&amp;gt;);&lt;br /&gt;
## &amp;lt;math&amp;gt;1&amp;lt;/math&amp;gt; (&amp;lt;math&amp;gt;\sqrt{}&amp;lt;/math&amp;gt;).&lt;br /&gt;
# Вычитание проекции вектора требует 1 скалярного произведения, &amp;lt;math&amp;gt;n&amp;lt;/math&amp;gt; сложений и &amp;lt;math&amp;gt;n&amp;lt;/math&amp;gt; умножений, то есть:&lt;br /&gt;
## &amp;lt;math&amp;gt;2n-1&amp;lt;/math&amp;gt; (&amp;lt;math&amp;gt;+&amp;lt;/math&amp;gt;);&lt;br /&gt;
## &amp;lt;math&amp;gt;2n&amp;lt;/math&amp;gt; (&amp;lt;math&amp;gt;\times&amp;lt;/math&amp;gt;).&lt;br /&gt;
# Вычисление &amp;lt;math&amp;gt;i&amp;lt;/math&amp;gt;-го вектора требует &amp;lt;math&amp;gt;i-1&amp;lt;/math&amp;gt; вычитаний проекций с нормализацией, то есть:&lt;br /&gt;
## &amp;lt;math&amp;gt;(2n-1)(i-1)+n-1&amp;lt;/math&amp;gt; (&amp;lt;math&amp;gt;+&amp;lt;/math&amp;gt;);&lt;br /&gt;
## &amp;lt;math&amp;gt;2n(i-1)+n&amp;lt;/math&amp;gt; (&amp;lt;math&amp;gt;\times&amp;lt;/math&amp;gt;);&lt;br /&gt;
## &amp;lt;math&amp;gt;n&amp;lt;/math&amp;gt; (&amp;lt;math&amp;gt;\div&amp;lt;/math&amp;gt;);&lt;br /&gt;
## &amp;lt;math&amp;gt;1&amp;lt;/math&amp;gt; (&amp;lt;math&amp;gt;\sqrt{}&amp;lt;/math&amp;gt;).&lt;br /&gt;
# Мы вычисляем вектора от &amp;lt;math&amp;gt;i=1&amp;lt;/math&amp;gt; до &amp;lt;math&amp;gt;m&amp;lt;/math&amp;gt;, поэтому &amp;lt;math&amp;gt;i-1&amp;lt;/math&amp;gt; множителей выражаются &#039;&#039;треугольным числом&#039;&#039; &amp;lt;math&amp;gt;(m-1)\frac{m}{2}&amp;lt;/math&amp;gt;, а элементы независимых &amp;lt;math&amp;gt;i&amp;lt;/math&amp;gt; умножаются на &amp;lt;math&amp;gt;m&amp;lt;/math&amp;gt;.&lt;br /&gt;
## &amp;lt;math&amp;gt;(2n-1)(m-1)\frac{m}{2}+(n-1)m&amp;lt;/math&amp;gt; (&amp;lt;math&amp;gt;+&amp;lt;/math&amp;gt;);&lt;br /&gt;
## &amp;lt;math&amp;gt;2n(m-1)\frac{m}{2}+nm&amp;lt;/math&amp;gt; (&amp;lt;math&amp;gt;\times&amp;lt;/math&amp;gt;);&lt;br /&gt;
## &amp;lt;math&amp;gt;nm&amp;lt;/math&amp;gt; (&amp;lt;math&amp;gt;\div&amp;lt;/math&amp;gt;);&lt;br /&gt;
## &amp;lt;math&amp;gt;m&amp;lt;/math&amp;gt; (&amp;lt;math&amp;gt;\sqrt{}&amp;lt;/math&amp;gt;).&lt;br /&gt;
# В скалярном произведении &amp;lt;math&amp;gt;n&amp;lt;/math&amp;gt; делений могут быть рассмотрены как &amp;lt;math&amp;gt;n&amp;lt;/math&amp;gt; умножений:&lt;br /&gt;
## &amp;lt;math&amp;gt;(2n-1)(m-1)\frac{m}{2}+(n-1)m&amp;lt;/math&amp;gt; (&amp;lt;math&amp;gt;+&amp;lt;/math&amp;gt;);&lt;br /&gt;
## &amp;lt;math&amp;gt;2n(m-1)\frac{m}{2}+2nm&amp;lt;/math&amp;gt; (&amp;lt;math&amp;gt;\times&amp;lt;/math&amp;gt;);&lt;br /&gt;
## &amp;lt;math&amp;gt;m&amp;lt;/math&amp;gt; (&amp;lt;math&amp;gt;\div&amp;lt;/math&amp;gt;);&lt;br /&gt;
## &amp;lt;math&amp;gt;m&amp;lt;/math&amp;gt; (&amp;lt;math&amp;gt;\sqrt{}&amp;lt;/math&amp;gt;).&lt;br /&gt;
&lt;br /&gt;
Таким образом, требуется &amp;lt;math&amp;gt;2nm^2&amp;lt;/math&amp;gt; операций. Сложность алгоритма &amp;lt;math&amp;gt;O(nm^2)&amp;lt;/math&amp;gt;.&lt;br /&gt;
&lt;br /&gt;
=== Информационный граф ===&lt;br /&gt;
*&lt;br /&gt;
=== Ресурс параллелизма алгоритма ===&lt;br /&gt;
*&lt;br /&gt;
=== Входные и выходные данные алгоритма ===&lt;br /&gt;
&#039;&#039;&#039;Входные данные.&#039;&#039;&#039; Матрица &amp;lt;math&amp;gt;A&amp;lt;/math&amp;gt; с элементами &amp;lt;math&amp;gt;\alpha_{ij}&amp;lt;/math&amp;gt;, где &amp;lt;math&amp;gt;i = \overline{1, n}&amp;lt;/math&amp;gt; (размерность пространства) и &amp;lt;math&amp;gt;j = \overline{1, m}&amp;lt;/math&amp;gt; (количество линейно-независимых векторов), при этом &amp;lt;math&amp;gt;n \leqslant m&amp;lt;/math&amp;gt;.&lt;br /&gt;
&lt;br /&gt;
&#039;&#039;&#039;Объем входных данных.&#039;&#039;&#039; &amp;lt;math&amp;gt;nm&amp;lt;/math&amp;gt;&lt;br /&gt;
&lt;br /&gt;
&#039;&#039;&#039;Выходные данные.&#039;&#039;&#039; Матрица &amp;lt;math&amp;gt;B&amp;lt;/math&amp;gt; с элементами &amp;lt;math&amp;gt;\beta_{ij}&amp;lt;/math&amp;gt;, где &amp;lt;math&amp;gt;i = \overline{1, n}&amp;lt;/math&amp;gt; и &amp;lt;math&amp;gt;j = \overline{1, m}&amp;lt;/math&amp;gt;, тогда &amp;lt;math&amp;gt;b_{i1}, \dots, b_{im}&amp;lt;/math&amp;gt; — система ортогональных векторов.&lt;br /&gt;
&lt;br /&gt;
&#039;&#039;&#039;Объем выходных данных.&#039;&#039;&#039; &amp;lt;math&amp;gt;nm&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;Срок сдачи продлен до 15 ноября.&#039;&#039;&lt;br /&gt;
=== Динамические характеристики и эффективность реализации алгоритма ===&lt;br /&gt;
=== Выводы для классов архитектур ===&lt;br /&gt;
=== Существующие реализации алгоритма ===&lt;br /&gt;
*&lt;br /&gt;
== Литература ==&lt;/div&gt;</summary>
		<author><name>BDA</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:BDA/%D0%9E%D1%80%D1%82%D0%BE%D0%B3%D0%BE%D0%BD%D0%B0%D0%BB%D0%B8%D0%B7%D0%B0%D1%86%D0%B8%D1%8F_%D0%93%D1%80%D0%B0%D0%BC%D0%B0-%D0%A8%D0%BC%D0%B8%D0%B4%D1%82%D0%B0&amp;diff=10923</id>
		<title>Участник:BDA/Ортогонализация Грама-Шмидта</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:BDA/%D0%9E%D1%80%D1%82%D0%BE%D0%B3%D0%BE%D0%BD%D0%B0%D0%BB%D0%B8%D0%B7%D0%B0%D1%86%D0%B8%D1%8F_%D0%93%D1%80%D0%B0%D0%BC%D0%B0-%D0%A8%D0%BC%D0%B8%D0%B4%D1%82%D0%B0&amp;diff=10923"/>
		<updated>2016-10-15T17:48:51Z</updated>

		<summary type="html">&lt;p&gt;BDA: &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(nm^2)&amp;lt;/math&amp;gt;&lt;br /&gt;
| pf_height         = &amp;lt;math&amp;gt;?&amp;lt;/math&amp;gt;&lt;br /&gt;
| pf_width          = &amp;lt;math&amp;gt;?&amp;lt;/math&amp;gt;&lt;br /&gt;
| input_data        = &amp;lt;math&amp;gt;nm&amp;lt;/math&amp;gt;&lt;br /&gt;
| output_data       = &amp;lt;math&amp;gt;nm&amp;lt;/math&amp;gt;&lt;br /&gt;
}}&lt;br /&gt;
&lt;br /&gt;
Основные авторы описания: [[Участник:Zodiac|Белов Н. А.]], [[Участник:BDA|Богомолов Д. А.]].&lt;br /&gt;
&lt;br /&gt;
== Свойства и структура алгоритма ==&lt;br /&gt;
=== Общее описание алгоритма ===&lt;br /&gt;
*&lt;br /&gt;
=== Математическое описание алгоритма ===&lt;br /&gt;
*&lt;br /&gt;
=== Вычислительное ядро алгоритма ===&lt;br /&gt;
*&lt;br /&gt;
=== Макроструктура алгоритма ===&lt;br /&gt;
*&lt;br /&gt;
=== Схема реализации последовательного алгоритма ===&lt;br /&gt;
*&lt;br /&gt;
=== Последовательная сложность алгоритма ===&lt;br /&gt;
*&lt;br /&gt;
=== Информационный граф ===&lt;br /&gt;
*&lt;br /&gt;
=== Ресурс параллелизма алгоритма ===&lt;br /&gt;
*&lt;br /&gt;
=== Входные и выходные данные алгоритма ===&lt;br /&gt;
*&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;Срок сдачи продлен до 15 ноября.&#039;&#039;&lt;br /&gt;
=== Динамические характеристики и эффективность реализации алгоритма ===&lt;br /&gt;
=== Выводы для классов архитектур ===&lt;br /&gt;
=== Существующие реализации алгоритма ===&lt;br /&gt;
*&lt;br /&gt;
== Литература ==&lt;br /&gt;
*&lt;/div&gt;</summary>
		<author><name>BDA</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:BDA/%D0%9E%D1%80%D1%82%D0%BE%D0%B3%D0%BE%D0%BD%D0%B0%D0%BB%D0%B8%D0%B7%D0%B0%D1%86%D0%B8%D1%8F_%D0%93%D1%80%D0%B0%D0%BC%D0%B0-%D0%A8%D0%BC%D0%B8%D0%B4%D1%82%D0%B0&amp;diff=10846</id>
		<title>Участник:BDA/Ортогонализация Грама-Шмидта</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:BDA/%D0%9E%D1%80%D1%82%D0%BE%D0%B3%D0%BE%D0%BD%D0%B0%D0%BB%D0%B8%D0%B7%D0%B0%D1%86%D0%B8%D1%8F_%D0%93%D1%80%D0%B0%D0%BC%D0%B0-%D0%A8%D0%BC%D0%B8%D0%B4%D1%82%D0%B0&amp;diff=10846"/>
		<updated>2016-10-15T17:33:54Z</updated>

		<summary type="html">&lt;p&gt;BDA: BDA переименовал страницу Участники: Белов Никита, Богомолов Данила/Ортогонализация Грамма-Шмидта в [[Участники: Белов Никита, Богомолов…&lt;/p&gt;
&lt;hr /&gt;
&lt;div&gt;{{algorithm&lt;br /&gt;
| name              = Ортогонализация Грамма-Шмидта&lt;br /&gt;
| serial_complexity = &amp;lt;math&amp;gt;?&amp;lt;/math&amp;gt;&lt;br /&gt;
| pf_height         = &amp;lt;math&amp;gt;?&amp;lt;/math&amp;gt;&lt;br /&gt;
| pf_width          = &amp;lt;math&amp;gt;?&amp;lt;/math&amp;gt;&lt;br /&gt;
| input_data        = &amp;lt;math&amp;gt;?&amp;lt;/math&amp;gt;&lt;br /&gt;
| output_data       = &amp;lt;math&amp;gt;?&amp;lt;/math&amp;gt;&lt;br /&gt;
}}&lt;br /&gt;
&lt;br /&gt;
Основные авторы описания: [[Участник:Zodiac|Белов Н. А.]], [[Участник:BDA|Богомолов Д. А.]].&lt;br /&gt;
&lt;br /&gt;
== Свойства и структура алгоритма ==&lt;br /&gt;
=== Общее описание алгоритма ===&lt;br /&gt;
*&lt;br /&gt;
=== Математическое описание алгоритма ===&lt;br /&gt;
*&lt;br /&gt;
=== Вычислительное ядро алгоритма ===&lt;br /&gt;
*&lt;br /&gt;
=== Макроструктура алгоритма ===&lt;br /&gt;
*&lt;br /&gt;
=== Схема реализации последовательного алгоритма ===&lt;br /&gt;
*&lt;br /&gt;
=== Последовательная сложность алгоритма ===&lt;br /&gt;
*&lt;br /&gt;
=== Информационный граф ===&lt;br /&gt;
*&lt;br /&gt;
=== Ресурс параллелизма алгоритма ===&lt;br /&gt;
*&lt;br /&gt;
=== Входные и выходные данные алгоритма ===&lt;br /&gt;
*&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;Срок сдачи продлен до 15 ноября.&#039;&#039;&lt;br /&gt;
=== Динамические характеристики и эффективность реализации алгоритма ===&lt;br /&gt;
=== Выводы для классов архитектур ===&lt;br /&gt;
=== Существующие реализации алгоритма ===&lt;br /&gt;
*&lt;br /&gt;
== Литература ==&lt;br /&gt;
*&lt;/div&gt;</summary>
		<author><name>BDA</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:BDA/%D0%9E%D1%80%D1%82%D0%BE%D0%B3%D0%BE%D0%BD%D0%B0%D0%BB%D0%B8%D0%B7%D0%B0%D1%86%D0%B8%D1%8F_%D0%93%D1%80%D0%B0%D0%BC%D0%BC%D0%B0-%D0%A8%D0%BC%D0%B8%D0%B4%D1%82%D0%B0&amp;diff=10307</id>
		<title>Участник:BDA/Ортогонализация Грамма-Шмидта</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:BDA/%D0%9E%D1%80%D1%82%D0%BE%D0%B3%D0%BE%D0%BD%D0%B0%D0%BB%D0%B8%D0%B7%D0%B0%D1%86%D0%B8%D1%8F_%D0%93%D1%80%D0%B0%D0%BC%D0%BC%D0%B0-%D0%A8%D0%BC%D0%B8%D0%B4%D1%82%D0%B0&amp;diff=10307"/>
		<updated>2016-10-15T15:47:39Z</updated>

		<summary type="html">&lt;p&gt;BDA: Полностью удалено содержимое страницы&lt;/p&gt;
&lt;hr /&gt;
&lt;div&gt;&lt;/div&gt;</summary>
		<author><name>BDA</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:BDA/%D0%9E%D1%80%D1%82%D0%BE%D0%B3%D0%BE%D0%BD%D0%B0%D0%BB%D0%B8%D0%B7%D0%B0%D1%86%D0%B8%D1%8F_%D0%93%D1%80%D0%B0%D0%BC%D0%B0-%D0%A8%D0%BC%D0%B8%D0%B4%D1%82%D0%B0&amp;diff=10302</id>
		<title>Участник:BDA/Ортогонализация Грама-Шмидта</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:BDA/%D0%9E%D1%80%D1%82%D0%BE%D0%B3%D0%BE%D0%BD%D0%B0%D0%BB%D0%B8%D0%B7%D0%B0%D1%86%D0%B8%D1%8F_%D0%93%D1%80%D0%B0%D0%BC%D0%B0-%D0%A8%D0%BC%D0%B8%D0%B4%D1%82%D0%B0&amp;diff=10302"/>
		<updated>2016-10-15T15:47:00Z</updated>

		<summary type="html">&lt;p&gt;BDA: оглавление и обязательные к заполнению главы&lt;/p&gt;
&lt;hr /&gt;
&lt;div&gt;== Свойства и структура алгоритмов ==&lt;br /&gt;
=== Общее описание алгоритма ===&lt;br /&gt;
*&lt;br /&gt;
=== Математическое описание алгоритма ===&lt;br /&gt;
*&lt;br /&gt;
=== Вычислительное ядро алгоритма ===&lt;br /&gt;
*&lt;br /&gt;
=== Макроструктура алгоритма ===&lt;br /&gt;
*&lt;br /&gt;
=== Схема реализации последовательного алгоритма ===&lt;br /&gt;
*&lt;br /&gt;
=== Последовательная сложность алгоритма ===&lt;br /&gt;
*&lt;br /&gt;
=== Информационный граф ===&lt;br /&gt;
*&lt;br /&gt;
=== Ресурс параллелизма алгоритма ===&lt;br /&gt;
*&lt;br /&gt;
=== Входные и выходные данные алгоритма ===&lt;br /&gt;
*&lt;br /&gt;
=== Свойства алгоритма ===&lt;br /&gt;
*&lt;br /&gt;
== Программная реализация алгоритма ==&lt;br /&gt;
=== Особенности реализации последовательного алгоритма ===&lt;br /&gt;
=== Локальность данных и вычислений ===&lt;br /&gt;
=== Возможные способы и особенности параллельной реализации алгоритма ===&lt;br /&gt;
=== Масштабируемость алгоритма и его реализации ===&lt;br /&gt;
*&lt;br /&gt;
=== Динамические характеристики и эффективность реализации алгоритма ===&lt;br /&gt;
=== Выводы для классов архитектур ===&lt;br /&gt;
=== Существующие реализации алгоритма ===&lt;br /&gt;
*&lt;br /&gt;
== Литература ==&lt;br /&gt;
*&lt;/div&gt;</summary>
		<author><name>BDA</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:BDA/%D0%9E%D1%80%D1%82%D0%BE%D0%B3%D0%BE%D0%BD%D0%B0%D0%BB%D0%B8%D0%B7%D0%B0%D1%86%D0%B8%D1%8F_%D0%93%D1%80%D0%B0%D0%BC%D0%BC%D0%B0-%D0%A8%D0%BC%D0%B8%D0%B4%D1%82%D0%B0&amp;diff=7481</id>
		<title>Участник:BDA/Ортогонализация Грамма-Шмидта</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:BDA/%D0%9E%D1%80%D1%82%D0%BE%D0%B3%D0%BE%D0%BD%D0%B0%D0%BB%D0%B8%D0%B7%D0%B0%D1%86%D0%B8%D1%8F_%D0%93%D1%80%D0%B0%D0%BC%D0%BC%D0%B0-%D0%A8%D0%BC%D0%B8%D0%B4%D1%82%D0%B0&amp;diff=7481"/>
		<updated>2016-10-14T13:04:34Z</updated>

		<summary type="html">&lt;p&gt;BDA: &lt;/p&gt;
&lt;hr /&gt;
&lt;div&gt;== Свойства и структура алгоритмов ==&lt;br /&gt;
=== Общее описание алгоритма ===&lt;br /&gt;
*&lt;br /&gt;
=== Математическое описание алгоритма ===&lt;br /&gt;
*&lt;br /&gt;
=== Вычислительное ядро алгоритма ===&lt;br /&gt;
*&lt;br /&gt;
=== Макроструктура алгоритма ===&lt;br /&gt;
*&lt;br /&gt;
=== Схема реализации последовательного алгоритма ===&lt;br /&gt;
*&lt;br /&gt;
=== Последовательная сложность алгоритма ===&lt;br /&gt;
*&lt;br /&gt;
=== Информационный граф ===&lt;br /&gt;
*&lt;br /&gt;
=== Ресурс параллелизма алгоритма ===&lt;br /&gt;
*&lt;br /&gt;
=== Входные и выходные данные алгоритма ===&lt;br /&gt;
*&lt;br /&gt;
=== Свойства алгоритма ===&lt;br /&gt;
*&lt;br /&gt;
== Программная реализация алгоритма ==&lt;br /&gt;
=== Особенности реализации последовательного алгоритма ===&lt;br /&gt;
=== Локальность данных и вычислений ===&lt;br /&gt;
=== Возможные способы и особенности параллельной реализации алгоритма ===&lt;br /&gt;
=== Масштабируемость алгоритма и его реализации ===&lt;br /&gt;
*&lt;br /&gt;
=== Динамические характеристики и эффективность реализации алгоритма ===&lt;br /&gt;
=== Выводы для классов архитектур ===&lt;br /&gt;
=== Существующие реализации алгоритма ===&lt;br /&gt;
*&lt;br /&gt;
== Литература ==&lt;br /&gt;
*&lt;/div&gt;</summary>
		<author><name>BDA</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:BDA/%D0%9E%D1%80%D1%82%D0%BE%D0%B3%D0%BE%D0%BD%D0%B0%D0%BB%D0%B8%D0%B7%D0%B0%D1%86%D0%B8%D1%8F_%D0%93%D1%80%D0%B0%D0%BC%D0%BC%D0%B0-%D0%A8%D0%BC%D0%B8%D0%B4%D1%82%D0%B0&amp;diff=7480</id>
		<title>Участник:BDA/Ортогонализация Грамма-Шмидта</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:BDA/%D0%9E%D1%80%D1%82%D0%BE%D0%B3%D0%BE%D0%BD%D0%B0%D0%BB%D0%B8%D0%B7%D0%B0%D1%86%D0%B8%D1%8F_%D0%93%D1%80%D0%B0%D0%BC%D0%BC%D0%B0-%D0%A8%D0%BC%D0%B8%D0%B4%D1%82%D0%B0&amp;diff=7480"/>
		<updated>2016-10-14T13:04:17Z</updated>

		<summary type="html">&lt;p&gt;BDA: оглавление и обязательные к заполнению главы&lt;/p&gt;
&lt;hr /&gt;
&lt;div&gt;== Свойства и структура алгоритмов ==&lt;br /&gt;
=== Общее описание алгоритма ===&lt;br /&gt;
*&lt;br /&gt;
=== Математическое описание алгоритма ===&lt;br /&gt;
*&lt;br /&gt;
=== Вычислительное ядро алгоритма ===&lt;br /&gt;
*&lt;br /&gt;
=== Макроструктура алгоритма ===&lt;br /&gt;
*&lt;br /&gt;
=== Схема реализации последовательного алгоритма ===&lt;br /&gt;
*&lt;br /&gt;
=== Последовательная сложность алгоритма ===&lt;br /&gt;
*&lt;br /&gt;
=== Информационный граф ===&lt;br /&gt;
*&lt;br /&gt;
=== Ресурс параллелизма алгоритма ===&lt;br /&gt;
*&lt;br /&gt;
=== Входные и выходные данные алгоритма ===&lt;br /&gt;
*&lt;br /&gt;
=== Свойства алгоритма ===&lt;br /&gt;
*&lt;br /&gt;
== Программная реализация алгоритма ==&lt;br /&gt;
=== Особенности реализации последовательного алгоритма ===&lt;br /&gt;
=== Локальность данных и вычислений ===&lt;br /&gt;
=== Возможные способы и особенности параллельной реализации алгоритма ===&lt;br /&gt;
=== Масштабируемость алгоритма и его реализации ===&lt;br /&gt;
*&lt;br /&gt;
=== Динамические характеристики и эффективность реализации алгоритма ===&lt;br /&gt;
=== Выводы для классов архитектур ===&lt;br /&gt;
=== Существующие реализации алгоритма ===&lt;br /&gt;
*&lt;br /&gt;
== Литература ==&lt;/div&gt;</summary>
		<author><name>BDA</name></author>
	</entry>
</feed>