<?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=Lexaloris</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=Lexaloris"/>
	<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/Lexaloris"/>
	<updated>2026-10-22T22:08:16Z</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:Lexaloris/%D0%A3%D0%BC%D0%BD%D0%BE%D0%B6%D0%B5%D0%BD%D0%B8%D0%B5_%D1%80%D0%B0%D0%B7%D1%80%D0%B5%D0%B6%D0%B5%D0%BD%D0%BD%D0%BE%D0%B9_%D0%BC%D0%B0%D1%82%D1%80%D0%B8%D1%86%D1%8B_%D0%BD%D0%B0_%D0%B2%D0%B5%D0%BA%D1%82%D0%BE%D1%80&amp;diff=18652</id>
		<title>Участник:Lexaloris/Умножение разреженной матрицы на вектор</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:Lexaloris/%D0%A3%D0%BC%D0%BD%D0%BE%D0%B6%D0%B5%D0%BD%D0%B8%D0%B5_%D1%80%D0%B0%D0%B7%D1%80%D0%B5%D0%B6%D0%B5%D0%BD%D0%BD%D0%BE%D0%B9_%D0%BC%D0%B0%D1%82%D1%80%D0%B8%D1%86%D1%8B_%D0%BD%D0%B0_%D0%B2%D0%B5%D0%BA%D1%82%D0%BE%D1%80&amp;diff=18652"/>
		<updated>2016-11-20T20:33:49Z</updated>

		<summary type="html">&lt;p&gt;Lexaloris: &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(k)&amp;lt;/math&amp;gt;&lt;br /&gt;
| pf_height         = &amp;lt;math&amp;gt;O(m)&amp;lt;/math&amp;gt;&lt;br /&gt;
| pf_width          = &amp;lt;math&amp;gt;O(n)&amp;lt;/math&amp;gt;&lt;br /&gt;
| input_data        = &amp;lt;math&amp;gt;k + m&amp;lt;/math&amp;gt;&lt;br /&gt;
| output_data       = &amp;lt;math&amp;gt;n&amp;lt;/math&amp;gt;&lt;br /&gt;
}}&lt;br /&gt;
&lt;br /&gt;
&lt;br /&gt;
&#039;&#039;&#039;Авторы страницы:&#039;&#039;&#039; [[Участник:Lexaloris|A.Д. Новоселов]] и [[Участник:kochet|П.А. Кочетков]]&lt;br /&gt;
&lt;br /&gt;
Кочетков Павел ответственен за программную реализацию алгоритма, Новоселов Алексей ответственен за оформление статьи. &lt;br /&gt;
&lt;br /&gt;
= Свойства и структура алгоритмов =&lt;br /&gt;
&lt;br /&gt;
== Общее описание алгоритма ==&lt;br /&gt;
&lt;br /&gt;
=== Хранение ненулевых элементов разреженной матрицы ===&lt;br /&gt;
&lt;br /&gt;
==== Разреженный строчной формат ====&lt;br /&gt;
&lt;br /&gt;
Одной из наиболее ши­роко используемых схем хранения разреженных матриц является &#039;&#039;разреженный строчный формат&#039;&#039;. Эта&lt;br /&gt;
схема предъявляет минимальные требования к памяти и в то же время оказывается очень удобной для умножения разреженной матрицы на вектор.&lt;br /&gt;
Например, рассмотрим формат хранения разряженной матрицы &amp;lt;math&amp;gt;A&amp;lt;/math&amp;gt;:&lt;br /&gt;
&lt;br /&gt;
[[File:RRCOMatrix.png]]&lt;br /&gt;
&lt;br /&gt;
Значения нену­левых элементов матрицы и соответствующие столбцовые индексы хранятся в этой схеме по строкам в двух массивах &amp;lt;math&amp;gt;AN&amp;lt;/math&amp;gt; и &amp;lt;math&amp;gt;JA&amp;lt;/math&amp;gt; соответственно. Используется также массив указателей &amp;lt;math&amp;gt;IA&amp;lt;/math&amp;gt;, отмечающих позиции массивов &amp;lt;math&amp;gt;AN&amp;lt;/math&amp;gt; и &amp;lt;math&amp;gt;JA&amp;lt;/math&amp;gt;, с которых начинается описание очередной строки. Дополнительная компо­нента в &amp;lt;math&amp;gt;IA&amp;lt;/math&amp;gt; содержит указатель первой свободной позиции в &amp;lt;math&amp;gt;JA&amp;lt;/math&amp;gt; и &amp;lt;math&amp;gt;AN&amp;lt;/math&amp;gt;.&lt;br /&gt;
&lt;br /&gt;
Таким образом &amp;lt;math&amp;gt;A&amp;lt;/math&amp;gt; представляется в виде:&lt;br /&gt;
&lt;br /&gt;
   IA = [ 1 4 4 6 ]&lt;br /&gt;
   JA = [ 3 4 8 6 8 ]&lt;br /&gt;
   AN = [ 1 3 5 7 1 ]&lt;br /&gt;
&lt;br /&gt;
Данный способ представления называют &#039;&#039;полным&#039;&#039;, поскольку представлена вся матрица &amp;lt;math&amp;gt;A&amp;lt;/math&amp;gt;, и &#039;&#039;упорядоченным&#039;&#039;, поскольку эле­менты каждой строки хранятся в соответствии с возрастанием столбцовых индексов. Таким образом, это строчное представление, полное и упорядоченное, или сокращенно &#039;&#039;&#039;(RR (С) О)&#039;&#039;&#039;.&lt;br /&gt;
&lt;br /&gt;
==== Неупорядоченное представление ====&lt;br /&gt;
&lt;br /&gt;
Представления разреженных матриц необязательно должны быть упорядочены в том смысле, что, хотя упорядоченность строк поддерживается, внутри каждой строки элементы могут храниться в произвольном порядке. Для матрицы А нашего примера вполне можно было бы использовать и строчное представление, полное, но &#039;&#039;неупорядоченное&#039;&#039; &#039;&#039;&#039;(RR (С) U )&#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;
   IA = [ 1 4 4 6 ]&lt;br /&gt;
   JA = [ 8 3 4 8 6 ]&lt;br /&gt;
   AN = [ 5 1 3 1 7 ]&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; — число строк матрицы. &lt;br /&gt;
Для каждой ее строки &amp;lt;math&amp;gt;I&amp;lt;/math&amp;gt; матрицы мы находим с помощью &amp;lt;math&amp;gt;IA&amp;lt;/math&amp;gt; значения первой &amp;lt;math&amp;gt;IAA&amp;lt;/math&amp;gt; и последней &amp;lt;math&amp;gt;IAB&amp;lt;/math&amp;gt; позиций, занимаемых элементами строки &amp;lt;math&amp;gt;I&amp;lt;/math&amp;gt; в массивах &amp;lt;math&amp;gt;JA&amp;lt;/math&amp;gt; и &amp;lt;math&amp;gt;AN&amp;lt;/math&amp;gt;. Затем, чтобы вычислить скалярное произведение строки &amp;lt;math&amp;gt;I&amp;lt;/math&amp;gt; и вектора &amp;lt;math&amp;gt;B&amp;lt;/math&amp;gt;, мы просто просматриваем &amp;lt;math&amp;gt;JA&amp;lt;/math&amp;gt; и &amp;lt;math&amp;gt;AN&amp;lt;/math&amp;gt; на отрезке от &amp;lt;math&amp;gt;IAA&amp;lt;/math&amp;gt; до &amp;lt;math&amp;gt;IAB&amp;lt;/math&amp;gt;:&lt;br /&gt;
каждое значение, хранимое в &amp;lt;math&amp;gt;JA&amp;lt;/math&amp;gt;, есть столбцовый индекс и используется для извлечения из массива &amp;lt;math&amp;gt;B&amp;lt;/math&amp;gt; элемента, который должен быть умножен на соответствующее число из &amp;lt;math&amp;gt;AN&amp;lt;/math&amp;gt;. Результат каж­дого умножения прибавляется к &amp;lt;math&amp;gt;C(I)&amp;lt;/math&amp;gt;.&lt;br /&gt;
&lt;br /&gt;
== Математическое описание алгоритма ==&lt;br /&gt;
&lt;br /&gt;
&#039;&#039;&#039;Исходные данные:&#039;&#039;&#039; &lt;br /&gt;
&lt;br /&gt;
&amp;lt;math&amp;gt;IA, JA, AN&amp;lt;/math&amp;gt; - заданная матрица в форме &#039;&#039;&#039;(RR (С) U)&#039;&#039;&#039;;&lt;br /&gt;
&lt;br /&gt;
&amp;lt;math&amp;gt;B&amp;lt;/math&amp;gt; - заданный заполненный вектор;&lt;br /&gt;
&lt;br /&gt;
&amp;lt;math&amp;gt;N&amp;lt;/math&amp;gt; - число строк матрицы.&lt;br /&gt;
&lt;br /&gt;
&#039;&#039;&#039;Выход:&#039;&#039;&#039; &amp;lt;math&amp;gt;C&amp;lt;/math&amp;gt; вектор-произведение размерности &amp;lt;math&amp;gt;N&amp;lt;/math&amp;gt;.&lt;br /&gt;
&lt;br /&gt;
&#039;&#039;&#039;Формулы метода:&#039;&#039;&#039;&lt;br /&gt;
&lt;br /&gt;
:&amp;lt;math&amp;gt;&lt;br /&gt;
\begin{align}&lt;br /&gt;
&amp;amp; IAA_{i} = IA(i), \quad i \in [1, N], \\&lt;br /&gt;
&amp;amp; IAB_{i} = IA(i + 1) - 1, \quad i \in [1, N], \\&lt;br /&gt;
&amp;amp; c_{i} = \sum\limits_{j = IAA_{i}}^{IAB_{i}} AN(j)B(JA(j)), \quad i \in [1, N] \\&lt;br /&gt;
\end{align}&lt;br /&gt;
&amp;lt;/math&amp;gt;&lt;br /&gt;
&lt;br /&gt;
== Вычислительное ядро алгоритма ==&lt;br /&gt;
&lt;br /&gt;
Вычислительным ядром, т.е. той частью алгоритма, на которую приходится основное время его работы, является вычисление значения &amp;lt;math&amp;gt;i&amp;lt;/math&amp;gt;-го элемента &amp;lt;math&amp;gt;c_{i}&amp;lt;/math&amp;gt; вектора-произведения, т.е произведения строки &amp;lt;math&amp;gt;I&amp;lt;/math&amp;gt; матрицы &amp;lt;math&amp;gt;A&amp;lt;/math&amp;gt; и вектора &amp;lt;math&amp;gt;B&amp;lt;/math&amp;gt; по формуле:&lt;br /&gt;
&lt;br /&gt;
:&amp;lt;math&amp;gt;&lt;br /&gt;
\begin{align}&lt;br /&gt;
&amp;amp; c_{i} = \sum\limits_{j = IAA_{i}}^{IAB_{i}} AN(j)B(JA(j)), \quad i \in [1, N] \\&lt;br /&gt;
\end{align}&lt;br /&gt;
&amp;lt;/math&amp;gt;&lt;br /&gt;
&lt;br /&gt;
== Макроструктура алгоритма ==&lt;br /&gt;
&lt;br /&gt;
Основу алгоритма составляет вычисление значения &amp;lt;math&amp;gt;i&amp;lt;/math&amp;gt;-го элемента &amp;lt;math&amp;gt;c_{i}&amp;lt;/math&amp;gt; вектора-произведения:&lt;br /&gt;
&lt;br /&gt;
:&amp;lt;math&amp;gt;&lt;br /&gt;
\begin{align}&lt;br /&gt;
&amp;amp; c_{i} = \sum\limits_{j = IAA_{i}}^{IAB_{i}} AN(j)B(JA(j)), \quad i \in [1, N] \\&lt;br /&gt;
\end{align}&lt;br /&gt;
&amp;lt;/math&amp;gt;&lt;br /&gt;
&lt;br /&gt;
== Схема реализации последовательного алгоритма ==&lt;br /&gt;
&lt;br /&gt;
Последовательность исполнения метода следующая: &lt;br /&gt;
&lt;br /&gt;
Далее для всех &amp;lt;math&amp;gt;i&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; по нарастанию выполняются:&lt;br /&gt;
&lt;br /&gt;
1. &amp;lt;math&amp;gt; c_{i} = 0; IAA = IA(i); IAB = IA(i + 1 ) - 1 &amp;lt;/math&amp;gt;&lt;br /&gt;
&lt;br /&gt;
После этого, если &amp;lt;math&amp;gt;(IAB \le IAA)&amp;lt;/math&amp;gt;:&lt;br /&gt;
&lt;br /&gt;
2. Для всех &amp;lt;math&amp;gt;j&amp;lt;/math&amp;gt; от &amp;lt;math&amp;gt;IAA&amp;lt;/math&amp;gt; до &amp;lt;math&amp;gt;IAB&amp;lt;/math&amp;gt; выполняется: &lt;br /&gt;
&lt;br /&gt;
&amp;lt;math&amp;gt;c_{i} = \sum\limits_{j = IAA_{i}}^{IAB_{i}} AN(j)B(JA(j))&amp;lt;/math&amp;gt;&lt;br /&gt;
&lt;br /&gt;
Псевдокод алгоритма: &lt;br /&gt;
&lt;br /&gt;
    FOR I = 1, N                          (1)&lt;br /&gt;
       U = 0.                             (2) &lt;br /&gt;
       IAA = IA(I)                        (3) &lt;br /&gt;
       IAB = IA(I + 1 ) - 1               (4)&lt;br /&gt;
       IF NOT(IAB.LT.IAA)                 (5)&lt;br /&gt;
           FOR J = IAA, IAB               (6)&lt;br /&gt;
           C(I) = U + AN(J)*B(JA(J))      (7)&lt;br /&gt;
&lt;br /&gt;
== Последовательная сложность алгоритма ==&lt;br /&gt;
&lt;br /&gt;
Для всего алгоритма потребуется выполнить &amp;lt;math&amp;gt;O(k)&amp;lt;/math&amp;gt; операций, как в строке стр.7 псевдокода алгоритма ([[#Схема реализации последовательного алгоритма|п.1.5]]), где &amp;lt;math&amp;gt;k&amp;lt;/math&amp;gt; - число ненулевых эле­ментов матрицы.&lt;br /&gt;
&lt;br /&gt;
== Информационный граф ==&lt;br /&gt;
&lt;br /&gt;
На рисунке 1 изображен информационный граф алгоритма.&lt;br /&gt;
&lt;br /&gt;
[[file:InfoGrafMatrixRRCUandVextor.jpg|thumb|center|1200px|Рисунок 1. Информационный граф алгоритма.]]&lt;br /&gt;
 &lt;br /&gt;
По оси &amp;lt;math&amp;gt;X&amp;lt;/math&amp;gt; для отдельной строки &amp;lt;math&amp;gt;I&amp;lt;/math&amp;gt; матрицы отложены в пределах первой &amp;lt;math&amp;gt;IAA&amp;lt;/math&amp;gt; и последней &amp;lt;math&amp;gt;IAB&amp;lt;/math&amp;gt; позиций ненулевых элементов значения &amp;lt;math&amp;gt;AN&amp;lt;/math&amp;gt; и соответствуюие им по столбцовомым индексам, хранимимым в &amp;lt;math&amp;gt;JA&amp;lt;/math&amp;gt;, значения &amp;lt;math&amp;gt;B&amp;lt;/math&amp;gt; элементов. &lt;br /&gt;
Пары этих значений обозначены желтыми квадратиками &amp;lt;math&amp;gt;(in)&amp;lt;/math&amp;gt;. Значения in попарно скалярно перемножаются (зеленый кружочек) и суммируются (синий кружочек) в результат значения элемента вектора-произведения &amp;lt;math&amp;gt;c_{i}&amp;lt;/math&amp;gt;, т.е &amp;lt;math&amp;gt;out&amp;lt;/math&amp;gt;(красный квадратик) с строковым индексом, соответствующем номеру строки матрицы.&lt;br /&gt;
&lt;br /&gt;
По оси &amp;lt;math&amp;gt;Y&amp;lt;/math&amp;gt; отложена схема вычисление значения каждого элемента вектора-произведения для каждой строки матрицы.&lt;br /&gt;
&lt;br /&gt;
== Ресурс параллелизма алгоритма ==&lt;br /&gt;
&lt;br /&gt;
Алгоритм обладает возможностью выполняться параллельно, что позволяет значительно ускорить вычисления.&lt;br /&gt;
Вычисление значения каждого элемента вектора-произведения для каждой строки матрицы и элемента вектора &amp;lt;math&amp;gt;B&amp;lt;/math&amp;gt; можно проводить на отдельных процессорах. &lt;br /&gt;
Максимальная эффективность вычислений достигается при наличии не менее, чем &amp;lt;math&amp;gt;N&amp;lt;/math&amp;gt; процессоров, т.е отдельный процессор на вычисление значения каждого элемента вектора-произведения. На процессоре выполняется &amp;lt;math&amp;gt;k(i)&amp;lt;/math&amp;gt; последовательных операций умножения и сложения. Поэтому число ярусов для &amp;lt;math&amp;gt;i&amp;lt;/math&amp;gt;-ого процессора равно &amp;lt;math&amp;gt;k(i)&amp;lt;/math&amp;gt;.&lt;br /&gt;
&lt;br /&gt;
Для параллельного выполнения алгоритма требуется:&lt;br /&gt;
&lt;br /&gt;
* &amp;lt;math&amp;gt;N&amp;lt;/math&amp;gt; ярусов умножений и сложений,&lt;br /&gt;
* в каждом из ярусов &amp;lt;math&amp;gt;k &amp;lt;&amp;lt; m&amp;lt;/math&amp;gt; операций.&lt;br /&gt;
&lt;br /&gt;
При классификации по высоте ЯПФ, алгоритм имеет линейную сложность. При классификации по высоте ЯПФ также линейную.&lt;br /&gt;
&lt;br /&gt;
== Входные и выходные данные алгоритма ==&lt;br /&gt;
&#039;&#039;&#039;Входные данные:&#039;&#039;&#039;&lt;br /&gt;
&lt;br /&gt;
* &amp;lt;math&amp;gt;IA, JA, AN&amp;lt;/math&amp;gt; - заданная матрица в форме &#039;&#039;&#039;(RR (С) U)&#039;&#039;&#039; c &amp;lt;math&amp;gt;k&amp;lt;/math&amp;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;B&amp;lt;/math&amp;gt; - заданный заполненный вектор c &amp;lt;math&amp;gt;m&amp;lt;/math&amp;gt; элементами;&lt;br /&gt;
&#039;&#039;&#039;&lt;br /&gt;
&#039;&#039;&#039;Объем входных данных&#039;&#039;&#039;: &amp;lt;math&amp;gt;k + m&amp;lt;/math&amp;gt;&lt;br /&gt;
&lt;br /&gt;
&#039;&#039;&#039;Выходные данные:&#039;&#039;&#039; &amp;lt;math&amp;gt;C&amp;lt;/math&amp;gt; вектор-произведение размерности &amp;lt;math&amp;gt;N&amp;lt;/math&amp;gt;.&lt;br /&gt;
&lt;br /&gt;
&#039;&#039;&#039;Объем выходных данных&#039;&#039;&#039;: &amp;lt;math&amp;gt;N&amp;lt;/math&amp;gt;&lt;br /&gt;
&lt;br /&gt;
== Свойства алгоритма ==&lt;br /&gt;
&lt;br /&gt;
Алгоритм в рамках выбранной версии полностью детерминирован.&lt;br /&gt;
&lt;br /&gt;
Вычислительная мощность алгоритма, как отношение числа операций к суммарному объему входных и выходных данных – константа.&lt;br /&gt;
&lt;br /&gt;
= Программная реализация алгоритма =&lt;br /&gt;
&lt;br /&gt;
&lt;br /&gt;
== Особенности реализации последовательного алгоритма ==&lt;br /&gt;
&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;IBM Blue Gene/P&#039;&#039; было проведено экспериментальное исследование масштабируемости программной реализации умножения разряженной матрицы на вектор. Результаты исследования представлены на рис.2:&lt;br /&gt;
&lt;br /&gt;
[[Файл:DependeceOfTheExecutionTime.jpg |thumb|center|900px|Рисунок 2. График зависимости времени выполнения программы умножения разряженной матрицы на вектор от количества ненулевых элементов матрицы для данного числа процессоров.]]&lt;br /&gt;
&lt;br /&gt;
Увеличивая число процессоров, можно добиться ускорения выполнения программы. Постепенно дальнейшие увеличение числа процессоров дает все меньший эффект из-за накладных расходов, связанных с организацией параллельного вычисления.&lt;br /&gt;
&lt;br /&gt;
== Динамические характеристики и эффективность реализации алгоритма ==&lt;br /&gt;
&lt;br /&gt;
== Выводы для классов архитектур ==&lt;br /&gt;
&lt;br /&gt;
== Существующие реализации алгоритма ==&lt;br /&gt;
&lt;br /&gt;
Алгоритм релизован в составе библиотек: &lt;br /&gt;
* SparseLib++[http://math.nist.gov/sparselib++/] &lt;br /&gt;
* cuSPARSE [http://docs.nvidia.com/cuda/cusparse/]&lt;br /&gt;
* uBLAS [http://www.boost.org/doc/libs/1_62_0/libs/numeric/ublas/doc/]&lt;br /&gt;
* Intel MKL [https://software.intel.com/en-us/intel-mkl]&lt;br /&gt;
&lt;br /&gt;
= Литература =&lt;br /&gt;
&lt;br /&gt;
* [1] С. Писсанецки. Технология разреженных матриц. Изд. Мир, 1988.&lt;br /&gt;
* [2] В. В. Воеводин, Вл.В. Воеводин. Параллельные вычисления. – СПб.: БХВ - Петербург, 2002.&lt;/div&gt;</summary>
		<author><name>Lexaloris</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:Lexaloris/%D0%A3%D0%BC%D0%BD%D0%BE%D0%B6%D0%B5%D0%BD%D0%B8%D0%B5_%D1%80%D0%B0%D0%B7%D1%80%D0%B5%D0%B6%D0%B5%D0%BD%D0%BD%D0%BE%D0%B9_%D0%BC%D0%B0%D1%82%D1%80%D0%B8%D1%86%D1%8B_%D0%BD%D0%B0_%D0%B2%D0%B5%D0%BA%D1%82%D0%BE%D1%80&amp;diff=18649</id>
		<title>Участник:Lexaloris/Умножение разреженной матрицы на вектор</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:Lexaloris/%D0%A3%D0%BC%D0%BD%D0%BE%D0%B6%D0%B5%D0%BD%D0%B8%D0%B5_%D1%80%D0%B0%D0%B7%D1%80%D0%B5%D0%B6%D0%B5%D0%BD%D0%BD%D0%BE%D0%B9_%D0%BC%D0%B0%D1%82%D1%80%D0%B8%D1%86%D1%8B_%D0%BD%D0%B0_%D0%B2%D0%B5%D0%BA%D1%82%D0%BE%D1%80&amp;diff=18649"/>
		<updated>2016-11-20T20:20:07Z</updated>

		<summary type="html">&lt;p&gt;Lexaloris: /* Масштабируемость алгоритма и его реализации */&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(k)&amp;lt;/math&amp;gt;&lt;br /&gt;
| pf_height         = &amp;lt;math&amp;gt;O(m)&amp;lt;/math&amp;gt;&lt;br /&gt;
| pf_width          = &amp;lt;math&amp;gt;O(n)&amp;lt;/math&amp;gt;&lt;br /&gt;
| input_data        = &amp;lt;math&amp;gt;k + m&amp;lt;/math&amp;gt;&lt;br /&gt;
| output_data       = &amp;lt;math&amp;gt;n&amp;lt;/math&amp;gt;&lt;br /&gt;
}}&lt;br /&gt;
&lt;br /&gt;
&lt;br /&gt;
&#039;&#039;&#039;Авторы страницы:&#039;&#039;&#039; [[Участник:Lexaloris|A.Д. Новоселов]] и [[Участник:kochet|П.А. Кочетков]]&lt;br /&gt;
&lt;br /&gt;
Кочетков Павел ответственен за программную реализацию алгоритма, Новоселов Алексей ответственен за оформление статьи. &lt;br /&gt;
&lt;br /&gt;
= Свойства и структура алгоритмов =&lt;br /&gt;
&lt;br /&gt;
== Общее описание алгоритма ==&lt;br /&gt;
&lt;br /&gt;
=== Хранение ненулевых элементов разреженной матрицы ===&lt;br /&gt;
&lt;br /&gt;
==== Разреженный строчной формат ====&lt;br /&gt;
&lt;br /&gt;
Одной из наиболее ши­роко используемых схем хранения разреженных матриц является &#039;&#039;разреженный строчный формат&#039;&#039;. Эта&lt;br /&gt;
схема предъявляет минимальные требования к памяти и в то же время оказывается очень удобной для умножения разреженной матрицы на вектор.&lt;br /&gt;
Например, рассмотрим формат хранения разряженной матрицы &amp;lt;math&amp;gt;A&amp;lt;/math&amp;gt;:&lt;br /&gt;
&lt;br /&gt;
[[File:RRCOMatrix.png]]&lt;br /&gt;
&lt;br /&gt;
Значения нену­левых элементов матрицы и соответствующие столбцовые индексы хранятся в этой схеме по строкам в двух массивах &amp;lt;math&amp;gt;AN&amp;lt;/math&amp;gt; и &amp;lt;math&amp;gt;JA&amp;lt;/math&amp;gt; соответственно. Используется также массив указателей &amp;lt;math&amp;gt;IA&amp;lt;/math&amp;gt;, отмечающих позиции массивов &amp;lt;math&amp;gt;AN&amp;lt;/math&amp;gt; и &amp;lt;math&amp;gt;JA&amp;lt;/math&amp;gt;, с которых начинается описание очередной строки. Дополнительная компо­нента в &amp;lt;math&amp;gt;IA&amp;lt;/math&amp;gt; содержит указатель первой свободной позиции в &amp;lt;math&amp;gt;JA&amp;lt;/math&amp;gt; и &amp;lt;math&amp;gt;AN&amp;lt;/math&amp;gt;.&lt;br /&gt;
&lt;br /&gt;
Таким образом &amp;lt;math&amp;gt;A&amp;lt;/math&amp;gt; представляется в виде:&lt;br /&gt;
&lt;br /&gt;
   IA = [ 1 4 4 6 ]&lt;br /&gt;
   JA = [ 3 4 8 6 8 ]&lt;br /&gt;
   AN = [ 1 3 5 7 1 ]&lt;br /&gt;
&lt;br /&gt;
Данный способ представления называют &#039;&#039;полным&#039;&#039;, поскольку представлена вся матрица &amp;lt;math&amp;gt;A&amp;lt;/math&amp;gt;, и &#039;&#039;упорядоченным&#039;&#039;, поскольку эле­менты каждой строки хранятся в соответствии с возрастанием столбцовых индексов. Таким образом, это строчное представление, полное и упорядоченное, или сокращенно &#039;&#039;&#039;(RR (С) О)&#039;&#039;&#039;.&lt;br /&gt;
&lt;br /&gt;
==== Неупорядоченное представление ====&lt;br /&gt;
&lt;br /&gt;
Представления разреженных матриц необязательно должны быть упорядочены в том смысле, что, хотя упорядоченность строк поддерживается, внутри каждой строки элементы могут храниться в произвольном порядке. Для матрицы А нашего примера вполне можно было бы использовать и строчное представление, полное, но &#039;&#039;неупорядоченное&#039;&#039; &#039;&#039;&#039;(RR (С) U )&#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;
   IA = [ 1 4 4 6 ]&lt;br /&gt;
   JA = [ 8 3 4 8 6 ]&lt;br /&gt;
   AN = [ 5 1 3 1 7 ]&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; — число строк матрицы. &lt;br /&gt;
Для каждой ее строки &amp;lt;math&amp;gt;I&amp;lt;/math&amp;gt; матрицы мы находим с помощью &amp;lt;math&amp;gt;IA&amp;lt;/math&amp;gt; значения первой &amp;lt;math&amp;gt;IAA&amp;lt;/math&amp;gt; и последней &amp;lt;math&amp;gt;IAB&amp;lt;/math&amp;gt; позиций, занимаемых элементами строки &amp;lt;math&amp;gt;I&amp;lt;/math&amp;gt; в массивах &amp;lt;math&amp;gt;JA&amp;lt;/math&amp;gt; и &amp;lt;math&amp;gt;AN&amp;lt;/math&amp;gt;. Затем, чтобы вычислить скалярное произведение строки &amp;lt;math&amp;gt;I&amp;lt;/math&amp;gt; и вектора &amp;lt;math&amp;gt;B&amp;lt;/math&amp;gt;, мы просто просматриваем &amp;lt;math&amp;gt;JA&amp;lt;/math&amp;gt; и &amp;lt;math&amp;gt;AN&amp;lt;/math&amp;gt; на отрезке от &amp;lt;math&amp;gt;IAA&amp;lt;/math&amp;gt; до &amp;lt;math&amp;gt;IAB&amp;lt;/math&amp;gt;:&lt;br /&gt;
каждое значение, хранимое в &amp;lt;math&amp;gt;JA&amp;lt;/math&amp;gt;, есть столбцовый индекс и используется для извлечения из массива &amp;lt;math&amp;gt;B&amp;lt;/math&amp;gt; элемента, который должен быть умножен на соответствующее число из &amp;lt;math&amp;gt;AN&amp;lt;/math&amp;gt;. Результат каж­дого умножения прибавляется к &amp;lt;math&amp;gt;C(I)&amp;lt;/math&amp;gt;.&lt;br /&gt;
&lt;br /&gt;
== Математическое описание алгоритма ==&lt;br /&gt;
&lt;br /&gt;
&#039;&#039;&#039;Исходные данные:&#039;&#039;&#039; &lt;br /&gt;
&lt;br /&gt;
&amp;lt;math&amp;gt;IA, JA, AN&amp;lt;/math&amp;gt; - заданная матрица в форме &#039;&#039;&#039;(RR (С) U)&#039;&#039;&#039;;&lt;br /&gt;
&lt;br /&gt;
&amp;lt;math&amp;gt;B&amp;lt;/math&amp;gt; - заданный заполненный вектор;&lt;br /&gt;
&lt;br /&gt;
&amp;lt;math&amp;gt;N&amp;lt;/math&amp;gt; - число строк матрицы.&lt;br /&gt;
&lt;br /&gt;
&#039;&#039;&#039;Выход:&#039;&#039;&#039; &amp;lt;math&amp;gt;C&amp;lt;/math&amp;gt; вектор-произведение размерности &amp;lt;math&amp;gt;N&amp;lt;/math&amp;gt;.&lt;br /&gt;
&lt;br /&gt;
&#039;&#039;&#039;Формулы метода:&#039;&#039;&#039;&lt;br /&gt;
&lt;br /&gt;
:&amp;lt;math&amp;gt;&lt;br /&gt;
\begin{align}&lt;br /&gt;
&amp;amp; IAA_{i} = IA(i), \quad i \in [1, N], \\&lt;br /&gt;
&amp;amp; IAB_{i} = IA(i + 1) - 1, \quad i \in [1, N], \\&lt;br /&gt;
&amp;amp; c_{i} = \sum\limits_{j = IAA_{i}}^{IAB_{i}} AN(j)B(JA(j)), \quad i \in [1, N] \\&lt;br /&gt;
\end{align}&lt;br /&gt;
&amp;lt;/math&amp;gt;&lt;br /&gt;
&lt;br /&gt;
== Вычислительное ядро алгоритма ==&lt;br /&gt;
&lt;br /&gt;
Вычислительным ядром, т.е. той частью алгоритма, на которую приходится основное время его работы, является вычисление значения &amp;lt;math&amp;gt;i&amp;lt;/math&amp;gt;-го элемента &amp;lt;math&amp;gt;c_{i}&amp;lt;/math&amp;gt; вектора-произведения, т.е произведения строки &amp;lt;math&amp;gt;I&amp;lt;/math&amp;gt; матрицы &amp;lt;math&amp;gt;A&amp;lt;/math&amp;gt; и вектора &amp;lt;math&amp;gt;B&amp;lt;/math&amp;gt; по формуле:&lt;br /&gt;
&lt;br /&gt;
:&amp;lt;math&amp;gt;&lt;br /&gt;
\begin{align}&lt;br /&gt;
&amp;amp; c_{i} = \sum\limits_{j = IAA_{i}}^{IAB_{i}} AN(j)B(JA(j)), \quad i \in [1, N] \\&lt;br /&gt;
\end{align}&lt;br /&gt;
&amp;lt;/math&amp;gt;&lt;br /&gt;
&lt;br /&gt;
== Макроструктура алгоритма ==&lt;br /&gt;
&lt;br /&gt;
Основу алгоритма составляет вычисление значения &amp;lt;math&amp;gt;i&amp;lt;/math&amp;gt;-го элемента &amp;lt;math&amp;gt;c_{i}&amp;lt;/math&amp;gt; вектора-произведения:&lt;br /&gt;
&lt;br /&gt;
:&amp;lt;math&amp;gt;&lt;br /&gt;
\begin{align}&lt;br /&gt;
&amp;amp; c_{i} = \sum\limits_{j = IAA_{i}}^{IAB_{i}} AN(j)B(JA(j)), \quad i \in [1, N] \\&lt;br /&gt;
\end{align}&lt;br /&gt;
&amp;lt;/math&amp;gt;&lt;br /&gt;
&lt;br /&gt;
== Схема реализации последовательного алгоритма ==&lt;br /&gt;
&lt;br /&gt;
Последовательность исполнения метода следующая: &lt;br /&gt;
&lt;br /&gt;
Далее для всех &amp;lt;math&amp;gt;i&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; по нарастанию выполняются:&lt;br /&gt;
&lt;br /&gt;
1. &amp;lt;math&amp;gt; c_{i} = 0; IAA = IA(i); IAB = IA(i + 1 ) - 1 &amp;lt;/math&amp;gt;&lt;br /&gt;
&lt;br /&gt;
После этого, если &amp;lt;math&amp;gt;(IAB \le IAA)&amp;lt;/math&amp;gt;:&lt;br /&gt;
&lt;br /&gt;
2. Для всех &amp;lt;math&amp;gt;j&amp;lt;/math&amp;gt; от &amp;lt;math&amp;gt;IAA&amp;lt;/math&amp;gt; до &amp;lt;math&amp;gt;IAB&amp;lt;/math&amp;gt; выполняется: &lt;br /&gt;
&lt;br /&gt;
&amp;lt;math&amp;gt;c_{i} = \sum\limits_{j = IAA_{i}}^{IAB_{i}} AN(j)B(JA(j))&amp;lt;/math&amp;gt;&lt;br /&gt;
&lt;br /&gt;
Псевдокод алгоритма: &lt;br /&gt;
&lt;br /&gt;
    FOR I = 1, N                          (1)&lt;br /&gt;
       U = 0.                             (2) &lt;br /&gt;
       IAA = IA(I)                        (3) &lt;br /&gt;
       IAB = IA(I + 1 ) - 1               (4)&lt;br /&gt;
       IF NOT(IAB.LT.IAA)                 (5)&lt;br /&gt;
           FOR J = IAA, IAB               (6)&lt;br /&gt;
           C(I) = U + AN(J)*B(JA(J))      (7)&lt;br /&gt;
&lt;br /&gt;
== Последовательная сложность алгоритма ==&lt;br /&gt;
&lt;br /&gt;
Для всего алгоритма потребуется выполнить &amp;lt;math&amp;gt;O(k)&amp;lt;/math&amp;gt; операций, как в строке стр.7 псевдокода алгоритма ([[#Схема реализации последовательного алгоритма|п.1.5]]), где &amp;lt;math&amp;gt;k&amp;lt;/math&amp;gt; - число ненулевых эле­ментов матрицы.&lt;br /&gt;
&lt;br /&gt;
== Информационный граф ==&lt;br /&gt;
&lt;br /&gt;
На рисунке 1 изображен информационный граф алгоритма.&lt;br /&gt;
&lt;br /&gt;
[[file:InfoGrafMatrixRRCUandVextor.jpg|thumb|center|1200px|Рисунок 1. Информационный граф алгоритма.]]&lt;br /&gt;
 &lt;br /&gt;
По оси &amp;lt;math&amp;gt;X&amp;lt;/math&amp;gt; для отдельной строки &amp;lt;math&amp;gt;I&amp;lt;/math&amp;gt; матрицы отложены в пределах первой &amp;lt;math&amp;gt;IAA&amp;lt;/math&amp;gt; и последней &amp;lt;math&amp;gt;IAB&amp;lt;/math&amp;gt; позиций ненулевых элементов значения &amp;lt;math&amp;gt;AN&amp;lt;/math&amp;gt; и соответствуюие им по столбцовомым индексам, хранимимым в &amp;lt;math&amp;gt;JA&amp;lt;/math&amp;gt;, значения &amp;lt;math&amp;gt;B&amp;lt;/math&amp;gt; элементов. &lt;br /&gt;
Пары этих значений обозначены желтыми квадратиками &amp;lt;math&amp;gt;(in)&amp;lt;/math&amp;gt;. Значения in попарно скалярно перемножаются (зеленый кружочек) и суммируются (синий кружочек) в результат значения элемента вектора-произведения &amp;lt;math&amp;gt;c_{i}&amp;lt;/math&amp;gt;, т.е &amp;lt;math&amp;gt;out&amp;lt;/math&amp;gt;(красный квадратик) с строковым индексом, соответствующем номеру строки матрицы.&lt;br /&gt;
&lt;br /&gt;
По оси &amp;lt;math&amp;gt;Y&amp;lt;/math&amp;gt; отложена схема вычисление значения каждого элемента вектора-произведения для каждой строки матрицы.&lt;br /&gt;
&lt;br /&gt;
== Ресурс параллелизма алгоритма ==&lt;br /&gt;
&lt;br /&gt;
Алгоритм обладает возможностью выполняться параллельно, что позволяет значительно ускорить вычисления.&lt;br /&gt;
Вычисление значения каждого элемента вектора-произведения для каждой строки матрицы и элемента вектора &amp;lt;math&amp;gt;B&amp;lt;/math&amp;gt; можно проводить на отдельных процессорах. &lt;br /&gt;
Максимальная эффективность вычислений достигается при наличии не менее, чем &amp;lt;math&amp;gt;N&amp;lt;/math&amp;gt; процессоров, т.е отдельный процессор на вычисление значения каждого элемента вектора-произведения. На процессоре выполняется &amp;lt;math&amp;gt;k(i)&amp;lt;/math&amp;gt; последовательных операций умножения и сложения. Поэтому число ярусов для &amp;lt;math&amp;gt;i&amp;lt;/math&amp;gt;-ого процессора равно &amp;lt;math&amp;gt;k(i)&amp;lt;/math&amp;gt;.&lt;br /&gt;
&lt;br /&gt;
Для параллельного выполнения алгоритма требуется:&lt;br /&gt;
&lt;br /&gt;
* &amp;lt;math&amp;gt;N&amp;lt;/math&amp;gt; ярусов умножений и сложений,&lt;br /&gt;
* в каждом из ярусов &amp;lt;math&amp;gt;k &amp;lt;&amp;lt; m&amp;lt;/math&amp;gt; операций.&lt;br /&gt;
&lt;br /&gt;
При классификации по высоте ЯПФ, алгоритм имеет линейную сложность. При классификации по высоте ЯПФ также линейную.&lt;br /&gt;
&lt;br /&gt;
== Входные и выходные данные алгоритма ==&lt;br /&gt;
&#039;&#039;&#039;Входные данные:&#039;&#039;&#039;&lt;br /&gt;
&lt;br /&gt;
* &amp;lt;math&amp;gt;IA, JA, AN&amp;lt;/math&amp;gt; - заданная матрица в форме &#039;&#039;&#039;(RR (С) U)&#039;&#039;&#039; c &amp;lt;math&amp;gt;k&amp;lt;/math&amp;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;B&amp;lt;/math&amp;gt; - заданный заполненный вектор c &amp;lt;math&amp;gt;m&amp;lt;/math&amp;gt; элементами;&lt;br /&gt;
&#039;&#039;&#039;&lt;br /&gt;
&#039;&#039;&#039;Объем входных данных&#039;&#039;&#039;: &amp;lt;math&amp;gt;k + m&amp;lt;/math&amp;gt;&lt;br /&gt;
&lt;br /&gt;
&#039;&#039;&#039;Выходные данные:&#039;&#039;&#039; &amp;lt;math&amp;gt;C&amp;lt;/math&amp;gt; вектор-произведение размерности &amp;lt;math&amp;gt;N&amp;lt;/math&amp;gt;.&lt;br /&gt;
&lt;br /&gt;
&#039;&#039;&#039;Объем выходных данных&#039;&#039;&#039;: &amp;lt;math&amp;gt;N&amp;lt;/math&amp;gt;&lt;br /&gt;
&lt;br /&gt;
== Свойства алгоритма ==&lt;br /&gt;
&lt;br /&gt;
Алгоритм в рамках выбранной версии полностью детерминирован.&lt;br /&gt;
&lt;br /&gt;
Вычислительная мощность алгоритма, как отношение числа операций к суммарному объему входных и выходных данных – константа.&lt;br /&gt;
&lt;br /&gt;
= Программная реализация алгоритма =&lt;br /&gt;
&lt;br /&gt;
&lt;br /&gt;
== Особенности реализации последовательного алгоритма ==&lt;br /&gt;
&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;IBM Blue Gene/P&#039;&#039; было проведено экспериментальное исследование масштабируемости программной реализации умножения разряженной матрицы на вектор. Результаты исследования представлены на рис.2:&lt;br /&gt;
&lt;br /&gt;
[[Файл:DependeceOfTheExecutionTime.jpg |thumb|center|900px|Рисунок 2. График зависимости времени выполнения программы умножения разряженной матрицы на вектор от количества ненулевых элементов матрицы для данного числа процессоров.]]&lt;br /&gt;
&lt;br /&gt;
Увеличивая число процессоров, можно добиться ускорения выполнения программы. Постепенно дальнейшие увеличение числа процессоров дает все меньший эффект из-за накладных расходов, связанных с организацией параллельного вычисления.&lt;br /&gt;
&lt;br /&gt;
== Динамические характеристики и эффективность реализации алгоритма ==&lt;br /&gt;
&lt;br /&gt;
== Выводы для классов архитектур ==&lt;br /&gt;
&lt;br /&gt;
== Существующие реализации алгоритма ==&lt;br /&gt;
&lt;br /&gt;
Алгоритм релизован в составе библиотек: &lt;br /&gt;
* SparseLib++[http://math.nist.gov/sparselib++/] &lt;br /&gt;
* cuSPARSE [http://docs.nvidia.com/cuda/cusparse/]&lt;br /&gt;
* uBLAS [http://www.boost.org/doc/libs/1_62_0/libs/numeric/ublas/doc/]&lt;br /&gt;
* Intel MKL [https://software.intel.com/en-us/intel-mkl]&lt;br /&gt;
&lt;br /&gt;
= Литература =&lt;br /&gt;
&lt;br /&gt;
* [1] С. Писсанецки. Технология разреженных матриц. Изд. Мир, 1988.&lt;br /&gt;
* [2] В. В. Воеводин, Вл.В. Воеводин. Параллельные вычисления. – СПб.: БХВ - Петербург, 2002.&lt;/div&gt;</summary>
		<author><name>Lexaloris</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:Lexaloris/%D0%A3%D0%BC%D0%BD%D0%BE%D0%B6%D0%B5%D0%BD%D0%B8%D0%B5_%D1%80%D0%B0%D0%B7%D1%80%D0%B5%D0%B6%D0%B5%D0%BD%D0%BD%D0%BE%D0%B9_%D0%BC%D0%B0%D1%82%D1%80%D0%B8%D1%86%D1%8B_%D0%BD%D0%B0_%D0%B2%D0%B5%D0%BA%D1%82%D0%BE%D1%80&amp;diff=18642</id>
		<title>Участник:Lexaloris/Умножение разреженной матрицы на вектор</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:Lexaloris/%D0%A3%D0%BC%D0%BD%D0%BE%D0%B6%D0%B5%D0%BD%D0%B8%D0%B5_%D1%80%D0%B0%D0%B7%D1%80%D0%B5%D0%B6%D0%B5%D0%BD%D0%BD%D0%BE%D0%B9_%D0%BC%D0%B0%D1%82%D1%80%D0%B8%D1%86%D1%8B_%D0%BD%D0%B0_%D0%B2%D0%B5%D0%BA%D1%82%D0%BE%D1%80&amp;diff=18642"/>
		<updated>2016-11-20T20:09:40Z</updated>

		<summary type="html">&lt;p&gt;Lexaloris: /* Масштабируемость алгоритма и его реализации */&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(k)&amp;lt;/math&amp;gt;&lt;br /&gt;
| pf_height         = &amp;lt;math&amp;gt;O(m)&amp;lt;/math&amp;gt;&lt;br /&gt;
| pf_width          = &amp;lt;math&amp;gt;O(n)&amp;lt;/math&amp;gt;&lt;br /&gt;
| input_data        = &amp;lt;math&amp;gt;k + m&amp;lt;/math&amp;gt;&lt;br /&gt;
| output_data       = &amp;lt;math&amp;gt;n&amp;lt;/math&amp;gt;&lt;br /&gt;
}}&lt;br /&gt;
&lt;br /&gt;
&lt;br /&gt;
&#039;&#039;&#039;Авторы страницы:&#039;&#039;&#039; [[Участник:Lexaloris|A.Д. Новоселов]] и [[Участник:kochet|П.А. Кочетков]]&lt;br /&gt;
&lt;br /&gt;
Кочетков Павел ответственен за программную реализацию алгоритма, Новоселов Алексей ответственен за оформление статьи. &lt;br /&gt;
&lt;br /&gt;
= Свойства и структура алгоритмов =&lt;br /&gt;
&lt;br /&gt;
== Общее описание алгоритма ==&lt;br /&gt;
&lt;br /&gt;
=== Хранение ненулевых элементов разреженной матрицы ===&lt;br /&gt;
&lt;br /&gt;
==== Разреженный строчной формат ====&lt;br /&gt;
&lt;br /&gt;
Одной из наиболее ши­роко используемых схем хранения разреженных матриц является &#039;&#039;разреженный строчный формат&#039;&#039;. Эта&lt;br /&gt;
схема предъявляет минимальные требования к памяти и в то же время оказывается очень удобной для умножения разреженной матрицы на вектор.&lt;br /&gt;
Например, рассмотрим формат хранения разряженной матрицы &amp;lt;math&amp;gt;A&amp;lt;/math&amp;gt;:&lt;br /&gt;
&lt;br /&gt;
[[File:RRCOMatrix.png]]&lt;br /&gt;
&lt;br /&gt;
Значения нену­левых элементов матрицы и соответствующие столбцовые индексы хранятся в этой схеме по строкам в двух массивах &amp;lt;math&amp;gt;AN&amp;lt;/math&amp;gt; и &amp;lt;math&amp;gt;JA&amp;lt;/math&amp;gt; соответственно. Используется также массив указателей &amp;lt;math&amp;gt;IA&amp;lt;/math&amp;gt;, отмечающих позиции массивов &amp;lt;math&amp;gt;AN&amp;lt;/math&amp;gt; и &amp;lt;math&amp;gt;JA&amp;lt;/math&amp;gt;, с которых начинается описание очередной строки. Дополнительная компо­нента в &amp;lt;math&amp;gt;IA&amp;lt;/math&amp;gt; содержит указатель первой свободной позиции в &amp;lt;math&amp;gt;JA&amp;lt;/math&amp;gt; и &amp;lt;math&amp;gt;AN&amp;lt;/math&amp;gt;.&lt;br /&gt;
&lt;br /&gt;
Таким образом &amp;lt;math&amp;gt;A&amp;lt;/math&amp;gt; представляется в виде:&lt;br /&gt;
&lt;br /&gt;
   IA = [ 1 4 4 6 ]&lt;br /&gt;
   JA = [ 3 4 8 6 8 ]&lt;br /&gt;
   AN = [ 1 3 5 7 1 ]&lt;br /&gt;
&lt;br /&gt;
Данный способ представления называют &#039;&#039;полным&#039;&#039;, поскольку представлена вся матрица &amp;lt;math&amp;gt;A&amp;lt;/math&amp;gt;, и &#039;&#039;упорядоченным&#039;&#039;, поскольку эле­менты каждой строки хранятся в соответствии с возрастанием столбцовых индексов. Таким образом, это строчное представление, полное и упорядоченное, или сокращенно &#039;&#039;&#039;(RR (С) О)&#039;&#039;&#039;.&lt;br /&gt;
&lt;br /&gt;
==== Неупорядоченное представление ====&lt;br /&gt;
&lt;br /&gt;
Представления разреженных матриц необязательно должны быть упорядочены в том смысле, что, хотя упорядоченность строк поддерживается, внутри каждой строки элементы могут храниться в произвольном порядке. Для матрицы А нашего примера вполне можно было бы использовать и строчное представление, полное, но &#039;&#039;неупорядоченное&#039;&#039; &#039;&#039;&#039;(RR (С) U )&#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;
   IA = [ 1 4 4 6 ]&lt;br /&gt;
   JA = [ 8 3 4 8 6 ]&lt;br /&gt;
   AN = [ 5 1 3 1 7 ]&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; — число строк матрицы. &lt;br /&gt;
Для каждой ее строки &amp;lt;math&amp;gt;I&amp;lt;/math&amp;gt; матрицы мы находим с помощью &amp;lt;math&amp;gt;IA&amp;lt;/math&amp;gt; значения первой &amp;lt;math&amp;gt;IAA&amp;lt;/math&amp;gt; и последней &amp;lt;math&amp;gt;IAB&amp;lt;/math&amp;gt; позиций, занимаемых элементами строки &amp;lt;math&amp;gt;I&amp;lt;/math&amp;gt; в массивах &amp;lt;math&amp;gt;JA&amp;lt;/math&amp;gt; и &amp;lt;math&amp;gt;AN&amp;lt;/math&amp;gt;. Затем, чтобы вычислить скалярное произведение строки &amp;lt;math&amp;gt;I&amp;lt;/math&amp;gt; и вектора &amp;lt;math&amp;gt;B&amp;lt;/math&amp;gt;, мы просто просматриваем &amp;lt;math&amp;gt;JA&amp;lt;/math&amp;gt; и &amp;lt;math&amp;gt;AN&amp;lt;/math&amp;gt; на отрезке от &amp;lt;math&amp;gt;IAA&amp;lt;/math&amp;gt; до &amp;lt;math&amp;gt;IAB&amp;lt;/math&amp;gt;:&lt;br /&gt;
каждое значение, хранимое в &amp;lt;math&amp;gt;JA&amp;lt;/math&amp;gt;, есть столбцовый индекс и используется для извлечения из массива &amp;lt;math&amp;gt;B&amp;lt;/math&amp;gt; элемента, который должен быть умножен на соответствующее число из &amp;lt;math&amp;gt;AN&amp;lt;/math&amp;gt;. Результат каж­дого умножения прибавляется к &amp;lt;math&amp;gt;C(I)&amp;lt;/math&amp;gt;.&lt;br /&gt;
&lt;br /&gt;
== Математическое описание алгоритма ==&lt;br /&gt;
&lt;br /&gt;
&#039;&#039;&#039;Исходные данные:&#039;&#039;&#039; &lt;br /&gt;
&lt;br /&gt;
&amp;lt;math&amp;gt;IA, JA, AN&amp;lt;/math&amp;gt; - заданная матрица в форме &#039;&#039;&#039;(RR (С) U)&#039;&#039;&#039;;&lt;br /&gt;
&lt;br /&gt;
&amp;lt;math&amp;gt;B&amp;lt;/math&amp;gt; - заданный заполненный вектор;&lt;br /&gt;
&lt;br /&gt;
&amp;lt;math&amp;gt;N&amp;lt;/math&amp;gt; - число строк матрицы.&lt;br /&gt;
&lt;br /&gt;
&#039;&#039;&#039;Выход:&#039;&#039;&#039; &amp;lt;math&amp;gt;C&amp;lt;/math&amp;gt; вектор-произведение размерности &amp;lt;math&amp;gt;N&amp;lt;/math&amp;gt;.&lt;br /&gt;
&lt;br /&gt;
&#039;&#039;&#039;Формулы метода:&#039;&#039;&#039;&lt;br /&gt;
&lt;br /&gt;
:&amp;lt;math&amp;gt;&lt;br /&gt;
\begin{align}&lt;br /&gt;
&amp;amp; IAA_{i} = IA(i), \quad i \in [1, N], \\&lt;br /&gt;
&amp;amp; IAB_{i} = IA(i + 1) - 1, \quad i \in [1, N], \\&lt;br /&gt;
&amp;amp; c_{i} = \sum\limits_{j = IAA_{i}}^{IAB_{i}} AN(j)B(JA(j)), \quad i \in [1, N] \\&lt;br /&gt;
\end{align}&lt;br /&gt;
&amp;lt;/math&amp;gt;&lt;br /&gt;
&lt;br /&gt;
== Вычислительное ядро алгоритма ==&lt;br /&gt;
&lt;br /&gt;
Вычислительным ядром, т.е. той частью алгоритма, на которую приходится основное время его работы, является вычисление значения &amp;lt;math&amp;gt;i&amp;lt;/math&amp;gt;-го элемента &amp;lt;math&amp;gt;c_{i}&amp;lt;/math&amp;gt; вектора-произведения, т.е произведения строки &amp;lt;math&amp;gt;I&amp;lt;/math&amp;gt; матрицы &amp;lt;math&amp;gt;A&amp;lt;/math&amp;gt; и вектора &amp;lt;math&amp;gt;B&amp;lt;/math&amp;gt; по формуле:&lt;br /&gt;
&lt;br /&gt;
:&amp;lt;math&amp;gt;&lt;br /&gt;
\begin{align}&lt;br /&gt;
&amp;amp; c_{i} = \sum\limits_{j = IAA_{i}}^{IAB_{i}} AN(j)B(JA(j)), \quad i \in [1, N] \\&lt;br /&gt;
\end{align}&lt;br /&gt;
&amp;lt;/math&amp;gt;&lt;br /&gt;
&lt;br /&gt;
== Макроструктура алгоритма ==&lt;br /&gt;
&lt;br /&gt;
Основу алгоритма составляет вычисление значения &amp;lt;math&amp;gt;i&amp;lt;/math&amp;gt;-го элемента &amp;lt;math&amp;gt;c_{i}&amp;lt;/math&amp;gt; вектора-произведения:&lt;br /&gt;
&lt;br /&gt;
:&amp;lt;math&amp;gt;&lt;br /&gt;
\begin{align}&lt;br /&gt;
&amp;amp; c_{i} = \sum\limits_{j = IAA_{i}}^{IAB_{i}} AN(j)B(JA(j)), \quad i \in [1, N] \\&lt;br /&gt;
\end{align}&lt;br /&gt;
&amp;lt;/math&amp;gt;&lt;br /&gt;
&lt;br /&gt;
== Схема реализации последовательного алгоритма ==&lt;br /&gt;
&lt;br /&gt;
Последовательность исполнения метода следующая: &lt;br /&gt;
&lt;br /&gt;
Далее для всех &amp;lt;math&amp;gt;i&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; по нарастанию выполняются:&lt;br /&gt;
&lt;br /&gt;
1. &amp;lt;math&amp;gt; c_{i} = 0; IAA = IA(i); IAB = IA(i + 1 ) - 1 &amp;lt;/math&amp;gt;&lt;br /&gt;
&lt;br /&gt;
После этого, если &amp;lt;math&amp;gt;(IAB \le IAA)&amp;lt;/math&amp;gt;:&lt;br /&gt;
&lt;br /&gt;
2. Для всех &amp;lt;math&amp;gt;j&amp;lt;/math&amp;gt; от &amp;lt;math&amp;gt;IAA&amp;lt;/math&amp;gt; до &amp;lt;math&amp;gt;IAB&amp;lt;/math&amp;gt; выполняется: &lt;br /&gt;
&lt;br /&gt;
&amp;lt;math&amp;gt;c_{i} = \sum\limits_{j = IAA_{i}}^{IAB_{i}} AN(j)B(JA(j))&amp;lt;/math&amp;gt;&lt;br /&gt;
&lt;br /&gt;
Псевдокод алгоритма: &lt;br /&gt;
&lt;br /&gt;
    FOR I = 1, N                          (1)&lt;br /&gt;
       U = 0.                             (2) &lt;br /&gt;
       IAA = IA(I)                        (3) &lt;br /&gt;
       IAB = IA(I + 1 ) - 1               (4)&lt;br /&gt;
       IF NOT(IAB.LT.IAA)                 (5)&lt;br /&gt;
           FOR J = IAA, IAB               (6)&lt;br /&gt;
           C(I) = U + AN(J)*B(JA(J))      (7)&lt;br /&gt;
&lt;br /&gt;
== Последовательная сложность алгоритма ==&lt;br /&gt;
&lt;br /&gt;
Для всего алгоритма потребуется выполнить &amp;lt;math&amp;gt;O(k)&amp;lt;/math&amp;gt; операций, как в строке стр.7 псевдокода алгоритма ([[#Схема реализации последовательного алгоритма|п.1.5]]), где &amp;lt;math&amp;gt;k&amp;lt;/math&amp;gt; - число ненулевых эле­ментов матрицы.&lt;br /&gt;
&lt;br /&gt;
== Информационный граф ==&lt;br /&gt;
&lt;br /&gt;
На рисунке 1 изображен информационный граф алгоритма.&lt;br /&gt;
&lt;br /&gt;
[[file:InfoGrafMatrixRRCUandVextor.jpg|thumb|center|1200px|Рисунок 1. Информационный граф алгоритма.]]&lt;br /&gt;
 &lt;br /&gt;
По оси &amp;lt;math&amp;gt;X&amp;lt;/math&amp;gt; для отдельной строки &amp;lt;math&amp;gt;I&amp;lt;/math&amp;gt; матрицы отложены в пределах первой &amp;lt;math&amp;gt;IAA&amp;lt;/math&amp;gt; и последней &amp;lt;math&amp;gt;IAB&amp;lt;/math&amp;gt; позиций ненулевых элементов значения &amp;lt;math&amp;gt;AN&amp;lt;/math&amp;gt; и соответствуюие им по столбцовомым индексам, хранимимым в &amp;lt;math&amp;gt;JA&amp;lt;/math&amp;gt;, значения &amp;lt;math&amp;gt;B&amp;lt;/math&amp;gt; элементов. &lt;br /&gt;
Пары этих значений обозначены желтыми квадратиками &amp;lt;math&amp;gt;(in)&amp;lt;/math&amp;gt;. Значения in попарно скалярно перемножаются (зеленый кружочек) и суммируются (синий кружочек) в результат значения элемента вектора-произведения &amp;lt;math&amp;gt;c_{i}&amp;lt;/math&amp;gt;, т.е &amp;lt;math&amp;gt;out&amp;lt;/math&amp;gt;(красный квадратик) с строковым индексом, соответствующем номеру строки матрицы.&lt;br /&gt;
&lt;br /&gt;
По оси &amp;lt;math&amp;gt;Y&amp;lt;/math&amp;gt; отложена схема вычисление значения каждого элемента вектора-произведения для каждой строки матрицы.&lt;br /&gt;
&lt;br /&gt;
== Ресурс параллелизма алгоритма ==&lt;br /&gt;
&lt;br /&gt;
Алгоритм обладает возможностью выполняться параллельно, что позволяет значительно ускорить вычисления.&lt;br /&gt;
Вычисление значения каждого элемента вектора-произведения для каждой строки матрицы и элемента вектора &amp;lt;math&amp;gt;B&amp;lt;/math&amp;gt; можно проводить на отдельных процессорах. &lt;br /&gt;
Максимальная эффективность вычислений достигается при наличии не менее, чем &amp;lt;math&amp;gt;N&amp;lt;/math&amp;gt; процессоров, т.е отдельный процессор на вычисление значения каждого элемента вектора-произведения. На процессоре выполняется &amp;lt;math&amp;gt;k(i)&amp;lt;/math&amp;gt; последовательных операций умножения и сложения. Поэтому число ярусов для &amp;lt;math&amp;gt;i&amp;lt;/math&amp;gt;-ого процессора равно &amp;lt;math&amp;gt;k(i)&amp;lt;/math&amp;gt;.&lt;br /&gt;
&lt;br /&gt;
Для параллельного выполнения алгоритма требуется:&lt;br /&gt;
&lt;br /&gt;
* &amp;lt;math&amp;gt;N&amp;lt;/math&amp;gt; ярусов умножений и сложений,&lt;br /&gt;
* в каждом из ярусов &amp;lt;math&amp;gt;k &amp;lt;&amp;lt; m&amp;lt;/math&amp;gt; операций.&lt;br /&gt;
&lt;br /&gt;
При классификации по высоте ЯПФ, алгоритм имеет линейную сложность. При классификации по высоте ЯПФ также линейную.&lt;br /&gt;
&lt;br /&gt;
== Входные и выходные данные алгоритма ==&lt;br /&gt;
&#039;&#039;&#039;Входные данные:&#039;&#039;&#039;&lt;br /&gt;
&lt;br /&gt;
* &amp;lt;math&amp;gt;IA, JA, AN&amp;lt;/math&amp;gt; - заданная матрица в форме &#039;&#039;&#039;(RR (С) U)&#039;&#039;&#039; c &amp;lt;math&amp;gt;k&amp;lt;/math&amp;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;B&amp;lt;/math&amp;gt; - заданный заполненный вектор c &amp;lt;math&amp;gt;m&amp;lt;/math&amp;gt; элементами;&lt;br /&gt;
&#039;&#039;&#039;&lt;br /&gt;
&#039;&#039;&#039;Объем входных данных&#039;&#039;&#039;: &amp;lt;math&amp;gt;k + m&amp;lt;/math&amp;gt;&lt;br /&gt;
&lt;br /&gt;
&#039;&#039;&#039;Выходные данные:&#039;&#039;&#039; &amp;lt;math&amp;gt;C&amp;lt;/math&amp;gt; вектор-произведение размерности &amp;lt;math&amp;gt;N&amp;lt;/math&amp;gt;.&lt;br /&gt;
&lt;br /&gt;
&#039;&#039;&#039;Объем выходных данных&#039;&#039;&#039;: &amp;lt;math&amp;gt;N&amp;lt;/math&amp;gt;&lt;br /&gt;
&lt;br /&gt;
== Свойства алгоритма ==&lt;br /&gt;
&lt;br /&gt;
Алгоритм в рамках выбранной версии полностью детерминирован.&lt;br /&gt;
&lt;br /&gt;
Вычислительная мощность алгоритма, как отношение числа операций к суммарному объему входных и выходных данных – константа.&lt;br /&gt;
&lt;br /&gt;
= Программная реализация алгоритма =&lt;br /&gt;
&lt;br /&gt;
&lt;br /&gt;
== Особенности реализации последовательного алгоритма ==&lt;br /&gt;
&lt;br /&gt;
== Локальность данных и вычислений ==&lt;br /&gt;
&lt;br /&gt;
== Возможные способы и особенности параллельной реализации алгоритма ==&lt;br /&gt;
&lt;br /&gt;
== Масштабируемость алгоритма и его реализации ==&lt;br /&gt;
&lt;br /&gt;
[[Файл:DependeceOfTheExecutionTime.jpg |thumb|center|900px|Рисунок 2. График зависимости времени выполнения программы умножения разряженной матрицы на вектор от количества ненулевых элементов матрицы для данного числа процессоров.]]&lt;br /&gt;
&lt;br /&gt;
== Динамические характеристики и эффективность реализации алгоритма ==&lt;br /&gt;
&lt;br /&gt;
== Выводы для классов архитектур ==&lt;br /&gt;
&lt;br /&gt;
== Существующие реализации алгоритма ==&lt;br /&gt;
&lt;br /&gt;
Алгоритм релизован в составе библиотек: &lt;br /&gt;
* SparseLib++[http://math.nist.gov/sparselib++/] &lt;br /&gt;
* cuSPARSE [http://docs.nvidia.com/cuda/cusparse/]&lt;br /&gt;
* uBLAS [http://www.boost.org/doc/libs/1_62_0/libs/numeric/ublas/doc/]&lt;br /&gt;
* Intel MKL [https://software.intel.com/en-us/intel-mkl]&lt;br /&gt;
&lt;br /&gt;
= Литература =&lt;br /&gt;
&lt;br /&gt;
* [1] С. Писсанецки. Технология разреженных матриц. Изд. Мир, 1988.&lt;br /&gt;
* [2] В. В. Воеводин, Вл.В. Воеводин. Параллельные вычисления. – СПб.: БХВ - Петербург, 2002.&lt;/div&gt;</summary>
		<author><name>Lexaloris</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:Lexaloris/%D0%A3%D0%BC%D0%BD%D0%BE%D0%B6%D0%B5%D0%BD%D0%B8%D0%B5_%D1%80%D0%B0%D0%B7%D1%80%D0%B5%D0%B6%D0%B5%D0%BD%D0%BD%D0%BE%D0%B9_%D0%BC%D0%B0%D1%82%D1%80%D0%B8%D1%86%D1%8B_%D0%BD%D0%B0_%D0%B2%D0%B5%D0%BA%D1%82%D0%BE%D1%80&amp;diff=18641</id>
		<title>Участник:Lexaloris/Умножение разреженной матрицы на вектор</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:Lexaloris/%D0%A3%D0%BC%D0%BD%D0%BE%D0%B6%D0%B5%D0%BD%D0%B8%D0%B5_%D1%80%D0%B0%D0%B7%D1%80%D0%B5%D0%B6%D0%B5%D0%BD%D0%BD%D0%BE%D0%B9_%D0%BC%D0%B0%D1%82%D1%80%D0%B8%D1%86%D1%8B_%D0%BD%D0%B0_%D0%B2%D0%B5%D0%BA%D1%82%D0%BE%D1%80&amp;diff=18641"/>
		<updated>2016-11-20T20:01:45Z</updated>

		<summary type="html">&lt;p&gt;Lexaloris: /* Масштабируемость алгоритма и его реализации */&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(k)&amp;lt;/math&amp;gt;&lt;br /&gt;
| pf_height         = &amp;lt;math&amp;gt;O(m)&amp;lt;/math&amp;gt;&lt;br /&gt;
| pf_width          = &amp;lt;math&amp;gt;O(n)&amp;lt;/math&amp;gt;&lt;br /&gt;
| input_data        = &amp;lt;math&amp;gt;k + m&amp;lt;/math&amp;gt;&lt;br /&gt;
| output_data       = &amp;lt;math&amp;gt;n&amp;lt;/math&amp;gt;&lt;br /&gt;
}}&lt;br /&gt;
&lt;br /&gt;
&lt;br /&gt;
&#039;&#039;&#039;Авторы страницы:&#039;&#039;&#039; [[Участник:Lexaloris|A.Д. Новоселов]] и [[Участник:kochet|П.А. Кочетков]]&lt;br /&gt;
&lt;br /&gt;
Кочетков Павел ответственен за программную реализацию алгоритма, Новоселов Алексей ответственен за оформление статьи. &lt;br /&gt;
&lt;br /&gt;
= Свойства и структура алгоритмов =&lt;br /&gt;
&lt;br /&gt;
== Общее описание алгоритма ==&lt;br /&gt;
&lt;br /&gt;
=== Хранение ненулевых элементов разреженной матрицы ===&lt;br /&gt;
&lt;br /&gt;
==== Разреженный строчной формат ====&lt;br /&gt;
&lt;br /&gt;
Одной из наиболее ши­роко используемых схем хранения разреженных матриц является &#039;&#039;разреженный строчный формат&#039;&#039;. Эта&lt;br /&gt;
схема предъявляет минимальные требования к памяти и в то же время оказывается очень удобной для умножения разреженной матрицы на вектор.&lt;br /&gt;
Например, рассмотрим формат хранения разряженной матрицы &amp;lt;math&amp;gt;A&amp;lt;/math&amp;gt;:&lt;br /&gt;
&lt;br /&gt;
[[File:RRCOMatrix.png]]&lt;br /&gt;
&lt;br /&gt;
Значения нену­левых элементов матрицы и соответствующие столбцовые индексы хранятся в этой схеме по строкам в двух массивах &amp;lt;math&amp;gt;AN&amp;lt;/math&amp;gt; и &amp;lt;math&amp;gt;JA&amp;lt;/math&amp;gt; соответственно. Используется также массив указателей &amp;lt;math&amp;gt;IA&amp;lt;/math&amp;gt;, отмечающих позиции массивов &amp;lt;math&amp;gt;AN&amp;lt;/math&amp;gt; и &amp;lt;math&amp;gt;JA&amp;lt;/math&amp;gt;, с которых начинается описание очередной строки. Дополнительная компо­нента в &amp;lt;math&amp;gt;IA&amp;lt;/math&amp;gt; содержит указатель первой свободной позиции в &amp;lt;math&amp;gt;JA&amp;lt;/math&amp;gt; и &amp;lt;math&amp;gt;AN&amp;lt;/math&amp;gt;.&lt;br /&gt;
&lt;br /&gt;
Таким образом &amp;lt;math&amp;gt;A&amp;lt;/math&amp;gt; представляется в виде:&lt;br /&gt;
&lt;br /&gt;
   IA = [ 1 4 4 6 ]&lt;br /&gt;
   JA = [ 3 4 8 6 8 ]&lt;br /&gt;
   AN = [ 1 3 5 7 1 ]&lt;br /&gt;
&lt;br /&gt;
Данный способ представления называют &#039;&#039;полным&#039;&#039;, поскольку представлена вся матрица &amp;lt;math&amp;gt;A&amp;lt;/math&amp;gt;, и &#039;&#039;упорядоченным&#039;&#039;, поскольку эле­менты каждой строки хранятся в соответствии с возрастанием столбцовых индексов. Таким образом, это строчное представление, полное и упорядоченное, или сокращенно &#039;&#039;&#039;(RR (С) О)&#039;&#039;&#039;.&lt;br /&gt;
&lt;br /&gt;
==== Неупорядоченное представление ====&lt;br /&gt;
&lt;br /&gt;
Представления разреженных матриц необязательно должны быть упорядочены в том смысле, что, хотя упорядоченность строк поддерживается, внутри каждой строки элементы могут храниться в произвольном порядке. Для матрицы А нашего примера вполне можно было бы использовать и строчное представление, полное, но &#039;&#039;неупорядоченное&#039;&#039; &#039;&#039;&#039;(RR (С) U )&#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;
   IA = [ 1 4 4 6 ]&lt;br /&gt;
   JA = [ 8 3 4 8 6 ]&lt;br /&gt;
   AN = [ 5 1 3 1 7 ]&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; — число строк матрицы. &lt;br /&gt;
Для каждой ее строки &amp;lt;math&amp;gt;I&amp;lt;/math&amp;gt; матрицы мы находим с помощью &amp;lt;math&amp;gt;IA&amp;lt;/math&amp;gt; значения первой &amp;lt;math&amp;gt;IAA&amp;lt;/math&amp;gt; и последней &amp;lt;math&amp;gt;IAB&amp;lt;/math&amp;gt; позиций, занимаемых элементами строки &amp;lt;math&amp;gt;I&amp;lt;/math&amp;gt; в массивах &amp;lt;math&amp;gt;JA&amp;lt;/math&amp;gt; и &amp;lt;math&amp;gt;AN&amp;lt;/math&amp;gt;. Затем, чтобы вычислить скалярное произведение строки &amp;lt;math&amp;gt;I&amp;lt;/math&amp;gt; и вектора &amp;lt;math&amp;gt;B&amp;lt;/math&amp;gt;, мы просто просматриваем &amp;lt;math&amp;gt;JA&amp;lt;/math&amp;gt; и &amp;lt;math&amp;gt;AN&amp;lt;/math&amp;gt; на отрезке от &amp;lt;math&amp;gt;IAA&amp;lt;/math&amp;gt; до &amp;lt;math&amp;gt;IAB&amp;lt;/math&amp;gt;:&lt;br /&gt;
каждое значение, хранимое в &amp;lt;math&amp;gt;JA&amp;lt;/math&amp;gt;, есть столбцовый индекс и используется для извлечения из массива &amp;lt;math&amp;gt;B&amp;lt;/math&amp;gt; элемента, который должен быть умножен на соответствующее число из &amp;lt;math&amp;gt;AN&amp;lt;/math&amp;gt;. Результат каж­дого умножения прибавляется к &amp;lt;math&amp;gt;C(I)&amp;lt;/math&amp;gt;.&lt;br /&gt;
&lt;br /&gt;
== Математическое описание алгоритма ==&lt;br /&gt;
&lt;br /&gt;
&#039;&#039;&#039;Исходные данные:&#039;&#039;&#039; &lt;br /&gt;
&lt;br /&gt;
&amp;lt;math&amp;gt;IA, JA, AN&amp;lt;/math&amp;gt; - заданная матрица в форме &#039;&#039;&#039;(RR (С) U)&#039;&#039;&#039;;&lt;br /&gt;
&lt;br /&gt;
&amp;lt;math&amp;gt;B&amp;lt;/math&amp;gt; - заданный заполненный вектор;&lt;br /&gt;
&lt;br /&gt;
&amp;lt;math&amp;gt;N&amp;lt;/math&amp;gt; - число строк матрицы.&lt;br /&gt;
&lt;br /&gt;
&#039;&#039;&#039;Выход:&#039;&#039;&#039; &amp;lt;math&amp;gt;C&amp;lt;/math&amp;gt; вектор-произведение размерности &amp;lt;math&amp;gt;N&amp;lt;/math&amp;gt;.&lt;br /&gt;
&lt;br /&gt;
&#039;&#039;&#039;Формулы метода:&#039;&#039;&#039;&lt;br /&gt;
&lt;br /&gt;
:&amp;lt;math&amp;gt;&lt;br /&gt;
\begin{align}&lt;br /&gt;
&amp;amp; IAA_{i} = IA(i), \quad i \in [1, N], \\&lt;br /&gt;
&amp;amp; IAB_{i} = IA(i + 1) - 1, \quad i \in [1, N], \\&lt;br /&gt;
&amp;amp; c_{i} = \sum\limits_{j = IAA_{i}}^{IAB_{i}} AN(j)B(JA(j)), \quad i \in [1, N] \\&lt;br /&gt;
\end{align}&lt;br /&gt;
&amp;lt;/math&amp;gt;&lt;br /&gt;
&lt;br /&gt;
== Вычислительное ядро алгоритма ==&lt;br /&gt;
&lt;br /&gt;
Вычислительным ядром, т.е. той частью алгоритма, на которую приходится основное время его работы, является вычисление значения &amp;lt;math&amp;gt;i&amp;lt;/math&amp;gt;-го элемента &amp;lt;math&amp;gt;c_{i}&amp;lt;/math&amp;gt; вектора-произведения, т.е произведения строки &amp;lt;math&amp;gt;I&amp;lt;/math&amp;gt; матрицы &amp;lt;math&amp;gt;A&amp;lt;/math&amp;gt; и вектора &amp;lt;math&amp;gt;B&amp;lt;/math&amp;gt; по формуле:&lt;br /&gt;
&lt;br /&gt;
:&amp;lt;math&amp;gt;&lt;br /&gt;
\begin{align}&lt;br /&gt;
&amp;amp; c_{i} = \sum\limits_{j = IAA_{i}}^{IAB_{i}} AN(j)B(JA(j)), \quad i \in [1, N] \\&lt;br /&gt;
\end{align}&lt;br /&gt;
&amp;lt;/math&amp;gt;&lt;br /&gt;
&lt;br /&gt;
== Макроструктура алгоритма ==&lt;br /&gt;
&lt;br /&gt;
Основу алгоритма составляет вычисление значения &amp;lt;math&amp;gt;i&amp;lt;/math&amp;gt;-го элемента &amp;lt;math&amp;gt;c_{i}&amp;lt;/math&amp;gt; вектора-произведения:&lt;br /&gt;
&lt;br /&gt;
:&amp;lt;math&amp;gt;&lt;br /&gt;
\begin{align}&lt;br /&gt;
&amp;amp; c_{i} = \sum\limits_{j = IAA_{i}}^{IAB_{i}} AN(j)B(JA(j)), \quad i \in [1, N] \\&lt;br /&gt;
\end{align}&lt;br /&gt;
&amp;lt;/math&amp;gt;&lt;br /&gt;
&lt;br /&gt;
== Схема реализации последовательного алгоритма ==&lt;br /&gt;
&lt;br /&gt;
Последовательность исполнения метода следующая: &lt;br /&gt;
&lt;br /&gt;
Далее для всех &amp;lt;math&amp;gt;i&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; по нарастанию выполняются:&lt;br /&gt;
&lt;br /&gt;
1. &amp;lt;math&amp;gt; c_{i} = 0; IAA = IA(i); IAB = IA(i + 1 ) - 1 &amp;lt;/math&amp;gt;&lt;br /&gt;
&lt;br /&gt;
После этого, если &amp;lt;math&amp;gt;(IAB \le IAA)&amp;lt;/math&amp;gt;:&lt;br /&gt;
&lt;br /&gt;
2. Для всех &amp;lt;math&amp;gt;j&amp;lt;/math&amp;gt; от &amp;lt;math&amp;gt;IAA&amp;lt;/math&amp;gt; до &amp;lt;math&amp;gt;IAB&amp;lt;/math&amp;gt; выполняется: &lt;br /&gt;
&lt;br /&gt;
&amp;lt;math&amp;gt;c_{i} = \sum\limits_{j = IAA_{i}}^{IAB_{i}} AN(j)B(JA(j))&amp;lt;/math&amp;gt;&lt;br /&gt;
&lt;br /&gt;
Псевдокод алгоритма: &lt;br /&gt;
&lt;br /&gt;
    FOR I = 1, N                          (1)&lt;br /&gt;
       U = 0.                             (2) &lt;br /&gt;
       IAA = IA(I)                        (3) &lt;br /&gt;
       IAB = IA(I + 1 ) - 1               (4)&lt;br /&gt;
       IF NOT(IAB.LT.IAA)                 (5)&lt;br /&gt;
           FOR J = IAA, IAB               (6)&lt;br /&gt;
           C(I) = U + AN(J)*B(JA(J))      (7)&lt;br /&gt;
&lt;br /&gt;
== Последовательная сложность алгоритма ==&lt;br /&gt;
&lt;br /&gt;
Для всего алгоритма потребуется выполнить &amp;lt;math&amp;gt;O(k)&amp;lt;/math&amp;gt; операций, как в строке стр.7 псевдокода алгоритма ([[#Схема реализации последовательного алгоритма|п.1.5]]), где &amp;lt;math&amp;gt;k&amp;lt;/math&amp;gt; - число ненулевых эле­ментов матрицы.&lt;br /&gt;
&lt;br /&gt;
== Информационный граф ==&lt;br /&gt;
&lt;br /&gt;
На рисунке 1 изображен информационный граф алгоритма.&lt;br /&gt;
&lt;br /&gt;
[[file:InfoGrafMatrixRRCUandVextor.jpg|thumb|center|1200px|Рисунок 1. Информационный граф алгоритма.]]&lt;br /&gt;
 &lt;br /&gt;
По оси &amp;lt;math&amp;gt;X&amp;lt;/math&amp;gt; для отдельной строки &amp;lt;math&amp;gt;I&amp;lt;/math&amp;gt; матрицы отложены в пределах первой &amp;lt;math&amp;gt;IAA&amp;lt;/math&amp;gt; и последней &amp;lt;math&amp;gt;IAB&amp;lt;/math&amp;gt; позиций ненулевых элементов значения &amp;lt;math&amp;gt;AN&amp;lt;/math&amp;gt; и соответствуюие им по столбцовомым индексам, хранимимым в &amp;lt;math&amp;gt;JA&amp;lt;/math&amp;gt;, значения &amp;lt;math&amp;gt;B&amp;lt;/math&amp;gt; элементов. &lt;br /&gt;
Пары этих значений обозначены желтыми квадратиками &amp;lt;math&amp;gt;(in)&amp;lt;/math&amp;gt;. Значения in попарно скалярно перемножаются (зеленый кружочек) и суммируются (синий кружочек) в результат значения элемента вектора-произведения &amp;lt;math&amp;gt;c_{i}&amp;lt;/math&amp;gt;, т.е &amp;lt;math&amp;gt;out&amp;lt;/math&amp;gt;(красный квадратик) с строковым индексом, соответствующем номеру строки матрицы.&lt;br /&gt;
&lt;br /&gt;
По оси &amp;lt;math&amp;gt;Y&amp;lt;/math&amp;gt; отложена схема вычисление значения каждого элемента вектора-произведения для каждой строки матрицы.&lt;br /&gt;
&lt;br /&gt;
== Ресурс параллелизма алгоритма ==&lt;br /&gt;
&lt;br /&gt;
Алгоритм обладает возможностью выполняться параллельно, что позволяет значительно ускорить вычисления.&lt;br /&gt;
Вычисление значения каждого элемента вектора-произведения для каждой строки матрицы и элемента вектора &amp;lt;math&amp;gt;B&amp;lt;/math&amp;gt; можно проводить на отдельных процессорах. &lt;br /&gt;
Максимальная эффективность вычислений достигается при наличии не менее, чем &amp;lt;math&amp;gt;N&amp;lt;/math&amp;gt; процессоров, т.е отдельный процессор на вычисление значения каждого элемента вектора-произведения. На процессоре выполняется &amp;lt;math&amp;gt;k(i)&amp;lt;/math&amp;gt; последовательных операций умножения и сложения. Поэтому число ярусов для &amp;lt;math&amp;gt;i&amp;lt;/math&amp;gt;-ого процессора равно &amp;lt;math&amp;gt;k(i)&amp;lt;/math&amp;gt;.&lt;br /&gt;
&lt;br /&gt;
Для параллельного выполнения алгоритма требуется:&lt;br /&gt;
&lt;br /&gt;
* &amp;lt;math&amp;gt;N&amp;lt;/math&amp;gt; ярусов умножений и сложений,&lt;br /&gt;
* в каждом из ярусов &amp;lt;math&amp;gt;k &amp;lt;&amp;lt; m&amp;lt;/math&amp;gt; операций.&lt;br /&gt;
&lt;br /&gt;
При классификации по высоте ЯПФ, алгоритм имеет линейную сложность. При классификации по высоте ЯПФ также линейную.&lt;br /&gt;
&lt;br /&gt;
== Входные и выходные данные алгоритма ==&lt;br /&gt;
&#039;&#039;&#039;Входные данные:&#039;&#039;&#039;&lt;br /&gt;
&lt;br /&gt;
* &amp;lt;math&amp;gt;IA, JA, AN&amp;lt;/math&amp;gt; - заданная матрица в форме &#039;&#039;&#039;(RR (С) U)&#039;&#039;&#039; c &amp;lt;math&amp;gt;k&amp;lt;/math&amp;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;B&amp;lt;/math&amp;gt; - заданный заполненный вектор c &amp;lt;math&amp;gt;m&amp;lt;/math&amp;gt; элементами;&lt;br /&gt;
&#039;&#039;&#039;&lt;br /&gt;
&#039;&#039;&#039;Объем входных данных&#039;&#039;&#039;: &amp;lt;math&amp;gt;k + m&amp;lt;/math&amp;gt;&lt;br /&gt;
&lt;br /&gt;
&#039;&#039;&#039;Выходные данные:&#039;&#039;&#039; &amp;lt;math&amp;gt;C&amp;lt;/math&amp;gt; вектор-произведение размерности &amp;lt;math&amp;gt;N&amp;lt;/math&amp;gt;.&lt;br /&gt;
&lt;br /&gt;
&#039;&#039;&#039;Объем выходных данных&#039;&#039;&#039;: &amp;lt;math&amp;gt;N&amp;lt;/math&amp;gt;&lt;br /&gt;
&lt;br /&gt;
== Свойства алгоритма ==&lt;br /&gt;
&lt;br /&gt;
Алгоритм в рамках выбранной версии полностью детерминирован.&lt;br /&gt;
&lt;br /&gt;
Вычислительная мощность алгоритма, как отношение числа операций к суммарному объему входных и выходных данных – константа.&lt;br /&gt;
&lt;br /&gt;
= Программная реализация алгоритма =&lt;br /&gt;
&lt;br /&gt;
&lt;br /&gt;
== Особенности реализации последовательного алгоритма ==&lt;br /&gt;
&lt;br /&gt;
== Локальность данных и вычислений ==&lt;br /&gt;
&lt;br /&gt;
== Возможные способы и особенности параллельной реализации алгоритма ==&lt;br /&gt;
&lt;br /&gt;
== Масштабируемость алгоритма и его реализации ==&lt;br /&gt;
&lt;br /&gt;
[[Файл:DependeceOfTheExecutionTime.jpg]]&lt;br /&gt;
&lt;br /&gt;
== Динамические характеристики и эффективность реализации алгоритма ==&lt;br /&gt;
&lt;br /&gt;
== Выводы для классов архитектур ==&lt;br /&gt;
&lt;br /&gt;
== Существующие реализации алгоритма ==&lt;br /&gt;
&lt;br /&gt;
Алгоритм релизован в составе библиотек: &lt;br /&gt;
* SparseLib++[http://math.nist.gov/sparselib++/] &lt;br /&gt;
* cuSPARSE [http://docs.nvidia.com/cuda/cusparse/]&lt;br /&gt;
* uBLAS [http://www.boost.org/doc/libs/1_62_0/libs/numeric/ublas/doc/]&lt;br /&gt;
* Intel MKL [https://software.intel.com/en-us/intel-mkl]&lt;br /&gt;
&lt;br /&gt;
= Литература =&lt;br /&gt;
&lt;br /&gt;
* [1] С. Писсанецки. Технология разреженных матриц. Изд. Мир, 1988.&lt;br /&gt;
* [2] В. В. Воеводин, Вл.В. Воеводин. Параллельные вычисления. – СПб.: БХВ - Петербург, 2002.&lt;/div&gt;</summary>
		<author><name>Lexaloris</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:Lexaloris/%D0%A3%D0%BC%D0%BD%D0%BE%D0%B6%D0%B5%D0%BD%D0%B8%D0%B5_%D1%80%D0%B0%D0%B7%D1%80%D0%B5%D0%B6%D0%B5%D0%BD%D0%BD%D0%BE%D0%B9_%D0%BC%D0%B0%D1%82%D1%80%D0%B8%D1%86%D1%8B_%D0%BD%D0%B0_%D0%B2%D0%B5%D0%BA%D1%82%D0%BE%D1%80&amp;diff=18640</id>
		<title>Участник:Lexaloris/Умножение разреженной матрицы на вектор</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:Lexaloris/%D0%A3%D0%BC%D0%BD%D0%BE%D0%B6%D0%B5%D0%BD%D0%B8%D0%B5_%D1%80%D0%B0%D0%B7%D1%80%D0%B5%D0%B6%D0%B5%D0%BD%D0%BD%D0%BE%D0%B9_%D0%BC%D0%B0%D1%82%D1%80%D0%B8%D1%86%D1%8B_%D0%BD%D0%B0_%D0%B2%D0%B5%D0%BA%D1%82%D0%BE%D1%80&amp;diff=18640"/>
		<updated>2016-11-20T19:59:35Z</updated>

		<summary type="html">&lt;p&gt;Lexaloris: /* Масштабируемость алгоритма и его реализации */&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(k)&amp;lt;/math&amp;gt;&lt;br /&gt;
| pf_height         = &amp;lt;math&amp;gt;O(m)&amp;lt;/math&amp;gt;&lt;br /&gt;
| pf_width          = &amp;lt;math&amp;gt;O(n)&amp;lt;/math&amp;gt;&lt;br /&gt;
| input_data        = &amp;lt;math&amp;gt;k + m&amp;lt;/math&amp;gt;&lt;br /&gt;
| output_data       = &amp;lt;math&amp;gt;n&amp;lt;/math&amp;gt;&lt;br /&gt;
}}&lt;br /&gt;
&lt;br /&gt;
&lt;br /&gt;
&#039;&#039;&#039;Авторы страницы:&#039;&#039;&#039; [[Участник:Lexaloris|A.Д. Новоселов]] и [[Участник:kochet|П.А. Кочетков]]&lt;br /&gt;
&lt;br /&gt;
Кочетков Павел ответственен за программную реализацию алгоритма, Новоселов Алексей ответственен за оформление статьи. &lt;br /&gt;
&lt;br /&gt;
= Свойства и структура алгоритмов =&lt;br /&gt;
&lt;br /&gt;
== Общее описание алгоритма ==&lt;br /&gt;
&lt;br /&gt;
=== Хранение ненулевых элементов разреженной матрицы ===&lt;br /&gt;
&lt;br /&gt;
==== Разреженный строчной формат ====&lt;br /&gt;
&lt;br /&gt;
Одной из наиболее ши­роко используемых схем хранения разреженных матриц является &#039;&#039;разреженный строчный формат&#039;&#039;. Эта&lt;br /&gt;
схема предъявляет минимальные требования к памяти и в то же время оказывается очень удобной для умножения разреженной матрицы на вектор.&lt;br /&gt;
Например, рассмотрим формат хранения разряженной матрицы &amp;lt;math&amp;gt;A&amp;lt;/math&amp;gt;:&lt;br /&gt;
&lt;br /&gt;
[[File:RRCOMatrix.png]]&lt;br /&gt;
&lt;br /&gt;
Значения нену­левых элементов матрицы и соответствующие столбцовые индексы хранятся в этой схеме по строкам в двух массивах &amp;lt;math&amp;gt;AN&amp;lt;/math&amp;gt; и &amp;lt;math&amp;gt;JA&amp;lt;/math&amp;gt; соответственно. Используется также массив указателей &amp;lt;math&amp;gt;IA&amp;lt;/math&amp;gt;, отмечающих позиции массивов &amp;lt;math&amp;gt;AN&amp;lt;/math&amp;gt; и &amp;lt;math&amp;gt;JA&amp;lt;/math&amp;gt;, с которых начинается описание очередной строки. Дополнительная компо­нента в &amp;lt;math&amp;gt;IA&amp;lt;/math&amp;gt; содержит указатель первой свободной позиции в &amp;lt;math&amp;gt;JA&amp;lt;/math&amp;gt; и &amp;lt;math&amp;gt;AN&amp;lt;/math&amp;gt;.&lt;br /&gt;
&lt;br /&gt;
Таким образом &amp;lt;math&amp;gt;A&amp;lt;/math&amp;gt; представляется в виде:&lt;br /&gt;
&lt;br /&gt;
   IA = [ 1 4 4 6 ]&lt;br /&gt;
   JA = [ 3 4 8 6 8 ]&lt;br /&gt;
   AN = [ 1 3 5 7 1 ]&lt;br /&gt;
&lt;br /&gt;
Данный способ представления называют &#039;&#039;полным&#039;&#039;, поскольку представлена вся матрица &amp;lt;math&amp;gt;A&amp;lt;/math&amp;gt;, и &#039;&#039;упорядоченным&#039;&#039;, поскольку эле­менты каждой строки хранятся в соответствии с возрастанием столбцовых индексов. Таким образом, это строчное представление, полное и упорядоченное, или сокращенно &#039;&#039;&#039;(RR (С) О)&#039;&#039;&#039;.&lt;br /&gt;
&lt;br /&gt;
==== Неупорядоченное представление ====&lt;br /&gt;
&lt;br /&gt;
Представления разреженных матриц необязательно должны быть упорядочены в том смысле, что, хотя упорядоченность строк поддерживается, внутри каждой строки элементы могут храниться в произвольном порядке. Для матрицы А нашего примера вполне можно было бы использовать и строчное представление, полное, но &#039;&#039;неупорядоченное&#039;&#039; &#039;&#039;&#039;(RR (С) U )&#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;
   IA = [ 1 4 4 6 ]&lt;br /&gt;
   JA = [ 8 3 4 8 6 ]&lt;br /&gt;
   AN = [ 5 1 3 1 7 ]&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; — число строк матрицы. &lt;br /&gt;
Для каждой ее строки &amp;lt;math&amp;gt;I&amp;lt;/math&amp;gt; матрицы мы находим с помощью &amp;lt;math&amp;gt;IA&amp;lt;/math&amp;gt; значения первой &amp;lt;math&amp;gt;IAA&amp;lt;/math&amp;gt; и последней &amp;lt;math&amp;gt;IAB&amp;lt;/math&amp;gt; позиций, занимаемых элементами строки &amp;lt;math&amp;gt;I&amp;lt;/math&amp;gt; в массивах &amp;lt;math&amp;gt;JA&amp;lt;/math&amp;gt; и &amp;lt;math&amp;gt;AN&amp;lt;/math&amp;gt;. Затем, чтобы вычислить скалярное произведение строки &amp;lt;math&amp;gt;I&amp;lt;/math&amp;gt; и вектора &amp;lt;math&amp;gt;B&amp;lt;/math&amp;gt;, мы просто просматриваем &amp;lt;math&amp;gt;JA&amp;lt;/math&amp;gt; и &amp;lt;math&amp;gt;AN&amp;lt;/math&amp;gt; на отрезке от &amp;lt;math&amp;gt;IAA&amp;lt;/math&amp;gt; до &amp;lt;math&amp;gt;IAB&amp;lt;/math&amp;gt;:&lt;br /&gt;
каждое значение, хранимое в &amp;lt;math&amp;gt;JA&amp;lt;/math&amp;gt;, есть столбцовый индекс и используется для извлечения из массива &amp;lt;math&amp;gt;B&amp;lt;/math&amp;gt; элемента, который должен быть умножен на соответствующее число из &amp;lt;math&amp;gt;AN&amp;lt;/math&amp;gt;. Результат каж­дого умножения прибавляется к &amp;lt;math&amp;gt;C(I)&amp;lt;/math&amp;gt;.&lt;br /&gt;
&lt;br /&gt;
== Математическое описание алгоритма ==&lt;br /&gt;
&lt;br /&gt;
&#039;&#039;&#039;Исходные данные:&#039;&#039;&#039; &lt;br /&gt;
&lt;br /&gt;
&amp;lt;math&amp;gt;IA, JA, AN&amp;lt;/math&amp;gt; - заданная матрица в форме &#039;&#039;&#039;(RR (С) U)&#039;&#039;&#039;;&lt;br /&gt;
&lt;br /&gt;
&amp;lt;math&amp;gt;B&amp;lt;/math&amp;gt; - заданный заполненный вектор;&lt;br /&gt;
&lt;br /&gt;
&amp;lt;math&amp;gt;N&amp;lt;/math&amp;gt; - число строк матрицы.&lt;br /&gt;
&lt;br /&gt;
&#039;&#039;&#039;Выход:&#039;&#039;&#039; &amp;lt;math&amp;gt;C&amp;lt;/math&amp;gt; вектор-произведение размерности &amp;lt;math&amp;gt;N&amp;lt;/math&amp;gt;.&lt;br /&gt;
&lt;br /&gt;
&#039;&#039;&#039;Формулы метода:&#039;&#039;&#039;&lt;br /&gt;
&lt;br /&gt;
:&amp;lt;math&amp;gt;&lt;br /&gt;
\begin{align}&lt;br /&gt;
&amp;amp; IAA_{i} = IA(i), \quad i \in [1, N], \\&lt;br /&gt;
&amp;amp; IAB_{i} = IA(i + 1) - 1, \quad i \in [1, N], \\&lt;br /&gt;
&amp;amp; c_{i} = \sum\limits_{j = IAA_{i}}^{IAB_{i}} AN(j)B(JA(j)), \quad i \in [1, N] \\&lt;br /&gt;
\end{align}&lt;br /&gt;
&amp;lt;/math&amp;gt;&lt;br /&gt;
&lt;br /&gt;
== Вычислительное ядро алгоритма ==&lt;br /&gt;
&lt;br /&gt;
Вычислительным ядром, т.е. той частью алгоритма, на которую приходится основное время его работы, является вычисление значения &amp;lt;math&amp;gt;i&amp;lt;/math&amp;gt;-го элемента &amp;lt;math&amp;gt;c_{i}&amp;lt;/math&amp;gt; вектора-произведения, т.е произведения строки &amp;lt;math&amp;gt;I&amp;lt;/math&amp;gt; матрицы &amp;lt;math&amp;gt;A&amp;lt;/math&amp;gt; и вектора &amp;lt;math&amp;gt;B&amp;lt;/math&amp;gt; по формуле:&lt;br /&gt;
&lt;br /&gt;
:&amp;lt;math&amp;gt;&lt;br /&gt;
\begin{align}&lt;br /&gt;
&amp;amp; c_{i} = \sum\limits_{j = IAA_{i}}^{IAB_{i}} AN(j)B(JA(j)), \quad i \in [1, N] \\&lt;br /&gt;
\end{align}&lt;br /&gt;
&amp;lt;/math&amp;gt;&lt;br /&gt;
&lt;br /&gt;
== Макроструктура алгоритма ==&lt;br /&gt;
&lt;br /&gt;
Основу алгоритма составляет вычисление значения &amp;lt;math&amp;gt;i&amp;lt;/math&amp;gt;-го элемента &amp;lt;math&amp;gt;c_{i}&amp;lt;/math&amp;gt; вектора-произведения:&lt;br /&gt;
&lt;br /&gt;
:&amp;lt;math&amp;gt;&lt;br /&gt;
\begin{align}&lt;br /&gt;
&amp;amp; c_{i} = \sum\limits_{j = IAA_{i}}^{IAB_{i}} AN(j)B(JA(j)), \quad i \in [1, N] \\&lt;br /&gt;
\end{align}&lt;br /&gt;
&amp;lt;/math&amp;gt;&lt;br /&gt;
&lt;br /&gt;
== Схема реализации последовательного алгоритма ==&lt;br /&gt;
&lt;br /&gt;
Последовательность исполнения метода следующая: &lt;br /&gt;
&lt;br /&gt;
Далее для всех &amp;lt;math&amp;gt;i&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; по нарастанию выполняются:&lt;br /&gt;
&lt;br /&gt;
1. &amp;lt;math&amp;gt; c_{i} = 0; IAA = IA(i); IAB = IA(i + 1 ) - 1 &amp;lt;/math&amp;gt;&lt;br /&gt;
&lt;br /&gt;
После этого, если &amp;lt;math&amp;gt;(IAB \le IAA)&amp;lt;/math&amp;gt;:&lt;br /&gt;
&lt;br /&gt;
2. Для всех &amp;lt;math&amp;gt;j&amp;lt;/math&amp;gt; от &amp;lt;math&amp;gt;IAA&amp;lt;/math&amp;gt; до &amp;lt;math&amp;gt;IAB&amp;lt;/math&amp;gt; выполняется: &lt;br /&gt;
&lt;br /&gt;
&amp;lt;math&amp;gt;c_{i} = \sum\limits_{j = IAA_{i}}^{IAB_{i}} AN(j)B(JA(j))&amp;lt;/math&amp;gt;&lt;br /&gt;
&lt;br /&gt;
Псевдокод алгоритма: &lt;br /&gt;
&lt;br /&gt;
    FOR I = 1, N                          (1)&lt;br /&gt;
       U = 0.                             (2) &lt;br /&gt;
       IAA = IA(I)                        (3) &lt;br /&gt;
       IAB = IA(I + 1 ) - 1               (4)&lt;br /&gt;
       IF NOT(IAB.LT.IAA)                 (5)&lt;br /&gt;
           FOR J = IAA, IAB               (6)&lt;br /&gt;
           C(I) = U + AN(J)*B(JA(J))      (7)&lt;br /&gt;
&lt;br /&gt;
== Последовательная сложность алгоритма ==&lt;br /&gt;
&lt;br /&gt;
Для всего алгоритма потребуется выполнить &amp;lt;math&amp;gt;O(k)&amp;lt;/math&amp;gt; операций, как в строке стр.7 псевдокода алгоритма ([[#Схема реализации последовательного алгоритма|п.1.5]]), где &amp;lt;math&amp;gt;k&amp;lt;/math&amp;gt; - число ненулевых эле­ментов матрицы.&lt;br /&gt;
&lt;br /&gt;
== Информационный граф ==&lt;br /&gt;
&lt;br /&gt;
На рисунке 1 изображен информационный граф алгоритма.&lt;br /&gt;
&lt;br /&gt;
[[file:InfoGrafMatrixRRCUandVextor.jpg|thumb|center|1200px|Рисунок 1. Информационный граф алгоритма.]]&lt;br /&gt;
 &lt;br /&gt;
По оси &amp;lt;math&amp;gt;X&amp;lt;/math&amp;gt; для отдельной строки &amp;lt;math&amp;gt;I&amp;lt;/math&amp;gt; матрицы отложены в пределах первой &amp;lt;math&amp;gt;IAA&amp;lt;/math&amp;gt; и последней &amp;lt;math&amp;gt;IAB&amp;lt;/math&amp;gt; позиций ненулевых элементов значения &amp;lt;math&amp;gt;AN&amp;lt;/math&amp;gt; и соответствуюие им по столбцовомым индексам, хранимимым в &amp;lt;math&amp;gt;JA&amp;lt;/math&amp;gt;, значения &amp;lt;math&amp;gt;B&amp;lt;/math&amp;gt; элементов. &lt;br /&gt;
Пары этих значений обозначены желтыми квадратиками &amp;lt;math&amp;gt;(in)&amp;lt;/math&amp;gt;. Значения in попарно скалярно перемножаются (зеленый кружочек) и суммируются (синий кружочек) в результат значения элемента вектора-произведения &amp;lt;math&amp;gt;c_{i}&amp;lt;/math&amp;gt;, т.е &amp;lt;math&amp;gt;out&amp;lt;/math&amp;gt;(красный квадратик) с строковым индексом, соответствующем номеру строки матрицы.&lt;br /&gt;
&lt;br /&gt;
По оси &amp;lt;math&amp;gt;Y&amp;lt;/math&amp;gt; отложена схема вычисление значения каждого элемента вектора-произведения для каждой строки матрицы.&lt;br /&gt;
&lt;br /&gt;
== Ресурс параллелизма алгоритма ==&lt;br /&gt;
&lt;br /&gt;
Алгоритм обладает возможностью выполняться параллельно, что позволяет значительно ускорить вычисления.&lt;br /&gt;
Вычисление значения каждого элемента вектора-произведения для каждой строки матрицы и элемента вектора &amp;lt;math&amp;gt;B&amp;lt;/math&amp;gt; можно проводить на отдельных процессорах. &lt;br /&gt;
Максимальная эффективность вычислений достигается при наличии не менее, чем &amp;lt;math&amp;gt;N&amp;lt;/math&amp;gt; процессоров, т.е отдельный процессор на вычисление значения каждого элемента вектора-произведения. На процессоре выполняется &amp;lt;math&amp;gt;k(i)&amp;lt;/math&amp;gt; последовательных операций умножения и сложения. Поэтому число ярусов для &amp;lt;math&amp;gt;i&amp;lt;/math&amp;gt;-ого процессора равно &amp;lt;math&amp;gt;k(i)&amp;lt;/math&amp;gt;.&lt;br /&gt;
&lt;br /&gt;
Для параллельного выполнения алгоритма требуется:&lt;br /&gt;
&lt;br /&gt;
* &amp;lt;math&amp;gt;N&amp;lt;/math&amp;gt; ярусов умножений и сложений,&lt;br /&gt;
* в каждом из ярусов &amp;lt;math&amp;gt;k &amp;lt;&amp;lt; m&amp;lt;/math&amp;gt; операций.&lt;br /&gt;
&lt;br /&gt;
При классификации по высоте ЯПФ, алгоритм имеет линейную сложность. При классификации по высоте ЯПФ также линейную.&lt;br /&gt;
&lt;br /&gt;
== Входные и выходные данные алгоритма ==&lt;br /&gt;
&#039;&#039;&#039;Входные данные:&#039;&#039;&#039;&lt;br /&gt;
&lt;br /&gt;
* &amp;lt;math&amp;gt;IA, JA, AN&amp;lt;/math&amp;gt; - заданная матрица в форме &#039;&#039;&#039;(RR (С) U)&#039;&#039;&#039; c &amp;lt;math&amp;gt;k&amp;lt;/math&amp;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;B&amp;lt;/math&amp;gt; - заданный заполненный вектор c &amp;lt;math&amp;gt;m&amp;lt;/math&amp;gt; элементами;&lt;br /&gt;
&#039;&#039;&#039;&lt;br /&gt;
&#039;&#039;&#039;Объем входных данных&#039;&#039;&#039;: &amp;lt;math&amp;gt;k + m&amp;lt;/math&amp;gt;&lt;br /&gt;
&lt;br /&gt;
&#039;&#039;&#039;Выходные данные:&#039;&#039;&#039; &amp;lt;math&amp;gt;C&amp;lt;/math&amp;gt; вектор-произведение размерности &amp;lt;math&amp;gt;N&amp;lt;/math&amp;gt;.&lt;br /&gt;
&lt;br /&gt;
&#039;&#039;&#039;Объем выходных данных&#039;&#039;&#039;: &amp;lt;math&amp;gt;N&amp;lt;/math&amp;gt;&lt;br /&gt;
&lt;br /&gt;
== Свойства алгоритма ==&lt;br /&gt;
&lt;br /&gt;
Алгоритм в рамках выбранной версии полностью детерминирован.&lt;br /&gt;
&lt;br /&gt;
Вычислительная мощность алгоритма, как отношение числа операций к суммарному объему входных и выходных данных – константа.&lt;br /&gt;
&lt;br /&gt;
= Программная реализация алгоритма =&lt;br /&gt;
&lt;br /&gt;
&lt;br /&gt;
== Особенности реализации последовательного алгоритма ==&lt;br /&gt;
&lt;br /&gt;
== Локальность данных и вычислений ==&lt;br /&gt;
&lt;br /&gt;
== Возможные способы и особенности параллельной реализации алгоритма ==&lt;br /&gt;
&lt;br /&gt;
== Масштабируемость алгоритма и его реализации ==&lt;br /&gt;
&lt;br /&gt;
[[Файл:Example.jpg]]&lt;br /&gt;
&lt;br /&gt;
== Динамические характеристики и эффективность реализации алгоритма ==&lt;br /&gt;
&lt;br /&gt;
== Выводы для классов архитектур ==&lt;br /&gt;
&lt;br /&gt;
== Существующие реализации алгоритма ==&lt;br /&gt;
&lt;br /&gt;
Алгоритм релизован в составе библиотек: &lt;br /&gt;
* SparseLib++[http://math.nist.gov/sparselib++/] &lt;br /&gt;
* cuSPARSE [http://docs.nvidia.com/cuda/cusparse/]&lt;br /&gt;
* uBLAS [http://www.boost.org/doc/libs/1_62_0/libs/numeric/ublas/doc/]&lt;br /&gt;
* Intel MKL [https://software.intel.com/en-us/intel-mkl]&lt;br /&gt;
&lt;br /&gt;
= Литература =&lt;br /&gt;
&lt;br /&gt;
* [1] С. Писсанецки. Технология разреженных матриц. Изд. Мир, 1988.&lt;br /&gt;
* [2] В. В. Воеводин, Вл.В. Воеводин. Параллельные вычисления. – СПб.: БХВ - Петербург, 2002.&lt;/div&gt;</summary>
		<author><name>Lexaloris</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:Lexaloris/%D0%A3%D0%BC%D0%BD%D0%BE%D0%B6%D0%B5%D0%BD%D0%B8%D0%B5_%D1%80%D0%B0%D0%B7%D1%80%D0%B5%D0%B6%D0%B5%D0%BD%D0%BD%D0%BE%D0%B9_%D0%BC%D0%B0%D1%82%D1%80%D0%B8%D1%86%D1%8B_%D0%BD%D0%B0_%D0%B2%D0%B5%D0%BA%D1%82%D0%BE%D1%80&amp;diff=15562</id>
		<title>Участник:Lexaloris/Умножение разреженной матрицы на вектор</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:Lexaloris/%D0%A3%D0%BC%D0%BD%D0%BE%D0%B6%D0%B5%D0%BD%D0%B8%D0%B5_%D1%80%D0%B0%D0%B7%D1%80%D0%B5%D0%B6%D0%B5%D0%BD%D0%BD%D0%BE%D0%B9_%D0%BC%D0%B0%D1%82%D1%80%D0%B8%D1%86%D1%8B_%D0%BD%D0%B0_%D0%B2%D0%B5%D0%BA%D1%82%D0%BE%D1%80&amp;diff=15562"/>
		<updated>2016-11-01T14:42:51Z</updated>

		<summary type="html">&lt;p&gt;Lexaloris: &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(k)&amp;lt;/math&amp;gt;&lt;br /&gt;
| pf_height         = &amp;lt;math&amp;gt;O(m)&amp;lt;/math&amp;gt;&lt;br /&gt;
| pf_width          = &amp;lt;math&amp;gt;O(n)&amp;lt;/math&amp;gt;&lt;br /&gt;
| input_data        = &amp;lt;math&amp;gt;k + m&amp;lt;/math&amp;gt;&lt;br /&gt;
| output_data       = &amp;lt;math&amp;gt;n&amp;lt;/math&amp;gt;&lt;br /&gt;
}}&lt;br /&gt;
&lt;br /&gt;
&lt;br /&gt;
&#039;&#039;&#039;Авторы страницы:&#039;&#039;&#039; [[Участник:Lexaloris|A.Д. Новоселов]] и [[Участник:kochet|П.А. Кочетков]]&lt;br /&gt;
&lt;br /&gt;
Кочетков Павел ответственен за программную реализацию алгоритма, Новоселов Алексей ответственен за оформление статьи. &lt;br /&gt;
&lt;br /&gt;
= Свойства и структура алгоритмов =&lt;br /&gt;
&lt;br /&gt;
== Общее описание алгоритма ==&lt;br /&gt;
&lt;br /&gt;
=== Хранение ненулевых элементов разреженной матрицы ===&lt;br /&gt;
&lt;br /&gt;
==== Разреженный строчной формат ====&lt;br /&gt;
&lt;br /&gt;
Одной из наиболее ши­роко используемых схем хранения разреженных матриц является &#039;&#039;разреженный строчный формат&#039;&#039;. Эта&lt;br /&gt;
схема предъявляет минимальные требования к памяти и в то же время оказывается очень удобной для умножения разреженной матрицы на вектор.&lt;br /&gt;
Например, рассмотрим формат хранения разряженной матрицы &amp;lt;math&amp;gt;A&amp;lt;/math&amp;gt;:&lt;br /&gt;
&lt;br /&gt;
[[File:RRCOMatrix.png]]&lt;br /&gt;
&lt;br /&gt;
Значения нену­левых элементов матрицы и соответствующие столбцовые индексы хранятся в этой схеме по строкам в двух массивах &amp;lt;math&amp;gt;AN&amp;lt;/math&amp;gt; и &amp;lt;math&amp;gt;JA&amp;lt;/math&amp;gt; соответственно. Используется также массив указателей &amp;lt;math&amp;gt;IA&amp;lt;/math&amp;gt;, отмечающих позиции массивов &amp;lt;math&amp;gt;AN&amp;lt;/math&amp;gt; и &amp;lt;math&amp;gt;JA&amp;lt;/math&amp;gt;, с которых начинается описание очередной строки. Дополнительная компо­нента в &amp;lt;math&amp;gt;IA&amp;lt;/math&amp;gt; содержит указатель первой свободной позиции в &amp;lt;math&amp;gt;JA&amp;lt;/math&amp;gt; и &amp;lt;math&amp;gt;AN&amp;lt;/math&amp;gt;.&lt;br /&gt;
&lt;br /&gt;
Таким образом &amp;lt;math&amp;gt;A&amp;lt;/math&amp;gt; представляется в виде:&lt;br /&gt;
&lt;br /&gt;
   IA = [ 1 4 4 6 ]&lt;br /&gt;
   JA = [ 3 4 8 6 8 ]&lt;br /&gt;
   AN = [ 1 3 5 7 1 ]&lt;br /&gt;
&lt;br /&gt;
Данный способ представления называют &#039;&#039;полным&#039;&#039;, поскольку представлена вся матрица &amp;lt;math&amp;gt;A&amp;lt;/math&amp;gt;, и &#039;&#039;упорядоченным&#039;&#039;, поскольку эле­менты каждой строки хранятся в соответствии с возрастанием столбцовых индексов. Таким образом, это строчное представление, полное и упорядоченное, или сокращенно &#039;&#039;&#039;(RR (С) О)&#039;&#039;&#039;.&lt;br /&gt;
&lt;br /&gt;
==== Неупорядоченное представление ====&lt;br /&gt;
&lt;br /&gt;
Представления разреженных матриц необязательно должны быть упорядочены в том смысле, что, хотя упорядоченность строк поддерживается, внутри каждой строки элементы могут храниться в произвольном порядке. Для матрицы А нашего примера вполне можно было бы использовать и строчное представление, полное, но &#039;&#039;неупорядоченное&#039;&#039; &#039;&#039;&#039;(RR (С) U )&#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;
   IA = [ 1 4 4 6 ]&lt;br /&gt;
   JA = [ 8 3 4 8 6 ]&lt;br /&gt;
   AN = [ 5 1 3 1 7 ]&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; — число строк матрицы. &lt;br /&gt;
Для каждой ее строки &amp;lt;math&amp;gt;I&amp;lt;/math&amp;gt; матрицы мы находим с помощью &amp;lt;math&amp;gt;IA&amp;lt;/math&amp;gt; значения первой &amp;lt;math&amp;gt;IAA&amp;lt;/math&amp;gt; и последней &amp;lt;math&amp;gt;IAB&amp;lt;/math&amp;gt; позиций, занимаемых элементами строки &amp;lt;math&amp;gt;I&amp;lt;/math&amp;gt; в массивах &amp;lt;math&amp;gt;JA&amp;lt;/math&amp;gt; и &amp;lt;math&amp;gt;AN&amp;lt;/math&amp;gt;. Затем, чтобы вычислить скалярное произведение строки &amp;lt;math&amp;gt;I&amp;lt;/math&amp;gt; и вектора &amp;lt;math&amp;gt;B&amp;lt;/math&amp;gt;, мы просто просматриваем &amp;lt;math&amp;gt;JA&amp;lt;/math&amp;gt; и &amp;lt;math&amp;gt;AN&amp;lt;/math&amp;gt; на отрезке от &amp;lt;math&amp;gt;IAA&amp;lt;/math&amp;gt; до &amp;lt;math&amp;gt;IAB&amp;lt;/math&amp;gt;:&lt;br /&gt;
каждое значение, хранимое в &amp;lt;math&amp;gt;JA&amp;lt;/math&amp;gt;, есть столбцовый индекс и используется для извлечения из массива &amp;lt;math&amp;gt;B&amp;lt;/math&amp;gt; элемента, который должен быть умножен на соответствующее число из &amp;lt;math&amp;gt;AN&amp;lt;/math&amp;gt;. Результат каж­дого умножения прибавляется к &amp;lt;math&amp;gt;C(I)&amp;lt;/math&amp;gt;.&lt;br /&gt;
&lt;br /&gt;
== Математическое описание алгоритма ==&lt;br /&gt;
&lt;br /&gt;
&#039;&#039;&#039;Исходные данные:&#039;&#039;&#039; &lt;br /&gt;
&lt;br /&gt;
&amp;lt;math&amp;gt;IA, JA, AN&amp;lt;/math&amp;gt; - заданная матрица в форме &#039;&#039;&#039;(RR (С) U)&#039;&#039;&#039;;&lt;br /&gt;
&lt;br /&gt;
&amp;lt;math&amp;gt;B&amp;lt;/math&amp;gt; - заданный заполненный вектор;&lt;br /&gt;
&lt;br /&gt;
&amp;lt;math&amp;gt;N&amp;lt;/math&amp;gt; - число строк матрицы.&lt;br /&gt;
&lt;br /&gt;
&#039;&#039;&#039;Выход:&#039;&#039;&#039; &amp;lt;math&amp;gt;C&amp;lt;/math&amp;gt; вектор-произведение размерности &amp;lt;math&amp;gt;N&amp;lt;/math&amp;gt;.&lt;br /&gt;
&lt;br /&gt;
&#039;&#039;&#039;Формулы метода:&#039;&#039;&#039;&lt;br /&gt;
&lt;br /&gt;
:&amp;lt;math&amp;gt;&lt;br /&gt;
\begin{align}&lt;br /&gt;
&amp;amp; IAA_{i} = IA(i), \quad i \in [1, N], \\&lt;br /&gt;
&amp;amp; IAB_{i} = IA(i + 1) - 1, \quad i \in [1, N], \\&lt;br /&gt;
&amp;amp; c_{i} = \sum\limits_{j = IAA_{i}}^{IAB_{i}} AN(j)B(JA(j)), \quad i \in [1, N] \\&lt;br /&gt;
\end{align}&lt;br /&gt;
&amp;lt;/math&amp;gt;&lt;br /&gt;
&lt;br /&gt;
== Вычислительное ядро алгоритма ==&lt;br /&gt;
&lt;br /&gt;
Вычислительным ядром, т.е. той частью алгоритма, на которую приходится основное время его работы, является вычисление значения &amp;lt;math&amp;gt;i&amp;lt;/math&amp;gt;-го элемента &amp;lt;math&amp;gt;c_{i}&amp;lt;/math&amp;gt; вектора-произведения, т.е произведения строки &amp;lt;math&amp;gt;I&amp;lt;/math&amp;gt; матрицы &amp;lt;math&amp;gt;A&amp;lt;/math&amp;gt; и вектора &amp;lt;math&amp;gt;B&amp;lt;/math&amp;gt; по формуле:&lt;br /&gt;
&lt;br /&gt;
:&amp;lt;math&amp;gt;&lt;br /&gt;
\begin{align}&lt;br /&gt;
&amp;amp; c_{i} = \sum\limits_{j = IAA_{i}}^{IAB_{i}} AN(j)B(JA(j)), \quad i \in [1, N] \\&lt;br /&gt;
\end{align}&lt;br /&gt;
&amp;lt;/math&amp;gt;&lt;br /&gt;
&lt;br /&gt;
== Макроструктура алгоритма ==&lt;br /&gt;
&lt;br /&gt;
Основу алгоритма составляет вычисление значения &amp;lt;math&amp;gt;i&amp;lt;/math&amp;gt;-го элемента &amp;lt;math&amp;gt;c_{i}&amp;lt;/math&amp;gt; вектора-произведения:&lt;br /&gt;
&lt;br /&gt;
:&amp;lt;math&amp;gt;&lt;br /&gt;
\begin{align}&lt;br /&gt;
&amp;amp; c_{i} = \sum\limits_{j = IAA_{i}}^{IAB_{i}} AN(j)B(JA(j)), \quad i \in [1, N] \\&lt;br /&gt;
\end{align}&lt;br /&gt;
&amp;lt;/math&amp;gt;&lt;br /&gt;
&lt;br /&gt;
== Схема реализации последовательного алгоритма ==&lt;br /&gt;
&lt;br /&gt;
Последовательность исполнения метода следующая: &lt;br /&gt;
&lt;br /&gt;
Далее для всех &amp;lt;math&amp;gt;i&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; по нарастанию выполняются:&lt;br /&gt;
&lt;br /&gt;
1. &amp;lt;math&amp;gt; c_{i} = 0; IAA = IA(i); IAB = IA(i + 1 ) - 1 &amp;lt;/math&amp;gt;&lt;br /&gt;
&lt;br /&gt;
После этого, если &amp;lt;math&amp;gt;(IAB \le IAA)&amp;lt;/math&amp;gt;:&lt;br /&gt;
&lt;br /&gt;
2. Для всех &amp;lt;math&amp;gt;j&amp;lt;/math&amp;gt; от &amp;lt;math&amp;gt;IAA&amp;lt;/math&amp;gt; до &amp;lt;math&amp;gt;IAB&amp;lt;/math&amp;gt; выполняется: &lt;br /&gt;
&lt;br /&gt;
&amp;lt;math&amp;gt;c_{i} = \sum\limits_{j = IAA_{i}}^{IAB_{i}} AN(j)B(JA(j))&amp;lt;/math&amp;gt;&lt;br /&gt;
&lt;br /&gt;
Псевдокод алгоритма: &lt;br /&gt;
&lt;br /&gt;
    FOR I = 1, N                          (1)&lt;br /&gt;
       U = 0.                             (2) &lt;br /&gt;
       IAA = IA(I)                        (3) &lt;br /&gt;
       IAB = IA(I + 1 ) - 1               (4)&lt;br /&gt;
       IF NOT(IAB.LT.IAA)                 (5)&lt;br /&gt;
           FOR J = IAA, IAB               (6)&lt;br /&gt;
           C(I) = U + AN(J)*B(JA(J))      (7)&lt;br /&gt;
&lt;br /&gt;
== Последовательная сложность алгоритма ==&lt;br /&gt;
&lt;br /&gt;
Для всего алгоритма потребуется выполнить &amp;lt;math&amp;gt;O(k)&amp;lt;/math&amp;gt; операций, как в строке стр.7 псевдокода алгоритма ([[#Схема реализации последовательного алгоритма|п.1.5]]), где &amp;lt;math&amp;gt;k&amp;lt;/math&amp;gt; - число ненулевых эле­ментов матрицы.&lt;br /&gt;
&lt;br /&gt;
== Информационный граф ==&lt;br /&gt;
&lt;br /&gt;
На рисунке 1 изображен информационный граф алгоритма.&lt;br /&gt;
&lt;br /&gt;
[[file:InfoGrafMatrixRRCUandVextor.jpg|thumb|center|1200px|Рисунок 1. Информационный граф алгоритма.]]&lt;br /&gt;
 &lt;br /&gt;
По оси &amp;lt;math&amp;gt;X&amp;lt;/math&amp;gt; для отдельной строки &amp;lt;math&amp;gt;I&amp;lt;/math&amp;gt; матрицы отложены в пределах первой &amp;lt;math&amp;gt;IAA&amp;lt;/math&amp;gt; и последней &amp;lt;math&amp;gt;IAB&amp;lt;/math&amp;gt; позиций ненулевых элементов значения &amp;lt;math&amp;gt;AN&amp;lt;/math&amp;gt; и соответствуюие им по столбцовомым индексам, хранимимым в &amp;lt;math&amp;gt;JA&amp;lt;/math&amp;gt;, значения &amp;lt;math&amp;gt;B&amp;lt;/math&amp;gt; элементов. &lt;br /&gt;
Пары этих значений обозначены желтыми квадратиками &amp;lt;math&amp;gt;(in)&amp;lt;/math&amp;gt;. Значения in попарно скалярно перемножаются (зеленый кружочек) и суммируются (синий кружочек) в результат значения элемента вектора-произведения &amp;lt;math&amp;gt;c_{i}&amp;lt;/math&amp;gt;, т.е &amp;lt;math&amp;gt;out&amp;lt;/math&amp;gt;(красный квадратик) с строковым индексом, соответствующем номеру строки матрицы.&lt;br /&gt;
&lt;br /&gt;
По оси &amp;lt;math&amp;gt;Y&amp;lt;/math&amp;gt; отложена схема вычисление значения каждого элемента вектора-произведения для каждой строки матрицы.&lt;br /&gt;
&lt;br /&gt;
== Ресурс параллелизма алгоритма ==&lt;br /&gt;
&lt;br /&gt;
Алгоритм обладает возможностью выполняться параллельно, что позволяет значительно ускорить вычисления.&lt;br /&gt;
Вычисление значения каждого элемента вектора-произведения для каждой строки матрицы и элемента вектора &amp;lt;math&amp;gt;B&amp;lt;/math&amp;gt; можно проводить на отдельных процессорах. &lt;br /&gt;
Максимальная эффективность вычислений достигается при наличии не менее, чем &amp;lt;math&amp;gt;N&amp;lt;/math&amp;gt; процессоров, т.е отдельный процессор на вычисление значения каждого элемента вектора-произведения. На процессоре выполняется &amp;lt;math&amp;gt;k(i)&amp;lt;/math&amp;gt; последовательных операций умножения и сложения. Поэтому число ярусов для &amp;lt;math&amp;gt;i&amp;lt;/math&amp;gt;-ого процессора равно &amp;lt;math&amp;gt;k(i)&amp;lt;/math&amp;gt;.&lt;br /&gt;
&lt;br /&gt;
Для параллельного выполнения алгоритма требуется:&lt;br /&gt;
&lt;br /&gt;
* &amp;lt;math&amp;gt;N&amp;lt;/math&amp;gt; ярусов умножений и сложений,&lt;br /&gt;
* в каждом из ярусов &amp;lt;math&amp;gt;k &amp;lt;&amp;lt; m&amp;lt;/math&amp;gt; операций.&lt;br /&gt;
&lt;br /&gt;
При классификации по высоте ЯПФ, алгоритм имеет линейную сложность. При классификации по высоте ЯПФ также линейную.&lt;br /&gt;
&lt;br /&gt;
== Входные и выходные данные алгоритма ==&lt;br /&gt;
&#039;&#039;&#039;Входные данные:&#039;&#039;&#039;&lt;br /&gt;
&lt;br /&gt;
* &amp;lt;math&amp;gt;IA, JA, AN&amp;lt;/math&amp;gt; - заданная матрица в форме &#039;&#039;&#039;(RR (С) U)&#039;&#039;&#039; c &amp;lt;math&amp;gt;k&amp;lt;/math&amp;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;B&amp;lt;/math&amp;gt; - заданный заполненный вектор c &amp;lt;math&amp;gt;m&amp;lt;/math&amp;gt; элементами;&lt;br /&gt;
&#039;&#039;&#039;&lt;br /&gt;
&#039;&#039;&#039;Объем входных данных&#039;&#039;&#039;: &amp;lt;math&amp;gt;k + m&amp;lt;/math&amp;gt;&lt;br /&gt;
&lt;br /&gt;
&#039;&#039;&#039;Выходные данные:&#039;&#039;&#039; &amp;lt;math&amp;gt;C&amp;lt;/math&amp;gt; вектор-произведение размерности &amp;lt;math&amp;gt;N&amp;lt;/math&amp;gt;.&lt;br /&gt;
&lt;br /&gt;
&#039;&#039;&#039;Объем выходных данных&#039;&#039;&#039;: &amp;lt;math&amp;gt;N&amp;lt;/math&amp;gt;&lt;br /&gt;
&lt;br /&gt;
== Свойства алгоритма ==&lt;br /&gt;
&lt;br /&gt;
Алгоритм в рамках выбранной версии полностью детерминирован.&lt;br /&gt;
&lt;br /&gt;
Вычислительная мощность алгоритма, как отношение числа операций к суммарному объему входных и выходных данных – константа.&lt;br /&gt;
&lt;br /&gt;
= Программная реализация алгоритма =&lt;br /&gt;
&lt;br /&gt;
&lt;br /&gt;
== Особенности реализации последовательного алгоритма ==&lt;br /&gt;
&lt;br /&gt;
== Локальность данных и вычислений ==&lt;br /&gt;
&lt;br /&gt;
== Возможные способы и особенности параллельной реализации алгоритма ==&lt;br /&gt;
&lt;br /&gt;
== Масштабируемость алгоритма и его реализации ==&lt;br /&gt;
&lt;br /&gt;
== Динамические характеристики и эффективность реализации алгоритма ==&lt;br /&gt;
&lt;br /&gt;
== Выводы для классов архитектур ==&lt;br /&gt;
&lt;br /&gt;
== Существующие реализации алгоритма ==&lt;br /&gt;
&lt;br /&gt;
Алгоритм релизован в составе библиотек: &lt;br /&gt;
* SparseLib++[http://math.nist.gov/sparselib++/] &lt;br /&gt;
* cuSPARSE [http://docs.nvidia.com/cuda/cusparse/]&lt;br /&gt;
* uBLAS [http://www.boost.org/doc/libs/1_62_0/libs/numeric/ublas/doc/]&lt;br /&gt;
* Intel MKL [https://software.intel.com/en-us/intel-mkl]&lt;br /&gt;
&lt;br /&gt;
= Литература =&lt;br /&gt;
&lt;br /&gt;
* [1] С. Писсанецки. Технология разреженных матриц. Изд. Мир, 1988.&lt;br /&gt;
* [2] В. В. Воеводин, Вл.В. Воеводин. Параллельные вычисления. – СПб.: БХВ - Петербург, 2002.&lt;/div&gt;</summary>
		<author><name>Lexaloris</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:Lexaloris/%D0%A3%D0%BC%D0%BD%D0%BE%D0%B6%D0%B5%D0%BD%D0%B8%D0%B5_%D1%80%D0%B0%D0%B7%D1%80%D0%B5%D0%B6%D0%B5%D0%BD%D0%BD%D0%BE%D0%B9_%D0%BC%D0%B0%D1%82%D1%80%D0%B8%D1%86%D1%8B_%D0%BD%D0%B0_%D0%B2%D0%B5%D0%BA%D1%82%D0%BE%D1%80&amp;diff=15558</id>
		<title>Участник:Lexaloris/Умножение разреженной матрицы на вектор</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:Lexaloris/%D0%A3%D0%BC%D0%BD%D0%BE%D0%B6%D0%B5%D0%BD%D0%B8%D0%B5_%D1%80%D0%B0%D0%B7%D1%80%D0%B5%D0%B6%D0%B5%D0%BD%D0%BD%D0%BE%D0%B9_%D0%BC%D0%B0%D1%82%D1%80%D0%B8%D1%86%D1%8B_%D0%BD%D0%B0_%D0%B2%D0%B5%D0%BA%D1%82%D0%BE%D1%80&amp;diff=15558"/>
		<updated>2016-11-01T14:34:32Z</updated>

		<summary type="html">&lt;p&gt;Lexaloris: &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(k)&amp;lt;/math&amp;gt;&lt;br /&gt;
| pf_height         = &amp;lt;math&amp;gt;O(m)&amp;lt;/math&amp;gt;&lt;br /&gt;
| pf_width          = &amp;lt;math&amp;gt;O(n)&amp;lt;/math&amp;gt;&lt;br /&gt;
| input_data        = &amp;lt;math&amp;gt;k + m&amp;lt;/math&amp;gt;&lt;br /&gt;
| output_data       = &amp;lt;math&amp;gt;n&amp;lt;/math&amp;gt;&lt;br /&gt;
}}&lt;br /&gt;
&lt;br /&gt;
&lt;br /&gt;
&#039;&#039;&#039;Авторы страницы:&#039;&#039;&#039; [[Участник:Lexaloris|A.Д. Новоселов]] и [[Участник:kochet|П.А. Кочетков]]&lt;br /&gt;
&lt;br /&gt;
Кочетков Павел ответственен за программную реализацию алгоритма, Новоселов Алексей ответственен за оформление статьи. &lt;br /&gt;
&lt;br /&gt;
= Свойства и структура алгоритмов =&lt;br /&gt;
&lt;br /&gt;
== Общее описание алгоритма ==&lt;br /&gt;
&lt;br /&gt;
=== Хранение ненулевых элементов разреженной матрицы ===&lt;br /&gt;
&lt;br /&gt;
==== Разреженный строчной формат ====&lt;br /&gt;
&lt;br /&gt;
Одной из наиболее ши­роко используемых схем хранения разреженных матриц является &#039;&#039;разреженный строчный формат&#039;&#039;. Эта&lt;br /&gt;
схема предъявляет минимальные требования к памяти и в то же время оказывается очень удобной для умножения разреженной матрицы на вектор.&lt;br /&gt;
Например, рассмотрим формат хранения разряженной матрицы &amp;lt;math&amp;gt;A&amp;lt;/math&amp;gt;:&lt;br /&gt;
&lt;br /&gt;
[[File:RRCOMatrix.png]]&lt;br /&gt;
&lt;br /&gt;
Значения нену­левых элементов матрицы и соответствующие столбцовые индексы хранятся в этой схеме по строкам в двух массивах &amp;lt;math&amp;gt;AN&amp;lt;/math&amp;gt; и &amp;lt;math&amp;gt;JA&amp;lt;/math&amp;gt; соответственно. Используется также массив указателей &amp;lt;math&amp;gt;IA&amp;lt;/math&amp;gt;, отмечающих позиции массивов &amp;lt;math&amp;gt;AN&amp;lt;/math&amp;gt; и &amp;lt;math&amp;gt;JA&amp;lt;/math&amp;gt;, с которых начинается описание очередной строки. Дополнительная компо­нента в &amp;lt;math&amp;gt;IA&amp;lt;/math&amp;gt; содержит указатель первой свободной позиции в &amp;lt;math&amp;gt;JA&amp;lt;/math&amp;gt; и &amp;lt;math&amp;gt;AN&amp;lt;/math&amp;gt;.&lt;br /&gt;
&lt;br /&gt;
Таким образом &amp;lt;math&amp;gt;A&amp;lt;/math&amp;gt; представляется в виде:&lt;br /&gt;
&lt;br /&gt;
   IA = [ 1 4 4 6 ]&lt;br /&gt;
   JA = [ 3 4 8 6 8 ]&lt;br /&gt;
   AN = [ 1 3 5 7 1 ]&lt;br /&gt;
&lt;br /&gt;
Данный способ представления называют &#039;&#039;полным&#039;&#039;, поскольку представлена вся матрица &amp;lt;math&amp;gt;A&amp;lt;/math&amp;gt;, и &#039;&#039;упорядоченным&#039;&#039;, поскольку эле­менты каждой строки хранятся в соответствии с возрастанием столбцовых индексов. Таким образом, это строчное представление, полное и упорядоченное, или сокращенно &#039;&#039;&#039;(RR (С) О)&#039;&#039;&#039;.&lt;br /&gt;
&lt;br /&gt;
==== Неупорядоченное представление ====&lt;br /&gt;
&lt;br /&gt;
Представления разреженных матриц необязательно должны быть упорядочены в том смысле, что, хотя упорядоченность строк поддерживается, внутри каждой строки элементы могут храниться в произвольном порядке. Для матрицы А нашего примера вполне можно было бы использовать и строчное представление, полное, но &#039;&#039;неупорядоченное&#039;&#039; &#039;&#039;&#039;(RR (С) U )&#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;
   IA = [ 1 4 4 6 ]&lt;br /&gt;
   JA = [ 8 3 4 8 6 ]&lt;br /&gt;
   AN = [ 5 1 3 1 7 ]&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; — число строк матрицы. &lt;br /&gt;
Для каждой ее строки &amp;lt;math&amp;gt;I&amp;lt;/math&amp;gt; матрицы мы находим с помощью &amp;lt;math&amp;gt;IA&amp;lt;/math&amp;gt; значения первой &amp;lt;math&amp;gt;IAA&amp;lt;/math&amp;gt; и последней &amp;lt;math&amp;gt;IAB&amp;lt;/math&amp;gt; позиций, занимаемых элементами строки &amp;lt;math&amp;gt;I&amp;lt;/math&amp;gt; в массивах &amp;lt;math&amp;gt;JA&amp;lt;/math&amp;gt; и &amp;lt;math&amp;gt;AN&amp;lt;/math&amp;gt;. Затем, чтобы вычислить скалярное произведение строки &amp;lt;math&amp;gt;I&amp;lt;/math&amp;gt; и вектора &amp;lt;math&amp;gt;B&amp;lt;/math&amp;gt;, мы просто просматриваем &amp;lt;math&amp;gt;JA&amp;lt;/math&amp;gt; и &amp;lt;math&amp;gt;AN&amp;lt;/math&amp;gt; на отрезке от &amp;lt;math&amp;gt;IAA&amp;lt;/math&amp;gt; до &amp;lt;math&amp;gt;IAB&amp;lt;/math&amp;gt;:&lt;br /&gt;
каждое значение, хранимое в &amp;lt;math&amp;gt;JA&amp;lt;/math&amp;gt;, есть столбцовый индекс и используется для извлечения из массива &amp;lt;math&amp;gt;B&amp;lt;/math&amp;gt; элемента, который должен быть умножен на соответствующее число из &amp;lt;math&amp;gt;AN&amp;lt;/math&amp;gt;. Результат каж­дого умножения прибавляется к &amp;lt;math&amp;gt;C(I)&amp;lt;/math&amp;gt;.&lt;br /&gt;
&lt;br /&gt;
== Математическое описание алгоритма ==&lt;br /&gt;
&lt;br /&gt;
&#039;&#039;&#039;Исходные данные:&#039;&#039;&#039; &lt;br /&gt;
&lt;br /&gt;
&amp;lt;math&amp;gt;IA, JA, AN&amp;lt;/math&amp;gt; - заданная матрица в форме &#039;&#039;&#039;(RR (С) U)&#039;&#039;&#039;;&lt;br /&gt;
&lt;br /&gt;
&amp;lt;math&amp;gt;B&amp;lt;/math&amp;gt; - заданный заполненный вектор;&lt;br /&gt;
&lt;br /&gt;
&amp;lt;math&amp;gt;N&amp;lt;/math&amp;gt; - число строк матрицы.&lt;br /&gt;
&lt;br /&gt;
&#039;&#039;&#039;Выход:&#039;&#039;&#039; &amp;lt;math&amp;gt;C&amp;lt;/math&amp;gt; вектор-произведение размерности &amp;lt;math&amp;gt;N&amp;lt;/math&amp;gt;.&lt;br /&gt;
&lt;br /&gt;
&#039;&#039;&#039;Формулы метода:&#039;&#039;&#039;&lt;br /&gt;
&lt;br /&gt;
:&amp;lt;math&amp;gt;&lt;br /&gt;
\begin{align}&lt;br /&gt;
&amp;amp; IAA_{i} = IA(i), \quad i \in [1, N], \\&lt;br /&gt;
&amp;amp; IAB_{i} = IA(i + 1) - 1, \quad i \in [1, N], \\&lt;br /&gt;
&amp;amp; c_{i} = \sum\limits_{j = IAA_{i}}^{IAB_{i}} AN(j)B(JA(j)), \quad i \in [1, N] \\&lt;br /&gt;
\end{align}&lt;br /&gt;
&amp;lt;/math&amp;gt;&lt;br /&gt;
&lt;br /&gt;
== Вычислительное ядро алгоритма ==&lt;br /&gt;
&lt;br /&gt;
Вычислительным ядром, т.е. той частью алгоритма, на которую приходится основное время его работы, является вычисление значения &amp;lt;math&amp;gt;i&amp;lt;/math&amp;gt;-го элемента &amp;lt;math&amp;gt;c_{i}&amp;lt;/math&amp;gt; вектора-произведения, т.е произведения строки &amp;lt;math&amp;gt;I&amp;lt;/math&amp;gt; матрицы &amp;lt;math&amp;gt;A&amp;lt;/math&amp;gt; и вектора &amp;lt;math&amp;gt;B&amp;lt;/math&amp;gt; по формуле:&lt;br /&gt;
&lt;br /&gt;
:&amp;lt;math&amp;gt;&lt;br /&gt;
\begin{align}&lt;br /&gt;
&amp;amp; c_{i} = \sum\limits_{j = IAA_{i}}^{IAB_{i}} AN(j)B(JA(j)), \quad i \in [1, N] \\&lt;br /&gt;
\end{align}&lt;br /&gt;
&amp;lt;/math&amp;gt;&lt;br /&gt;
&lt;br /&gt;
== Макроструктура алгоритма ==&lt;br /&gt;
&lt;br /&gt;
Основу алгоритма составляет вычисление значения &amp;lt;math&amp;gt;i&amp;lt;/math&amp;gt;-го элемента &amp;lt;math&amp;gt;c_{i}&amp;lt;/math&amp;gt; вектора-произведения:&lt;br /&gt;
&lt;br /&gt;
:&amp;lt;math&amp;gt;&lt;br /&gt;
\begin{align}&lt;br /&gt;
&amp;amp; c_{i} = \sum\limits_{j = IAA_{i}}^{IAB_{i}} AN(j)B(JA(j)), \quad i \in [1, N] \\&lt;br /&gt;
\end{align}&lt;br /&gt;
&amp;lt;/math&amp;gt;&lt;br /&gt;
&lt;br /&gt;
== Схема реализации последовательного алгоритма ==&lt;br /&gt;
&lt;br /&gt;
Последовательность исполнения метода следующая: &lt;br /&gt;
&lt;br /&gt;
Далее для всех &amp;lt;math&amp;gt;i&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; по нарастанию выполняются:&lt;br /&gt;
&lt;br /&gt;
1. &amp;lt;math&amp;gt; c_{i} = 0; IAA = IA(i); IAB = IA(i + 1 ) - 1 &amp;lt;/math&amp;gt;&lt;br /&gt;
&lt;br /&gt;
После этого, если &amp;lt;math&amp;gt;(IAB \le IAA)&amp;lt;/math&amp;gt;:&lt;br /&gt;
&lt;br /&gt;
2. Для всех &amp;lt;math&amp;gt;j&amp;lt;/math&amp;gt; от &amp;lt;math&amp;gt;IAA&amp;lt;/math&amp;gt; до &amp;lt;math&amp;gt;IAB&amp;lt;/math&amp;gt; выполняется: &lt;br /&gt;
&lt;br /&gt;
&amp;lt;math&amp;gt;c_{i} = \sum\limits_{j = IAA_{i}}^{IAB_{i}} AN(j)B(JA(j))&amp;lt;/math&amp;gt;&lt;br /&gt;
&lt;br /&gt;
Псевдокод алгоритма: &lt;br /&gt;
&lt;br /&gt;
    FOR I = 1, N                          (1)&lt;br /&gt;
       U = 0.                             (2) &lt;br /&gt;
       IAA = IA(I)                        (3) &lt;br /&gt;
       IAB = IA(I + 1 ) - 1               (4)&lt;br /&gt;
       IF NOT(IAB.LT.IAA)                 (5)&lt;br /&gt;
           FOR J = IAA, IAB               (6)&lt;br /&gt;
           C(I) = U + AN(J)*B(JA(J))      (7)&lt;br /&gt;
&lt;br /&gt;
== Последовательная сложность алгоритма ==&lt;br /&gt;
&lt;br /&gt;
Для всего алгоритма потребуется выполнить &amp;lt;math&amp;gt;O(k)&amp;lt;/math&amp;gt; операций, как в строке стр.7 псевдокода алгоритма ([[#Схема реализации последовательного алгоритма|п.1.5]]), где &amp;lt;math&amp;gt;k&amp;lt;/math&amp;gt; - число ненулевых эле­ментов матрицы.&lt;br /&gt;
&lt;br /&gt;
== Информационный граф ==&lt;br /&gt;
&lt;br /&gt;
На рисунке 1 изображен информационный граф алгоритма.&lt;br /&gt;
&lt;br /&gt;
[[file:InfoGrafMatrixRRCUandVextor.jpg|thumb|center|1200px|Рисунок 1. Информационный граф алгоритма.]]&lt;br /&gt;
 &lt;br /&gt;
По оси &amp;lt;math&amp;gt;X&amp;lt;/math&amp;gt; для отдельной строки &amp;lt;math&amp;gt;I&amp;lt;/math&amp;gt; матрицы отложены в пределах первой &amp;lt;math&amp;gt;IAA&amp;lt;/math&amp;gt; и последней &amp;lt;math&amp;gt;IAB&amp;lt;/math&amp;gt; позиций ненулевых элементов значения &amp;lt;math&amp;gt;AN&amp;lt;/math&amp;gt; и соответствуюие им по столбцовомым индексам, хранимимым в &amp;lt;math&amp;gt;JA&amp;lt;/math&amp;gt;, значения &amp;lt;math&amp;gt;B&amp;lt;/math&amp;gt; элементов. &lt;br /&gt;
Пары этих значений обозначены желтыми квадратиками &amp;lt;math&amp;gt;(in)&amp;lt;/math&amp;gt;. Значения in попарно скалярно перемножаются (зеленый кружочек) и суммируются (синий кружочек) в результат значения элемента вектора-произведения &amp;lt;math&amp;gt;c_{i}&amp;lt;/math&amp;gt;, т.е &amp;lt;math&amp;gt;out&amp;lt;/math&amp;gt;(красный квадратик) с строковым индексом, соответствующем номеру строки матрицы.&lt;br /&gt;
&lt;br /&gt;
По оси &amp;lt;math&amp;gt;Y&amp;lt;/math&amp;gt; отложена схема вычисление значения каждого элемента вектора-произведения для каждой строки матрицы.&lt;br /&gt;
&lt;br /&gt;
== Ресурс параллелизма алгоритма ==&lt;br /&gt;
&lt;br /&gt;
Алгоритм обладает возможностью выполняться параллельно, что позволяет значительно ускорить вычисления.&lt;br /&gt;
Вычисление значения каждого элемента вектора-произведения для каждой строки матрицы и элемента вектора &amp;lt;math&amp;gt;B&amp;lt;/math&amp;gt; можно проводить на отдельных процессорах. &lt;br /&gt;
Максимальная эффективность вычислений достигается при наличии не менее, чем &amp;lt;math&amp;gt;N&amp;lt;/math&amp;gt; процессоров, т.е отдельный процессор на вычисление значения каждого элемента вектора-произведения. На процессоре выполняется &amp;lt;math&amp;gt;k(i)&amp;lt;/math&amp;gt; последовательных операций умножения и сложения. Поэтому число ярусов для &amp;lt;math&amp;gt;i&amp;lt;/math&amp;gt;-ого процессора равно &amp;lt;math&amp;gt;k(i)&amp;lt;/math&amp;gt;.&lt;br /&gt;
&lt;br /&gt;
Для параллельного выполнения алгоритма требуется:&lt;br /&gt;
&lt;br /&gt;
* &amp;lt;math&amp;gt;N&amp;lt;/math&amp;gt; ярусов умножений и сложений,&lt;br /&gt;
* в каждом из ярусов &amp;lt;math&amp;gt;k &amp;lt;&amp;lt; m&amp;lt;/math&amp;gt; операций.&lt;br /&gt;
&lt;br /&gt;
При классификации по высоте ЯПФ, алгоритм имеет линейную сложность. При классификации по высоте ЯПФ также линейную.&lt;br /&gt;
&lt;br /&gt;
== Входные и выходные данные алгоритма ==&lt;br /&gt;
&#039;&#039;&#039;Входные данные:&#039;&#039;&#039;&lt;br /&gt;
&lt;br /&gt;
* &amp;lt;math&amp;gt;IA, JA, AN&amp;lt;/math&amp;gt; - заданная матрица в форме &#039;&#039;&#039;(RR (С) U)&#039;&#039;&#039; c &amp;lt;math&amp;gt;k&amp;lt;/math&amp;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;B&amp;lt;/math&amp;gt; - заданный заполненный вектор c &amp;lt;math&amp;gt;m&amp;lt;/math&amp;gt; элементами;&lt;br /&gt;
&#039;&#039;&#039;&lt;br /&gt;
&#039;&#039;&#039;Объем входных данных&#039;&#039;&#039;: &amp;lt;math&amp;gt;k + m&amp;lt;/math&amp;gt;&lt;br /&gt;
&lt;br /&gt;
&#039;&#039;&#039;Выходные данные:&#039;&#039;&#039; &amp;lt;math&amp;gt;C&amp;lt;/math&amp;gt; вектор-произведение размерности &amp;lt;math&amp;gt;N&amp;lt;/math&amp;gt;.&lt;br /&gt;
&lt;br /&gt;
&#039;&#039;&#039;Объем выходных данных&#039;&#039;&#039;: &amp;lt;math&amp;gt;N&amp;lt;/math&amp;gt;&lt;br /&gt;
&lt;br /&gt;
== Свойства алгоритма ==&lt;br /&gt;
&lt;br /&gt;
Алгоритм в рамках выбранной версии полностью детерминирован.&lt;br /&gt;
&lt;br /&gt;
Вычислительная мощность алгоритма, как отношение числа операций к суммарному объему входных и выходных данных – константа.&lt;br /&gt;
&lt;br /&gt;
= Программная реализация алгоритма =&lt;br /&gt;
&lt;br /&gt;
&lt;br /&gt;
== Особенности реализации последовательного алгоритма ==&lt;br /&gt;
&lt;br /&gt;
== Локальность данных и вычислений ==&lt;br /&gt;
&lt;br /&gt;
== Возможные способы и особенности параллельной реализации алгоритма ==&lt;br /&gt;
&lt;br /&gt;
== Масштабируемость алгоритма и его реализации ==&lt;br /&gt;
&lt;br /&gt;
== Динамические характеристики и эффективность реализации алгоритма ==&lt;br /&gt;
&lt;br /&gt;
== Выводы для классов архитектур ==&lt;br /&gt;
&lt;br /&gt;
== Существующие реализации алгоритма ==&lt;br /&gt;
&lt;br /&gt;
Алгоритм релизован в составе библиотек: &lt;br /&gt;
* SparseLib++[http://math.nist.gov/sparselib++/] &lt;br /&gt;
* cuSPARSE [http://docs.nvidia.com/cuda/cusparse/]&lt;br /&gt;
* uBLAS [http://www.boost.org/doc/libs/1_62_0/libs/numeric/ublas/doc/]&lt;br /&gt;
* Intel MKL [https://software.intel.com/en-us/intel-mkl]&lt;br /&gt;
&lt;br /&gt;
= Литература =&lt;br /&gt;
&lt;br /&gt;
* [1] С. Писсанецки. Технология разреженных матриц. Изд. Мир, 1988.&lt;br /&gt;
* [2] В. В. Воеводин, Вл.В. Воеводин. Параллельные вычисления. – СПб.: БХВ - Петербург, 2002.&lt;/div&gt;</summary>
		<author><name>Lexaloris</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:Lexaloris/%D0%A3%D0%BC%D0%BD%D0%BE%D0%B6%D0%B5%D0%BD%D0%B8%D0%B5_%D1%80%D0%B0%D0%B7%D1%80%D0%B5%D0%B6%D0%B5%D0%BD%D0%BD%D0%BE%D0%B9_%D0%BC%D0%B0%D1%82%D1%80%D0%B8%D1%86%D1%8B_%D0%BD%D0%B0_%D0%B2%D0%B5%D0%BA%D1%82%D0%BE%D1%80&amp;diff=15557</id>
		<title>Участник:Lexaloris/Умножение разреженной матрицы на вектор</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:Lexaloris/%D0%A3%D0%BC%D0%BD%D0%BE%D0%B6%D0%B5%D0%BD%D0%B8%D0%B5_%D1%80%D0%B0%D0%B7%D1%80%D0%B5%D0%B6%D0%B5%D0%BD%D0%BD%D0%BE%D0%B9_%D0%BC%D0%B0%D1%82%D1%80%D0%B8%D1%86%D1%8B_%D0%BD%D0%B0_%D0%B2%D0%B5%D0%BA%D1%82%D0%BE%D1%80&amp;diff=15557"/>
		<updated>2016-11-01T14:33:03Z</updated>

		<summary type="html">&lt;p&gt;Lexaloris: &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(k)&amp;lt;/math&amp;gt;&lt;br /&gt;
| pf_height         = &amp;lt;math&amp;gt;O(m)&amp;lt;/math&amp;gt;&lt;br /&gt;
| pf_width          = &amp;lt;math&amp;gt;O(n)&amp;lt;/math&amp;gt;&lt;br /&gt;
| input_data        = &amp;lt;math&amp;gt;k + m&amp;lt;/math&amp;gt;&lt;br /&gt;
| output_data       = &amp;lt;math&amp;gt;n&amp;lt;/math&amp;gt;&lt;br /&gt;
}}&lt;br /&gt;
&lt;br /&gt;
&lt;br /&gt;
&#039;&#039;&#039;Авторы страницы:&#039;&#039;&#039; [[Участник:Lexaloris|A.Д. Новоселов]] и [[Участник:kochet|П.А. Кочетков]]&lt;br /&gt;
Кочетков Павел ответственен за программную реализацию алгоритма, Новоселов Алексей ответственен за оформление статьи. &lt;br /&gt;
&lt;br /&gt;
= Свойства и структура алгоритмов =&lt;br /&gt;
&lt;br /&gt;
== Общее описание алгоритма ==&lt;br /&gt;
&lt;br /&gt;
=== Хранение ненулевых элементов разреженной матрицы ===&lt;br /&gt;
&lt;br /&gt;
==== Разреженный строчной формат ====&lt;br /&gt;
&lt;br /&gt;
Одной из наиболее ши­роко используемых схем хранения разреженных матриц является &#039;&#039;разреженный строчный формат&#039;&#039;. Эта&lt;br /&gt;
схема предъявляет минимальные требования к памяти и в то же время оказывается очень удобной для умножения разреженной матрицы на вектор.&lt;br /&gt;
Например, рассмотрим формат хранения разряженной матрицы &amp;lt;math&amp;gt;A&amp;lt;/math&amp;gt;:&lt;br /&gt;
&lt;br /&gt;
[[File:RRCOMatrix.png]]&lt;br /&gt;
&lt;br /&gt;
Значения нену­левых элементов матрицы и соответствующие столбцовые индексы хранятся в этой схеме по строкам в двух массивах &amp;lt;math&amp;gt;AN&amp;lt;/math&amp;gt; и &amp;lt;math&amp;gt;JA&amp;lt;/math&amp;gt; соответственно. Используется также массив указателей &amp;lt;math&amp;gt;IA&amp;lt;/math&amp;gt;, отмечающих позиции массивов &amp;lt;math&amp;gt;AN&amp;lt;/math&amp;gt; и &amp;lt;math&amp;gt;JA&amp;lt;/math&amp;gt;, с которых начинается описание очередной строки. Дополнительная компо­нента в &amp;lt;math&amp;gt;IA&amp;lt;/math&amp;gt; содержит указатель первой свободной позиции в &amp;lt;math&amp;gt;JA&amp;lt;/math&amp;gt; и &amp;lt;math&amp;gt;AN&amp;lt;/math&amp;gt;.&lt;br /&gt;
&lt;br /&gt;
Таким образом &amp;lt;math&amp;gt;A&amp;lt;/math&amp;gt; представляется в виде:&lt;br /&gt;
&lt;br /&gt;
   IA = [ 1 4 4 6 ]&lt;br /&gt;
   JA = [ 3 4 8 6 8 ]&lt;br /&gt;
   AN = [ 1 3 5 7 1 ]&lt;br /&gt;
&lt;br /&gt;
Данный способ представления называют &#039;&#039;полным&#039;&#039;, поскольку представлена вся матрица &amp;lt;math&amp;gt;A&amp;lt;/math&amp;gt;, и &#039;&#039;упорядоченным&#039;&#039;, поскольку эле­менты каждой строки хранятся в соответствии с возрастанием столбцовых индексов. Таким образом, это строчное представление, полное и упорядоченное, или сокращенно &#039;&#039;&#039;(RR (С) О)&#039;&#039;&#039;.&lt;br /&gt;
&lt;br /&gt;
==== Неупорядоченное представление ====&lt;br /&gt;
&lt;br /&gt;
Представления разреженных матриц необязательно должны быть упорядочены в том смысле, что, хотя упорядоченность строк поддерживается, внутри каждой строки элементы могут храниться в произвольном порядке. Для матрицы А нашего примера вполне можно было бы использовать и строчное представление, полное, но &#039;&#039;неупорядоченное&#039;&#039; &#039;&#039;&#039;(RR (С) U )&#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;
   IA = [ 1 4 4 6 ]&lt;br /&gt;
   JA = [ 8 3 4 8 6 ]&lt;br /&gt;
   AN = [ 5 1 3 1 7 ]&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; — число строк матрицы. &lt;br /&gt;
Для каждой ее строки &amp;lt;math&amp;gt;I&amp;lt;/math&amp;gt; матрицы мы находим с помощью &amp;lt;math&amp;gt;IA&amp;lt;/math&amp;gt; значения первой &amp;lt;math&amp;gt;IAA&amp;lt;/math&amp;gt; и последней &amp;lt;math&amp;gt;IAB&amp;lt;/math&amp;gt; позиций, занимаемых элементами строки &amp;lt;math&amp;gt;I&amp;lt;/math&amp;gt; в массивах &amp;lt;math&amp;gt;JA&amp;lt;/math&amp;gt; и &amp;lt;math&amp;gt;AN&amp;lt;/math&amp;gt;. Затем, чтобы вычислить скалярное произведение строки &amp;lt;math&amp;gt;I&amp;lt;/math&amp;gt; и вектора &amp;lt;math&amp;gt;B&amp;lt;/math&amp;gt;, мы просто просматриваем &amp;lt;math&amp;gt;JA&amp;lt;/math&amp;gt; и &amp;lt;math&amp;gt;AN&amp;lt;/math&amp;gt; на отрезке от &amp;lt;math&amp;gt;IAA&amp;lt;/math&amp;gt; до &amp;lt;math&amp;gt;IAB&amp;lt;/math&amp;gt;:&lt;br /&gt;
каждое значение, хранимое в &amp;lt;math&amp;gt;JA&amp;lt;/math&amp;gt;, есть столбцовый индекс и используется для извлечения из массива &amp;lt;math&amp;gt;B&amp;lt;/math&amp;gt; элемента, который должен быть умножен на соответствующее число из &amp;lt;math&amp;gt;AN&amp;lt;/math&amp;gt;. Результат каж­дого умножения прибавляется к &amp;lt;math&amp;gt;C(I)&amp;lt;/math&amp;gt;.&lt;br /&gt;
&lt;br /&gt;
== Математическое описание алгоритма ==&lt;br /&gt;
&lt;br /&gt;
&#039;&#039;&#039;Исходные данные:&#039;&#039;&#039; &lt;br /&gt;
&lt;br /&gt;
&amp;lt;math&amp;gt;IA, JA, AN&amp;lt;/math&amp;gt; - заданная матрица в форме &#039;&#039;&#039;(RR (С) U)&#039;&#039;&#039;;&lt;br /&gt;
&lt;br /&gt;
&amp;lt;math&amp;gt;B&amp;lt;/math&amp;gt; - заданный заполненный вектор;&lt;br /&gt;
&lt;br /&gt;
&amp;lt;math&amp;gt;N&amp;lt;/math&amp;gt; - число строк матрицы.&lt;br /&gt;
&lt;br /&gt;
&#039;&#039;&#039;Выход:&#039;&#039;&#039; &amp;lt;math&amp;gt;C&amp;lt;/math&amp;gt; вектор-произведение размерности &amp;lt;math&amp;gt;N&amp;lt;/math&amp;gt;.&lt;br /&gt;
&lt;br /&gt;
&#039;&#039;&#039;Формулы метода:&#039;&#039;&#039;&lt;br /&gt;
&lt;br /&gt;
:&amp;lt;math&amp;gt;&lt;br /&gt;
\begin{align}&lt;br /&gt;
&amp;amp; IAA_{i} = IA(i), \quad i \in [1, N], \\&lt;br /&gt;
&amp;amp; IAB_{i} = IA(i + 1) - 1, \quad i \in [1, N], \\&lt;br /&gt;
&amp;amp; c_{i} = \sum\limits_{j = IAA_{i}}^{IAB_{i}} AN(j)B(JA(j)), \quad i \in [1, N] \\&lt;br /&gt;
\end{align}&lt;br /&gt;
&amp;lt;/math&amp;gt;&lt;br /&gt;
&lt;br /&gt;
== Вычислительное ядро алгоритма ==&lt;br /&gt;
&lt;br /&gt;
Вычислительным ядром, т.е. той частью алгоритма, на которую приходится основное время его работы, является вычисление значения &amp;lt;math&amp;gt;i&amp;lt;/math&amp;gt;-го элемента &amp;lt;math&amp;gt;c_{i}&amp;lt;/math&amp;gt; вектора-произведения, т.е произведения строки &amp;lt;math&amp;gt;I&amp;lt;/math&amp;gt; матрицы &amp;lt;math&amp;gt;A&amp;lt;/math&amp;gt; и вектора &amp;lt;math&amp;gt;B&amp;lt;/math&amp;gt; по формуле:&lt;br /&gt;
&lt;br /&gt;
:&amp;lt;math&amp;gt;&lt;br /&gt;
\begin{align}&lt;br /&gt;
&amp;amp; c_{i} = \sum\limits_{j = IAA_{i}}^{IAB_{i}} AN(j)B(JA(j)), \quad i \in [1, N] \\&lt;br /&gt;
\end{align}&lt;br /&gt;
&amp;lt;/math&amp;gt;&lt;br /&gt;
&lt;br /&gt;
== Макроструктура алгоритма ==&lt;br /&gt;
&lt;br /&gt;
Основу алгоритма составляет вычисление значения &amp;lt;math&amp;gt;i&amp;lt;/math&amp;gt;-го элемента &amp;lt;math&amp;gt;c_{i}&amp;lt;/math&amp;gt; вектора-произведения:&lt;br /&gt;
&lt;br /&gt;
:&amp;lt;math&amp;gt;&lt;br /&gt;
\begin{align}&lt;br /&gt;
&amp;amp; c_{i} = \sum\limits_{j = IAA_{i}}^{IAB_{i}} AN(j)B(JA(j)), \quad i \in [1, N] \\&lt;br /&gt;
\end{align}&lt;br /&gt;
&amp;lt;/math&amp;gt;&lt;br /&gt;
&lt;br /&gt;
== Схема реализации последовательного алгоритма ==&lt;br /&gt;
&lt;br /&gt;
Последовательность исполнения метода следующая: &lt;br /&gt;
&lt;br /&gt;
Далее для всех &amp;lt;math&amp;gt;i&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; по нарастанию выполняются:&lt;br /&gt;
&lt;br /&gt;
1. &amp;lt;math&amp;gt; c_{i} = 0; IAA = IA(i); IAB = IA(i + 1 ) - 1 &amp;lt;/math&amp;gt;&lt;br /&gt;
&lt;br /&gt;
После этого, если &amp;lt;math&amp;gt;(IAB \le IAA)&amp;lt;/math&amp;gt;:&lt;br /&gt;
&lt;br /&gt;
2. Для всех &amp;lt;math&amp;gt;j&amp;lt;/math&amp;gt; от &amp;lt;math&amp;gt;IAA&amp;lt;/math&amp;gt; до &amp;lt;math&amp;gt;IAB&amp;lt;/math&amp;gt; выполняется: &lt;br /&gt;
&lt;br /&gt;
&amp;lt;math&amp;gt;c_{i} = \sum\limits_{j = IAA_{i}}^{IAB_{i}} AN(j)B(JA(j))&amp;lt;/math&amp;gt;&lt;br /&gt;
&lt;br /&gt;
Псевдокод алгоритма: &lt;br /&gt;
&lt;br /&gt;
    FOR I = 1, N                          (1)&lt;br /&gt;
       U = 0.                             (2) &lt;br /&gt;
       IAA = IA(I)                        (3) &lt;br /&gt;
       IAB = IA(I + 1 ) - 1               (4)&lt;br /&gt;
       IF NOT(IAB.LT.IAA)                 (5)&lt;br /&gt;
           FOR J = IAA, IAB               (6)&lt;br /&gt;
           C(I) = U + AN(J)*B(JA(J))      (7)&lt;br /&gt;
&lt;br /&gt;
== Последовательная сложность алгоритма ==&lt;br /&gt;
&lt;br /&gt;
Для всего алгоритма потребуется выполнить &amp;lt;math&amp;gt;O(k)&amp;lt;/math&amp;gt; операций, как в строке стр.7 псевдокода алгоритма ([[#Схема реализации последовательного алгоритма|п.1.5]]), где &amp;lt;math&amp;gt;k&amp;lt;/math&amp;gt; - число ненулевых эле­ментов матрицы.&lt;br /&gt;
&lt;br /&gt;
== Информационный граф ==&lt;br /&gt;
&lt;br /&gt;
На рисунке 1 изображен информационный граф алгоритма.&lt;br /&gt;
&lt;br /&gt;
[[file:InfoGrafMatrixRRCUandVextor.jpg|thumb|center|1200px|Рисунок 1. Информационный граф алгоритма.]]&lt;br /&gt;
 &lt;br /&gt;
По оси &amp;lt;math&amp;gt;X&amp;lt;/math&amp;gt; для отдельной строки &amp;lt;math&amp;gt;I&amp;lt;/math&amp;gt; матрицы отложены в пределах первой &amp;lt;math&amp;gt;IAA&amp;lt;/math&amp;gt; и последней &amp;lt;math&amp;gt;IAB&amp;lt;/math&amp;gt; позиций ненулевых элементов значения &amp;lt;math&amp;gt;AN&amp;lt;/math&amp;gt; и соответствуюие им по столбцовомым индексам, хранимимым в &amp;lt;math&amp;gt;JA&amp;lt;/math&amp;gt;, значения &amp;lt;math&amp;gt;B&amp;lt;/math&amp;gt; элементов. &lt;br /&gt;
Пары этих значений обозначены желтыми квадратиками &amp;lt;math&amp;gt;(in)&amp;lt;/math&amp;gt;. Значения in попарно скалярно перемножаются (зеленый кружочек) и суммируются (синий кружочек) в результат значения элемента вектора-произведения &amp;lt;math&amp;gt;c_{i}&amp;lt;/math&amp;gt;, т.е &amp;lt;math&amp;gt;out&amp;lt;/math&amp;gt;(красный квадратик) с строковым индексом, соответствующем номеру строки матрицы.&lt;br /&gt;
&lt;br /&gt;
По оси &amp;lt;math&amp;gt;Y&amp;lt;/math&amp;gt; отложена схема вычисление значения каждого элемента вектора-произведения для каждой строки матрицы.&lt;br /&gt;
&lt;br /&gt;
== Ресурс параллелизма алгоритма ==&lt;br /&gt;
&lt;br /&gt;
Алгоритм обладает возможностью выполняться параллельно, что позволяет значительно ускорить вычисления.&lt;br /&gt;
Вычисление значения каждого элемента вектора-произведения для каждой строки матрицы и элемента вектора &amp;lt;math&amp;gt;B&amp;lt;/math&amp;gt; можно проводить на отдельных процессорах. &lt;br /&gt;
Максимальная эффективность вычислений достигается при наличии не менее, чем &amp;lt;math&amp;gt;N&amp;lt;/math&amp;gt; процессоров, т.е отдельный процессор на вычисление значения каждого элемента вектора-произведения. На процессоре выполняется &amp;lt;math&amp;gt;k(i)&amp;lt;/math&amp;gt; последовательных операций умножения и сложения. Поэтому число ярусов для &amp;lt;math&amp;gt;i&amp;lt;/math&amp;gt;-ого процессора равно &amp;lt;math&amp;gt;k(i)&amp;lt;/math&amp;gt;.&lt;br /&gt;
&lt;br /&gt;
Для параллельного выполнения алгоритма требуется:&lt;br /&gt;
&lt;br /&gt;
* &amp;lt;math&amp;gt;N&amp;lt;/math&amp;gt; ярусов умножений и сложений,&lt;br /&gt;
* в каждом из ярусов &amp;lt;math&amp;gt;k &amp;lt;&amp;lt; m&amp;lt;/math&amp;gt; операций.&lt;br /&gt;
&lt;br /&gt;
При классификации по высоте ЯПФ, алгоритм имеет линейную сложность. При классификации по высоте ЯПФ также линейную.&lt;br /&gt;
&lt;br /&gt;
== Входные и выходные данные алгоритма ==&lt;br /&gt;
&#039;&#039;&#039;Входные данные:&#039;&#039;&#039;&lt;br /&gt;
&lt;br /&gt;
* &amp;lt;math&amp;gt;IA, JA, AN&amp;lt;/math&amp;gt; - заданная матрица в форме &#039;&#039;&#039;(RR (С) U)&#039;&#039;&#039; c &amp;lt;math&amp;gt;k&amp;lt;/math&amp;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;B&amp;lt;/math&amp;gt; - заданный заполненный вектор c &amp;lt;math&amp;gt;m&amp;lt;/math&amp;gt; элементами;&lt;br /&gt;
&#039;&#039;&#039;&lt;br /&gt;
&#039;&#039;&#039;Объем входных данных&#039;&#039;&#039;: &amp;lt;math&amp;gt;k + m&amp;lt;/math&amp;gt;&lt;br /&gt;
&lt;br /&gt;
&#039;&#039;&#039;Выходные данные:&#039;&#039;&#039; &amp;lt;math&amp;gt;C&amp;lt;/math&amp;gt; вектор-произведение размерности &amp;lt;math&amp;gt;N&amp;lt;/math&amp;gt;.&lt;br /&gt;
&lt;br /&gt;
&#039;&#039;&#039;Объем выходных данных&#039;&#039;&#039;: &amp;lt;math&amp;gt;N&amp;lt;/math&amp;gt;&lt;br /&gt;
&lt;br /&gt;
== Свойства алгоритма ==&lt;br /&gt;
&lt;br /&gt;
Алгоритм в рамках выбранной версии полностью детерминирован.&lt;br /&gt;
&lt;br /&gt;
Вычислительная мощность алгоритма, как отношение числа операций к суммарному объему входных и выходных данных – константа.&lt;br /&gt;
&lt;br /&gt;
= Программная реализация алгоритма =&lt;br /&gt;
&lt;br /&gt;
&lt;br /&gt;
== Особенности реализации последовательного алгоритма ==&lt;br /&gt;
&lt;br /&gt;
== Локальность данных и вычислений ==&lt;br /&gt;
&lt;br /&gt;
== Возможные способы и особенности параллельной реализации алгоритма ==&lt;br /&gt;
&lt;br /&gt;
== Масштабируемость алгоритма и его реализации ==&lt;br /&gt;
&lt;br /&gt;
== Динамические характеристики и эффективность реализации алгоритма ==&lt;br /&gt;
&lt;br /&gt;
== Выводы для классов архитектур ==&lt;br /&gt;
&lt;br /&gt;
== Существующие реализации алгоритма ==&lt;br /&gt;
&lt;br /&gt;
Алгоритм релизован в составе библиотек: &lt;br /&gt;
* SparseLib++[http://math.nist.gov/sparselib++/] &lt;br /&gt;
* cuSPARSE [http://docs.nvidia.com/cuda/cusparse/]&lt;br /&gt;
* uBLAS [http://www.boost.org/doc/libs/1_62_0/libs/numeric/ublas/doc/]&lt;br /&gt;
* Intel MKL [https://software.intel.com/en-us/intel-mkl]&lt;br /&gt;
&lt;br /&gt;
= Литература =&lt;br /&gt;
&lt;br /&gt;
* [1] С. Писсанецки. Технология разреженных матриц. Изд. Мир, 1988.&lt;br /&gt;
* [2] В. В. Воеводин, Вл.В. Воеводин. Параллельные вычисления. – СПб.: БХВ - Петербург, 2002.&lt;/div&gt;</summary>
		<author><name>Lexaloris</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:Lexaloris/%D0%A3%D0%BC%D0%BD%D0%BE%D0%B6%D0%B5%D0%BD%D0%B8%D0%B5_%D1%80%D0%B0%D0%B7%D1%80%D0%B5%D0%B6%D0%B5%D0%BD%D0%BD%D0%BE%D0%B9_%D0%BC%D0%B0%D1%82%D1%80%D0%B8%D1%86%D1%8B_%D0%BD%D0%B0_%D0%B2%D0%B5%D0%BA%D1%82%D0%BE%D1%80&amp;diff=11624</id>
		<title>Участник:Lexaloris/Умножение разреженной матрицы на вектор</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:Lexaloris/%D0%A3%D0%BC%D0%BD%D0%BE%D0%B6%D0%B5%D0%BD%D0%B8%D0%B5_%D1%80%D0%B0%D0%B7%D1%80%D0%B5%D0%B6%D0%B5%D0%BD%D0%BD%D0%BE%D0%B9_%D0%BC%D0%B0%D1%82%D1%80%D0%B8%D1%86%D1%8B_%D0%BD%D0%B0_%D0%B2%D0%B5%D0%BA%D1%82%D0%BE%D1%80&amp;diff=11624"/>
		<updated>2016-10-15T20:03:57Z</updated>

		<summary type="html">&lt;p&gt;Lexaloris: &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(k)&amp;lt;/math&amp;gt;&lt;br /&gt;
| pf_height         = &amp;lt;math&amp;gt;O(m)&amp;lt;/math&amp;gt;&lt;br /&gt;
| pf_width          = &amp;lt;math&amp;gt;O(n)&amp;lt;/math&amp;gt;&lt;br /&gt;
| input_data        = &amp;lt;math&amp;gt;k + m&amp;lt;/math&amp;gt;&lt;br /&gt;
| output_data       = &amp;lt;math&amp;gt;n&amp;lt;/math&amp;gt;&lt;br /&gt;
}}&lt;br /&gt;
&lt;br /&gt;
&lt;br /&gt;
&#039;&#039;&#039;Авторы страницы:&#039;&#039;&#039; [[Участник:Lexaloris|A.Д. Новоселов]] и [[Участник:kochet|П.А. Кочетков]]&lt;br /&gt;
&lt;br /&gt;
= Свойства и структура алгоритмов =&lt;br /&gt;
&lt;br /&gt;
== Общее описание алгоритма ==&lt;br /&gt;
&lt;br /&gt;
=== Хранение ненулевых элементов разреженной матрицы ===&lt;br /&gt;
&lt;br /&gt;
==== Разреженный строчной формат ====&lt;br /&gt;
&lt;br /&gt;
Одной из наиболее ши­роко используемых схем хранения разреженных матриц является &#039;&#039;разреженный строчный формат&#039;&#039;. Эта&lt;br /&gt;
схема предъявляет минимальные требования к памяти и в то же время оказывается очень удобной для умножения разреженной матрицы на вектор.&lt;br /&gt;
Например, рассмотрим формат хранения разряженной матрицы &amp;lt;math&amp;gt;A&amp;lt;/math&amp;gt;:&lt;br /&gt;
&lt;br /&gt;
[[File:RRCOMatrix.png]]&lt;br /&gt;
&lt;br /&gt;
Значения нену­левых элементов матрицы и соответствующие столбцовые индексы хранятся в этой схеме по строкам в двух массивах &amp;lt;math&amp;gt;AN&amp;lt;/math&amp;gt; и &amp;lt;math&amp;gt;JA&amp;lt;/math&amp;gt; соответственно. Используется также массив указателей &amp;lt;math&amp;gt;IA&amp;lt;/math&amp;gt;, отмечающих позиции массивов &amp;lt;math&amp;gt;AN&amp;lt;/math&amp;gt; и &amp;lt;math&amp;gt;JA&amp;lt;/math&amp;gt;, с которых начинается описание очередной строки. Дополнительная компо­нента в &amp;lt;math&amp;gt;IA&amp;lt;/math&amp;gt; содержит указатель первой свободной позиции в &amp;lt;math&amp;gt;JA&amp;lt;/math&amp;gt; и &amp;lt;math&amp;gt;AN&amp;lt;/math&amp;gt;.&lt;br /&gt;
&lt;br /&gt;
Таким образом &amp;lt;math&amp;gt;A&amp;lt;/math&amp;gt; представляется в виде:&lt;br /&gt;
&lt;br /&gt;
   IA = [ 1 4 4 6 ]&lt;br /&gt;
   JA = [ 3 4 8 6 8 ]&lt;br /&gt;
   AN = [ 1 3 5 7 1 ]&lt;br /&gt;
&lt;br /&gt;
Данный способ представления называют &#039;&#039;полным&#039;&#039;, поскольку представлена вся матрица &amp;lt;math&amp;gt;A&amp;lt;/math&amp;gt;, и &#039;&#039;упорядоченным&#039;&#039;, поскольку эле­менты каждой строки хранятся в соответствии с возрастанием столбцовых индексов. Таким образом, это строчное представление, полное и упорядоченное, или сокращенно &#039;&#039;&#039;(RR (С) О)&#039;&#039;&#039;.&lt;br /&gt;
&lt;br /&gt;
==== Неупорядоченное представление ====&lt;br /&gt;
&lt;br /&gt;
Представления разреженных матриц необязательно должны быть упорядочены в том смысле, что, хотя упорядоченность строк поддерживается, внутри каждой строки элементы могут храниться в произвольном порядке. Для матрицы А нашего примера вполне можно было бы использовать и строчное представление, полное, но &#039;&#039;неупорядоченное&#039;&#039; &#039;&#039;&#039;(RR (С) U )&#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;
   IA = [ 1 4 4 6 ]&lt;br /&gt;
   JA = [ 8 3 4 8 6 ]&lt;br /&gt;
   AN = [ 5 1 3 1 7 ]&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; — число строк матрицы. &lt;br /&gt;
Для каждой ее строки &amp;lt;math&amp;gt;I&amp;lt;/math&amp;gt; матрицы мы находим с помощью &amp;lt;math&amp;gt;IA&amp;lt;/math&amp;gt; значения первой &amp;lt;math&amp;gt;IAA&amp;lt;/math&amp;gt; и последней &amp;lt;math&amp;gt;IAB&amp;lt;/math&amp;gt; позиций, занимаемых элементами строки &amp;lt;math&amp;gt;I&amp;lt;/math&amp;gt; в массивах &amp;lt;math&amp;gt;JA&amp;lt;/math&amp;gt; и &amp;lt;math&amp;gt;AN&amp;lt;/math&amp;gt;. Затем, чтобы вычислить скалярное произведение строки &amp;lt;math&amp;gt;I&amp;lt;/math&amp;gt; и вектора &amp;lt;math&amp;gt;B&amp;lt;/math&amp;gt;, мы просто просматриваем &amp;lt;math&amp;gt;JA&amp;lt;/math&amp;gt; и &amp;lt;math&amp;gt;AN&amp;lt;/math&amp;gt; на отрезке от &amp;lt;math&amp;gt;IAA&amp;lt;/math&amp;gt; до &amp;lt;math&amp;gt;IAB&amp;lt;/math&amp;gt;:&lt;br /&gt;
каждое значение, хранимое в &amp;lt;math&amp;gt;JA&amp;lt;/math&amp;gt;, есть столбцовый индекс и используется для извлечения из массива &amp;lt;math&amp;gt;B&amp;lt;/math&amp;gt; элемента, который должен быть умножен на соответствующее число из &amp;lt;math&amp;gt;AN&amp;lt;/math&amp;gt;. Результат каж­дого умножения прибавляется к &amp;lt;math&amp;gt;C(I)&amp;lt;/math&amp;gt;.&lt;br /&gt;
&lt;br /&gt;
== Математическое описание алгоритма ==&lt;br /&gt;
&lt;br /&gt;
&#039;&#039;&#039;Исходные данные:&#039;&#039;&#039; &lt;br /&gt;
&lt;br /&gt;
&amp;lt;math&amp;gt;IA, JA, AN&amp;lt;/math&amp;gt; - заданная матрица в форме &#039;&#039;&#039;(RR (С) U)&#039;&#039;&#039;;&lt;br /&gt;
&lt;br /&gt;
&amp;lt;math&amp;gt;B&amp;lt;/math&amp;gt; - заданный заполненный вектор;&lt;br /&gt;
&lt;br /&gt;
&amp;lt;math&amp;gt;N&amp;lt;/math&amp;gt; - число строк матрицы.&lt;br /&gt;
&lt;br /&gt;
&#039;&#039;&#039;Выход:&#039;&#039;&#039; &amp;lt;math&amp;gt;C&amp;lt;/math&amp;gt; вектор-произведение размерности &amp;lt;math&amp;gt;N&amp;lt;/math&amp;gt;.&lt;br /&gt;
&lt;br /&gt;
&#039;&#039;&#039;Формулы метода:&#039;&#039;&#039;&lt;br /&gt;
&lt;br /&gt;
:&amp;lt;math&amp;gt;&lt;br /&gt;
\begin{align}&lt;br /&gt;
&amp;amp; IAA_{i} = IA(i), \quad i \in [1, N], \\&lt;br /&gt;
&amp;amp; IAB_{i} = IA(i + 1) - 1, \quad i \in [1, N], \\&lt;br /&gt;
&amp;amp; c_{i} = \sum\limits_{j = IAA_{i}}^{IAB_{i}} AN(j)B(JA(j)), \quad i \in [1, N] \\&lt;br /&gt;
\end{align}&lt;br /&gt;
&amp;lt;/math&amp;gt;&lt;br /&gt;
&lt;br /&gt;
== Вычислительное ядро алгоритма ==&lt;br /&gt;
&lt;br /&gt;
Вычислительным ядром, т.е. той частью алгоритма, на которую приходится основное время его работы, является вычисление значения &amp;lt;math&amp;gt;i&amp;lt;/math&amp;gt;-го элемента &amp;lt;math&amp;gt;c_{i}&amp;lt;/math&amp;gt; вектора-произведения, т.е произведения строки &amp;lt;math&amp;gt;I&amp;lt;/math&amp;gt; матрицы &amp;lt;math&amp;gt;A&amp;lt;/math&amp;gt; и вектора &amp;lt;math&amp;gt;B&amp;lt;/math&amp;gt; по формуле:&lt;br /&gt;
&lt;br /&gt;
:&amp;lt;math&amp;gt;&lt;br /&gt;
\begin{align}&lt;br /&gt;
&amp;amp; c_{i} = \sum\limits_{j = IAA_{i}}^{IAB_{i}} AN(j)B(JA(j)), \quad i \in [1, N] \\&lt;br /&gt;
\end{align}&lt;br /&gt;
&amp;lt;/math&amp;gt;&lt;br /&gt;
&lt;br /&gt;
== Макроструктура алгоритма ==&lt;br /&gt;
&lt;br /&gt;
Основу алгоритма составляет вычисление значения &amp;lt;math&amp;gt;i&amp;lt;/math&amp;gt;-го элемента &amp;lt;math&amp;gt;c_{i}&amp;lt;/math&amp;gt; вектора-произведения:&lt;br /&gt;
&lt;br /&gt;
:&amp;lt;math&amp;gt;&lt;br /&gt;
\begin{align}&lt;br /&gt;
&amp;amp; c_{i} = \sum\limits_{j = IAA_{i}}^{IAB_{i}} AN(j)B(JA(j)), \quad i \in [1, N] \\&lt;br /&gt;
\end{align}&lt;br /&gt;
&amp;lt;/math&amp;gt;&lt;br /&gt;
&lt;br /&gt;
== Схема реализации последовательного алгоритма ==&lt;br /&gt;
&lt;br /&gt;
Последовательность исполнения метода следующая: &lt;br /&gt;
&lt;br /&gt;
Далее для всех &amp;lt;math&amp;gt;i&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; по нарастанию выполняются:&lt;br /&gt;
&lt;br /&gt;
1. &amp;lt;math&amp;gt; c_{i} = 0; IAA = IA(i); IAB = IA(i + 1 ) - 1 &amp;lt;/math&amp;gt;&lt;br /&gt;
&lt;br /&gt;
После этого, если &amp;lt;math&amp;gt;(IAB \le IAA)&amp;lt;/math&amp;gt;:&lt;br /&gt;
&lt;br /&gt;
2. Для всех &amp;lt;math&amp;gt;j&amp;lt;/math&amp;gt; от &amp;lt;math&amp;gt;IAA&amp;lt;/math&amp;gt; до &amp;lt;math&amp;gt;IAB&amp;lt;/math&amp;gt; выполняется: &lt;br /&gt;
&lt;br /&gt;
&amp;lt;math&amp;gt;c_{i} = \sum\limits_{j = IAA_{i}}^{IAB_{i}} AN(j)B(JA(j))&amp;lt;/math&amp;gt;&lt;br /&gt;
&lt;br /&gt;
Псевдокод алгоритма: &lt;br /&gt;
&lt;br /&gt;
    FOR I = 1, N                          (1)&lt;br /&gt;
       U = 0.                             (2) &lt;br /&gt;
       IAA = IA(I)                        (3) &lt;br /&gt;
       IAB = IA(I + 1 ) - 1               (4)&lt;br /&gt;
       IF NOT(IAB.LT.IAA)                 (5)&lt;br /&gt;
           FOR J = IAA, IAB               (6)&lt;br /&gt;
           C(I) = U + AN(J)*B(JA(J))      (7)&lt;br /&gt;
&lt;br /&gt;
== Последовательная сложность алгоритма ==&lt;br /&gt;
&lt;br /&gt;
Для всего алгоритма потребуется выполнить &amp;lt;math&amp;gt;O(k)&amp;lt;/math&amp;gt; операций, как в строке стр.7 псевдокода алгоритма ([[#Схема реализации последовательного алгоритма|п.1.5]]), где &amp;lt;math&amp;gt;k&amp;lt;/math&amp;gt; - число ненулевых эле­ментов матрицы.&lt;br /&gt;
&lt;br /&gt;
== Информационный граф ==&lt;br /&gt;
&lt;br /&gt;
На рисунке 1 изображен информационный граф алгоритма.&lt;br /&gt;
&lt;br /&gt;
[[file:InfoGrafMatrixRRCUandVextor.jpg|thumb|center|1200px|Рисунок 1. Информационный граф алгоритма.]]&lt;br /&gt;
 &lt;br /&gt;
По оси &amp;lt;math&amp;gt;X&amp;lt;/math&amp;gt; для отдельной строки &amp;lt;math&amp;gt;I&amp;lt;/math&amp;gt; матрицы отложены в пределах первой &amp;lt;math&amp;gt;IAA&amp;lt;/math&amp;gt; и последней &amp;lt;math&amp;gt;IAB&amp;lt;/math&amp;gt; позиций ненулевых элементов значения &amp;lt;math&amp;gt;AN&amp;lt;/math&amp;gt; и соответствуюие им по столбцовомым индексам, хранимимым в &amp;lt;math&amp;gt;JA&amp;lt;/math&amp;gt;, значения &amp;lt;math&amp;gt;B&amp;lt;/math&amp;gt; элементов. &lt;br /&gt;
Пары этих значений обозначены желтыми квадратиками &amp;lt;math&amp;gt;(in)&amp;lt;/math&amp;gt;. Значения in попарно скалярно перемножаются (зеленый кружочек) и суммируются (синий кружочек) в результат значения элемента вектора-произведения &amp;lt;math&amp;gt;c_{i}&amp;lt;/math&amp;gt;, т.е &amp;lt;math&amp;gt;out&amp;lt;/math&amp;gt;(красный квадратик) с строковым индексом, соответствующем номеру строки матрицы.&lt;br /&gt;
&lt;br /&gt;
По оси &amp;lt;math&amp;gt;Y&amp;lt;/math&amp;gt; отложена схема вычисление значения каждого элемента вектора-произведения для каждой строки матрицы.&lt;br /&gt;
&lt;br /&gt;
== Ресурс параллелизма алгоритма ==&lt;br /&gt;
&lt;br /&gt;
Алгоритм обладает возможностью выполняться параллельно, что позволяет значительно ускорить вычисления.&lt;br /&gt;
Вычисление значения каждого элемента вектора-произведения для каждой строки матрицы и элемента вектора &amp;lt;math&amp;gt;B&amp;lt;/math&amp;gt; можно проводить на отдельных процессорах. &lt;br /&gt;
Максимальная эффективность вычислений достигается при наличии не менее, чем &amp;lt;math&amp;gt;N&amp;lt;/math&amp;gt; процессоров, т.е отдельный процессор на вычисление значения каждого элемента вектора-произведения. На процессоре выполняется &amp;lt;math&amp;gt;k(i)&amp;lt;/math&amp;gt; последовательных операций умножения и сложения. Поэтому число ярусов для &amp;lt;math&amp;gt;i&amp;lt;/math&amp;gt;-ого процессора равно &amp;lt;math&amp;gt;k(i)&amp;lt;/math&amp;gt;.&lt;br /&gt;
&lt;br /&gt;
Для параллельного выполнения алгоритма требуется:&lt;br /&gt;
&lt;br /&gt;
* &amp;lt;math&amp;gt;N&amp;lt;/math&amp;gt; ярусов умножений и сложений,&lt;br /&gt;
* в каждом из ярусов &amp;lt;math&amp;gt;k &amp;lt;&amp;lt; m&amp;lt;/math&amp;gt; операций.&lt;br /&gt;
&lt;br /&gt;
При классификации по высоте ЯПФ, алгоритм имеет линейную сложность. При классификации по высоте ЯПФ также линейную.&lt;br /&gt;
&lt;br /&gt;
== Входные и выходные данные алгоритма ==&lt;br /&gt;
&#039;&#039;&#039;Входные данные:&#039;&#039;&#039;&lt;br /&gt;
&lt;br /&gt;
* &amp;lt;math&amp;gt;IA, JA, AN&amp;lt;/math&amp;gt; - заданная матрица в форме &#039;&#039;&#039;(RR (С) U)&#039;&#039;&#039; c &amp;lt;math&amp;gt;k&amp;lt;/math&amp;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;B&amp;lt;/math&amp;gt; - заданный заполненный вектор c &amp;lt;math&amp;gt;m&amp;lt;/math&amp;gt; элементами;&lt;br /&gt;
&#039;&#039;&#039;&lt;br /&gt;
&#039;&#039;&#039;Объем входных данных&#039;&#039;&#039;: &amp;lt;math&amp;gt;k + m&amp;lt;/math&amp;gt;&lt;br /&gt;
&lt;br /&gt;
&#039;&#039;&#039;Выходные данные:&#039;&#039;&#039; &amp;lt;math&amp;gt;C&amp;lt;/math&amp;gt; вектор-произведение размерности &amp;lt;math&amp;gt;N&amp;lt;/math&amp;gt;.&lt;br /&gt;
&lt;br /&gt;
&#039;&#039;&#039;Объем выходных данных&#039;&#039;&#039;: &amp;lt;math&amp;gt;N&amp;lt;/math&amp;gt;&lt;br /&gt;
&lt;br /&gt;
== Свойства алгоритма ==&lt;br /&gt;
&lt;br /&gt;
Алгоритм в рамках выбранной версии полностью детерминирован.&lt;br /&gt;
&lt;br /&gt;
Вычислительная мощность алгоритма, как отношение числа операций к суммарному объему входных и выходных данных – константа.&lt;br /&gt;
&lt;br /&gt;
= Программная реализация алгоритма =&lt;br /&gt;
&lt;br /&gt;
&lt;br /&gt;
== Особенности реализации последовательного алгоритма ==&lt;br /&gt;
&lt;br /&gt;
== Локальность данных и вычислений ==&lt;br /&gt;
&lt;br /&gt;
== Возможные способы и особенности параллельной реализации алгоритма ==&lt;br /&gt;
&lt;br /&gt;
== Масштабируемость алгоритма и его реализации ==&lt;br /&gt;
&lt;br /&gt;
== Динамические характеристики и эффективность реализации алгоритма ==&lt;br /&gt;
&lt;br /&gt;
== Выводы для классов архитектур ==&lt;br /&gt;
&lt;br /&gt;
== Существующие реализации алгоритма ==&lt;br /&gt;
&lt;br /&gt;
Алгоритм релизован в составе библиотек: &lt;br /&gt;
* SparseLib++[http://math.nist.gov/sparselib++/] &lt;br /&gt;
* cuSPARSE [http://docs.nvidia.com/cuda/cusparse/]&lt;br /&gt;
* uBLAS [http://www.boost.org/doc/libs/1_62_0/libs/numeric/ublas/doc/]&lt;br /&gt;
* Intel MKL [https://software.intel.com/en-us/intel-mkl]&lt;br /&gt;
&lt;br /&gt;
= Литература =&lt;br /&gt;
&lt;br /&gt;
* [1] С. Писсанецки. Технология разреженных матриц. Изд. Мир, 1988.&lt;br /&gt;
* [2] В. В. Воеводин, Вл.В. Воеводин. Параллельные вычисления. – СПб.: БХВ - Петербург, 2002.&lt;/div&gt;</summary>
		<author><name>Lexaloris</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:Lexaloris/%D0%A3%D0%BC%D0%BD%D0%BE%D0%B6%D0%B5%D0%BD%D0%B8%D0%B5_%D1%80%D0%B0%D0%B7%D1%80%D0%B5%D0%B6%D0%B5%D0%BD%D0%BD%D0%BE%D0%B9_%D0%BC%D0%B0%D1%82%D1%80%D0%B8%D1%86%D1%8B_%D0%BD%D0%B0_%D0%B2%D0%B5%D0%BA%D1%82%D0%BE%D1%80&amp;diff=11473</id>
		<title>Участник:Lexaloris/Умножение разреженной матрицы на вектор</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:Lexaloris/%D0%A3%D0%BC%D0%BD%D0%BE%D0%B6%D0%B5%D0%BD%D0%B8%D0%B5_%D1%80%D0%B0%D0%B7%D1%80%D0%B5%D0%B6%D0%B5%D0%BD%D0%BD%D0%BE%D0%B9_%D0%BC%D0%B0%D1%82%D1%80%D0%B8%D1%86%D1%8B_%D0%BD%D0%B0_%D0%B2%D0%B5%D0%BA%D1%82%D0%BE%D1%80&amp;diff=11473"/>
		<updated>2016-10-15T19:34:39Z</updated>

		<summary type="html">&lt;p&gt;Lexaloris: &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(k)&amp;lt;/math&amp;gt;&lt;br /&gt;
| pf_height         = &amp;lt;math&amp;gt;O(m)&amp;lt;/math&amp;gt;&lt;br /&gt;
| pf_width          = &amp;lt;math&amp;gt;O(n)&amp;lt;/math&amp;gt;&lt;br /&gt;
| input_data        = &amp;lt;math&amp;gt;k + m&amp;lt;/math&amp;gt;&lt;br /&gt;
| output_data       = &amp;lt;math&amp;gt;n&amp;lt;/math&amp;gt;&lt;br /&gt;
}}&lt;br /&gt;
&lt;br /&gt;
&lt;br /&gt;
&#039;&#039;&#039;Авторы страницы:&#039;&#039;&#039; [[Участник:Lexaloris|A.Д. Новоселов]] и [[Участник:kochet|П.А. Кочетков]]&lt;br /&gt;
&lt;br /&gt;
= Свойства и структура алгоритмов =&lt;br /&gt;
&lt;br /&gt;
== Общее описание алгоритма ==&lt;br /&gt;
&lt;br /&gt;
=== Хранение ненулевых элементов разреженной матрицы ===&lt;br /&gt;
&lt;br /&gt;
==== Разреженный строчной формат ====&lt;br /&gt;
&lt;br /&gt;
Одной из наиболее ши­роко используемых схем хранения разреженных матриц является &#039;&#039;разреженный строчный формат&#039;&#039;. Эта&lt;br /&gt;
схема предъявляет минимальные требования к памяти и в то же время оказывается очень удобной для умножения разреженной матрицы на вектор.&lt;br /&gt;
Например, рассмотрим формат хранения разряженной матрицы &amp;lt;math&amp;gt;A&amp;lt;/math&amp;gt;:&lt;br /&gt;
&lt;br /&gt;
[[File:RRCOMatrix.png]]&lt;br /&gt;
&lt;br /&gt;
Значения нену­левых элементов матрицы и соответствующие столбцовые индексы хранятся в этой схеме по строкам в двух массивах &amp;lt;math&amp;gt;AN&amp;lt;/math&amp;gt; и &amp;lt;math&amp;gt;JA&amp;lt;/math&amp;gt; соответственно. Используется также массив указателей &amp;lt;math&amp;gt;IA&amp;lt;/math&amp;gt;, отмечающих позиции массивов &amp;lt;math&amp;gt;AN&amp;lt;/math&amp;gt; и &amp;lt;math&amp;gt;JA&amp;lt;/math&amp;gt;, с которых начинается описание очередной строки. Дополнительная компо­нента в &amp;lt;math&amp;gt;IA&amp;lt;/math&amp;gt; содержит указатель первой свободной позиции в &amp;lt;math&amp;gt;JA&amp;lt;/math&amp;gt; и &amp;lt;math&amp;gt;AN&amp;lt;/math&amp;gt;.&lt;br /&gt;
&lt;br /&gt;
Таким образом &amp;lt;math&amp;gt;A&amp;lt;/math&amp;gt; представляется в виде:&lt;br /&gt;
&lt;br /&gt;
   IA = [ 1 4 4 6 ]&lt;br /&gt;
   JA = [ 3 4 8 6 8 ]&lt;br /&gt;
   AN = [ 1 3 5 7 1 ]&lt;br /&gt;
&lt;br /&gt;
Данный способ представления называют &#039;&#039;полным&#039;&#039;, поскольку представлена вся матрица &amp;lt;math&amp;gt;A&amp;lt;/math&amp;gt;, и &#039;&#039;упорядоченным&#039;&#039;, поскольку эле­менты каждой строки хранятся в соответствии с возрастанием столбцовых индексов. Таким образом, это строчное представление, полное и упорядоченное, или сокращенно &#039;&#039;&#039;(RR (С) О)&#039;&#039;&#039;.&lt;br /&gt;
&lt;br /&gt;
==== Неупорядоченное представление ====&lt;br /&gt;
&lt;br /&gt;
Представления разреженных матриц необязательно должны быть упорядочены в том смысле, что, хотя упорядоченность строк поддерживается, внутри каждой строки элементы могут храниться в произвольном порядке. Для матрицы А нашего примера вполне можно было бы использовать и строчное представление, полное, но &#039;&#039;неупорядоченное&#039;&#039; &#039;&#039;&#039;(RR (С) U )&#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;
   IA = [ 1 4 4 6 ]&lt;br /&gt;
   JA = [ 8 3 4 8 6 ]&lt;br /&gt;
   AN = [ 5 1 3 1 7 ]&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; — число строк матрицы. &lt;br /&gt;
Для каждой ее строки &amp;lt;math&amp;gt;I&amp;lt;/math&amp;gt; матрицы мы находим с помощью &amp;lt;math&amp;gt;IA&amp;lt;/math&amp;gt; значения первой &amp;lt;math&amp;gt;IAA&amp;lt;/math&amp;gt; и последней &amp;lt;math&amp;gt;IAB&amp;lt;/math&amp;gt; позиций, занимаемых элементами строки &amp;lt;math&amp;gt;I&amp;lt;/math&amp;gt; в массивах &amp;lt;math&amp;gt;JA&amp;lt;/math&amp;gt; и &amp;lt;math&amp;gt;AN&amp;lt;/math&amp;gt;. Затем, чтобы вычислить скалярное произведение строки &amp;lt;math&amp;gt;I&amp;lt;/math&amp;gt; и вектора &amp;lt;math&amp;gt;B&amp;lt;/math&amp;gt;, мы просто просматриваем &amp;lt;math&amp;gt;JA&amp;lt;/math&amp;gt; и &amp;lt;math&amp;gt;AN&amp;lt;/math&amp;gt; на отрезке от &amp;lt;math&amp;gt;IAA&amp;lt;/math&amp;gt; до &amp;lt;math&amp;gt;IAB&amp;lt;/math&amp;gt;:&lt;br /&gt;
каждое значение, хранимое в &amp;lt;math&amp;gt;JA&amp;lt;/math&amp;gt;, есть столбцовый индекс и используется для извлечения из массива &amp;lt;math&amp;gt;B&amp;lt;/math&amp;gt; элемента, который должен быть умножен на соответствующее число из &amp;lt;math&amp;gt;AN&amp;lt;/math&amp;gt;. Результат каж­дого умножения прибавляется к &amp;lt;math&amp;gt;C(I)&amp;lt;/math&amp;gt;.&lt;br /&gt;
&lt;br /&gt;
== Математическое описание алгоритма ==&lt;br /&gt;
&lt;br /&gt;
&#039;&#039;&#039;Исходные данные:&#039;&#039;&#039; &lt;br /&gt;
&lt;br /&gt;
&amp;lt;math&amp;gt;IA, JA, AN&amp;lt;/math&amp;gt; - заданная матрица в форме &#039;&#039;&#039;(RR (С) U)&#039;&#039;&#039;;&lt;br /&gt;
&lt;br /&gt;
&amp;lt;math&amp;gt;B&amp;lt;/math&amp;gt; - заданный заполненный вектор;&lt;br /&gt;
&lt;br /&gt;
&amp;lt;math&amp;gt;N&amp;lt;/math&amp;gt; - число строк матрицы.&lt;br /&gt;
&lt;br /&gt;
&#039;&#039;&#039;Выход:&#039;&#039;&#039; &amp;lt;math&amp;gt;C&amp;lt;/math&amp;gt; вектор-произведение размерности &amp;lt;math&amp;gt;N&amp;lt;/math&amp;gt;.&lt;br /&gt;
&lt;br /&gt;
&#039;&#039;&#039;Формулы метода:&#039;&#039;&#039;&lt;br /&gt;
&lt;br /&gt;
:&amp;lt;math&amp;gt;&lt;br /&gt;
\begin{align}&lt;br /&gt;
&amp;amp; IAA_{i} = IA(i), \quad i \in [1, N], \\&lt;br /&gt;
&amp;amp; IAB_{i} = IA(i + 1) - 1, \quad i \in [1, N], \\&lt;br /&gt;
&amp;amp; c_{i} = \sum\limits_{j = IAA_{i}}^{IAB_{i}} AN(j)B(JA(j)), \quad i \in [1, N] \\&lt;br /&gt;
\end{align}&lt;br /&gt;
&amp;lt;/math&amp;gt;&lt;br /&gt;
&lt;br /&gt;
== Вычислительное ядро алгоритма ==&lt;br /&gt;
&lt;br /&gt;
Вычислительным ядром, т.е. той частью алгоритма, на которую приходится основное время его работы, является вычисление значения &amp;lt;math&amp;gt;i&amp;lt;/math&amp;gt;-го элемента &amp;lt;math&amp;gt;c_{i}&amp;lt;/math&amp;gt; вектора-произведения, т.е произведения строки &amp;lt;math&amp;gt;I&amp;lt;/math&amp;gt; матрицы &amp;lt;math&amp;gt;A&amp;lt;/math&amp;gt; и вектора &amp;lt;math&amp;gt;B&amp;lt;/math&amp;gt; по формуле:&lt;br /&gt;
&lt;br /&gt;
:&amp;lt;math&amp;gt;&lt;br /&gt;
\begin{align}&lt;br /&gt;
&amp;amp; c_{i} = \sum\limits_{j = IAA_{i}}^{IAB_{i}} AN(j)B(JA(j)), \quad i \in [1, N] \\&lt;br /&gt;
\end{align}&lt;br /&gt;
&amp;lt;/math&amp;gt;&lt;br /&gt;
&lt;br /&gt;
== Макроструктура алгоритма ==&lt;br /&gt;
&lt;br /&gt;
Основу алгоритма составляет вычисление значения &amp;lt;math&amp;gt;i&amp;lt;/math&amp;gt;-го элемента &amp;lt;math&amp;gt;c_{i}&amp;lt;/math&amp;gt; вектора-произведения:&lt;br /&gt;
&lt;br /&gt;
:&amp;lt;math&amp;gt;&lt;br /&gt;
\begin{align}&lt;br /&gt;
&amp;amp; c_{i} = \sum\limits_{j = IAA_{i}}^{IAB_{i}} AN(j)B(JA(j)), \quad i \in [1, N] \\&lt;br /&gt;
\end{align}&lt;br /&gt;
&amp;lt;/math&amp;gt;&lt;br /&gt;
&lt;br /&gt;
== Схема реализации последовательного алгоритма ==&lt;br /&gt;
&lt;br /&gt;
Последовательность исполнения метода следующая: &lt;br /&gt;
&lt;br /&gt;
Далее для всех &amp;lt;math&amp;gt;i&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; по нарастанию выполняются:&lt;br /&gt;
&lt;br /&gt;
1. &amp;lt;math&amp;gt; c_{i} = 0; IAA = IA(i); IAB = IA(i + 1 ) - 1 &amp;lt;/math&amp;gt;&lt;br /&gt;
&lt;br /&gt;
После этого, если &amp;lt;math&amp;gt;(IAB \le IAA)&amp;lt;/math&amp;gt;:&lt;br /&gt;
&lt;br /&gt;
2. Для всех &amp;lt;math&amp;gt;j&amp;lt;/math&amp;gt; от &amp;lt;math&amp;gt;IAA&amp;lt;/math&amp;gt; до &amp;lt;math&amp;gt;IAB&amp;lt;/math&amp;gt; выполняется: &lt;br /&gt;
&lt;br /&gt;
&amp;lt;math&amp;gt;c_{i} = \sum\limits_{j = IAA_{i}}^{IAB_{i}} AN(j)B(JA(j))&amp;lt;/math&amp;gt;&lt;br /&gt;
&lt;br /&gt;
Псевдокод алгоритма: &lt;br /&gt;
&lt;br /&gt;
    FOR I = 1, N                          (1)&lt;br /&gt;
       U = 0.                             (2) &lt;br /&gt;
       IAA = IA(I)                        (3) &lt;br /&gt;
       IAB = IA(I + 1 ) - 1               (4)&lt;br /&gt;
       IF NOT(IAB.LT.IAA)                 (5)&lt;br /&gt;
           FOR J = IAA, IAB               (6)&lt;br /&gt;
           C(I) = U + AN(J)*B(JA(J))      (7)&lt;br /&gt;
&lt;br /&gt;
== Последовательная сложность алгоритма ==&lt;br /&gt;
&lt;br /&gt;
Для всего алгоритма потребуется выполнить &amp;lt;math&amp;gt;O(k)&amp;lt;/math&amp;gt; операций, как в строке стр.7 псевдокода алгоритма ([[#Схема реализации последовательного алгоритма|п.1.5]]), где &amp;lt;math&amp;gt;k&amp;lt;/math&amp;gt; - число ненулевых эле­ментов матрицы.&lt;br /&gt;
&lt;br /&gt;
== Информационный граф ==&lt;br /&gt;
&lt;br /&gt;
На рисунке 1 изображен информационный граф алгоритма.&lt;br /&gt;
&lt;br /&gt;
[[file:InfoGrafMatrixRRCUandVextor.jpg|thumb|center|1200px|Рисунок 1. Информационный граф алгоритма.]]&lt;br /&gt;
 &lt;br /&gt;
По оси &amp;lt;math&amp;gt;X&amp;lt;/math&amp;gt; для отдельной строки &amp;lt;math&amp;gt;I&amp;lt;/math&amp;gt; матрицы отложены в пределах первой &amp;lt;math&amp;gt;IAA&amp;lt;/math&amp;gt; и последней &amp;lt;math&amp;gt;IAB&amp;lt;/math&amp;gt; позиций ненулевых элементов значения &amp;lt;math&amp;gt;AN&amp;lt;/math&amp;gt; и соответствуюие им по столбцовомым индексам, хранимимым в &amp;lt;math&amp;gt;JA&amp;lt;/math&amp;gt;, значения &amp;lt;math&amp;gt;B&amp;lt;/math&amp;gt; элементов. &lt;br /&gt;
Пары этих значений обозначены желтыми квадратиками &amp;lt;math&amp;gt;(in)&amp;lt;/math&amp;gt;. Значения in попарно скалярно перемножаются (зеленый кружочек) и суммируются (синий кружочек) в результат значения элемента вектора-произведения &amp;lt;math&amp;gt;c_{i}&amp;lt;/math&amp;gt;, т.е &amp;lt;math&amp;gt;out&amp;lt;/math&amp;gt;(красный квадратик) с строковым индексом, соответствующем номеру строки матрицы.&lt;br /&gt;
&lt;br /&gt;
По оси &amp;lt;math&amp;gt;Y&amp;lt;/math&amp;gt; отложена схема вычисление значения каждого элемента вектора-произведения для каждой строки матрицы.&lt;br /&gt;
&lt;br /&gt;
== Ресурс параллелизма алгоритма ==&lt;br /&gt;
&lt;br /&gt;
Алгоритм обладает возможностью выполняться параллельно, что позволяет значительно ускорить вычисления.&lt;br /&gt;
Вычисление значения каждого элемента вектора-произведения для каждой строки матрицы и элемента вектора B можно проводить на отдельных процессорах. &lt;br /&gt;
Максимальная эффективность вычислений достигается при наличии не менее, чем &amp;lt;math&amp;gt;N&amp;lt;/math&amp;gt; процессоров, т.е отдельный процессор на вычисление значения каждого элемента вектора-произведения. На процессоре выполняется &amp;lt;math&amp;gt;k(i)&amp;lt;/math&amp;gt; последовательных операций умножения и сложения. Поэтому число ярусов для &amp;lt;math&amp;gt;i&amp;lt;/math&amp;gt;-ого процессора равно &amp;lt;math&amp;gt;k(i)&amp;lt;/math&amp;gt;.&lt;br /&gt;
&lt;br /&gt;
Для параллельного выполнения алгоритма требуется:&lt;br /&gt;
&lt;br /&gt;
* &amp;lt;math&amp;gt;N&amp;lt;/math&amp;gt; ярусов умножений и сложений,&lt;br /&gt;
* в каждом из ярусов &amp;lt;math&amp;gt;k &amp;lt;&amp;lt; m&amp;lt;/math&amp;gt; операций.&lt;br /&gt;
&lt;br /&gt;
При классификации по высоте ЯПФ, алгоритм имеет линейную сложность. При классификации по высоте ЯПФ также линейную.&lt;br /&gt;
&lt;br /&gt;
== Входные и выходные данные алгоритма ==&lt;br /&gt;
&#039;&#039;&#039;Входные данные:&#039;&#039;&#039;&lt;br /&gt;
&lt;br /&gt;
* &amp;lt;math&amp;gt;IA, JA, AN&amp;lt;/math&amp;gt; - заданная матрица в форме &#039;&#039;&#039;(RR (С) U)&#039;&#039;&#039; c &amp;lt;math&amp;gt;k&amp;lt;/math&amp;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;B&amp;lt;/math&amp;gt; - заданный заполненный вектор c &amp;lt;math&amp;gt;m&amp;lt;/math&amp;gt; элементами;&lt;br /&gt;
&#039;&#039;&#039;&lt;br /&gt;
&#039;&#039;&#039;Объем входных данных&#039;&#039;&#039;: &amp;lt;math&amp;gt;k + m&amp;lt;/math&amp;gt;&lt;br /&gt;
&lt;br /&gt;
&#039;&#039;&#039;Выходные данные:&#039;&#039;&#039; &amp;lt;math&amp;gt;C&amp;lt;/math&amp;gt; вектор-произведение размерности &amp;lt;math&amp;gt;N&amp;lt;/math&amp;gt;.&lt;br /&gt;
&lt;br /&gt;
&#039;&#039;&#039;Объем выходных данных&#039;&#039;&#039;: &amp;lt;math&amp;gt;N&amp;lt;/math&amp;gt;&lt;br /&gt;
&lt;br /&gt;
== Свойства алгоритма ==&lt;br /&gt;
&lt;br /&gt;
Алгоритм в рамках выбранной версии полностью детерминирован.&lt;br /&gt;
&lt;br /&gt;
Вычислительная мощность алгоритма, как отношение числа операций к суммарному объему входных и выходных данных – константа.&lt;br /&gt;
&lt;br /&gt;
= Программная реализация алгоритма =&lt;br /&gt;
&lt;br /&gt;
== Масштабируемость алгоритма и его реализации ==&lt;br /&gt;
&lt;br /&gt;
== Существующие реализации алгоритма ==&lt;br /&gt;
&lt;br /&gt;
Алгоритм релизован в составе библиотек: &lt;br /&gt;
* SparseLib++[http://math.nist.gov/sparselib++/] &lt;br /&gt;
* cuSPARSE [http://docs.nvidia.com/cuda/cusparse/]&lt;br /&gt;
* uBLAS [http://www.boost.org/doc/libs/1_62_0/libs/numeric/ublas/doc/]&lt;br /&gt;
* Intel MKL [https://software.intel.com/en-us/intel-mkl]&lt;br /&gt;
&lt;br /&gt;
= Литература =&lt;br /&gt;
&lt;br /&gt;
* [1] С. Писсанецки. Технология разреженных матриц. Изд. Мир, 1988.&lt;br /&gt;
* [2] В. В. Воеводин, Вл.В. Воеводин. Параллельные вычисления. – СПб.: БХВ - Петербург, 2002.&lt;/div&gt;</summary>
		<author><name>Lexaloris</name></author>
	</entry>
	<entry>
		<id>https://xn--80aecvaldz.xn--80ahdrnmvk.xn--p1ai/w/ru/index.php?title=%D0%9E%D0%B1%D1%81%D1%83%D0%B6%D0%B4%D0%B5%D0%BD%D0%B8%D0%B5_%D1%83%D1%87%D0%B0%D1%81%D1%82%D0%BD%D0%B8%D0%BA%D0%B0:Lineprinter&amp;diff=11267</id>
		<title>Обсуждение участника:Lineprinter</title>
		<link rel="alternate" type="text/html" href="https://xn--80aecvaldz.xn--80ahdrnmvk.xn--p1ai/w/ru/index.php?title=%D0%9E%D0%B1%D1%81%D1%83%D0%B6%D0%B4%D0%B5%D0%BD%D0%B8%D0%B5_%D1%83%D1%87%D0%B0%D1%81%D1%82%D0%BD%D0%B8%D0%BA%D0%B0:Lineprinter&amp;diff=11267"/>
		<updated>2016-10-15T19:03:17Z</updated>

		<summary type="html">&lt;p&gt;Lexaloris: /* Перенос */&lt;/p&gt;
&lt;hr /&gt;
&lt;div&gt;== Перенос ==&lt;br /&gt;
Статья: [[Кластеризация сетями Кохонена]]&lt;br /&gt;
Выполняют: [[Участник:Kravtsovkirill| Кравцов Кирилл]] и [[Участник:Emaksimov| Максимов Егор]]&lt;br /&gt;
&lt;br /&gt;
Статья: [[Нахождение собственных чисел квадратной матрицы методом QR разложения (2)]]&lt;br /&gt;
Выполняют: Баев Олег и Шевелев Александр&lt;br /&gt;
&lt;br /&gt;
Статья: [[Стабилизированный метод биспоряженных градиентов (BiCGSTAB)]]&lt;br /&gt;
Выполняют: Гаврилов Алексей и Новиков Александр&lt;br /&gt;
&lt;br /&gt;
Статья: [[Участники: Бобошко А., Юмакаева А./Решение начальной задачи Коши для системы ОДУ методом Рунге-Кутта 4-го порядка]];&lt;br /&gt;
Выполняют: Бобошко Алексей и Юмакаева Алина&lt;br /&gt;
&lt;br /&gt;
Статья: [[Алгоритм кластеризации, основанный на сетях Кохоннена]];&lt;br /&gt;
Выполняют:  Логвиненко Александра и Адиев Тохтар&lt;br /&gt;
&lt;br /&gt;
Статья: [[Ортогонализация Грама-Шмидта]];&lt;br /&gt;
Выполняют: [[Участник:KibAndrey| Кибанов Андрей]] и Аджиева Татьяна&lt;br /&gt;
&lt;br /&gt;
Статья: [[Самоорганизующиеся карты Кохонена]];&lt;br /&gt;
Выполняет: [[Участник:Anton goy| Гой Антон]]&lt;br /&gt;
&lt;br /&gt;
Статья:[[ЕМ-алгоритм_(Тематическое_моделирование)]];&lt;br /&gt;
Выполняют: Мурат Апишев и Андрей Заночкин&lt;br /&gt;
&lt;br /&gt;
Статья:[[Алгоритм_Ланцоша_с_полной_переортогонализацией]];&lt;br /&gt;
Выполняет:[[Участник:Sfedotov| Федотов С.А.]]&lt;br /&gt;
&lt;br /&gt;
Статья: [[Алгоритм_k-средних]]&lt;br /&gt;
Выполняют: [[Участник:Error2407|Богомазов Евгений]], [[Участник:Илья_Егоров|Егоров Илья]]&lt;br /&gt;
&lt;br /&gt;
Статья: [[Алгоритм k-means]]&lt;br /&gt;
Выполняют: [[Участник:Бротиковская Данута|Данута Бротиковская]] и [[Участник:DennZo1993|Денис Зобнин]]&lt;br /&gt;
&lt;br /&gt;
Статья: [[Нечеткий_алгоритм_С_средних]]&lt;br /&gt;
Выполняют: [[Участник:Demon smd|Д.А.Гуськов]], [[Участник:marina abramenkova|М.А.Абраменкова]]&lt;br /&gt;
&lt;br /&gt;
Статья: [[Решение_задачи_Коши_для_системы_ОДУ_методом_Рунге-Кутты_4_порядка]];&lt;br /&gt;
Выполняют: [[Участник:Алимов_Дамир_Алиевич|Алимов Дамир]] и [[Участник:Anlesnichiy|Антон Лесничий]]&lt;br /&gt;
&lt;br /&gt;
Статья: [[Строгий_алгоритм_С_средних_(Hard_C-Means,_HCM)]];&lt;br /&gt;
Выполняют: [[Участник:Светлана_Лукьяненко|Лукьяненко Светлана]] и [[Участник:Юрий_Комаров|Комаров Юрий]]&lt;br /&gt;
&lt;br /&gt;
Статья: [[Алгоритм кластеризации, основанный на минимальном остовном дереве]];&lt;br /&gt;
Выполняет: [[Участник:Astandrik | Стандрик Антон Сергеевич]]&lt;br /&gt;
&lt;br /&gt;
Статья: [[Умножение разреженной матрицы на вектор]];&lt;br /&gt;
Выполняет: [[Участник:Lexaloris | Новоселов Алексей]], Выполняет: [[Участник:kochet|П.А. Кочетков]]&lt;br /&gt;
&lt;br /&gt;
Статья: [[Нахождение_собственных_чисел_квадратной_матрицы_методом_QR_разложения_(3)|Нахождение собственных чисел квадратной матрицы методом QR разложения (3)]];&lt;br /&gt;
Выполняют: [[Участник:Смирнова_Александра|Смирнова А.С.]], [[Участник:Александра_Киямова|Киямова А.]]&lt;br /&gt;
&lt;br /&gt;
Статья: [[Метод_Якоби_вычисления_сингулярных_чисел_и_векторов]];&lt;br /&gt;
Выполняют: [[Участница:Почернина_Елена| Почернина Елена]] и [[Участница:Светлана|Костюкова Светлана]]&lt;br /&gt;
&lt;br /&gt;
Статья: [[Метод_Ньютона_для_решения_систем_нелинейных_уравнений(2)]];&lt;br /&gt;
Выполняют: [[Участник:Oleggium|Гирняк О.Р.]], [[Участник:Dimx19|Васильков Д.А.]]&lt;br /&gt;
&lt;br /&gt;
Статья: [[Алгоритм_кластеризации_с_использованием_представлений]];&lt;br /&gt;
Выполняют: [[Участник:Cookie|Шатков С.А.]], [[Участница:JuliaA|Антохина Ю.А.]]&lt;br /&gt;
&lt;br /&gt;
Статья: [[Быстрое_преобразование_Фурье_(FFT)|Быстрое преобразование Фурье (FFT)]];&lt;br /&gt;
Выполняют: [[Участник:Victoria_Stepanischeva|Степанищева Виктория]] и [[Участник:Igor_Munkin|Мунькин Игорь]]&lt;br /&gt;
&lt;br /&gt;
Статья: [[Быстрое_дискретное_преобразование_Фурье|Быстрое_дискретное_преобразование_Фурье]];&lt;br /&gt;
Выполняют: [[Участник:ivanov.kir.m | К.М.Иванов]], [[Участник:Pumpkin | А.C.Сапин]]&lt;br /&gt;
&lt;br /&gt;
Статья:[[Алгоритм_k_средних]]&lt;br /&gt;
Выполняют: [[Участник:Parkhomenko|Пархоменко Павел]], [[Участник:ivan.mashonskiy|Машонский Иван]]&lt;br /&gt;
&lt;br /&gt;
Статья:[[EM-алгоритм_кластеризации]]&lt;br /&gt;
Выполняет: [[Участник:Noite|Зинченко Дмитрий]]&lt;br /&gt;
&lt;br /&gt;
Статья:[[Алгоритм_k_means]]&lt;br /&gt;
Выполняют: [[Участник:IanaV| Валуйская Яна]], [[Участник:GlotovES| Глотов Евгений]]&lt;br /&gt;
&lt;br /&gt;
Статья: [[Метод Якоби вычисления собственных значений симметричной матрицы ЗП |Метод Якоби вычисления собственных значений симметричной матрицы ЗП]];&lt;br /&gt;
Выполняют: [[Участник:Зиновьев Владимир|Зиновьев В.С.]], [[Участник:Пронин Андрей|Пронин А.М.]]&lt;br /&gt;
&lt;br /&gt;
Статья:[[Алгоритм_кластеризации,_основанный_на_минимальном_покрывающем_дереве]]&lt;br /&gt;
Выполняет: [[Участник:Kanast74|Дмитриева Анастасия]]&lt;br /&gt;
&lt;br /&gt;
Статья:[[Нахождение_собственных_чисел_квадратной_матрицы_методом_QR_разложения_(4)]]&lt;br /&gt;
Выполняют: [[Участник:F-morozov|Морозов Ф. В.]], [[Участник:Nataliya|Пащенко Н. Ф.]]&lt;br /&gt;
&lt;br /&gt;
Статья:[[Хранение_ненулевых_элементов_разреженных_матриц._Умножение_разреженной_матрицы_на_вектор]];&lt;br /&gt;
Выполняют: [[Участник:Trrufina|Третьякова Р.М.]] и [[Участник:Екатерина_Буторина|Буторина Е.В.]]&lt;br /&gt;
&lt;br /&gt;
Статья: [[Алгоритм_кластеризации_с_использованием_представлений2]];&lt;br /&gt;
Выполняет: [[Участник:Лукьянова Анна|Лукьянова А.Я.]]&lt;br /&gt;
&lt;br /&gt;
Статья: [[Метод Якоби вычисления собственных значений симметричной матрицы]];&lt;br /&gt;
Выполняют: [[Участник: Galkina|Галкина А.С.]], [[Участник: Игорь|Плахов И.А.]]&lt;br /&gt;
&lt;br /&gt;
Статья: [[Метод рекурсивной координатной бисекции]];&lt;br /&gt;
Выполняют: [[Участник: Obirvalger|Гордеев Михаил]], [[Участник: KolmakovEA|Колмаков Евгений]]&lt;br /&gt;
&lt;br /&gt;
Статья: [[Итерационный метод решения системы линейных алгебраических уравнений GMRES (обобщенный метод минимальных невязок)]];&lt;br /&gt;
Выполняют: [[Участник: Эльвира Ахиярова|Ахиярова Эльвира]]&lt;br /&gt;
&lt;br /&gt;
Статья: [[Хранение ненулевых элементов разреженной матрицы. Умножение разреженной матрицы на вектор]];&lt;br /&gt;
Выполняют: [[Участник: Janyell|Сычева Евгения]], [[Участник: Ahahalin|Хахалин Анатолий]]&lt;br /&gt;
&lt;br /&gt;
Статья: [[Построение матрицы Адамара произвольного размера]];&lt;br /&gt;
Выполняют: [[Участник: Бугаков Юрий|Бугаков Юрий]], Кужамалиев Ернур&lt;br /&gt;
&lt;br /&gt;
Статья: [[Вычисление определенного интеграла с использованием адаптивно сгущающейся сетки (1)]]&lt;br /&gt;
Выполняют: [[Участница:Sannikovats| Санникова Татьяна Сергеевна]], [[Участник:Plukshin| Лукшин Петр Андреевич]]&lt;br /&gt;
&lt;br /&gt;
Статья: [[Алгоритм кластеризации, основанный на построении каркаса]];&lt;br /&gt;
Выполняют: [[Участник:SenderovichNikita| Сендерович Никита]]&lt;br /&gt;
&lt;br /&gt;
Статья: [[Алгоритм кластеризации, основанный на максимизации ожидания]];&lt;br /&gt;
Выполняют: Готман Мария, Лукашкина Юлия&lt;br /&gt;
&lt;br /&gt;
Статья: [[Partitioning_Around_Medoids_(PAM)]]&lt;br /&gt;
Выполняют: [[Участник:Avasilenko|А.Э.Василенко]], [[Участник:Anastasia|А.В.Тузикова]]&lt;br /&gt;
&lt;br /&gt;
Статья: [[Нечеткий алгоритм С-средних (Fuzzy C-means)]]&lt;br /&gt;
Выполняют: [[Участник:Nikmedoed|Н.А. Муромцев]], [[Участник:illusive_mike|М.С. Дворецкий]]&lt;br /&gt;
&lt;br /&gt;
Статья: [[Нечеткий алгоритм C средних]]&lt;br /&gt;
Выполняют: [[Участник:Gkhazeeva|Гелана Хазеева]], [[Участник:Yushin|Павел Юшин]]&lt;br /&gt;
&lt;br /&gt;
Статья: [[Плотностный алгоритм кластеризации DBSCAN]]&lt;br /&gt;
Выполняют: [[Участник:Elena777mc|Малахова Е.С.]], [[Участник:Жаннат_Сагиолданова|Сагиолданова Ж.]]&lt;br /&gt;
&lt;br /&gt;
Статья: [[Кластеризация Partitioning Around Medoids (PAM)]]&lt;br /&gt;
Выполняют:[[ Участник:Тодуа Антон| Тодуа Антон]], [[Участник:Гусева Юлия| Гусева Юлия]]&lt;/div&gt;</summary>
		<author><name>Lexaloris</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:Lexaloris/%D0%A3%D0%BC%D0%BD%D0%BE%D0%B6%D0%B5%D0%BD%D0%B8%D0%B5_%D1%80%D0%B0%D0%B7%D1%80%D0%B5%D0%B6%D0%B5%D0%BD%D0%BD%D0%BE%D0%B9_%D0%BC%D0%B0%D1%82%D1%80%D0%B8%D1%86%D1%8B_%D0%BD%D0%B0_%D0%B2%D0%B5%D0%BA%D1%82%D0%BE%D1%80&amp;diff=11250</id>
		<title>Участник:Lexaloris/Умножение разреженной матрицы на вектор</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:Lexaloris/%D0%A3%D0%BC%D0%BD%D0%BE%D0%B6%D0%B5%D0%BD%D0%B8%D0%B5_%D1%80%D0%B0%D0%B7%D1%80%D0%B5%D0%B6%D0%B5%D0%BD%D0%BD%D0%BE%D0%B9_%D0%BC%D0%B0%D1%82%D1%80%D0%B8%D1%86%D1%8B_%D0%BD%D0%B0_%D0%B2%D0%B5%D0%BA%D1%82%D0%BE%D1%80&amp;diff=11250"/>
		<updated>2016-10-15T18:59:27Z</updated>

		<summary type="html">&lt;p&gt;Lexaloris: /* Свойства алгоритма */&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(k)&amp;lt;/math&amp;gt;&lt;br /&gt;
| pf_height         = &amp;lt;math&amp;gt;O(m)&amp;lt;/math&amp;gt;&lt;br /&gt;
| pf_width          = &amp;lt;math&amp;gt;O(n)&amp;lt;/math&amp;gt;&lt;br /&gt;
| input_data        = &amp;lt;math&amp;gt;k + m&amp;lt;/math&amp;gt;&lt;br /&gt;
| output_data       = &amp;lt;math&amp;gt;n&amp;lt;/math&amp;gt;&lt;br /&gt;
}}&lt;br /&gt;
&lt;br /&gt;
&lt;br /&gt;
&#039;&#039;&#039;Авторы страницы:&#039;&#039;&#039; [[Участник:Lexaloris|A.Д. Новоселов]] и [[Участник:kochet|П.А. Кочетков]]&lt;br /&gt;
&lt;br /&gt;
= Свойства и структура алгоритмов =&lt;br /&gt;
&lt;br /&gt;
== Общее описание алгоритма ==&lt;br /&gt;
&lt;br /&gt;
=== Хранение ненулевых элементов разреженной матрицы ===&lt;br /&gt;
&lt;br /&gt;
==== Разреженный строчной формат ====&lt;br /&gt;
&lt;br /&gt;
Одной из наиболее ши­роко используемых схем хранения разреженных матриц является &#039;&#039;разреженный строчный формат&#039;&#039;. Эта&lt;br /&gt;
схема предъявляет минимальные требования к памяти и в то же время оказывается очень удобной для умножения разреженной матрицы на вектор.&lt;br /&gt;
Например, рассмотрим формат хранения разряженной матрицы &amp;lt;math&amp;gt;A&amp;lt;/math&amp;gt;:&lt;br /&gt;
&lt;br /&gt;
[[File:RRCOMatrix.png]]&lt;br /&gt;
&lt;br /&gt;
Значения нену­левых элементов матрицы и соответствующие столбцовые индексы хранятся в этой схеме по строкам в двух массивах &amp;lt;math&amp;gt;AN&amp;lt;/math&amp;gt; и &amp;lt;math&amp;gt;JA&amp;lt;/math&amp;gt; соответственно. Используется также массив указателей &amp;lt;math&amp;gt;IA&amp;lt;/math&amp;gt;, отмечающих позиции массивов &amp;lt;math&amp;gt;AN&amp;lt;/math&amp;gt; и &amp;lt;math&amp;gt;JA&amp;lt;/math&amp;gt;, с которых начинается описание очередной строки. Дополнительная компо­нента в &amp;lt;math&amp;gt;IA&amp;lt;/math&amp;gt; содержит указатель первой свободной позиции в &amp;lt;math&amp;gt;JA&amp;lt;/math&amp;gt; и &amp;lt;math&amp;gt;AN&amp;lt;/math&amp;gt;.&lt;br /&gt;
&lt;br /&gt;
Таким образом &amp;lt;math&amp;gt;A&amp;lt;/math&amp;gt; представляется в виде:&lt;br /&gt;
&lt;br /&gt;
   IA = [ 1 4 4 6 ]&lt;br /&gt;
   JA = [ 3 4 8 6 8 ]&lt;br /&gt;
   AN = [ 1 3 5 7 1 ]&lt;br /&gt;
&lt;br /&gt;
Данный способ представления называют &#039;&#039;полным&#039;&#039;, поскольку представлена вся матрица &amp;lt;math&amp;gt;A&amp;lt;/math&amp;gt;, и &#039;&#039;упорядоченным&#039;&#039;, поскольку эле­менты каждой строки хранятся в соответствии с возрастанием столбцовых индексов. Таким образом, это строчное представление, полное и упорядоченное, или сокращенно &#039;&#039;&#039;(RR (С) О)&#039;&#039;&#039;.&lt;br /&gt;
&lt;br /&gt;
==== Неупорядоченное представление ====&lt;br /&gt;
&lt;br /&gt;
Представления разреженных матриц необязательно должны быть упорядочены в том смысле, что, хотя упорядоченность строк поддерживается, внутри каждой строки элементы могут храниться в произвольном порядке. Для матрицы А нашего примера вполне можно было бы использовать и строчное представление, полное, но &#039;&#039;неупорядоченное&#039;&#039; &#039;&#039;&#039;(RR (С) U )&#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;
   IA = [ 1 4 4 6 ]&lt;br /&gt;
   JA = [ 8 3 4 8 6 ]&lt;br /&gt;
   AN = [ 5 1 3 1 7 ]&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; — число строк матрицы. &lt;br /&gt;
Для каждой ее строки &amp;lt;math&amp;gt;I&amp;lt;/math&amp;gt; матрицы мы находим с помощью &amp;lt;math&amp;gt;IA&amp;lt;/math&amp;gt; значения первой &amp;lt;math&amp;gt;IAA&amp;lt;/math&amp;gt; и последней &amp;lt;math&amp;gt;IAB&amp;lt;/math&amp;gt; позиций, занимаемых элементами строки &amp;lt;math&amp;gt;I&amp;lt;/math&amp;gt; в массивах &amp;lt;math&amp;gt;JA&amp;lt;/math&amp;gt; и &amp;lt;math&amp;gt;AN&amp;lt;/math&amp;gt;. Затем, чтобы вычислить скалярное произведение строки &amp;lt;math&amp;gt;I&amp;lt;/math&amp;gt; и вектора &amp;lt;math&amp;gt;B&amp;lt;/math&amp;gt;, мы просто просматриваем &amp;lt;math&amp;gt;JA&amp;lt;/math&amp;gt; и &amp;lt;math&amp;gt;AN&amp;lt;/math&amp;gt; на отрезке от &amp;lt;math&amp;gt;IAA&amp;lt;/math&amp;gt; до &amp;lt;math&amp;gt;IAB&amp;lt;/math&amp;gt;:&lt;br /&gt;
каждое значение, хранимое в &amp;lt;math&amp;gt;JA&amp;lt;/math&amp;gt;, есть столбцовый индекс и используется для извлечения из массива &amp;lt;math&amp;gt;B&amp;lt;/math&amp;gt; элемента, который должен быть умножен на соответствующее число из &amp;lt;math&amp;gt;AN&amp;lt;/math&amp;gt;. Результат каж­дого умножения прибавляется к &amp;lt;math&amp;gt;C(I)&amp;lt;/math&amp;gt;.&lt;br /&gt;
&lt;br /&gt;
== Математическое описание алгоритма ==&lt;br /&gt;
&lt;br /&gt;
&#039;&#039;&#039;Исходные данные:&#039;&#039;&#039; &lt;br /&gt;
&lt;br /&gt;
&amp;lt;math&amp;gt;IA, JA, AN&amp;lt;/math&amp;gt; - заданная матрица в форме &#039;&#039;&#039;(RR (С) U)&#039;&#039;&#039;;&lt;br /&gt;
&lt;br /&gt;
&amp;lt;math&amp;gt;B&amp;lt;/math&amp;gt; - заданный заполненный вектор;&lt;br /&gt;
&lt;br /&gt;
&amp;lt;math&amp;gt;N&amp;lt;/math&amp;gt; - число строк матрицы.&lt;br /&gt;
&lt;br /&gt;
&#039;&#039;&#039;Выход:&#039;&#039;&#039; &amp;lt;math&amp;gt;C&amp;lt;/math&amp;gt; вектор-произведение размерности &amp;lt;math&amp;gt;N&amp;lt;/math&amp;gt;.&lt;br /&gt;
&lt;br /&gt;
&#039;&#039;&#039;Формулы метода:&#039;&#039;&#039;&lt;br /&gt;
&lt;br /&gt;
:&amp;lt;math&amp;gt;&lt;br /&gt;
\begin{align}&lt;br /&gt;
&amp;amp; IAA_{i} = IA(i), \quad i \in [1, N], \\&lt;br /&gt;
&amp;amp; IAB_{i} = IA(i + 1) - 1, \quad i \in [1, N], \\&lt;br /&gt;
&amp;amp; c_{i} = \sum\limits_{j = IAA_{i}}^{IAB_{i}} AN(j)B(JA(j)), \quad i \in [1, N] \\&lt;br /&gt;
\end{align}&lt;br /&gt;
&amp;lt;/math&amp;gt;&lt;br /&gt;
&lt;br /&gt;
== Вычислительное ядро алгоритма ==&lt;br /&gt;
&lt;br /&gt;
Вычислительным ядром, т.е. той частью алгоритма, на которую приходится основное время его работы, является вычисление значения &amp;lt;math&amp;gt;i&amp;lt;/math&amp;gt;-го элемента &amp;lt;math&amp;gt;c_{i}&amp;lt;/math&amp;gt; вектора-произведения, т.е произведения строки &amp;lt;math&amp;gt;I&amp;lt;/math&amp;gt; матрицы &amp;lt;math&amp;gt;A&amp;lt;/math&amp;gt; и вектора &amp;lt;math&amp;gt;B&amp;lt;/math&amp;gt; по формуле:&lt;br /&gt;
&lt;br /&gt;
:&amp;lt;math&amp;gt;&lt;br /&gt;
\begin{align}&lt;br /&gt;
&amp;amp; c_{i} = \sum\limits_{j = IAA_{i}}^{IAB_{i}} AN(j)B(JA(j)), \quad i \in [1, N] \\&lt;br /&gt;
\end{align}&lt;br /&gt;
&amp;lt;/math&amp;gt;&lt;br /&gt;
&lt;br /&gt;
== Макроструктура алгоритма ==&lt;br /&gt;
&lt;br /&gt;
Основу алгоритма составляет вычисление значения &amp;lt;math&amp;gt;i&amp;lt;/math&amp;gt;-го элемента &amp;lt;math&amp;gt;c_{i}&amp;lt;/math&amp;gt; вектора-произведения:&lt;br /&gt;
&lt;br /&gt;
:&amp;lt;math&amp;gt;&lt;br /&gt;
\begin{align}&lt;br /&gt;
&amp;amp; c_{i} = \sum\limits_{j = IAA_{i}}^{IAB_{i}} AN(j)B(JA(j)), \quad i \in [1, N] \\&lt;br /&gt;
\end{align}&lt;br /&gt;
&amp;lt;/math&amp;gt;&lt;br /&gt;
&lt;br /&gt;
== Схема реализации последовательного алгоритма ==&lt;br /&gt;
&lt;br /&gt;
Последовательность исполнения метода следующая: &lt;br /&gt;
&lt;br /&gt;
Далее для всех &amp;lt;math&amp;gt;i&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; по нарастанию выполняются:&lt;br /&gt;
&lt;br /&gt;
1. &amp;lt;math&amp;gt; c_{i} = 0; IAA = IA(i); IAB = IA(i + 1 ) - 1 &amp;lt;/math&amp;gt;&lt;br /&gt;
&lt;br /&gt;
После этого, если &amp;lt;math&amp;gt;(IAB \le IAA)&amp;lt;/math&amp;gt;:&lt;br /&gt;
&lt;br /&gt;
2. Для всех &amp;lt;math&amp;gt;j&amp;lt;/math&amp;gt; от &amp;lt;math&amp;gt;IAA&amp;lt;/math&amp;gt; до &amp;lt;math&amp;gt;IAB&amp;lt;/math&amp;gt; выполняется: &lt;br /&gt;
&lt;br /&gt;
&amp;lt;math&amp;gt;c_{i} = \sum\limits_{j = IAA_{i}}^{IAB_{i}} AN(j)B(JA(j))&amp;lt;/math&amp;gt;&lt;br /&gt;
&lt;br /&gt;
Псевдокод алгоритма: &lt;br /&gt;
&lt;br /&gt;
    FOR I = 1, N                          (1)&lt;br /&gt;
       U = 0.                             (2) &lt;br /&gt;
       IAA = IA(I)                        (3) &lt;br /&gt;
       IAB = IA(I + 1 ) - 1               (4)&lt;br /&gt;
       IF NOT(IAB.LT.IAA)                 (5)&lt;br /&gt;
           FOR J = IAA, IAB               (6)&lt;br /&gt;
           C(I) = U + AN(J)*B(JA(J))      (7)&lt;br /&gt;
&lt;br /&gt;
== Последовательная сложность алгоритма ==&lt;br /&gt;
&lt;br /&gt;
Для всего алгоритма потребуется выполнить &amp;lt;math&amp;gt;O(k)&amp;lt;/math&amp;gt; операций, как в строке стр.7 псевдокода алгоритма ([[#Схема реализации последовательного алгоритма|п.1.5]]), где &amp;lt;math&amp;gt;k&amp;lt;/math&amp;gt; - число ненулевых эле­ментов матрицы.&lt;br /&gt;
&lt;br /&gt;
== Информационный граф ==&lt;br /&gt;
&lt;br /&gt;
На рисунке 1 изображен информационный граф алгоритма.&lt;br /&gt;
&lt;br /&gt;
[[file:InfoGrafMatrixRRCUandVextor.jpg|thumb|center|1200px|Рисунок 1. Информационный граф алгоритма.]]&lt;br /&gt;
 &lt;br /&gt;
По оси &amp;lt;math&amp;gt;X&amp;lt;/math&amp;gt; для отдельной строки &amp;lt;math&amp;gt;I&amp;lt;/math&amp;gt; матрицы отложены в пределах первой &amp;lt;math&amp;gt;IAA&amp;lt;/math&amp;gt; и последней &amp;lt;math&amp;gt;IAB&amp;lt;/math&amp;gt; позиций ненулевых элементов значения &amp;lt;math&amp;gt;AN&amp;lt;/math&amp;gt; и соответствуюие им по столбцовомым индексам, хранимимым в &amp;lt;math&amp;gt;JA&amp;lt;/math&amp;gt;, значения &amp;lt;math&amp;gt;B&amp;lt;/math&amp;gt; элементов. &lt;br /&gt;
Пары этих значений обозначены желтыми квадратиками &amp;lt;math&amp;gt;(in)&amp;lt;/math&amp;gt;. Значения in попарно скалярно перемножаются (зеленый кружочек) и суммируются (синий кружочек) в результат значения элемента вектора-произведения &amp;lt;math&amp;gt;c_{i}&amp;lt;/math&amp;gt;, т.е &amp;lt;math&amp;gt;out&amp;lt;/math&amp;gt;(красный квадратик) с строковым индексом, соответствующем номеру строки матрицы.&lt;br /&gt;
&lt;br /&gt;
По оси &amp;lt;math&amp;gt;Y&amp;lt;/math&amp;gt; отложена схема вычисление значения каждого элемента вектора-произведения для каждой строки матрицы.&lt;br /&gt;
&lt;br /&gt;
== Ресурс параллелизма алгоритма ==&lt;br /&gt;
&lt;br /&gt;
Алгоритм обладает возможностью выполняться параллельно, что позволяет значительно ускорить вычисления.&lt;br /&gt;
Вычисление значения каждого элемента вектора-произведения для каждой строки матрицы и элемента вектора B можно проводить на отдельных процессорах. &lt;br /&gt;
Максимальная эффективность вычислений достигается при наличии не менее, чем &amp;lt;math&amp;gt;N&amp;lt;/math&amp;gt; процессоров, т.е отдельный процессор на вычисление значения каждого элемента вектора-произведения. На процессоре выполняется &amp;lt;math&amp;gt;k(i)&amp;lt;/math&amp;gt; последовательных операций умножения и сложения. Поэтому число ярусов для &amp;lt;math&amp;gt;i&amp;lt;/math&amp;gt;-ого процессора равно &amp;lt;math&amp;gt;k(i)&amp;lt;/math&amp;gt;.&lt;br /&gt;
&lt;br /&gt;
Для параллельного выполнения алгоритма требуется:&lt;br /&gt;
&lt;br /&gt;
* &amp;lt;math&amp;gt;N&amp;lt;/math&amp;gt; ярусов умножений и сложений,&lt;br /&gt;
* в каждом из ярусов &amp;lt;math&amp;gt;k &amp;lt;&amp;lt; m&amp;lt;/math&amp;gt; операций.&lt;br /&gt;
&lt;br /&gt;
При классификации по высоте ЯПФ, алгоритм имеет линейную сложность. При классификации по высоте ЯПФ также линейную.&lt;br /&gt;
&lt;br /&gt;
== Входные и выходные данные алгоритма ==&lt;br /&gt;
&#039;&#039;&#039;Входные данные:&#039;&#039;&#039;&lt;br /&gt;
&lt;br /&gt;
* &amp;lt;math&amp;gt;IA, JA, AN&amp;lt;/math&amp;gt; - заданная матрица в форме &#039;&#039;&#039;(RR (С) U)&#039;&#039;&#039; c &amp;lt;math&amp;gt;k&amp;lt;/math&amp;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;B&amp;lt;/math&amp;gt; - заданный заполненный вектор c &amp;lt;math&amp;gt;m&amp;lt;/math&amp;gt; элементами;&lt;br /&gt;
&#039;&#039;&#039;&lt;br /&gt;
&#039;&#039;&#039;Объем входных данных&#039;&#039;&#039;: &amp;lt;math&amp;gt;k + m&amp;lt;/math&amp;gt;&lt;br /&gt;
&lt;br /&gt;
&#039;&#039;&#039;Выходные данные:&#039;&#039;&#039; &amp;lt;math&amp;gt;C&amp;lt;/math&amp;gt; вектор-произведение размерности &amp;lt;math&amp;gt;N&amp;lt;/math&amp;gt;.&lt;br /&gt;
&lt;br /&gt;
&#039;&#039;&#039;Объем выходных данных&#039;&#039;&#039;: &amp;lt;math&amp;gt;N&amp;lt;/math&amp;gt;&lt;br /&gt;
&lt;br /&gt;
== Свойства алгоритма ==&lt;br /&gt;
&lt;br /&gt;
Алгоритм в рамках выбранной версии полностью детерминирован.&lt;br /&gt;
&lt;br /&gt;
Вычислительная мощность алгоритма, как отношение числа операций к суммарному объему входных и выходных данных – константа.&lt;br /&gt;
&lt;br /&gt;
= Программная реализация алгоритма =&lt;br /&gt;
&lt;br /&gt;
== Масштабируемость алгоритма и его реализации ==&lt;br /&gt;
&lt;br /&gt;
== Существующие реализации алгоритма ==&lt;br /&gt;
&lt;br /&gt;
Алгоритм релизован в составе библиотек: &lt;br /&gt;
* SparseLib++[http://math.nist.gov/sparselib++/] &lt;br /&gt;
* cuSPARSE [http://docs.nvidia.com/cuda/cusparse/]&lt;br /&gt;
* uBLAS [http://www.boost.org/doc/libs/1_62_0/libs/numeric/ublas/doc/]&lt;br /&gt;
* Intel MKL [https://software.intel.com/en-us/intel-mkl]&lt;br /&gt;
&lt;br /&gt;
= Литература =&lt;br /&gt;
&lt;br /&gt;
* [1] С. Писсанецки. Технология разреженных матриц. Изд. Мир, 1988.&lt;br /&gt;
* [2] В. В. Воеводин, Вл.В. Воеводин. Параллельные вычисления. – СПб.: БХВ - Петербург, 2002.&lt;/div&gt;</summary>
		<author><name>Lexaloris</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:Lexaloris/%D0%A3%D0%BC%D0%BD%D0%BE%D0%B6%D0%B5%D0%BD%D0%B8%D0%B5_%D1%80%D0%B0%D0%B7%D1%80%D0%B5%D0%B6%D0%B5%D0%BD%D0%BD%D0%BE%D0%B9_%D0%BC%D0%B0%D1%82%D1%80%D0%B8%D1%86%D1%8B_%D0%BD%D0%B0_%D0%B2%D0%B5%D0%BA%D1%82%D0%BE%D1%80&amp;diff=11188</id>
		<title>Участник:Lexaloris/Умножение разреженной матрицы на вектор</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:Lexaloris/%D0%A3%D0%BC%D0%BD%D0%BE%D0%B6%D0%B5%D0%BD%D0%B8%D0%B5_%D1%80%D0%B0%D0%B7%D1%80%D0%B5%D0%B6%D0%B5%D0%BD%D0%BD%D0%BE%D0%B9_%D0%BC%D0%B0%D1%82%D1%80%D0%B8%D1%86%D1%8B_%D0%BD%D0%B0_%D0%B2%D0%B5%D0%BA%D1%82%D0%BE%D1%80&amp;diff=11188"/>
		<updated>2016-10-15T18:47:23Z</updated>

		<summary type="html">&lt;p&gt;Lexaloris: /* Литература */&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(k)&amp;lt;/math&amp;gt;&lt;br /&gt;
| pf_height         = &amp;lt;math&amp;gt;O(m)&amp;lt;/math&amp;gt;&lt;br /&gt;
| pf_width          = &amp;lt;math&amp;gt;O(n)&amp;lt;/math&amp;gt;&lt;br /&gt;
| input_data        = &amp;lt;math&amp;gt;k + m&amp;lt;/math&amp;gt;&lt;br /&gt;
| output_data       = &amp;lt;math&amp;gt;n&amp;lt;/math&amp;gt;&lt;br /&gt;
}}&lt;br /&gt;
&lt;br /&gt;
&lt;br /&gt;
&#039;&#039;&#039;Авторы страницы:&#039;&#039;&#039; [[Участник:Lexaloris|A.Д. Новоселов]] и [[Участник:kochet|П.А. Кочетков]]&lt;br /&gt;
&lt;br /&gt;
= Свойства и структура алгоритмов =&lt;br /&gt;
&lt;br /&gt;
== Общее описание алгоритма ==&lt;br /&gt;
&lt;br /&gt;
=== Хранение ненулевых элементов разреженной матрицы ===&lt;br /&gt;
&lt;br /&gt;
==== Разреженный строчной формат ====&lt;br /&gt;
&lt;br /&gt;
Одной из наиболее ши­роко используемых схем хранения разреженных матриц является &#039;&#039;разреженный строчный формат&#039;&#039;. Эта&lt;br /&gt;
схема предъявляет минимальные требования к памяти и в то же время оказывается очень удобной для умножения разреженной матрицы на вектор.&lt;br /&gt;
Например, рассмотрим формат хранения разряженной матрицы &amp;lt;math&amp;gt;A&amp;lt;/math&amp;gt;:&lt;br /&gt;
&lt;br /&gt;
[[File:RRCOMatrix.png]]&lt;br /&gt;
&lt;br /&gt;
Значения нену­левых элементов матрицы и соответствующие столбцовые индексы хранятся в этой схеме по строкам в двух массивах &amp;lt;math&amp;gt;AN&amp;lt;/math&amp;gt; и &amp;lt;math&amp;gt;JA&amp;lt;/math&amp;gt; соответственно. Используется также массив указателей &amp;lt;math&amp;gt;IA&amp;lt;/math&amp;gt;, отмечающих позиции массивов &amp;lt;math&amp;gt;AN&amp;lt;/math&amp;gt; и &amp;lt;math&amp;gt;JA&amp;lt;/math&amp;gt;, с которых начинается описание очередной строки. Дополнительная компо­нента в &amp;lt;math&amp;gt;IA&amp;lt;/math&amp;gt; содержит указатель первой свободной позиции в &amp;lt;math&amp;gt;JA&amp;lt;/math&amp;gt; и &amp;lt;math&amp;gt;AN&amp;lt;/math&amp;gt;.&lt;br /&gt;
&lt;br /&gt;
Таким образом &amp;lt;math&amp;gt;A&amp;lt;/math&amp;gt; представляется в виде:&lt;br /&gt;
&lt;br /&gt;
   IA = [ 1 4 4 6 ]&lt;br /&gt;
   JA = [ 3 4 8 6 8 ]&lt;br /&gt;
   AN = [ 1 3 5 7 1 ]&lt;br /&gt;
&lt;br /&gt;
Данный способ представления называют &#039;&#039;полным&#039;&#039;, поскольку представлена вся матрица &amp;lt;math&amp;gt;A&amp;lt;/math&amp;gt;, и &#039;&#039;упорядоченным&#039;&#039;, поскольку эле­менты каждой строки хранятся в соответствии с возрастанием столбцовых индексов. Таким образом, это строчное представление, полное и упорядоченное, или сокращенно &#039;&#039;&#039;(RR (С) О)&#039;&#039;&#039;.&lt;br /&gt;
&lt;br /&gt;
==== Неупорядоченное представление ====&lt;br /&gt;
&lt;br /&gt;
Представления разреженных матриц необязательно должны быть упорядочены в том смысле, что, хотя упорядоченность строк поддерживается, внутри каждой строки элементы могут храниться в произвольном порядке. Для матрицы А нашего примера вполне можно было бы использовать и строчное представление, полное, но &#039;&#039;неупорядоченное&#039;&#039; &#039;&#039;&#039;(RR (С) U )&#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;
   IA = [ 1 4 4 6 ]&lt;br /&gt;
   JA = [ 8 3 4 8 6 ]&lt;br /&gt;
   AN = [ 5 1 3 1 7 ]&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; — число строк матрицы. &lt;br /&gt;
Для каждой ее строки &amp;lt;math&amp;gt;I&amp;lt;/math&amp;gt; матрицы мы находим с помощью &amp;lt;math&amp;gt;IA&amp;lt;/math&amp;gt; значения первой &amp;lt;math&amp;gt;IAA&amp;lt;/math&amp;gt; и последней &amp;lt;math&amp;gt;IAB&amp;lt;/math&amp;gt; позиций, занимаемых элементами строки &amp;lt;math&amp;gt;I&amp;lt;/math&amp;gt; в массивах &amp;lt;math&amp;gt;JA&amp;lt;/math&amp;gt; и &amp;lt;math&amp;gt;AN&amp;lt;/math&amp;gt;. Затем, чтобы вычислить скалярное произведение строки &amp;lt;math&amp;gt;I&amp;lt;/math&amp;gt; и вектора &amp;lt;math&amp;gt;B&amp;lt;/math&amp;gt;, мы просто просматриваем &amp;lt;math&amp;gt;JA&amp;lt;/math&amp;gt; и &amp;lt;math&amp;gt;AN&amp;lt;/math&amp;gt; на отрезке от &amp;lt;math&amp;gt;IAA&amp;lt;/math&amp;gt; до &amp;lt;math&amp;gt;IAB&amp;lt;/math&amp;gt;:&lt;br /&gt;
каждое значение, хранимое в &amp;lt;math&amp;gt;JA&amp;lt;/math&amp;gt;, есть столбцовый индекс и используется для извлечения из массива &amp;lt;math&amp;gt;B&amp;lt;/math&amp;gt; элемента, который должен быть умножен на соответствующее число из &amp;lt;math&amp;gt;AN&amp;lt;/math&amp;gt;. Результат каж­дого умножения прибавляется к &amp;lt;math&amp;gt;C(I)&amp;lt;/math&amp;gt;.&lt;br /&gt;
&lt;br /&gt;
== Математическое описание алгоритма ==&lt;br /&gt;
&lt;br /&gt;
&#039;&#039;&#039;Исходные данные:&#039;&#039;&#039; &lt;br /&gt;
&lt;br /&gt;
&amp;lt;math&amp;gt;IA, JA, AN&amp;lt;/math&amp;gt; - заданная матрица в форме &#039;&#039;&#039;(RR (С) U)&#039;&#039;&#039;;&lt;br /&gt;
&lt;br /&gt;
&amp;lt;math&amp;gt;B&amp;lt;/math&amp;gt; - заданный заполненный вектор;&lt;br /&gt;
&lt;br /&gt;
&amp;lt;math&amp;gt;N&amp;lt;/math&amp;gt; - число строк матрицы.&lt;br /&gt;
&lt;br /&gt;
&#039;&#039;&#039;Выход:&#039;&#039;&#039; &amp;lt;math&amp;gt;C&amp;lt;/math&amp;gt; вектор-произведение размерности &amp;lt;math&amp;gt;N&amp;lt;/math&amp;gt;.&lt;br /&gt;
&lt;br /&gt;
&#039;&#039;&#039;Формулы метода:&#039;&#039;&#039;&lt;br /&gt;
&lt;br /&gt;
:&amp;lt;math&amp;gt;&lt;br /&gt;
\begin{align}&lt;br /&gt;
&amp;amp; IAA_{i} = IA(i), \quad i \in [1, N], \\&lt;br /&gt;
&amp;amp; IAB_{i} = IA(i + 1) - 1, \quad i \in [1, N], \\&lt;br /&gt;
&amp;amp; c_{i} = \sum\limits_{j = IAA_{i}}^{IAB_{i}} AN(j)B(JA(j)), \quad i \in [1, N] \\&lt;br /&gt;
\end{align}&lt;br /&gt;
&amp;lt;/math&amp;gt;&lt;br /&gt;
&lt;br /&gt;
== Вычислительное ядро алгоритма ==&lt;br /&gt;
&lt;br /&gt;
Вычислительным ядром, т.е. той частью алгоритма, на которую приходится основное время его работы, является вычисление значения &amp;lt;math&amp;gt;i&amp;lt;/math&amp;gt;-го элемента &amp;lt;math&amp;gt;c_{i}&amp;lt;/math&amp;gt; вектора-произведения, т.е произведения строки &amp;lt;math&amp;gt;I&amp;lt;/math&amp;gt; матрицы &amp;lt;math&amp;gt;A&amp;lt;/math&amp;gt; и вектора &amp;lt;math&amp;gt;B&amp;lt;/math&amp;gt; по формуле:&lt;br /&gt;
&lt;br /&gt;
:&amp;lt;math&amp;gt;&lt;br /&gt;
\begin{align}&lt;br /&gt;
&amp;amp; c_{i} = \sum\limits_{j = IAA_{i}}^{IAB_{i}} AN(j)B(JA(j)), \quad i \in [1, N] \\&lt;br /&gt;
\end{align}&lt;br /&gt;
&amp;lt;/math&amp;gt;&lt;br /&gt;
&lt;br /&gt;
== Макроструктура алгоритма ==&lt;br /&gt;
&lt;br /&gt;
Основу алгоритма составляет вычисление значения &amp;lt;math&amp;gt;i&amp;lt;/math&amp;gt;-го элемента &amp;lt;math&amp;gt;c_{i}&amp;lt;/math&amp;gt; вектора-произведения:&lt;br /&gt;
&lt;br /&gt;
:&amp;lt;math&amp;gt;&lt;br /&gt;
\begin{align}&lt;br /&gt;
&amp;amp; c_{i} = \sum\limits_{j = IAA_{i}}^{IAB_{i}} AN(j)B(JA(j)), \quad i \in [1, N] \\&lt;br /&gt;
\end{align}&lt;br /&gt;
&amp;lt;/math&amp;gt;&lt;br /&gt;
&lt;br /&gt;
== Схема реализации последовательного алгоритма ==&lt;br /&gt;
&lt;br /&gt;
Последовательность исполнения метода следующая: &lt;br /&gt;
&lt;br /&gt;
Далее для всех &amp;lt;math&amp;gt;i&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; по нарастанию выполняются:&lt;br /&gt;
&lt;br /&gt;
1. &amp;lt;math&amp;gt; c_{i} = 0; IAA = IA(i); IAB = IA(i + 1 ) - 1 &amp;lt;/math&amp;gt;&lt;br /&gt;
&lt;br /&gt;
После этого, если &amp;lt;math&amp;gt;(IAB \le IAA)&amp;lt;/math&amp;gt;:&lt;br /&gt;
&lt;br /&gt;
2. Для всех &amp;lt;math&amp;gt;j&amp;lt;/math&amp;gt; от &amp;lt;math&amp;gt;IAA&amp;lt;/math&amp;gt; до &amp;lt;math&amp;gt;IAB&amp;lt;/math&amp;gt; выполняется: &lt;br /&gt;
&lt;br /&gt;
&amp;lt;math&amp;gt;c_{i} = \sum\limits_{j = IAA_{i}}^{IAB_{i}} AN(j)B(JA(j))&amp;lt;/math&amp;gt;&lt;br /&gt;
&lt;br /&gt;
Псевдокод алгоритма: &lt;br /&gt;
&lt;br /&gt;
    FOR I = 1, N                          (1)&lt;br /&gt;
       U = 0.                             (2) &lt;br /&gt;
       IAA = IA(I)                        (3) &lt;br /&gt;
       IAB = IA(I + 1 ) - 1               (4)&lt;br /&gt;
       IF NOT(IAB.LT.IAA)                 (5)&lt;br /&gt;
           FOR J = IAA, IAB               (6)&lt;br /&gt;
           C(I) = U + AN(J)*B(JA(J))      (7)&lt;br /&gt;
&lt;br /&gt;
== Последовательная сложность алгоритма ==&lt;br /&gt;
&lt;br /&gt;
Для всего алгоритма потребуется выполнить &amp;lt;math&amp;gt;O(k)&amp;lt;/math&amp;gt; операций, как в строке стр.7 псевдокода алгоритма ([[#Схема реализации последовательного алгоритма|п.1.5]]), где &amp;lt;math&amp;gt;k&amp;lt;/math&amp;gt; - число ненулевых эле­ментов матрицы.&lt;br /&gt;
&lt;br /&gt;
== Информационный граф ==&lt;br /&gt;
&lt;br /&gt;
На рисунке 1 изображен информационный граф алгоритма.&lt;br /&gt;
&lt;br /&gt;
[[file:InfoGrafMatrixRRCUandVextor.jpg|thumb|center|1200px|Рисунок 1. Информационный граф алгоритма.]]&lt;br /&gt;
 &lt;br /&gt;
По оси &amp;lt;math&amp;gt;X&amp;lt;/math&amp;gt; для отдельной строки &amp;lt;math&amp;gt;I&amp;lt;/math&amp;gt; матрицы отложены в пределах первой &amp;lt;math&amp;gt;IAA&amp;lt;/math&amp;gt; и последней &amp;lt;math&amp;gt;IAB&amp;lt;/math&amp;gt; позиций ненулевых элементов значения &amp;lt;math&amp;gt;AN&amp;lt;/math&amp;gt; и соответствуюие им по столбцовомым индексам, хранимимым в &amp;lt;math&amp;gt;JA&amp;lt;/math&amp;gt;, значения &amp;lt;math&amp;gt;B&amp;lt;/math&amp;gt; элементов. &lt;br /&gt;
Пары этих значений обозначены желтыми квадратиками &amp;lt;math&amp;gt;(in)&amp;lt;/math&amp;gt;. Значения in попарно скалярно перемножаются (зеленый кружочек) и суммируются (синий кружочек) в результат значения элемента вектора-произведения &amp;lt;math&amp;gt;c_{i}&amp;lt;/math&amp;gt;, т.е &amp;lt;math&amp;gt;out&amp;lt;/math&amp;gt;(красный квадратик) с строковым индексом, соответствующем номеру строки матрицы.&lt;br /&gt;
&lt;br /&gt;
По оси &amp;lt;math&amp;gt;Y&amp;lt;/math&amp;gt; отложена схема вычисление значения каждого элемента вектора-произведения для каждой строки матрицы.&lt;br /&gt;
&lt;br /&gt;
== Ресурс параллелизма алгоритма ==&lt;br /&gt;
&lt;br /&gt;
Алгоритм обладает возможностью выполняться параллельно, что позволяет значительно ускорить вычисления.&lt;br /&gt;
Вычисление значения каждого элемента вектора-произведения для каждой строки матрицы и элемента вектора B можно проводить на отдельных процессорах. &lt;br /&gt;
Максимальная эффективность вычислений достигается при наличии не менее, чем &amp;lt;math&amp;gt;N&amp;lt;/math&amp;gt; процессоров, т.е отдельный процессор на вычисление значения каждого элемента вектора-произведения. На процессоре выполняется &amp;lt;math&amp;gt;k(i)&amp;lt;/math&amp;gt; последовательных операций умножения и сложения. Поэтому число ярусов для &amp;lt;math&amp;gt;i&amp;lt;/math&amp;gt;-ого процессора равно &amp;lt;math&amp;gt;k(i)&amp;lt;/math&amp;gt;.&lt;br /&gt;
&lt;br /&gt;
Для параллельного выполнения алгоритма требуется:&lt;br /&gt;
&lt;br /&gt;
* &amp;lt;math&amp;gt;N&amp;lt;/math&amp;gt; ярусов умножений и сложений,&lt;br /&gt;
* в каждом из ярусов &amp;lt;math&amp;gt;k &amp;lt;&amp;lt; m&amp;lt;/math&amp;gt; операций.&lt;br /&gt;
&lt;br /&gt;
При классификации по высоте ЯПФ, алгоритм имеет линейную сложность. При классификации по высоте ЯПФ также линейную.&lt;br /&gt;
&lt;br /&gt;
== Входные и выходные данные алгоритма ==&lt;br /&gt;
&#039;&#039;&#039;Входные данные:&#039;&#039;&#039;&lt;br /&gt;
&lt;br /&gt;
* &amp;lt;math&amp;gt;IA, JA, AN&amp;lt;/math&amp;gt; - заданная матрица в форме &#039;&#039;&#039;(RR (С) U)&#039;&#039;&#039; c &amp;lt;math&amp;gt;k&amp;lt;/math&amp;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;B&amp;lt;/math&amp;gt; - заданный заполненный вектор c &amp;lt;math&amp;gt;m&amp;lt;/math&amp;gt; элементами;&lt;br /&gt;
&#039;&#039;&#039;&lt;br /&gt;
&#039;&#039;&#039;Объем входных данных&#039;&#039;&#039;: &amp;lt;math&amp;gt;k + m&amp;lt;/math&amp;gt;&lt;br /&gt;
&lt;br /&gt;
&#039;&#039;&#039;Выходные данные:&#039;&#039;&#039; &amp;lt;math&amp;gt;C&amp;lt;/math&amp;gt; вектор-произведение размерности &amp;lt;math&amp;gt;N&amp;lt;/math&amp;gt;.&lt;br /&gt;
&lt;br /&gt;
&#039;&#039;&#039;Объем выходных данных&#039;&#039;&#039;: &amp;lt;math&amp;gt;N&amp;lt;/math&amp;gt;&lt;br /&gt;
&lt;br /&gt;
== Свойства алгоритма ==&lt;br /&gt;
&lt;br /&gt;
Алгоритм в рамках выбранной версии полностью детерминирован.&lt;br /&gt;
&lt;br /&gt;
Вычислительная мощность алгоритма, как отношение числа операций к суммарному объему входных и выходных данных – константа.&lt;br /&gt;
&lt;br /&gt;
Соотношение последовательной и параллельной сложности в случае неограниченных ресурсов равно &amp;lt;math&amp;gt;O(\frac{k}{N})&amp;lt;/math&amp;gt;&lt;br /&gt;
&lt;br /&gt;
= Программная реализация алгоритма =&lt;br /&gt;
&lt;br /&gt;
== Масштабируемость алгоритма и его реализации ==&lt;br /&gt;
&lt;br /&gt;
== Существующие реализации алгоритма ==&lt;br /&gt;
&lt;br /&gt;
Алгоритм релизован в составе библиотек: &lt;br /&gt;
* SparseLib++[http://math.nist.gov/sparselib++/] &lt;br /&gt;
* cuSPARSE [http://docs.nvidia.com/cuda/cusparse/]&lt;br /&gt;
* uBLAS [http://www.boost.org/doc/libs/1_62_0/libs/numeric/ublas/doc/]&lt;br /&gt;
* Intel MKL [https://software.intel.com/en-us/intel-mkl]&lt;br /&gt;
&lt;br /&gt;
= Литература =&lt;br /&gt;
&lt;br /&gt;
* [1] С. Писсанецки. Технология разреженных матриц. Изд. Мир, 1988.&lt;br /&gt;
* [2] В. В. Воеводин, Вл.В. Воеводин. Параллельные вычисления. – СПб.: БХВ - Петербург, 2002.&lt;/div&gt;</summary>
		<author><name>Lexaloris</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:Lexaloris/%D0%A3%D0%BC%D0%BD%D0%BE%D0%B6%D0%B5%D0%BD%D0%B8%D0%B5_%D1%80%D0%B0%D0%B7%D1%80%D0%B5%D0%B6%D0%B5%D0%BD%D0%BD%D0%BE%D0%B9_%D0%BC%D0%B0%D1%82%D1%80%D0%B8%D1%86%D1%8B_%D0%BD%D0%B0_%D0%B2%D0%B5%D0%BA%D1%82%D0%BE%D1%80&amp;diff=11185</id>
		<title>Участник:Lexaloris/Умножение разреженной матрицы на вектор</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:Lexaloris/%D0%A3%D0%BC%D0%BD%D0%BE%D0%B6%D0%B5%D0%BD%D0%B8%D0%B5_%D1%80%D0%B0%D0%B7%D1%80%D0%B5%D0%B6%D0%B5%D0%BD%D0%BD%D0%BE%D0%B9_%D0%BC%D0%B0%D1%82%D1%80%D0%B8%D1%86%D1%8B_%D0%BD%D0%B0_%D0%B2%D0%B5%D0%BA%D1%82%D0%BE%D1%80&amp;diff=11185"/>
		<updated>2016-10-15T18:47:08Z</updated>

		<summary type="html">&lt;p&gt;Lexaloris: /* Литература */&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(k)&amp;lt;/math&amp;gt;&lt;br /&gt;
| pf_height         = &amp;lt;math&amp;gt;O(m)&amp;lt;/math&amp;gt;&lt;br /&gt;
| pf_width          = &amp;lt;math&amp;gt;O(n)&amp;lt;/math&amp;gt;&lt;br /&gt;
| input_data        = &amp;lt;math&amp;gt;k + m&amp;lt;/math&amp;gt;&lt;br /&gt;
| output_data       = &amp;lt;math&amp;gt;n&amp;lt;/math&amp;gt;&lt;br /&gt;
}}&lt;br /&gt;
&lt;br /&gt;
&lt;br /&gt;
&#039;&#039;&#039;Авторы страницы:&#039;&#039;&#039; [[Участник:Lexaloris|A.Д. Новоселов]] и [[Участник:kochet|П.А. Кочетков]]&lt;br /&gt;
&lt;br /&gt;
= Свойства и структура алгоритмов =&lt;br /&gt;
&lt;br /&gt;
== Общее описание алгоритма ==&lt;br /&gt;
&lt;br /&gt;
=== Хранение ненулевых элементов разреженной матрицы ===&lt;br /&gt;
&lt;br /&gt;
==== Разреженный строчной формат ====&lt;br /&gt;
&lt;br /&gt;
Одной из наиболее ши­роко используемых схем хранения разреженных матриц является &#039;&#039;разреженный строчный формат&#039;&#039;. Эта&lt;br /&gt;
схема предъявляет минимальные требования к памяти и в то же время оказывается очень удобной для умножения разреженной матрицы на вектор.&lt;br /&gt;
Например, рассмотрим формат хранения разряженной матрицы &amp;lt;math&amp;gt;A&amp;lt;/math&amp;gt;:&lt;br /&gt;
&lt;br /&gt;
[[File:RRCOMatrix.png]]&lt;br /&gt;
&lt;br /&gt;
Значения нену­левых элементов матрицы и соответствующие столбцовые индексы хранятся в этой схеме по строкам в двух массивах &amp;lt;math&amp;gt;AN&amp;lt;/math&amp;gt; и &amp;lt;math&amp;gt;JA&amp;lt;/math&amp;gt; соответственно. Используется также массив указателей &amp;lt;math&amp;gt;IA&amp;lt;/math&amp;gt;, отмечающих позиции массивов &amp;lt;math&amp;gt;AN&amp;lt;/math&amp;gt; и &amp;lt;math&amp;gt;JA&amp;lt;/math&amp;gt;, с которых начинается описание очередной строки. Дополнительная компо­нента в &amp;lt;math&amp;gt;IA&amp;lt;/math&amp;gt; содержит указатель первой свободной позиции в &amp;lt;math&amp;gt;JA&amp;lt;/math&amp;gt; и &amp;lt;math&amp;gt;AN&amp;lt;/math&amp;gt;.&lt;br /&gt;
&lt;br /&gt;
Таким образом &amp;lt;math&amp;gt;A&amp;lt;/math&amp;gt; представляется в виде:&lt;br /&gt;
&lt;br /&gt;
   IA = [ 1 4 4 6 ]&lt;br /&gt;
   JA = [ 3 4 8 6 8 ]&lt;br /&gt;
   AN = [ 1 3 5 7 1 ]&lt;br /&gt;
&lt;br /&gt;
Данный способ представления называют &#039;&#039;полным&#039;&#039;, поскольку представлена вся матрица &amp;lt;math&amp;gt;A&amp;lt;/math&amp;gt;, и &#039;&#039;упорядоченным&#039;&#039;, поскольку эле­менты каждой строки хранятся в соответствии с возрастанием столбцовых индексов. Таким образом, это строчное представление, полное и упорядоченное, или сокращенно &#039;&#039;&#039;(RR (С) О)&#039;&#039;&#039;.&lt;br /&gt;
&lt;br /&gt;
==== Неупорядоченное представление ====&lt;br /&gt;
&lt;br /&gt;
Представления разреженных матриц необязательно должны быть упорядочены в том смысле, что, хотя упорядоченность строк поддерживается, внутри каждой строки элементы могут храниться в произвольном порядке. Для матрицы А нашего примера вполне можно было бы использовать и строчное представление, полное, но &#039;&#039;неупорядоченное&#039;&#039; &#039;&#039;&#039;(RR (С) U )&#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;
   IA = [ 1 4 4 6 ]&lt;br /&gt;
   JA = [ 8 3 4 8 6 ]&lt;br /&gt;
   AN = [ 5 1 3 1 7 ]&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; — число строк матрицы. &lt;br /&gt;
Для каждой ее строки &amp;lt;math&amp;gt;I&amp;lt;/math&amp;gt; матрицы мы находим с помощью &amp;lt;math&amp;gt;IA&amp;lt;/math&amp;gt; значения первой &amp;lt;math&amp;gt;IAA&amp;lt;/math&amp;gt; и последней &amp;lt;math&amp;gt;IAB&amp;lt;/math&amp;gt; позиций, занимаемых элементами строки &amp;lt;math&amp;gt;I&amp;lt;/math&amp;gt; в массивах &amp;lt;math&amp;gt;JA&amp;lt;/math&amp;gt; и &amp;lt;math&amp;gt;AN&amp;lt;/math&amp;gt;. Затем, чтобы вычислить скалярное произведение строки &amp;lt;math&amp;gt;I&amp;lt;/math&amp;gt; и вектора &amp;lt;math&amp;gt;B&amp;lt;/math&amp;gt;, мы просто просматриваем &amp;lt;math&amp;gt;JA&amp;lt;/math&amp;gt; и &amp;lt;math&amp;gt;AN&amp;lt;/math&amp;gt; на отрезке от &amp;lt;math&amp;gt;IAA&amp;lt;/math&amp;gt; до &amp;lt;math&amp;gt;IAB&amp;lt;/math&amp;gt;:&lt;br /&gt;
каждое значение, хранимое в &amp;lt;math&amp;gt;JA&amp;lt;/math&amp;gt;, есть столбцовый индекс и используется для извлечения из массива &amp;lt;math&amp;gt;B&amp;lt;/math&amp;gt; элемента, который должен быть умножен на соответствующее число из &amp;lt;math&amp;gt;AN&amp;lt;/math&amp;gt;. Результат каж­дого умножения прибавляется к &amp;lt;math&amp;gt;C(I)&amp;lt;/math&amp;gt;.&lt;br /&gt;
&lt;br /&gt;
== Математическое описание алгоритма ==&lt;br /&gt;
&lt;br /&gt;
&#039;&#039;&#039;Исходные данные:&#039;&#039;&#039; &lt;br /&gt;
&lt;br /&gt;
&amp;lt;math&amp;gt;IA, JA, AN&amp;lt;/math&amp;gt; - заданная матрица в форме &#039;&#039;&#039;(RR (С) U)&#039;&#039;&#039;;&lt;br /&gt;
&lt;br /&gt;
&amp;lt;math&amp;gt;B&amp;lt;/math&amp;gt; - заданный заполненный вектор;&lt;br /&gt;
&lt;br /&gt;
&amp;lt;math&amp;gt;N&amp;lt;/math&amp;gt; - число строк матрицы.&lt;br /&gt;
&lt;br /&gt;
&#039;&#039;&#039;Выход:&#039;&#039;&#039; &amp;lt;math&amp;gt;C&amp;lt;/math&amp;gt; вектор-произведение размерности &amp;lt;math&amp;gt;N&amp;lt;/math&amp;gt;.&lt;br /&gt;
&lt;br /&gt;
&#039;&#039;&#039;Формулы метода:&#039;&#039;&#039;&lt;br /&gt;
&lt;br /&gt;
:&amp;lt;math&amp;gt;&lt;br /&gt;
\begin{align}&lt;br /&gt;
&amp;amp; IAA_{i} = IA(i), \quad i \in [1, N], \\&lt;br /&gt;
&amp;amp; IAB_{i} = IA(i + 1) - 1, \quad i \in [1, N], \\&lt;br /&gt;
&amp;amp; c_{i} = \sum\limits_{j = IAA_{i}}^{IAB_{i}} AN(j)B(JA(j)), \quad i \in [1, N] \\&lt;br /&gt;
\end{align}&lt;br /&gt;
&amp;lt;/math&amp;gt;&lt;br /&gt;
&lt;br /&gt;
== Вычислительное ядро алгоритма ==&lt;br /&gt;
&lt;br /&gt;
Вычислительным ядром, т.е. той частью алгоритма, на которую приходится основное время его работы, является вычисление значения &amp;lt;math&amp;gt;i&amp;lt;/math&amp;gt;-го элемента &amp;lt;math&amp;gt;c_{i}&amp;lt;/math&amp;gt; вектора-произведения, т.е произведения строки &amp;lt;math&amp;gt;I&amp;lt;/math&amp;gt; матрицы &amp;lt;math&amp;gt;A&amp;lt;/math&amp;gt; и вектора &amp;lt;math&amp;gt;B&amp;lt;/math&amp;gt; по формуле:&lt;br /&gt;
&lt;br /&gt;
:&amp;lt;math&amp;gt;&lt;br /&gt;
\begin{align}&lt;br /&gt;
&amp;amp; c_{i} = \sum\limits_{j = IAA_{i}}^{IAB_{i}} AN(j)B(JA(j)), \quad i \in [1, N] \\&lt;br /&gt;
\end{align}&lt;br /&gt;
&amp;lt;/math&amp;gt;&lt;br /&gt;
&lt;br /&gt;
== Макроструктура алгоритма ==&lt;br /&gt;
&lt;br /&gt;
Основу алгоритма составляет вычисление значения &amp;lt;math&amp;gt;i&amp;lt;/math&amp;gt;-го элемента &amp;lt;math&amp;gt;c_{i}&amp;lt;/math&amp;gt; вектора-произведения:&lt;br /&gt;
&lt;br /&gt;
:&amp;lt;math&amp;gt;&lt;br /&gt;
\begin{align}&lt;br /&gt;
&amp;amp; c_{i} = \sum\limits_{j = IAA_{i}}^{IAB_{i}} AN(j)B(JA(j)), \quad i \in [1, N] \\&lt;br /&gt;
\end{align}&lt;br /&gt;
&amp;lt;/math&amp;gt;&lt;br /&gt;
&lt;br /&gt;
== Схема реализации последовательного алгоритма ==&lt;br /&gt;
&lt;br /&gt;
Последовательность исполнения метода следующая: &lt;br /&gt;
&lt;br /&gt;
Далее для всех &amp;lt;math&amp;gt;i&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; по нарастанию выполняются:&lt;br /&gt;
&lt;br /&gt;
1. &amp;lt;math&amp;gt; c_{i} = 0; IAA = IA(i); IAB = IA(i + 1 ) - 1 &amp;lt;/math&amp;gt;&lt;br /&gt;
&lt;br /&gt;
После этого, если &amp;lt;math&amp;gt;(IAB \le IAA)&amp;lt;/math&amp;gt;:&lt;br /&gt;
&lt;br /&gt;
2. Для всех &amp;lt;math&amp;gt;j&amp;lt;/math&amp;gt; от &amp;lt;math&amp;gt;IAA&amp;lt;/math&amp;gt; до &amp;lt;math&amp;gt;IAB&amp;lt;/math&amp;gt; выполняется: &lt;br /&gt;
&lt;br /&gt;
&amp;lt;math&amp;gt;c_{i} = \sum\limits_{j = IAA_{i}}^{IAB_{i}} AN(j)B(JA(j))&amp;lt;/math&amp;gt;&lt;br /&gt;
&lt;br /&gt;
Псевдокод алгоритма: &lt;br /&gt;
&lt;br /&gt;
    FOR I = 1, N                          (1)&lt;br /&gt;
       U = 0.                             (2) &lt;br /&gt;
       IAA = IA(I)                        (3) &lt;br /&gt;
       IAB = IA(I + 1 ) - 1               (4)&lt;br /&gt;
       IF NOT(IAB.LT.IAA)                 (5)&lt;br /&gt;
           FOR J = IAA, IAB               (6)&lt;br /&gt;
           C(I) = U + AN(J)*B(JA(J))      (7)&lt;br /&gt;
&lt;br /&gt;
== Последовательная сложность алгоритма ==&lt;br /&gt;
&lt;br /&gt;
Для всего алгоритма потребуется выполнить &amp;lt;math&amp;gt;O(k)&amp;lt;/math&amp;gt; операций, как в строке стр.7 псевдокода алгоритма ([[#Схема реализации последовательного алгоритма|п.1.5]]), где &amp;lt;math&amp;gt;k&amp;lt;/math&amp;gt; - число ненулевых эле­ментов матрицы.&lt;br /&gt;
&lt;br /&gt;
== Информационный граф ==&lt;br /&gt;
&lt;br /&gt;
На рисунке 1 изображен информационный граф алгоритма.&lt;br /&gt;
&lt;br /&gt;
[[file:InfoGrafMatrixRRCUandVextor.jpg|thumb|center|1200px|Рисунок 1. Информационный граф алгоритма.]]&lt;br /&gt;
 &lt;br /&gt;
По оси &amp;lt;math&amp;gt;X&amp;lt;/math&amp;gt; для отдельной строки &amp;lt;math&amp;gt;I&amp;lt;/math&amp;gt; матрицы отложены в пределах первой &amp;lt;math&amp;gt;IAA&amp;lt;/math&amp;gt; и последней &amp;lt;math&amp;gt;IAB&amp;lt;/math&amp;gt; позиций ненулевых элементов значения &amp;lt;math&amp;gt;AN&amp;lt;/math&amp;gt; и соответствуюие им по столбцовомым индексам, хранимимым в &amp;lt;math&amp;gt;JA&amp;lt;/math&amp;gt;, значения &amp;lt;math&amp;gt;B&amp;lt;/math&amp;gt; элементов. &lt;br /&gt;
Пары этих значений обозначены желтыми квадратиками &amp;lt;math&amp;gt;(in)&amp;lt;/math&amp;gt;. Значения in попарно скалярно перемножаются (зеленый кружочек) и суммируются (синий кружочек) в результат значения элемента вектора-произведения &amp;lt;math&amp;gt;c_{i}&amp;lt;/math&amp;gt;, т.е &amp;lt;math&amp;gt;out&amp;lt;/math&amp;gt;(красный квадратик) с строковым индексом, соответствующем номеру строки матрицы.&lt;br /&gt;
&lt;br /&gt;
По оси &amp;lt;math&amp;gt;Y&amp;lt;/math&amp;gt; отложена схема вычисление значения каждого элемента вектора-произведения для каждой строки матрицы.&lt;br /&gt;
&lt;br /&gt;
== Ресурс параллелизма алгоритма ==&lt;br /&gt;
&lt;br /&gt;
Алгоритм обладает возможностью выполняться параллельно, что позволяет значительно ускорить вычисления.&lt;br /&gt;
Вычисление значения каждого элемента вектора-произведения для каждой строки матрицы и элемента вектора B можно проводить на отдельных процессорах. &lt;br /&gt;
Максимальная эффективность вычислений достигается при наличии не менее, чем &amp;lt;math&amp;gt;N&amp;lt;/math&amp;gt; процессоров, т.е отдельный процессор на вычисление значения каждого элемента вектора-произведения. На процессоре выполняется &amp;lt;math&amp;gt;k(i)&amp;lt;/math&amp;gt; последовательных операций умножения и сложения. Поэтому число ярусов для &amp;lt;math&amp;gt;i&amp;lt;/math&amp;gt;-ого процессора равно &amp;lt;math&amp;gt;k(i)&amp;lt;/math&amp;gt;.&lt;br /&gt;
&lt;br /&gt;
Для параллельного выполнения алгоритма требуется:&lt;br /&gt;
&lt;br /&gt;
* &amp;lt;math&amp;gt;N&amp;lt;/math&amp;gt; ярусов умножений и сложений,&lt;br /&gt;
* в каждом из ярусов &amp;lt;math&amp;gt;k &amp;lt;&amp;lt; m&amp;lt;/math&amp;gt; операций.&lt;br /&gt;
&lt;br /&gt;
При классификации по высоте ЯПФ, алгоритм имеет линейную сложность. При классификации по высоте ЯПФ также линейную.&lt;br /&gt;
&lt;br /&gt;
== Входные и выходные данные алгоритма ==&lt;br /&gt;
&#039;&#039;&#039;Входные данные:&#039;&#039;&#039;&lt;br /&gt;
&lt;br /&gt;
* &amp;lt;math&amp;gt;IA, JA, AN&amp;lt;/math&amp;gt; - заданная матрица в форме &#039;&#039;&#039;(RR (С) U)&#039;&#039;&#039; c &amp;lt;math&amp;gt;k&amp;lt;/math&amp;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;B&amp;lt;/math&amp;gt; - заданный заполненный вектор c &amp;lt;math&amp;gt;m&amp;lt;/math&amp;gt; элементами;&lt;br /&gt;
&#039;&#039;&#039;&lt;br /&gt;
&#039;&#039;&#039;Объем входных данных&#039;&#039;&#039;: &amp;lt;math&amp;gt;k + m&amp;lt;/math&amp;gt;&lt;br /&gt;
&lt;br /&gt;
&#039;&#039;&#039;Выходные данные:&#039;&#039;&#039; &amp;lt;math&amp;gt;C&amp;lt;/math&amp;gt; вектор-произведение размерности &amp;lt;math&amp;gt;N&amp;lt;/math&amp;gt;.&lt;br /&gt;
&lt;br /&gt;
&#039;&#039;&#039;Объем выходных данных&#039;&#039;&#039;: &amp;lt;math&amp;gt;N&amp;lt;/math&amp;gt;&lt;br /&gt;
&lt;br /&gt;
== Свойства алгоритма ==&lt;br /&gt;
&lt;br /&gt;
Алгоритм в рамках выбранной версии полностью детерминирован.&lt;br /&gt;
&lt;br /&gt;
Вычислительная мощность алгоритма, как отношение числа операций к суммарному объему входных и выходных данных – константа.&lt;br /&gt;
&lt;br /&gt;
Соотношение последовательной и параллельной сложности в случае неограниченных ресурсов равно &amp;lt;math&amp;gt;O(\frac{k}{N})&amp;lt;/math&amp;gt;&lt;br /&gt;
&lt;br /&gt;
= Программная реализация алгоритма =&lt;br /&gt;
&lt;br /&gt;
== Масштабируемость алгоритма и его реализации ==&lt;br /&gt;
&lt;br /&gt;
== Существующие реализации алгоритма ==&lt;br /&gt;
&lt;br /&gt;
Алгоритм релизован в составе библиотек: &lt;br /&gt;
* SparseLib++[http://math.nist.gov/sparselib++/] &lt;br /&gt;
* cuSPARSE [http://docs.nvidia.com/cuda/cusparse/]&lt;br /&gt;
* uBLAS [http://www.boost.org/doc/libs/1_62_0/libs/numeric/ublas/doc/]&lt;br /&gt;
* Intel MKL [https://software.intel.com/en-us/intel-mkl]&lt;br /&gt;
&lt;br /&gt;
= Литература =&lt;br /&gt;
&lt;br /&gt;
[1] С. Писсанецки. Технология разреженных матриц. Изд. Мир, 1988.&lt;br /&gt;
[2] В. В. Воеводин, Вл.В. Воеводин. Параллельные вычисления. – СПб.: БХВ - Петербург, 2002.&lt;/div&gt;</summary>
		<author><name>Lexaloris</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:Lexaloris/%D0%A3%D0%BC%D0%BD%D0%BE%D0%B6%D0%B5%D0%BD%D0%B8%D0%B5_%D1%80%D0%B0%D0%B7%D1%80%D0%B5%D0%B6%D0%B5%D0%BD%D0%BD%D0%BE%D0%B9_%D0%BC%D0%B0%D1%82%D1%80%D0%B8%D1%86%D1%8B_%D0%BD%D0%B0_%D0%B2%D0%B5%D0%BA%D1%82%D0%BE%D1%80&amp;diff=11175</id>
		<title>Участник:Lexaloris/Умножение разреженной матрицы на вектор</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:Lexaloris/%D0%A3%D0%BC%D0%BD%D0%BE%D0%B6%D0%B5%D0%BD%D0%B8%D0%B5_%D1%80%D0%B0%D0%B7%D1%80%D0%B5%D0%B6%D0%B5%D0%BD%D0%BD%D0%BE%D0%B9_%D0%BC%D0%B0%D1%82%D1%80%D0%B8%D1%86%D1%8B_%D0%BD%D0%B0_%D0%B2%D0%B5%D0%BA%D1%82%D0%BE%D1%80&amp;diff=11175"/>
		<updated>2016-10-15T18:44:22Z</updated>

		<summary type="html">&lt;p&gt;Lexaloris: /* Существующие реализации алгоритма */&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(k)&amp;lt;/math&amp;gt;&lt;br /&gt;
| pf_height         = &amp;lt;math&amp;gt;O(m)&amp;lt;/math&amp;gt;&lt;br /&gt;
| pf_width          = &amp;lt;math&amp;gt;O(n)&amp;lt;/math&amp;gt;&lt;br /&gt;
| input_data        = &amp;lt;math&amp;gt;k + m&amp;lt;/math&amp;gt;&lt;br /&gt;
| output_data       = &amp;lt;math&amp;gt;n&amp;lt;/math&amp;gt;&lt;br /&gt;
}}&lt;br /&gt;
&lt;br /&gt;
&lt;br /&gt;
&#039;&#039;&#039;Авторы страницы:&#039;&#039;&#039; [[Участник:Lexaloris|A.Д. Новоселов]] и [[Участник:kochet|П.А. Кочетков]]&lt;br /&gt;
&lt;br /&gt;
= Свойства и структура алгоритмов =&lt;br /&gt;
&lt;br /&gt;
== Общее описание алгоритма ==&lt;br /&gt;
&lt;br /&gt;
=== Хранение ненулевых элементов разреженной матрицы ===&lt;br /&gt;
&lt;br /&gt;
==== Разреженный строчной формат ====&lt;br /&gt;
&lt;br /&gt;
Одной из наиболее ши­роко используемых схем хранения разреженных матриц является &#039;&#039;разреженный строчный формат&#039;&#039;. Эта&lt;br /&gt;
схема предъявляет минимальные требования к памяти и в то же время оказывается очень удобной для умножения разреженной матрицы на вектор.&lt;br /&gt;
Например, рассмотрим формат хранения разряженной матрицы &amp;lt;math&amp;gt;A&amp;lt;/math&amp;gt;:&lt;br /&gt;
&lt;br /&gt;
[[File:RRCOMatrix.png]]&lt;br /&gt;
&lt;br /&gt;
Значения нену­левых элементов матрицы и соответствующие столбцовые индексы хранятся в этой схеме по строкам в двух массивах &amp;lt;math&amp;gt;AN&amp;lt;/math&amp;gt; и &amp;lt;math&amp;gt;JA&amp;lt;/math&amp;gt; соответственно. Используется также массив указателей &amp;lt;math&amp;gt;IA&amp;lt;/math&amp;gt;, отмечающих позиции массивов &amp;lt;math&amp;gt;AN&amp;lt;/math&amp;gt; и &amp;lt;math&amp;gt;JA&amp;lt;/math&amp;gt;, с которых начинается описание очередной строки. Дополнительная компо­нента в &amp;lt;math&amp;gt;IA&amp;lt;/math&amp;gt; содержит указатель первой свободной позиции в &amp;lt;math&amp;gt;JA&amp;lt;/math&amp;gt; и &amp;lt;math&amp;gt;AN&amp;lt;/math&amp;gt;.&lt;br /&gt;
&lt;br /&gt;
Таким образом &amp;lt;math&amp;gt;A&amp;lt;/math&amp;gt; представляется в виде:&lt;br /&gt;
&lt;br /&gt;
   IA = [ 1 4 4 6 ]&lt;br /&gt;
   JA = [ 3 4 8 6 8 ]&lt;br /&gt;
   AN = [ 1 3 5 7 1 ]&lt;br /&gt;
&lt;br /&gt;
Данный способ представления называют &#039;&#039;полным&#039;&#039;, поскольку представлена вся матрица &amp;lt;math&amp;gt;A&amp;lt;/math&amp;gt;, и &#039;&#039;упорядоченным&#039;&#039;, поскольку эле­менты каждой строки хранятся в соответствии с возрастанием столбцовых индексов. Таким образом, это строчное представление, полное и упорядоченное, или сокращенно &#039;&#039;&#039;(RR (С) О)&#039;&#039;&#039;.&lt;br /&gt;
&lt;br /&gt;
==== Неупорядоченное представление ====&lt;br /&gt;
&lt;br /&gt;
Представления разреженных матриц необязательно должны быть упорядочены в том смысле, что, хотя упорядоченность строк поддерживается, внутри каждой строки элементы могут храниться в произвольном порядке. Для матрицы А нашего примера вполне можно было бы использовать и строчное представление, полное, но &#039;&#039;неупорядоченное&#039;&#039; &#039;&#039;&#039;(RR (С) U )&#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;
   IA = [ 1 4 4 6 ]&lt;br /&gt;
   JA = [ 8 3 4 8 6 ]&lt;br /&gt;
   AN = [ 5 1 3 1 7 ]&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; — число строк матрицы. &lt;br /&gt;
Для каждой ее строки &amp;lt;math&amp;gt;I&amp;lt;/math&amp;gt; матрицы мы находим с помощью &amp;lt;math&amp;gt;IA&amp;lt;/math&amp;gt; значения первой &amp;lt;math&amp;gt;IAA&amp;lt;/math&amp;gt; и последней &amp;lt;math&amp;gt;IAB&amp;lt;/math&amp;gt; позиций, занимаемых элементами строки &amp;lt;math&amp;gt;I&amp;lt;/math&amp;gt; в массивах &amp;lt;math&amp;gt;JA&amp;lt;/math&amp;gt; и &amp;lt;math&amp;gt;AN&amp;lt;/math&amp;gt;. Затем, чтобы вычислить скалярное произведение строки &amp;lt;math&amp;gt;I&amp;lt;/math&amp;gt; и вектора &amp;lt;math&amp;gt;B&amp;lt;/math&amp;gt;, мы просто просматриваем &amp;lt;math&amp;gt;JA&amp;lt;/math&amp;gt; и &amp;lt;math&amp;gt;AN&amp;lt;/math&amp;gt; на отрезке от &amp;lt;math&amp;gt;IAA&amp;lt;/math&amp;gt; до &amp;lt;math&amp;gt;IAB&amp;lt;/math&amp;gt;:&lt;br /&gt;
каждое значение, хранимое в &amp;lt;math&amp;gt;JA&amp;lt;/math&amp;gt;, есть столбцовый индекс и используется для извлечения из массива &amp;lt;math&amp;gt;B&amp;lt;/math&amp;gt; элемента, который должен быть умножен на соответствующее число из &amp;lt;math&amp;gt;AN&amp;lt;/math&amp;gt;. Результат каж­дого умножения прибавляется к &amp;lt;math&amp;gt;C(I)&amp;lt;/math&amp;gt;.&lt;br /&gt;
&lt;br /&gt;
== Математическое описание алгоритма ==&lt;br /&gt;
&lt;br /&gt;
&#039;&#039;&#039;Исходные данные:&#039;&#039;&#039; &lt;br /&gt;
&lt;br /&gt;
&amp;lt;math&amp;gt;IA, JA, AN&amp;lt;/math&amp;gt; - заданная матрица в форме &#039;&#039;&#039;(RR (С) U)&#039;&#039;&#039;;&lt;br /&gt;
&lt;br /&gt;
&amp;lt;math&amp;gt;B&amp;lt;/math&amp;gt; - заданный заполненный вектор;&lt;br /&gt;
&lt;br /&gt;
&amp;lt;math&amp;gt;N&amp;lt;/math&amp;gt; - число строк матрицы.&lt;br /&gt;
&lt;br /&gt;
&#039;&#039;&#039;Выход:&#039;&#039;&#039; &amp;lt;math&amp;gt;C&amp;lt;/math&amp;gt; вектор-произведение размерности &amp;lt;math&amp;gt;N&amp;lt;/math&amp;gt;.&lt;br /&gt;
&lt;br /&gt;
&#039;&#039;&#039;Формулы метода:&#039;&#039;&#039;&lt;br /&gt;
&lt;br /&gt;
:&amp;lt;math&amp;gt;&lt;br /&gt;
\begin{align}&lt;br /&gt;
&amp;amp; IAA_{i} = IA(i), \quad i \in [1, N], \\&lt;br /&gt;
&amp;amp; IAB_{i} = IA(i + 1) - 1, \quad i \in [1, N], \\&lt;br /&gt;
&amp;amp; c_{i} = \sum\limits_{j = IAA_{i}}^{IAB_{i}} AN(j)B(JA(j)), \quad i \in [1, N] \\&lt;br /&gt;
\end{align}&lt;br /&gt;
&amp;lt;/math&amp;gt;&lt;br /&gt;
&lt;br /&gt;
== Вычислительное ядро алгоритма ==&lt;br /&gt;
&lt;br /&gt;
Вычислительным ядром, т.е. той частью алгоритма, на которую приходится основное время его работы, является вычисление значения &amp;lt;math&amp;gt;i&amp;lt;/math&amp;gt;-го элемента &amp;lt;math&amp;gt;c_{i}&amp;lt;/math&amp;gt; вектора-произведения, т.е произведения строки &amp;lt;math&amp;gt;I&amp;lt;/math&amp;gt; матрицы &amp;lt;math&amp;gt;A&amp;lt;/math&amp;gt; и вектора &amp;lt;math&amp;gt;B&amp;lt;/math&amp;gt; по формуле:&lt;br /&gt;
&lt;br /&gt;
:&amp;lt;math&amp;gt;&lt;br /&gt;
\begin{align}&lt;br /&gt;
&amp;amp; c_{i} = \sum\limits_{j = IAA_{i}}^{IAB_{i}} AN(j)B(JA(j)), \quad i \in [1, N] \\&lt;br /&gt;
\end{align}&lt;br /&gt;
&amp;lt;/math&amp;gt;&lt;br /&gt;
&lt;br /&gt;
== Макроструктура алгоритма ==&lt;br /&gt;
&lt;br /&gt;
Основу алгоритма составляет вычисление значения &amp;lt;math&amp;gt;i&amp;lt;/math&amp;gt;-го элемента &amp;lt;math&amp;gt;c_{i}&amp;lt;/math&amp;gt; вектора-произведения:&lt;br /&gt;
&lt;br /&gt;
:&amp;lt;math&amp;gt;&lt;br /&gt;
\begin{align}&lt;br /&gt;
&amp;amp; c_{i} = \sum\limits_{j = IAA_{i}}^{IAB_{i}} AN(j)B(JA(j)), \quad i \in [1, N] \\&lt;br /&gt;
\end{align}&lt;br /&gt;
&amp;lt;/math&amp;gt;&lt;br /&gt;
&lt;br /&gt;
== Схема реализации последовательного алгоритма ==&lt;br /&gt;
&lt;br /&gt;
Последовательность исполнения метода следующая: &lt;br /&gt;
&lt;br /&gt;
Далее для всех &amp;lt;math&amp;gt;i&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; по нарастанию выполняются:&lt;br /&gt;
&lt;br /&gt;
1. &amp;lt;math&amp;gt; c_{i} = 0; IAA = IA(i); IAB = IA(i + 1 ) - 1 &amp;lt;/math&amp;gt;&lt;br /&gt;
&lt;br /&gt;
После этого, если &amp;lt;math&amp;gt;(IAB \le IAA)&amp;lt;/math&amp;gt;:&lt;br /&gt;
&lt;br /&gt;
2. Для всех &amp;lt;math&amp;gt;j&amp;lt;/math&amp;gt; от &amp;lt;math&amp;gt;IAA&amp;lt;/math&amp;gt; до &amp;lt;math&amp;gt;IAB&amp;lt;/math&amp;gt; выполняется: &lt;br /&gt;
&lt;br /&gt;
&amp;lt;math&amp;gt;c_{i} = \sum\limits_{j = IAA_{i}}^{IAB_{i}} AN(j)B(JA(j))&amp;lt;/math&amp;gt;&lt;br /&gt;
&lt;br /&gt;
Псевдокод алгоритма: &lt;br /&gt;
&lt;br /&gt;
    FOR I = 1, N                          (1)&lt;br /&gt;
       U = 0.                             (2) &lt;br /&gt;
       IAA = IA(I)                        (3) &lt;br /&gt;
       IAB = IA(I + 1 ) - 1               (4)&lt;br /&gt;
       IF NOT(IAB.LT.IAA)                 (5)&lt;br /&gt;
           FOR J = IAA, IAB               (6)&lt;br /&gt;
           C(I) = U + AN(J)*B(JA(J))      (7)&lt;br /&gt;
&lt;br /&gt;
== Последовательная сложность алгоритма ==&lt;br /&gt;
&lt;br /&gt;
Для всего алгоритма потребуется выполнить &amp;lt;math&amp;gt;O(k)&amp;lt;/math&amp;gt; операций, как в строке стр.7 псевдокода алгоритма ([[#Схема реализации последовательного алгоритма|п.1.5]]), где &amp;lt;math&amp;gt;k&amp;lt;/math&amp;gt; - число ненулевых эле­ментов матрицы.&lt;br /&gt;
&lt;br /&gt;
== Информационный граф ==&lt;br /&gt;
&lt;br /&gt;
На рисунке 1 изображен информационный граф алгоритма.&lt;br /&gt;
&lt;br /&gt;
[[file:InfoGrafMatrixRRCUandVextor.jpg|thumb|center|1200px|Рисунок 1. Информационный граф алгоритма.]]&lt;br /&gt;
 &lt;br /&gt;
По оси &amp;lt;math&amp;gt;X&amp;lt;/math&amp;gt; для отдельной строки &amp;lt;math&amp;gt;I&amp;lt;/math&amp;gt; матрицы отложены в пределах первой &amp;lt;math&amp;gt;IAA&amp;lt;/math&amp;gt; и последней &amp;lt;math&amp;gt;IAB&amp;lt;/math&amp;gt; позиций ненулевых элементов значения &amp;lt;math&amp;gt;AN&amp;lt;/math&amp;gt; и соответствуюие им по столбцовомым индексам, хранимимым в &amp;lt;math&amp;gt;JA&amp;lt;/math&amp;gt;, значения &amp;lt;math&amp;gt;B&amp;lt;/math&amp;gt; элементов. &lt;br /&gt;
Пары этих значений обозначены желтыми квадратиками &amp;lt;math&amp;gt;(in)&amp;lt;/math&amp;gt;. Значения in попарно скалярно перемножаются (зеленый кружочек) и суммируются (синий кружочек) в результат значения элемента вектора-произведения &amp;lt;math&amp;gt;c_{i}&amp;lt;/math&amp;gt;, т.е &amp;lt;math&amp;gt;out&amp;lt;/math&amp;gt;(красный квадратик) с строковым индексом, соответствующем номеру строки матрицы.&lt;br /&gt;
&lt;br /&gt;
По оси &amp;lt;math&amp;gt;Y&amp;lt;/math&amp;gt; отложена схема вычисление значения каждого элемента вектора-произведения для каждой строки матрицы.&lt;br /&gt;
&lt;br /&gt;
== Ресурс параллелизма алгоритма ==&lt;br /&gt;
&lt;br /&gt;
Алгоритм обладает возможностью выполняться параллельно, что позволяет значительно ускорить вычисления.&lt;br /&gt;
Вычисление значения каждого элемента вектора-произведения для каждой строки матрицы и элемента вектора B можно проводить на отдельных процессорах. &lt;br /&gt;
Максимальная эффективность вычислений достигается при наличии не менее, чем &amp;lt;math&amp;gt;N&amp;lt;/math&amp;gt; процессоров, т.е отдельный процессор на вычисление значения каждого элемента вектора-произведения. На процессоре выполняется &amp;lt;math&amp;gt;k(i)&amp;lt;/math&amp;gt; последовательных операций умножения и сложения. Поэтому число ярусов для &amp;lt;math&amp;gt;i&amp;lt;/math&amp;gt;-ого процессора равно &amp;lt;math&amp;gt;k(i)&amp;lt;/math&amp;gt;.&lt;br /&gt;
&lt;br /&gt;
Для параллельного выполнения алгоритма требуется:&lt;br /&gt;
&lt;br /&gt;
* &amp;lt;math&amp;gt;N&amp;lt;/math&amp;gt; ярусов умножений и сложений,&lt;br /&gt;
* в каждом из ярусов &amp;lt;math&amp;gt;k &amp;lt;&amp;lt; m&amp;lt;/math&amp;gt; операций.&lt;br /&gt;
&lt;br /&gt;
При классификации по высоте ЯПФ, алгоритм имеет линейную сложность. При классификации по высоте ЯПФ также линейную.&lt;br /&gt;
&lt;br /&gt;
== Входные и выходные данные алгоритма ==&lt;br /&gt;
&#039;&#039;&#039;Входные данные:&#039;&#039;&#039;&lt;br /&gt;
&lt;br /&gt;
* &amp;lt;math&amp;gt;IA, JA, AN&amp;lt;/math&amp;gt; - заданная матрица в форме &#039;&#039;&#039;(RR (С) U)&#039;&#039;&#039; c &amp;lt;math&amp;gt;k&amp;lt;/math&amp;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;B&amp;lt;/math&amp;gt; - заданный заполненный вектор c &amp;lt;math&amp;gt;m&amp;lt;/math&amp;gt; элементами;&lt;br /&gt;
&#039;&#039;&#039;&lt;br /&gt;
&#039;&#039;&#039;Объем входных данных&#039;&#039;&#039;: &amp;lt;math&amp;gt;k + m&amp;lt;/math&amp;gt;&lt;br /&gt;
&lt;br /&gt;
&#039;&#039;&#039;Выходные данные:&#039;&#039;&#039; &amp;lt;math&amp;gt;C&amp;lt;/math&amp;gt; вектор-произведение размерности &amp;lt;math&amp;gt;N&amp;lt;/math&amp;gt;.&lt;br /&gt;
&lt;br /&gt;
&#039;&#039;&#039;Объем выходных данных&#039;&#039;&#039;: &amp;lt;math&amp;gt;N&amp;lt;/math&amp;gt;&lt;br /&gt;
&lt;br /&gt;
== Свойства алгоритма ==&lt;br /&gt;
&lt;br /&gt;
Алгоритм в рамках выбранной версии полностью детерминирован.&lt;br /&gt;
&lt;br /&gt;
Вычислительная мощность алгоритма, как отношение числа операций к суммарному объему входных и выходных данных – константа.&lt;br /&gt;
&lt;br /&gt;
Соотношение последовательной и параллельной сложности в случае неограниченных ресурсов равно &amp;lt;math&amp;gt;O(\frac{k}{N})&amp;lt;/math&amp;gt;&lt;br /&gt;
&lt;br /&gt;
= Программная реализация алгоритма =&lt;br /&gt;
&lt;br /&gt;
== Масштабируемость алгоритма и его реализации ==&lt;br /&gt;
&lt;br /&gt;
== Существующие реализации алгоритма ==&lt;br /&gt;
&lt;br /&gt;
Алгоритм релизован в составе библиотек: &lt;br /&gt;
* SparseLib++[http://math.nist.gov/sparselib++/] &lt;br /&gt;
* cuSPARSE [http://docs.nvidia.com/cuda/cusparse/]&lt;br /&gt;
* uBLAS [http://www.boost.org/doc/libs/1_62_0/libs/numeric/ublas/doc/]&lt;br /&gt;
* Intel MKL [https://software.intel.com/en-us/intel-mkl]&lt;br /&gt;
&lt;br /&gt;
= Литература =&lt;br /&gt;
&lt;br /&gt;
[1] С. Писсанецки. Технология разреженных матриц. Изд. Мир, 1988.&lt;/div&gt;</summary>
		<author><name>Lexaloris</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:Lexaloris/%D0%A3%D0%BC%D0%BD%D0%BE%D0%B6%D0%B5%D0%BD%D0%B8%D0%B5_%D1%80%D0%B0%D0%B7%D1%80%D0%B5%D0%B6%D0%B5%D0%BD%D0%BD%D0%BE%D0%B9_%D0%BC%D0%B0%D1%82%D1%80%D0%B8%D1%86%D1%8B_%D0%BD%D0%B0_%D0%B2%D0%B5%D0%BA%D1%82%D0%BE%D1%80&amp;diff=11157</id>
		<title>Участник:Lexaloris/Умножение разреженной матрицы на вектор</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:Lexaloris/%D0%A3%D0%BC%D0%BD%D0%BE%D0%B6%D0%B5%D0%BD%D0%B8%D0%B5_%D1%80%D0%B0%D0%B7%D1%80%D0%B5%D0%B6%D0%B5%D0%BD%D0%BD%D0%BE%D0%B9_%D0%BC%D0%B0%D1%82%D1%80%D0%B8%D1%86%D1%8B_%D0%BD%D0%B0_%D0%B2%D0%B5%D0%BA%D1%82%D0%BE%D1%80&amp;diff=11157"/>
		<updated>2016-10-15T18:41:07Z</updated>

		<summary type="html">&lt;p&gt;Lexaloris: /* Свойства алгоритма */&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(k)&amp;lt;/math&amp;gt;&lt;br /&gt;
| pf_height         = &amp;lt;math&amp;gt;O(m)&amp;lt;/math&amp;gt;&lt;br /&gt;
| pf_width          = &amp;lt;math&amp;gt;O(n)&amp;lt;/math&amp;gt;&lt;br /&gt;
| input_data        = &amp;lt;math&amp;gt;k + m&amp;lt;/math&amp;gt;&lt;br /&gt;
| output_data       = &amp;lt;math&amp;gt;n&amp;lt;/math&amp;gt;&lt;br /&gt;
}}&lt;br /&gt;
&lt;br /&gt;
&lt;br /&gt;
&#039;&#039;&#039;Авторы страницы:&#039;&#039;&#039; [[Участник:Lexaloris|A.Д. Новоселов]] и [[Участник:kochet|П.А. Кочетков]]&lt;br /&gt;
&lt;br /&gt;
= Свойства и структура алгоритмов =&lt;br /&gt;
&lt;br /&gt;
== Общее описание алгоритма ==&lt;br /&gt;
&lt;br /&gt;
=== Хранение ненулевых элементов разреженной матрицы ===&lt;br /&gt;
&lt;br /&gt;
==== Разреженный строчной формат ====&lt;br /&gt;
&lt;br /&gt;
Одной из наиболее ши­роко используемых схем хранения разреженных матриц является &#039;&#039;разреженный строчный формат&#039;&#039;. Эта&lt;br /&gt;
схема предъявляет минимальные требования к памяти и в то же время оказывается очень удобной для умножения разреженной матрицы на вектор.&lt;br /&gt;
Например, рассмотрим формат хранения разряженной матрицы &amp;lt;math&amp;gt;A&amp;lt;/math&amp;gt;:&lt;br /&gt;
&lt;br /&gt;
[[File:RRCOMatrix.png]]&lt;br /&gt;
&lt;br /&gt;
Значения нену­левых элементов матрицы и соответствующие столбцовые индексы хранятся в этой схеме по строкам в двух массивах &amp;lt;math&amp;gt;AN&amp;lt;/math&amp;gt; и &amp;lt;math&amp;gt;JA&amp;lt;/math&amp;gt; соответственно. Используется также массив указателей &amp;lt;math&amp;gt;IA&amp;lt;/math&amp;gt;, отмечающих позиции массивов &amp;lt;math&amp;gt;AN&amp;lt;/math&amp;gt; и &amp;lt;math&amp;gt;JA&amp;lt;/math&amp;gt;, с которых начинается описание очередной строки. Дополнительная компо­нента в &amp;lt;math&amp;gt;IA&amp;lt;/math&amp;gt; содержит указатель первой свободной позиции в &amp;lt;math&amp;gt;JA&amp;lt;/math&amp;gt; и &amp;lt;math&amp;gt;AN&amp;lt;/math&amp;gt;.&lt;br /&gt;
&lt;br /&gt;
Таким образом &amp;lt;math&amp;gt;A&amp;lt;/math&amp;gt; представляется в виде:&lt;br /&gt;
&lt;br /&gt;
   IA = [ 1 4 4 6 ]&lt;br /&gt;
   JA = [ 3 4 8 6 8 ]&lt;br /&gt;
   AN = [ 1 3 5 7 1 ]&lt;br /&gt;
&lt;br /&gt;
Данный способ представления называют &#039;&#039;полным&#039;&#039;, поскольку представлена вся матрица &amp;lt;math&amp;gt;A&amp;lt;/math&amp;gt;, и &#039;&#039;упорядоченным&#039;&#039;, поскольку эле­менты каждой строки хранятся в соответствии с возрастанием столбцовых индексов. Таким образом, это строчное представление, полное и упорядоченное, или сокращенно &#039;&#039;&#039;(RR (С) О)&#039;&#039;&#039;.&lt;br /&gt;
&lt;br /&gt;
==== Неупорядоченное представление ====&lt;br /&gt;
&lt;br /&gt;
Представления разреженных матриц необязательно должны быть упорядочены в том смысле, что, хотя упорядоченность строк поддерживается, внутри каждой строки элементы могут храниться в произвольном порядке. Для матрицы А нашего примера вполне можно было бы использовать и строчное представление, полное, но &#039;&#039;неупорядоченное&#039;&#039; &#039;&#039;&#039;(RR (С) U )&#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;
   IA = [ 1 4 4 6 ]&lt;br /&gt;
   JA = [ 8 3 4 8 6 ]&lt;br /&gt;
   AN = [ 5 1 3 1 7 ]&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; — число строк матрицы. &lt;br /&gt;
Для каждой ее строки &amp;lt;math&amp;gt;I&amp;lt;/math&amp;gt; матрицы мы находим с помощью &amp;lt;math&amp;gt;IA&amp;lt;/math&amp;gt; значения первой &amp;lt;math&amp;gt;IAA&amp;lt;/math&amp;gt; и последней &amp;lt;math&amp;gt;IAB&amp;lt;/math&amp;gt; позиций, занимаемых элементами строки &amp;lt;math&amp;gt;I&amp;lt;/math&amp;gt; в массивах &amp;lt;math&amp;gt;JA&amp;lt;/math&amp;gt; и &amp;lt;math&amp;gt;AN&amp;lt;/math&amp;gt;. Затем, чтобы вычислить скалярное произведение строки &amp;lt;math&amp;gt;I&amp;lt;/math&amp;gt; и вектора &amp;lt;math&amp;gt;B&amp;lt;/math&amp;gt;, мы просто просматриваем &amp;lt;math&amp;gt;JA&amp;lt;/math&amp;gt; и &amp;lt;math&amp;gt;AN&amp;lt;/math&amp;gt; на отрезке от &amp;lt;math&amp;gt;IAA&amp;lt;/math&amp;gt; до &amp;lt;math&amp;gt;IAB&amp;lt;/math&amp;gt;:&lt;br /&gt;
каждое значение, хранимое в &amp;lt;math&amp;gt;JA&amp;lt;/math&amp;gt;, есть столбцовый индекс и используется для извлечения из массива &amp;lt;math&amp;gt;B&amp;lt;/math&amp;gt; элемента, который должен быть умножен на соответствующее число из &amp;lt;math&amp;gt;AN&amp;lt;/math&amp;gt;. Результат каж­дого умножения прибавляется к &amp;lt;math&amp;gt;C(I)&amp;lt;/math&amp;gt;.&lt;br /&gt;
&lt;br /&gt;
== Математическое описание алгоритма ==&lt;br /&gt;
&lt;br /&gt;
&#039;&#039;&#039;Исходные данные:&#039;&#039;&#039; &lt;br /&gt;
&lt;br /&gt;
&amp;lt;math&amp;gt;IA, JA, AN&amp;lt;/math&amp;gt; - заданная матрица в форме &#039;&#039;&#039;(RR (С) U)&#039;&#039;&#039;;&lt;br /&gt;
&lt;br /&gt;
&amp;lt;math&amp;gt;B&amp;lt;/math&amp;gt; - заданный заполненный вектор;&lt;br /&gt;
&lt;br /&gt;
&amp;lt;math&amp;gt;N&amp;lt;/math&amp;gt; - число строк матрицы.&lt;br /&gt;
&lt;br /&gt;
&#039;&#039;&#039;Выход:&#039;&#039;&#039; &amp;lt;math&amp;gt;C&amp;lt;/math&amp;gt; вектор-произведение размерности &amp;lt;math&amp;gt;N&amp;lt;/math&amp;gt;.&lt;br /&gt;
&lt;br /&gt;
&#039;&#039;&#039;Формулы метода:&#039;&#039;&#039;&lt;br /&gt;
&lt;br /&gt;
:&amp;lt;math&amp;gt;&lt;br /&gt;
\begin{align}&lt;br /&gt;
&amp;amp; IAA_{i} = IA(i), \quad i \in [1, N], \\&lt;br /&gt;
&amp;amp; IAB_{i} = IA(i + 1) - 1, \quad i \in [1, N], \\&lt;br /&gt;
&amp;amp; c_{i} = \sum\limits_{j = IAA_{i}}^{IAB_{i}} AN(j)B(JA(j)), \quad i \in [1, N] \\&lt;br /&gt;
\end{align}&lt;br /&gt;
&amp;lt;/math&amp;gt;&lt;br /&gt;
&lt;br /&gt;
== Вычислительное ядро алгоритма ==&lt;br /&gt;
&lt;br /&gt;
Вычислительным ядром, т.е. той частью алгоритма, на которую приходится основное время его работы, является вычисление значения &amp;lt;math&amp;gt;i&amp;lt;/math&amp;gt;-го элемента &amp;lt;math&amp;gt;c_{i}&amp;lt;/math&amp;gt; вектора-произведения, т.е произведения строки &amp;lt;math&amp;gt;I&amp;lt;/math&amp;gt; матрицы &amp;lt;math&amp;gt;A&amp;lt;/math&amp;gt; и вектора &amp;lt;math&amp;gt;B&amp;lt;/math&amp;gt; по формуле:&lt;br /&gt;
&lt;br /&gt;
:&amp;lt;math&amp;gt;&lt;br /&gt;
\begin{align}&lt;br /&gt;
&amp;amp; c_{i} = \sum\limits_{j = IAA_{i}}^{IAB_{i}} AN(j)B(JA(j)), \quad i \in [1, N] \\&lt;br /&gt;
\end{align}&lt;br /&gt;
&amp;lt;/math&amp;gt;&lt;br /&gt;
&lt;br /&gt;
== Макроструктура алгоритма ==&lt;br /&gt;
&lt;br /&gt;
Основу алгоритма составляет вычисление значения &amp;lt;math&amp;gt;i&amp;lt;/math&amp;gt;-го элемента &amp;lt;math&amp;gt;c_{i}&amp;lt;/math&amp;gt; вектора-произведения:&lt;br /&gt;
&lt;br /&gt;
:&amp;lt;math&amp;gt;&lt;br /&gt;
\begin{align}&lt;br /&gt;
&amp;amp; c_{i} = \sum\limits_{j = IAA_{i}}^{IAB_{i}} AN(j)B(JA(j)), \quad i \in [1, N] \\&lt;br /&gt;
\end{align}&lt;br /&gt;
&amp;lt;/math&amp;gt;&lt;br /&gt;
&lt;br /&gt;
== Схема реализации последовательного алгоритма ==&lt;br /&gt;
&lt;br /&gt;
Последовательность исполнения метода следующая: &lt;br /&gt;
&lt;br /&gt;
Далее для всех &amp;lt;math&amp;gt;i&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; по нарастанию выполняются:&lt;br /&gt;
&lt;br /&gt;
1. &amp;lt;math&amp;gt; c_{i} = 0; IAA = IA(i); IAB = IA(i + 1 ) - 1 &amp;lt;/math&amp;gt;&lt;br /&gt;
&lt;br /&gt;
После этого, если &amp;lt;math&amp;gt;(IAB \le IAA)&amp;lt;/math&amp;gt;:&lt;br /&gt;
&lt;br /&gt;
2. Для всех &amp;lt;math&amp;gt;j&amp;lt;/math&amp;gt; от &amp;lt;math&amp;gt;IAA&amp;lt;/math&amp;gt; до &amp;lt;math&amp;gt;IAB&amp;lt;/math&amp;gt; выполняется: &lt;br /&gt;
&lt;br /&gt;
&amp;lt;math&amp;gt;c_{i} = \sum\limits_{j = IAA_{i}}^{IAB_{i}} AN(j)B(JA(j))&amp;lt;/math&amp;gt;&lt;br /&gt;
&lt;br /&gt;
Псевдокод алгоритма: &lt;br /&gt;
&lt;br /&gt;
    FOR I = 1, N                          (1)&lt;br /&gt;
       U = 0.                             (2) &lt;br /&gt;
       IAA = IA(I)                        (3) &lt;br /&gt;
       IAB = IA(I + 1 ) - 1               (4)&lt;br /&gt;
       IF NOT(IAB.LT.IAA)                 (5)&lt;br /&gt;
           FOR J = IAA, IAB               (6)&lt;br /&gt;
           C(I) = U + AN(J)*B(JA(J))      (7)&lt;br /&gt;
&lt;br /&gt;
== Последовательная сложность алгоритма ==&lt;br /&gt;
&lt;br /&gt;
Для всего алгоритма потребуется выполнить &amp;lt;math&amp;gt;O(k)&amp;lt;/math&amp;gt; операций, как в строке стр.7 псевдокода алгоритма ([[#Схема реализации последовательного алгоритма|п.1.5]]), где &amp;lt;math&amp;gt;k&amp;lt;/math&amp;gt; - число ненулевых эле­ментов матрицы.&lt;br /&gt;
&lt;br /&gt;
== Информационный граф ==&lt;br /&gt;
&lt;br /&gt;
На рисунке 1 изображен информационный граф алгоритма.&lt;br /&gt;
&lt;br /&gt;
[[file:InfoGrafMatrixRRCUandVextor.jpg|thumb|center|1200px|Рисунок 1. Информационный граф алгоритма.]]&lt;br /&gt;
 &lt;br /&gt;
По оси &amp;lt;math&amp;gt;X&amp;lt;/math&amp;gt; для отдельной строки &amp;lt;math&amp;gt;I&amp;lt;/math&amp;gt; матрицы отложены в пределах первой &amp;lt;math&amp;gt;IAA&amp;lt;/math&amp;gt; и последней &amp;lt;math&amp;gt;IAB&amp;lt;/math&amp;gt; позиций ненулевых элементов значения &amp;lt;math&amp;gt;AN&amp;lt;/math&amp;gt; и соответствуюие им по столбцовомым индексам, хранимимым в &amp;lt;math&amp;gt;JA&amp;lt;/math&amp;gt;, значения &amp;lt;math&amp;gt;B&amp;lt;/math&amp;gt; элементов. &lt;br /&gt;
Пары этих значений обозначены желтыми квадратиками &amp;lt;math&amp;gt;(in)&amp;lt;/math&amp;gt;. Значения in попарно скалярно перемножаются (зеленый кружочек) и суммируются (синий кружочек) в результат значения элемента вектора-произведения &amp;lt;math&amp;gt;c_{i}&amp;lt;/math&amp;gt;, т.е &amp;lt;math&amp;gt;out&amp;lt;/math&amp;gt;(красный квадратик) с строковым индексом, соответствующем номеру строки матрицы.&lt;br /&gt;
&lt;br /&gt;
По оси &amp;lt;math&amp;gt;Y&amp;lt;/math&amp;gt; отложена схема вычисление значения каждого элемента вектора-произведения для каждой строки матрицы.&lt;br /&gt;
&lt;br /&gt;
== Ресурс параллелизма алгоритма ==&lt;br /&gt;
&lt;br /&gt;
Алгоритм обладает возможностью выполняться параллельно, что позволяет значительно ускорить вычисления.&lt;br /&gt;
Вычисление значения каждого элемента вектора-произведения для каждой строки матрицы и элемента вектора B можно проводить на отдельных процессорах. &lt;br /&gt;
Максимальная эффективность вычислений достигается при наличии не менее, чем &amp;lt;math&amp;gt;N&amp;lt;/math&amp;gt; процессоров, т.е отдельный процессор на вычисление значения каждого элемента вектора-произведения. На процессоре выполняется &amp;lt;math&amp;gt;k(i)&amp;lt;/math&amp;gt; последовательных операций умножения и сложения. Поэтому число ярусов для &amp;lt;math&amp;gt;i&amp;lt;/math&amp;gt;-ого процессора равно &amp;lt;math&amp;gt;k(i)&amp;lt;/math&amp;gt;.&lt;br /&gt;
&lt;br /&gt;
Для параллельного выполнения алгоритма требуется:&lt;br /&gt;
&lt;br /&gt;
* &amp;lt;math&amp;gt;N&amp;lt;/math&amp;gt; ярусов умножений и сложений,&lt;br /&gt;
* в каждом из ярусов &amp;lt;math&amp;gt;k &amp;lt;&amp;lt; m&amp;lt;/math&amp;gt; операций.&lt;br /&gt;
&lt;br /&gt;
При классификации по высоте ЯПФ, алгоритм имеет линейную сложность. При классификации по высоте ЯПФ также линейную.&lt;br /&gt;
&lt;br /&gt;
== Входные и выходные данные алгоритма ==&lt;br /&gt;
&#039;&#039;&#039;Входные данные:&#039;&#039;&#039;&lt;br /&gt;
&lt;br /&gt;
* &amp;lt;math&amp;gt;IA, JA, AN&amp;lt;/math&amp;gt; - заданная матрица в форме &#039;&#039;&#039;(RR (С) U)&#039;&#039;&#039; c &amp;lt;math&amp;gt;k&amp;lt;/math&amp;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;B&amp;lt;/math&amp;gt; - заданный заполненный вектор c &amp;lt;math&amp;gt;m&amp;lt;/math&amp;gt; элементами;&lt;br /&gt;
&#039;&#039;&#039;&lt;br /&gt;
&#039;&#039;&#039;Объем входных данных&#039;&#039;&#039;: &amp;lt;math&amp;gt;k + m&amp;lt;/math&amp;gt;&lt;br /&gt;
&lt;br /&gt;
&#039;&#039;&#039;Выходные данные:&#039;&#039;&#039; &amp;lt;math&amp;gt;C&amp;lt;/math&amp;gt; вектор-произведение размерности &amp;lt;math&amp;gt;N&amp;lt;/math&amp;gt;.&lt;br /&gt;
&lt;br /&gt;
&#039;&#039;&#039;Объем выходных данных&#039;&#039;&#039;: &amp;lt;math&amp;gt;N&amp;lt;/math&amp;gt;&lt;br /&gt;
&lt;br /&gt;
== Свойства алгоритма ==&lt;br /&gt;
&lt;br /&gt;
Алгоритм в рамках выбранной версии полностью детерминирован.&lt;br /&gt;
&lt;br /&gt;
Вычислительная мощность алгоритма, как отношение числа операций к суммарному объему входных и выходных данных – константа.&lt;br /&gt;
&lt;br /&gt;
Соотношение последовательной и параллельной сложности в случае неограниченных ресурсов равно &amp;lt;math&amp;gt;O(\frac{k}{N})&amp;lt;/math&amp;gt;&lt;br /&gt;
&lt;br /&gt;
= Программная реализация алгоритма =&lt;br /&gt;
&lt;br /&gt;
== Масштабируемость алгоритма и его реализации ==&lt;br /&gt;
&lt;br /&gt;
== Существующие реализации алгоритма ==&lt;br /&gt;
&lt;br /&gt;
= Литература =&lt;br /&gt;
&lt;br /&gt;
[1] С. Писсанецки. Технология разреженных матриц. Изд. Мир, 1988.&lt;/div&gt;</summary>
		<author><name>Lexaloris</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:Lexaloris/%D0%A3%D0%BC%D0%BD%D0%BE%D0%B6%D0%B5%D0%BD%D0%B8%D0%B5_%D1%80%D0%B0%D0%B7%D1%80%D0%B5%D0%B6%D0%B5%D0%BD%D0%BD%D0%BE%D0%B9_%D0%BC%D0%B0%D1%82%D1%80%D0%B8%D1%86%D1%8B_%D0%BD%D0%B0_%D0%B2%D0%B5%D0%BA%D1%82%D0%BE%D1%80&amp;diff=11108</id>
		<title>Участник:Lexaloris/Умножение разреженной матрицы на вектор</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:Lexaloris/%D0%A3%D0%BC%D0%BD%D0%BE%D0%B6%D0%B5%D0%BD%D0%B8%D0%B5_%D1%80%D0%B0%D0%B7%D1%80%D0%B5%D0%B6%D0%B5%D0%BD%D0%BD%D0%BE%D0%B9_%D0%BC%D0%B0%D1%82%D1%80%D0%B8%D1%86%D1%8B_%D0%BD%D0%B0_%D0%B2%D0%B5%D0%BA%D1%82%D0%BE%D1%80&amp;diff=11108"/>
		<updated>2016-10-15T18:28:51Z</updated>

		<summary type="html">&lt;p&gt;Lexaloris: /* Ресурс параллелизма алгоритма */&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(k)&amp;lt;/math&amp;gt;&lt;br /&gt;
| pf_height         = &amp;lt;math&amp;gt;O(m)&amp;lt;/math&amp;gt;&lt;br /&gt;
| pf_width          = &amp;lt;math&amp;gt;O(n)&amp;lt;/math&amp;gt;&lt;br /&gt;
| input_data        = &amp;lt;math&amp;gt;k + m&amp;lt;/math&amp;gt;&lt;br /&gt;
| output_data       = &amp;lt;math&amp;gt;n&amp;lt;/math&amp;gt;&lt;br /&gt;
}}&lt;br /&gt;
&lt;br /&gt;
&lt;br /&gt;
&#039;&#039;&#039;Авторы страницы:&#039;&#039;&#039; [[Участник:Lexaloris|A.Д. Новоселов]] и [[Участник:kochet|П.А. Кочетков]]&lt;br /&gt;
&lt;br /&gt;
= Свойства и структура алгоритмов =&lt;br /&gt;
&lt;br /&gt;
== Общее описание алгоритма ==&lt;br /&gt;
&lt;br /&gt;
=== Хранение ненулевых элементов разреженной матрицы ===&lt;br /&gt;
&lt;br /&gt;
==== Разреженный строчной формат ====&lt;br /&gt;
&lt;br /&gt;
Одной из наиболее ши­роко используемых схем хранения разреженных матриц является &#039;&#039;разреженный строчный формат&#039;&#039;. Эта&lt;br /&gt;
схема предъявляет минимальные требования к памяти и в то же время оказывается очень удобной для умножения разреженной матрицы на вектор.&lt;br /&gt;
Например, рассмотрим формат хранения разряженной матрицы &amp;lt;math&amp;gt;A&amp;lt;/math&amp;gt;:&lt;br /&gt;
&lt;br /&gt;
[[File:RRCOMatrix.png]]&lt;br /&gt;
&lt;br /&gt;
Значения нену­левых элементов матрицы и соответствующие столбцовые индексы хранятся в этой схеме по строкам в двух массивах &amp;lt;math&amp;gt;AN&amp;lt;/math&amp;gt; и &amp;lt;math&amp;gt;JA&amp;lt;/math&amp;gt; соответственно. Используется также массив указателей &amp;lt;math&amp;gt;IA&amp;lt;/math&amp;gt;, отмечающих позиции массивов &amp;lt;math&amp;gt;AN&amp;lt;/math&amp;gt; и &amp;lt;math&amp;gt;JA&amp;lt;/math&amp;gt;, с которых начинается описание очередной строки. Дополнительная компо­нента в &amp;lt;math&amp;gt;IA&amp;lt;/math&amp;gt; содержит указатель первой свободной позиции в &amp;lt;math&amp;gt;JA&amp;lt;/math&amp;gt; и &amp;lt;math&amp;gt;AN&amp;lt;/math&amp;gt;.&lt;br /&gt;
&lt;br /&gt;
Таким образом &amp;lt;math&amp;gt;A&amp;lt;/math&amp;gt; представляется в виде:&lt;br /&gt;
&lt;br /&gt;
   IA = [ 1 4 4 6 ]&lt;br /&gt;
   JA = [ 3 4 8 6 8 ]&lt;br /&gt;
   AN = [ 1 3 5 7 1 ]&lt;br /&gt;
&lt;br /&gt;
Данный способ представления называют &#039;&#039;полным&#039;&#039;, поскольку представлена вся матрица &amp;lt;math&amp;gt;A&amp;lt;/math&amp;gt;, и &#039;&#039;упорядоченным&#039;&#039;, поскольку эле­менты каждой строки хранятся в соответствии с возрастанием столбцовых индексов. Таким образом, это строчное представление, полное и упорядоченное, или сокращенно &#039;&#039;&#039;(RR (С) О)&#039;&#039;&#039;.&lt;br /&gt;
&lt;br /&gt;
==== Неупорядоченное представление ====&lt;br /&gt;
&lt;br /&gt;
Представления разреженных матриц необязательно должны быть упорядочены в том смысле, что, хотя упорядоченность строк поддерживается, внутри каждой строки элементы могут храниться в произвольном порядке. Для матрицы А нашего примера вполне можно было бы использовать и строчное представление, полное, но &#039;&#039;неупорядоченное&#039;&#039; &#039;&#039;&#039;(RR (С) U )&#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;
   IA = [ 1 4 4 6 ]&lt;br /&gt;
   JA = [ 8 3 4 8 6 ]&lt;br /&gt;
   AN = [ 5 1 3 1 7 ]&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; — число строк матрицы. &lt;br /&gt;
Для каждой ее строки &amp;lt;math&amp;gt;I&amp;lt;/math&amp;gt; матрицы мы находим с помощью &amp;lt;math&amp;gt;IA&amp;lt;/math&amp;gt; значения первой &amp;lt;math&amp;gt;IAA&amp;lt;/math&amp;gt; и последней &amp;lt;math&amp;gt;IAB&amp;lt;/math&amp;gt; позиций, занимаемых элементами строки &amp;lt;math&amp;gt;I&amp;lt;/math&amp;gt; в массивах &amp;lt;math&amp;gt;JA&amp;lt;/math&amp;gt; и &amp;lt;math&amp;gt;AN&amp;lt;/math&amp;gt;. Затем, чтобы вычислить скалярное произведение строки &amp;lt;math&amp;gt;I&amp;lt;/math&amp;gt; и вектора &amp;lt;math&amp;gt;B&amp;lt;/math&amp;gt;, мы просто просматриваем &amp;lt;math&amp;gt;JA&amp;lt;/math&amp;gt; и &amp;lt;math&amp;gt;AN&amp;lt;/math&amp;gt; на отрезке от &amp;lt;math&amp;gt;IAA&amp;lt;/math&amp;gt; до &amp;lt;math&amp;gt;IAB&amp;lt;/math&amp;gt;:&lt;br /&gt;
каждое значение, хранимое в &amp;lt;math&amp;gt;JA&amp;lt;/math&amp;gt;, есть столбцовый индекс и используется для извлечения из массива &amp;lt;math&amp;gt;B&amp;lt;/math&amp;gt; элемента, который должен быть умножен на соответствующее число из &amp;lt;math&amp;gt;AN&amp;lt;/math&amp;gt;. Результат каж­дого умножения прибавляется к &amp;lt;math&amp;gt;C(I)&amp;lt;/math&amp;gt;.&lt;br /&gt;
&lt;br /&gt;
== Математическое описание алгоритма ==&lt;br /&gt;
&lt;br /&gt;
&#039;&#039;&#039;Исходные данные:&#039;&#039;&#039; &lt;br /&gt;
&lt;br /&gt;
&amp;lt;math&amp;gt;IA, JA, AN&amp;lt;/math&amp;gt; - заданная матрица в форме &#039;&#039;&#039;(RR (С) U)&#039;&#039;&#039;;&lt;br /&gt;
&lt;br /&gt;
&amp;lt;math&amp;gt;B&amp;lt;/math&amp;gt; - заданный заполненный вектор;&lt;br /&gt;
&lt;br /&gt;
&amp;lt;math&amp;gt;N&amp;lt;/math&amp;gt; - число строк матрицы.&lt;br /&gt;
&lt;br /&gt;
&#039;&#039;&#039;Выход:&#039;&#039;&#039; &amp;lt;math&amp;gt;C&amp;lt;/math&amp;gt; вектор-произведение размерности &amp;lt;math&amp;gt;N&amp;lt;/math&amp;gt;.&lt;br /&gt;
&lt;br /&gt;
&#039;&#039;&#039;Формулы метода:&#039;&#039;&#039;&lt;br /&gt;
&lt;br /&gt;
:&amp;lt;math&amp;gt;&lt;br /&gt;
\begin{align}&lt;br /&gt;
&amp;amp; IAA_{i} = IA(i), \quad i \in [1, N], \\&lt;br /&gt;
&amp;amp; IAB_{i} = IA(i + 1) - 1, \quad i \in [1, N], \\&lt;br /&gt;
&amp;amp; c_{i} = \sum\limits_{j = IAA_{i}}^{IAB_{i}} AN(j)B(JA(j)), \quad i \in [1, N] \\&lt;br /&gt;
\end{align}&lt;br /&gt;
&amp;lt;/math&amp;gt;&lt;br /&gt;
&lt;br /&gt;
== Вычислительное ядро алгоритма ==&lt;br /&gt;
&lt;br /&gt;
Вычислительным ядром, т.е. той частью алгоритма, на которую приходится основное время его работы, является вычисление значения &amp;lt;math&amp;gt;i&amp;lt;/math&amp;gt;-го элемента &amp;lt;math&amp;gt;c_{i}&amp;lt;/math&amp;gt; вектора-произведения, т.е произведения строки &amp;lt;math&amp;gt;I&amp;lt;/math&amp;gt; матрицы &amp;lt;math&amp;gt;A&amp;lt;/math&amp;gt; и вектора &amp;lt;math&amp;gt;B&amp;lt;/math&amp;gt; по формуле:&lt;br /&gt;
&lt;br /&gt;
:&amp;lt;math&amp;gt;&lt;br /&gt;
\begin{align}&lt;br /&gt;
&amp;amp; c_{i} = \sum\limits_{j = IAA_{i}}^{IAB_{i}} AN(j)B(JA(j)), \quad i \in [1, N] \\&lt;br /&gt;
\end{align}&lt;br /&gt;
&amp;lt;/math&amp;gt;&lt;br /&gt;
&lt;br /&gt;
== Макроструктура алгоритма ==&lt;br /&gt;
&lt;br /&gt;
Основу алгоритма составляет вычисление значения &amp;lt;math&amp;gt;i&amp;lt;/math&amp;gt;-го элемента &amp;lt;math&amp;gt;c_{i}&amp;lt;/math&amp;gt; вектора-произведения:&lt;br /&gt;
&lt;br /&gt;
:&amp;lt;math&amp;gt;&lt;br /&gt;
\begin{align}&lt;br /&gt;
&amp;amp; c_{i} = \sum\limits_{j = IAA_{i}}^{IAB_{i}} AN(j)B(JA(j)), \quad i \in [1, N] \\&lt;br /&gt;
\end{align}&lt;br /&gt;
&amp;lt;/math&amp;gt;&lt;br /&gt;
&lt;br /&gt;
== Схема реализации последовательного алгоритма ==&lt;br /&gt;
&lt;br /&gt;
Последовательность исполнения метода следующая: &lt;br /&gt;
&lt;br /&gt;
Далее для всех &amp;lt;math&amp;gt;i&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; по нарастанию выполняются:&lt;br /&gt;
&lt;br /&gt;
1. &amp;lt;math&amp;gt; c_{i} = 0; IAA = IA(i); IAB = IA(i + 1 ) - 1 &amp;lt;/math&amp;gt;&lt;br /&gt;
&lt;br /&gt;
После этого, если &amp;lt;math&amp;gt;(IAB \le IAA)&amp;lt;/math&amp;gt;:&lt;br /&gt;
&lt;br /&gt;
2. Для всех &amp;lt;math&amp;gt;j&amp;lt;/math&amp;gt; от &amp;lt;math&amp;gt;IAA&amp;lt;/math&amp;gt; до &amp;lt;math&amp;gt;IAB&amp;lt;/math&amp;gt; выполняется: &lt;br /&gt;
&lt;br /&gt;
&amp;lt;math&amp;gt;c_{i} = \sum\limits_{j = IAA_{i}}^{IAB_{i}} AN(j)B(JA(j))&amp;lt;/math&amp;gt;&lt;br /&gt;
&lt;br /&gt;
Псевдокод алгоритма: &lt;br /&gt;
&lt;br /&gt;
    FOR I = 1, N                          (1)&lt;br /&gt;
       U = 0.                             (2) &lt;br /&gt;
       IAA = IA(I)                        (3) &lt;br /&gt;
       IAB = IA(I + 1 ) - 1               (4)&lt;br /&gt;
       IF NOT(IAB.LT.IAA)                 (5)&lt;br /&gt;
           FOR J = IAA, IAB               (6)&lt;br /&gt;
           C(I) = U + AN(J)*B(JA(J))      (7)&lt;br /&gt;
&lt;br /&gt;
== Последовательная сложность алгоритма ==&lt;br /&gt;
&lt;br /&gt;
Для всего алгоритма потребуется выполнить &amp;lt;math&amp;gt;O(k)&amp;lt;/math&amp;gt; операций, как в строке стр.7 псевдокода алгоритма ([[#Схема реализации последовательного алгоритма|п.1.5]]), где &amp;lt;math&amp;gt;k&amp;lt;/math&amp;gt; - число ненулевых эле­ментов матрицы.&lt;br /&gt;
&lt;br /&gt;
== Информационный граф ==&lt;br /&gt;
&lt;br /&gt;
На рисунке 1 изображен информационный граф алгоритма.&lt;br /&gt;
&lt;br /&gt;
[[file:InfoGrafMatrixRRCUandVextor.jpg|thumb|center|1200px|Рисунок 1. Информационный граф алгоритма.]]&lt;br /&gt;
 &lt;br /&gt;
По оси &amp;lt;math&amp;gt;X&amp;lt;/math&amp;gt; для отдельной строки &amp;lt;math&amp;gt;I&amp;lt;/math&amp;gt; матрицы отложены в пределах первой &amp;lt;math&amp;gt;IAA&amp;lt;/math&amp;gt; и последней &amp;lt;math&amp;gt;IAB&amp;lt;/math&amp;gt; позиций ненулевых элементов значения &amp;lt;math&amp;gt;AN&amp;lt;/math&amp;gt; и соответствуюие им по столбцовомым индексам, хранимимым в &amp;lt;math&amp;gt;JA&amp;lt;/math&amp;gt;, значения &amp;lt;math&amp;gt;B&amp;lt;/math&amp;gt; элементов. &lt;br /&gt;
Пары этих значений обозначены желтыми квадратиками &amp;lt;math&amp;gt;(in)&amp;lt;/math&amp;gt;. Значения in попарно скалярно перемножаются (зеленый кружочек) и суммируются (синий кружочек) в результат значения элемента вектора-произведения &amp;lt;math&amp;gt;c_{i}&amp;lt;/math&amp;gt;, т.е &amp;lt;math&amp;gt;out&amp;lt;/math&amp;gt;(красный квадратик) с строковым индексом, соответствующем номеру строки матрицы.&lt;br /&gt;
&lt;br /&gt;
По оси &amp;lt;math&amp;gt;Y&amp;lt;/math&amp;gt; отложена схема вычисление значения каждого элемента вектора-произведения для каждой строки матрицы.&lt;br /&gt;
&lt;br /&gt;
== Ресурс параллелизма алгоритма ==&lt;br /&gt;
&lt;br /&gt;
Алгоритм обладает возможностью выполняться параллельно, что позволяет значительно ускорить вычисления.&lt;br /&gt;
Вычисление значения каждого элемента вектора-произведения для каждой строки матрицы и элемента вектора B можно проводить на отдельных процессорах. &lt;br /&gt;
Максимальная эффективность вычислений достигается при наличии не менее, чем &amp;lt;math&amp;gt;N&amp;lt;/math&amp;gt; процессоров, т.е отдельный процессор на вычисление значения каждого элемента вектора-произведения. На процессоре выполняется &amp;lt;math&amp;gt;k(i)&amp;lt;/math&amp;gt; последовательных операций умножения и сложения. Поэтому число ярусов для &amp;lt;math&amp;gt;i&amp;lt;/math&amp;gt;-ого процессора равно &amp;lt;math&amp;gt;k(i)&amp;lt;/math&amp;gt;.&lt;br /&gt;
&lt;br /&gt;
Для параллельного выполнения алгоритма требуется:&lt;br /&gt;
&lt;br /&gt;
* &amp;lt;math&amp;gt;N&amp;lt;/math&amp;gt; ярусов умножений и сложений,&lt;br /&gt;
* в каждом из ярусов &amp;lt;math&amp;gt;k &amp;lt;&amp;lt; m&amp;lt;/math&amp;gt; операций.&lt;br /&gt;
&lt;br /&gt;
При классификации по высоте ЯПФ, алгоритм имеет линейную сложность. При классификации по высоте ЯПФ также линейную.&lt;br /&gt;
&lt;br /&gt;
== Входные и выходные данные алгоритма ==&lt;br /&gt;
&#039;&#039;&#039;Входные данные:&#039;&#039;&#039;&lt;br /&gt;
&lt;br /&gt;
* &amp;lt;math&amp;gt;IA, JA, AN&amp;lt;/math&amp;gt; - заданная матрица в форме &#039;&#039;&#039;(RR (С) U)&#039;&#039;&#039; c &amp;lt;math&amp;gt;k&amp;lt;/math&amp;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;B&amp;lt;/math&amp;gt; - заданный заполненный вектор c &amp;lt;math&amp;gt;m&amp;lt;/math&amp;gt; элементами;&lt;br /&gt;
&#039;&#039;&#039;&lt;br /&gt;
&#039;&#039;&#039;Объем входных данных&#039;&#039;&#039;: &amp;lt;math&amp;gt;k + m&amp;lt;/math&amp;gt;&lt;br /&gt;
&lt;br /&gt;
&#039;&#039;&#039;Выходные данные:&#039;&#039;&#039; &amp;lt;math&amp;gt;C&amp;lt;/math&amp;gt; вектор-произведение размерности &amp;lt;math&amp;gt;N&amp;lt;/math&amp;gt;.&lt;br /&gt;
&lt;br /&gt;
&#039;&#039;&#039;Объем выходных данных&#039;&#039;&#039;: &amp;lt;math&amp;gt;N&amp;lt;/math&amp;gt;&lt;br /&gt;
&lt;br /&gt;
== Свойства алгоритма ==&lt;br /&gt;
&lt;br /&gt;
Алгоритм в рамках выбранной версии полностью детерминирован.&lt;br /&gt;
&lt;br /&gt;
Вычислительная мощность алгоритма, как отношение числа операций к суммарному объему входных и выходных данных – константа.&lt;br /&gt;
&lt;br /&gt;
= Программная реализация алгоритма =&lt;br /&gt;
&lt;br /&gt;
== Масштабируемость алгоритма и его реализации ==&lt;br /&gt;
&lt;br /&gt;
== Существующие реализации алгоритма ==&lt;br /&gt;
&lt;br /&gt;
= Литература =&lt;br /&gt;
&lt;br /&gt;
[1] С. Писсанецки. Технология разреженных матриц. Изд. Мир, 1988.&lt;/div&gt;</summary>
		<author><name>Lexaloris</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:Lexaloris/%D0%A3%D0%BC%D0%BD%D0%BE%D0%B6%D0%B5%D0%BD%D0%B8%D0%B5_%D1%80%D0%B0%D0%B7%D1%80%D0%B5%D0%B6%D0%B5%D0%BD%D0%BD%D0%BE%D0%B9_%D0%BC%D0%B0%D1%82%D1%80%D0%B8%D1%86%D1%8B_%D0%BD%D0%B0_%D0%B2%D0%B5%D0%BA%D1%82%D0%BE%D1%80&amp;diff=10891</id>
		<title>Участник:Lexaloris/Умножение разреженной матрицы на вектор</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:Lexaloris/%D0%A3%D0%BC%D0%BD%D0%BE%D0%B6%D0%B5%D0%BD%D0%B8%D0%B5_%D1%80%D0%B0%D0%B7%D1%80%D0%B5%D0%B6%D0%B5%D0%BD%D0%BD%D0%BE%D0%B9_%D0%BC%D0%B0%D1%82%D1%80%D0%B8%D1%86%D1%8B_%D0%BD%D0%B0_%D0%B2%D0%B5%D0%BA%D1%82%D0%BE%D1%80&amp;diff=10891"/>
		<updated>2016-10-15T17:43:57Z</updated>

		<summary type="html">&lt;p&gt;Lexaloris: /* Информационный граф */&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(k)&amp;lt;/math&amp;gt;&lt;br /&gt;
| pf_height         = &amp;lt;math&amp;gt;O(m)&amp;lt;/math&amp;gt;&lt;br /&gt;
| pf_width          = &amp;lt;math&amp;gt;O(n)&amp;lt;/math&amp;gt;&lt;br /&gt;
| input_data        = &amp;lt;math&amp;gt;k + m&amp;lt;/math&amp;gt;&lt;br /&gt;
| output_data       = &amp;lt;math&amp;gt;n&amp;lt;/math&amp;gt;&lt;br /&gt;
}}&lt;br /&gt;
&lt;br /&gt;
&lt;br /&gt;
&#039;&#039;&#039;Авторы страницы:&#039;&#039;&#039; [[Участник:Lexaloris|A.Д. Новоселов]] и [[Участник:kochet|П.А. Кочетков]]&lt;br /&gt;
&lt;br /&gt;
= Свойства и структура алгоритмов =&lt;br /&gt;
&lt;br /&gt;
== Общее описание алгоритма ==&lt;br /&gt;
&lt;br /&gt;
=== Хранение ненулевых элементов разреженной матрицы ===&lt;br /&gt;
&lt;br /&gt;
==== Разреженный строчной формат ====&lt;br /&gt;
&lt;br /&gt;
Одной из наиболее ши­роко используемых схем хранения разреженных матриц является &#039;&#039;разреженный строчный формат&#039;&#039;. Эта&lt;br /&gt;
схема предъявляет минимальные требования к памяти и в то же время оказывается очень удобной для умножения разреженной матрицы на вектор.&lt;br /&gt;
Например, рассмотрим формат хранения разряженной матрицы &amp;lt;math&amp;gt;A&amp;lt;/math&amp;gt;:&lt;br /&gt;
&lt;br /&gt;
[[File:RRCOMatrix.png]]&lt;br /&gt;
&lt;br /&gt;
Значения нену­левых элементов матрицы и соответствующие столбцовые индексы хранятся в этой схеме по строкам в двух массивах &amp;lt;math&amp;gt;AN&amp;lt;/math&amp;gt; и &amp;lt;math&amp;gt;JA&amp;lt;/math&amp;gt; соответственно. Используется также массив указателей &amp;lt;math&amp;gt;IA&amp;lt;/math&amp;gt;, отмечающих позиции массивов &amp;lt;math&amp;gt;AN&amp;lt;/math&amp;gt; и &amp;lt;math&amp;gt;JA&amp;lt;/math&amp;gt;, с которых начинается описание очередной строки. Дополнительная компо­нента в &amp;lt;math&amp;gt;IA&amp;lt;/math&amp;gt; содержит указатель первой свободной позиции в &amp;lt;math&amp;gt;JA&amp;lt;/math&amp;gt; и &amp;lt;math&amp;gt;AN&amp;lt;/math&amp;gt;.&lt;br /&gt;
&lt;br /&gt;
Таким образом &amp;lt;math&amp;gt;A&amp;lt;/math&amp;gt; представляется в виде:&lt;br /&gt;
&lt;br /&gt;
   IA = [ 1 4 4 6 ]&lt;br /&gt;
   JA = [ 3 4 8 6 8 ]&lt;br /&gt;
   AN = [ 1 3 5 7 1 ]&lt;br /&gt;
&lt;br /&gt;
Данный способ представления называют &#039;&#039;полным&#039;&#039;, поскольку представлена вся матрица &amp;lt;math&amp;gt;A&amp;lt;/math&amp;gt;, и &#039;&#039;упорядоченным&#039;&#039;, поскольку эле­менты каждой строки хранятся в соответствии с возрастанием столбцовых индексов. Таким образом, это строчное представление, полное и упорядоченное, или сокращенно &#039;&#039;&#039;(RR (С) О)&#039;&#039;&#039;.&lt;br /&gt;
&lt;br /&gt;
==== Неупорядоченное представление ====&lt;br /&gt;
&lt;br /&gt;
Представления разреженных матриц необязательно должны быть упорядочены в том смысле, что, хотя упорядоченность строк поддерживается, внутри каждой строки элементы могут храниться в произвольном порядке. Для матрицы А нашего примера вполне можно было бы использовать и строчное представление, полное, но &#039;&#039;неупорядоченное&#039;&#039; &#039;&#039;&#039;(RR (С) U )&#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;
   IA = [ 1 4 4 6 ]&lt;br /&gt;
   JA = [ 8 3 4 8 6 ]&lt;br /&gt;
   AN = [ 5 1 3 1 7 ]&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; — число строк матрицы. &lt;br /&gt;
Для каждой ее строки &amp;lt;math&amp;gt;I&amp;lt;/math&amp;gt; матрицы мы находим с помощью &amp;lt;math&amp;gt;IA&amp;lt;/math&amp;gt; значения первой &amp;lt;math&amp;gt;IAA&amp;lt;/math&amp;gt; и последней &amp;lt;math&amp;gt;IAB&amp;lt;/math&amp;gt; позиций, занимаемых элементами строки &amp;lt;math&amp;gt;I&amp;lt;/math&amp;gt; в массивах &amp;lt;math&amp;gt;JA&amp;lt;/math&amp;gt; и &amp;lt;math&amp;gt;AN&amp;lt;/math&amp;gt;. Затем, чтобы вычислить скалярное произведение строки &amp;lt;math&amp;gt;I&amp;lt;/math&amp;gt; и вектора &amp;lt;math&amp;gt;B&amp;lt;/math&amp;gt;, мы просто просматриваем &amp;lt;math&amp;gt;JA&amp;lt;/math&amp;gt; и &amp;lt;math&amp;gt;AN&amp;lt;/math&amp;gt; на отрезке от &amp;lt;math&amp;gt;IAA&amp;lt;/math&amp;gt; до &amp;lt;math&amp;gt;IAB&amp;lt;/math&amp;gt;:&lt;br /&gt;
каждое значение, хранимое в &amp;lt;math&amp;gt;JA&amp;lt;/math&amp;gt;, есть столбцовый индекс и используется для извлечения из массива &amp;lt;math&amp;gt;B&amp;lt;/math&amp;gt; элемента, который должен быть умножен на соответствующее число из &amp;lt;math&amp;gt;AN&amp;lt;/math&amp;gt;. Результат каж­дого умножения прибавляется к &amp;lt;math&amp;gt;C(I)&amp;lt;/math&amp;gt;.&lt;br /&gt;
&lt;br /&gt;
== Математическое описание алгоритма ==&lt;br /&gt;
&lt;br /&gt;
&#039;&#039;&#039;Исходные данные:&#039;&#039;&#039; &lt;br /&gt;
&lt;br /&gt;
&amp;lt;math&amp;gt;IA, JA, AN&amp;lt;/math&amp;gt; - заданная матрица в форме &#039;&#039;&#039;(RR (С) U)&#039;&#039;&#039;;&lt;br /&gt;
&lt;br /&gt;
&amp;lt;math&amp;gt;B&amp;lt;/math&amp;gt; - заданный заполненный вектор;&lt;br /&gt;
&lt;br /&gt;
&amp;lt;math&amp;gt;N&amp;lt;/math&amp;gt; - число строк матрицы.&lt;br /&gt;
&lt;br /&gt;
&#039;&#039;&#039;Выход:&#039;&#039;&#039; &amp;lt;math&amp;gt;C&amp;lt;/math&amp;gt; вектор-произведение размерности &amp;lt;math&amp;gt;N&amp;lt;/math&amp;gt;.&lt;br /&gt;
&lt;br /&gt;
&#039;&#039;&#039;Формулы метода:&#039;&#039;&#039;&lt;br /&gt;
&lt;br /&gt;
:&amp;lt;math&amp;gt;&lt;br /&gt;
\begin{align}&lt;br /&gt;
&amp;amp; IAA_{i} = IA(i), \quad i \in [1, N], \\&lt;br /&gt;
&amp;amp; IAB_{i} = IA(i + 1) - 1, \quad i \in [1, N], \\&lt;br /&gt;
&amp;amp; c_{i} = \sum\limits_{j = IAA_{i}}^{IAB_{i}} AN(j)B(JA(j)), \quad i \in [1, N] \\&lt;br /&gt;
\end{align}&lt;br /&gt;
&amp;lt;/math&amp;gt;&lt;br /&gt;
&lt;br /&gt;
== Вычислительное ядро алгоритма ==&lt;br /&gt;
&lt;br /&gt;
Вычислительным ядром, т.е. той частью алгоритма, на которую приходится основное время его работы, является вычисление значения &amp;lt;math&amp;gt;i&amp;lt;/math&amp;gt;-го элемента &amp;lt;math&amp;gt;c_{i}&amp;lt;/math&amp;gt; вектора-произведения, т.е произведения строки &amp;lt;math&amp;gt;I&amp;lt;/math&amp;gt; матрицы &amp;lt;math&amp;gt;A&amp;lt;/math&amp;gt; и вектора &amp;lt;math&amp;gt;B&amp;lt;/math&amp;gt; по формуле:&lt;br /&gt;
&lt;br /&gt;
:&amp;lt;math&amp;gt;&lt;br /&gt;
\begin{align}&lt;br /&gt;
&amp;amp; c_{i} = \sum\limits_{j = IAA_{i}}^{IAB_{i}} AN(j)B(JA(j)), \quad i \in [1, N] \\&lt;br /&gt;
\end{align}&lt;br /&gt;
&amp;lt;/math&amp;gt;&lt;br /&gt;
&lt;br /&gt;
== Макроструктура алгоритма ==&lt;br /&gt;
&lt;br /&gt;
Основу алгоритма составляет вычисление значения &amp;lt;math&amp;gt;i&amp;lt;/math&amp;gt;-го элемента &amp;lt;math&amp;gt;c_{i}&amp;lt;/math&amp;gt; вектора-произведения:&lt;br /&gt;
&lt;br /&gt;
:&amp;lt;math&amp;gt;&lt;br /&gt;
\begin{align}&lt;br /&gt;
&amp;amp; c_{i} = \sum\limits_{j = IAA_{i}}^{IAB_{i}} AN(j)B(JA(j)), \quad i \in [1, N] \\&lt;br /&gt;
\end{align}&lt;br /&gt;
&amp;lt;/math&amp;gt;&lt;br /&gt;
&lt;br /&gt;
== Схема реализации последовательного алгоритма ==&lt;br /&gt;
&lt;br /&gt;
Последовательность исполнения метода следующая: &lt;br /&gt;
&lt;br /&gt;
Далее для всех &amp;lt;math&amp;gt;i&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; по нарастанию выполняются:&lt;br /&gt;
&lt;br /&gt;
1. &amp;lt;math&amp;gt; c_{i} = 0; IAA = IA(i); IAB = IA(i + 1 ) - 1 &amp;lt;/math&amp;gt;&lt;br /&gt;
&lt;br /&gt;
После этого, если &amp;lt;math&amp;gt;(IAB \le IAA)&amp;lt;/math&amp;gt;:&lt;br /&gt;
&lt;br /&gt;
2. Для всех &amp;lt;math&amp;gt;j&amp;lt;/math&amp;gt; от &amp;lt;math&amp;gt;IAA&amp;lt;/math&amp;gt; до &amp;lt;math&amp;gt;IAB&amp;lt;/math&amp;gt; выполняется: &lt;br /&gt;
&lt;br /&gt;
&amp;lt;math&amp;gt;c_{i} = \sum\limits_{j = IAA_{i}}^{IAB_{i}} AN(j)B(JA(j))&amp;lt;/math&amp;gt;&lt;br /&gt;
&lt;br /&gt;
Псевдокод алгоритма: &lt;br /&gt;
&lt;br /&gt;
    FOR I = 1, N                          (1)&lt;br /&gt;
       U = 0.                             (2) &lt;br /&gt;
       IAA = IA(I)                        (3) &lt;br /&gt;
       IAB = IA(I + 1 ) - 1               (4)&lt;br /&gt;
       IF NOT(IAB.LT.IAA)                 (5)&lt;br /&gt;
           FOR J = IAA, IAB               (6)&lt;br /&gt;
           C(I) = U + AN(J)*B(JA(J))      (7)&lt;br /&gt;
&lt;br /&gt;
== Последовательная сложность алгоритма ==&lt;br /&gt;
&lt;br /&gt;
Для всего алгоритма потребуется выполнить &amp;lt;math&amp;gt;O(k)&amp;lt;/math&amp;gt; операций, как в строке стр.7 псевдокода алгоритма ([[#Схема реализации последовательного алгоритма|п.1.5]]), где &amp;lt;math&amp;gt;k&amp;lt;/math&amp;gt; - число ненулевых эле­ментов матрицы.&lt;br /&gt;
&lt;br /&gt;
== Информационный граф ==&lt;br /&gt;
&lt;br /&gt;
На рисунке 1 изображен информационный граф алгоритма.&lt;br /&gt;
&lt;br /&gt;
[[file:InfoGrafMatrixRRCUandVextor.jpg|thumb|center|1200px|Рисунок 1. Информационный граф алгоритма.]]&lt;br /&gt;
 &lt;br /&gt;
По оси &amp;lt;math&amp;gt;X&amp;lt;/math&amp;gt; для отдельной строки &amp;lt;math&amp;gt;I&amp;lt;/math&amp;gt; матрицы отложены в пределах первой &amp;lt;math&amp;gt;IAA&amp;lt;/math&amp;gt; и последней &amp;lt;math&amp;gt;IAB&amp;lt;/math&amp;gt; позиций ненулевых элементов значения &amp;lt;math&amp;gt;AN&amp;lt;/math&amp;gt; и соответствуюие им по столбцовомым индексам, хранимимым в &amp;lt;math&amp;gt;JA&amp;lt;/math&amp;gt;, значения &amp;lt;math&amp;gt;B&amp;lt;/math&amp;gt; элементов. &lt;br /&gt;
Пары этих значений обозначены желтыми квадратиками &amp;lt;math&amp;gt;(in)&amp;lt;/math&amp;gt;. Значения in попарно скалярно перемножаются (зеленый кружочек) и суммируются (синий кружочек) в результат значения элемента вектора-произведения &amp;lt;math&amp;gt;c_{i}&amp;lt;/math&amp;gt;, т.е &amp;lt;math&amp;gt;out&amp;lt;/math&amp;gt;(красный квадратик) с строковым индексом, соответствующем номеру строки матрицы.&lt;br /&gt;
&lt;br /&gt;
По оси &amp;lt;math&amp;gt;Y&amp;lt;/math&amp;gt; отложена схема вычисление значения каждого элемента вектора-произведения для каждой строки матрицы.&lt;br /&gt;
&lt;br /&gt;
== Ресурс параллелизма алгоритма ==&lt;br /&gt;
&lt;br /&gt;
== Входные и выходные данные алгоритма ==&lt;br /&gt;
&#039;&#039;&#039;Входные данные:&#039;&#039;&#039;&lt;br /&gt;
&lt;br /&gt;
* &amp;lt;math&amp;gt;IA, JA, AN&amp;lt;/math&amp;gt; - заданная матрица в форме &#039;&#039;&#039;(RR (С) U)&#039;&#039;&#039; c &amp;lt;math&amp;gt;k&amp;lt;/math&amp;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;B&amp;lt;/math&amp;gt; - заданный заполненный вектор c &amp;lt;math&amp;gt;m&amp;lt;/math&amp;gt; элементами;&lt;br /&gt;
&#039;&#039;&#039;&lt;br /&gt;
&#039;&#039;&#039;Объем входных данных&#039;&#039;&#039;: &amp;lt;math&amp;gt;k + m&amp;lt;/math&amp;gt;&lt;br /&gt;
&lt;br /&gt;
&#039;&#039;&#039;Выходные данные:&#039;&#039;&#039; &amp;lt;math&amp;gt;C&amp;lt;/math&amp;gt; вектор-произведение размерности &amp;lt;math&amp;gt;N&amp;lt;/math&amp;gt;.&lt;br /&gt;
&lt;br /&gt;
&#039;&#039;&#039;Объем выходных данных&#039;&#039;&#039;: &amp;lt;math&amp;gt;N&amp;lt;/math&amp;gt;&lt;br /&gt;
&lt;br /&gt;
== Свойства алгоритма ==&lt;br /&gt;
&lt;br /&gt;
Алгоритм в рамках выбранной версии полностью детерминирован.&lt;br /&gt;
&lt;br /&gt;
Вычислительная мощность алгоритма, как отношение числа операций к суммарному объему входных и выходных данных – константа.&lt;br /&gt;
&lt;br /&gt;
= Программная реализация алгоритма =&lt;br /&gt;
&lt;br /&gt;
== Масштабируемость алгоритма и его реализации ==&lt;br /&gt;
&lt;br /&gt;
== Существующие реализации алгоритма ==&lt;br /&gt;
&lt;br /&gt;
= Литература =&lt;br /&gt;
&lt;br /&gt;
[1] С. Писсанецки. Технология разреженных матриц. Изд. Мир, 1988.&lt;/div&gt;</summary>
		<author><name>Lexaloris</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:Lexaloris/%D0%A3%D0%BC%D0%BD%D0%BE%D0%B6%D0%B5%D0%BD%D0%B8%D0%B5_%D1%80%D0%B0%D0%B7%D1%80%D0%B5%D0%B6%D0%B5%D0%BD%D0%BD%D0%BE%D0%B9_%D0%BC%D0%B0%D1%82%D1%80%D0%B8%D1%86%D1%8B_%D0%BD%D0%B0_%D0%B2%D0%B5%D0%BA%D1%82%D0%BE%D1%80&amp;diff=10884</id>
		<title>Участник:Lexaloris/Умножение разреженной матрицы на вектор</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:Lexaloris/%D0%A3%D0%BC%D0%BD%D0%BE%D0%B6%D0%B5%D0%BD%D0%B8%D0%B5_%D1%80%D0%B0%D0%B7%D1%80%D0%B5%D0%B6%D0%B5%D0%BD%D0%BD%D0%BE%D0%B9_%D0%BC%D0%B0%D1%82%D1%80%D0%B8%D1%86%D1%8B_%D0%BD%D0%B0_%D0%B2%D0%B5%D0%BA%D1%82%D0%BE%D1%80&amp;diff=10884"/>
		<updated>2016-10-15T17:42:35Z</updated>

		<summary type="html">&lt;p&gt;Lexaloris: &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(k)&amp;lt;/math&amp;gt;&lt;br /&gt;
| pf_height         = &amp;lt;math&amp;gt;O(m)&amp;lt;/math&amp;gt;&lt;br /&gt;
| pf_width          = &amp;lt;math&amp;gt;O(n)&amp;lt;/math&amp;gt;&lt;br /&gt;
| input_data        = &amp;lt;math&amp;gt;k + m&amp;lt;/math&amp;gt;&lt;br /&gt;
| output_data       = &amp;lt;math&amp;gt;n&amp;lt;/math&amp;gt;&lt;br /&gt;
}}&lt;br /&gt;
&lt;br /&gt;
&lt;br /&gt;
&#039;&#039;&#039;Авторы страницы:&#039;&#039;&#039; [[Участник:Lexaloris|A.Д. Новоселов]] и [[Участник:kochet|П.А. Кочетков]]&lt;br /&gt;
&lt;br /&gt;
= Свойства и структура алгоритмов =&lt;br /&gt;
&lt;br /&gt;
== Общее описание алгоритма ==&lt;br /&gt;
&lt;br /&gt;
=== Хранение ненулевых элементов разреженной матрицы ===&lt;br /&gt;
&lt;br /&gt;
==== Разреженный строчной формат ====&lt;br /&gt;
&lt;br /&gt;
Одной из наиболее ши­роко используемых схем хранения разреженных матриц является &#039;&#039;разреженный строчный формат&#039;&#039;. Эта&lt;br /&gt;
схема предъявляет минимальные требования к памяти и в то же время оказывается очень удобной для умножения разреженной матрицы на вектор.&lt;br /&gt;
Например, рассмотрим формат хранения разряженной матрицы &amp;lt;math&amp;gt;A&amp;lt;/math&amp;gt;:&lt;br /&gt;
&lt;br /&gt;
[[File:RRCOMatrix.png]]&lt;br /&gt;
&lt;br /&gt;
Значения нену­левых элементов матрицы и соответствующие столбцовые индексы хранятся в этой схеме по строкам в двух массивах &amp;lt;math&amp;gt;AN&amp;lt;/math&amp;gt; и &amp;lt;math&amp;gt;JA&amp;lt;/math&amp;gt; соответственно. Используется также массив указателей &amp;lt;math&amp;gt;IA&amp;lt;/math&amp;gt;, отмечающих позиции массивов &amp;lt;math&amp;gt;AN&amp;lt;/math&amp;gt; и &amp;lt;math&amp;gt;JA&amp;lt;/math&amp;gt;, с которых начинается описание очередной строки. Дополнительная компо­нента в &amp;lt;math&amp;gt;IA&amp;lt;/math&amp;gt; содержит указатель первой свободной позиции в &amp;lt;math&amp;gt;JA&amp;lt;/math&amp;gt; и &amp;lt;math&amp;gt;AN&amp;lt;/math&amp;gt;.&lt;br /&gt;
&lt;br /&gt;
Таким образом &amp;lt;math&amp;gt;A&amp;lt;/math&amp;gt; представляется в виде:&lt;br /&gt;
&lt;br /&gt;
   IA = [ 1 4 4 6 ]&lt;br /&gt;
   JA = [ 3 4 8 6 8 ]&lt;br /&gt;
   AN = [ 1 3 5 7 1 ]&lt;br /&gt;
&lt;br /&gt;
Данный способ представления называют &#039;&#039;полным&#039;&#039;, поскольку представлена вся матрица &amp;lt;math&amp;gt;A&amp;lt;/math&amp;gt;, и &#039;&#039;упорядоченным&#039;&#039;, поскольку эле­менты каждой строки хранятся в соответствии с возрастанием столбцовых индексов. Таким образом, это строчное представление, полное и упорядоченное, или сокращенно &#039;&#039;&#039;(RR (С) О)&#039;&#039;&#039;.&lt;br /&gt;
&lt;br /&gt;
==== Неупорядоченное представление ====&lt;br /&gt;
&lt;br /&gt;
Представления разреженных матриц необязательно должны быть упорядочены в том смысле, что, хотя упорядоченность строк поддерживается, внутри каждой строки элементы могут храниться в произвольном порядке. Для матрицы А нашего примера вполне можно было бы использовать и строчное представление, полное, но &#039;&#039;неупорядоченное&#039;&#039; &#039;&#039;&#039;(RR (С) U )&#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;
   IA = [ 1 4 4 6 ]&lt;br /&gt;
   JA = [ 8 3 4 8 6 ]&lt;br /&gt;
   AN = [ 5 1 3 1 7 ]&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; — число строк матрицы. &lt;br /&gt;
Для каждой ее строки &amp;lt;math&amp;gt;I&amp;lt;/math&amp;gt; матрицы мы находим с помощью &amp;lt;math&amp;gt;IA&amp;lt;/math&amp;gt; значения первой &amp;lt;math&amp;gt;IAA&amp;lt;/math&amp;gt; и последней &amp;lt;math&amp;gt;IAB&amp;lt;/math&amp;gt; позиций, занимаемых элементами строки &amp;lt;math&amp;gt;I&amp;lt;/math&amp;gt; в массивах &amp;lt;math&amp;gt;JA&amp;lt;/math&amp;gt; и &amp;lt;math&amp;gt;AN&amp;lt;/math&amp;gt;. Затем, чтобы вычислить скалярное произведение строки &amp;lt;math&amp;gt;I&amp;lt;/math&amp;gt; и вектора &amp;lt;math&amp;gt;B&amp;lt;/math&amp;gt;, мы просто просматриваем &amp;lt;math&amp;gt;JA&amp;lt;/math&amp;gt; и &amp;lt;math&amp;gt;AN&amp;lt;/math&amp;gt; на отрезке от &amp;lt;math&amp;gt;IAA&amp;lt;/math&amp;gt; до &amp;lt;math&amp;gt;IAB&amp;lt;/math&amp;gt;:&lt;br /&gt;
каждое значение, хранимое в &amp;lt;math&amp;gt;JA&amp;lt;/math&amp;gt;, есть столбцовый индекс и используется для извлечения из массива &amp;lt;math&amp;gt;B&amp;lt;/math&amp;gt; элемента, который должен быть умножен на соответствующее число из &amp;lt;math&amp;gt;AN&amp;lt;/math&amp;gt;. Результат каж­дого умножения прибавляется к &amp;lt;math&amp;gt;C(I)&amp;lt;/math&amp;gt;.&lt;br /&gt;
&lt;br /&gt;
== Математическое описание алгоритма ==&lt;br /&gt;
&lt;br /&gt;
&#039;&#039;&#039;Исходные данные:&#039;&#039;&#039; &lt;br /&gt;
&lt;br /&gt;
&amp;lt;math&amp;gt;IA, JA, AN&amp;lt;/math&amp;gt; - заданная матрица в форме &#039;&#039;&#039;(RR (С) U)&#039;&#039;&#039;;&lt;br /&gt;
&lt;br /&gt;
&amp;lt;math&amp;gt;B&amp;lt;/math&amp;gt; - заданный заполненный вектор;&lt;br /&gt;
&lt;br /&gt;
&amp;lt;math&amp;gt;N&amp;lt;/math&amp;gt; - число строк матрицы.&lt;br /&gt;
&lt;br /&gt;
&#039;&#039;&#039;Выход:&#039;&#039;&#039; &amp;lt;math&amp;gt;C&amp;lt;/math&amp;gt; вектор-произведение размерности &amp;lt;math&amp;gt;N&amp;lt;/math&amp;gt;.&lt;br /&gt;
&lt;br /&gt;
&#039;&#039;&#039;Формулы метода:&#039;&#039;&#039;&lt;br /&gt;
&lt;br /&gt;
:&amp;lt;math&amp;gt;&lt;br /&gt;
\begin{align}&lt;br /&gt;
&amp;amp; IAA_{i} = IA(i), \quad i \in [1, N], \\&lt;br /&gt;
&amp;amp; IAB_{i} = IA(i + 1) - 1, \quad i \in [1, N], \\&lt;br /&gt;
&amp;amp; c_{i} = \sum\limits_{j = IAA_{i}}^{IAB_{i}} AN(j)B(JA(j)), \quad i \in [1, N] \\&lt;br /&gt;
\end{align}&lt;br /&gt;
&amp;lt;/math&amp;gt;&lt;br /&gt;
&lt;br /&gt;
== Вычислительное ядро алгоритма ==&lt;br /&gt;
&lt;br /&gt;
Вычислительным ядром, т.е. той частью алгоритма, на которую приходится основное время его работы, является вычисление значения &amp;lt;math&amp;gt;i&amp;lt;/math&amp;gt;-го элемента &amp;lt;math&amp;gt;c_{i}&amp;lt;/math&amp;gt; вектора-произведения, т.е произведения строки &amp;lt;math&amp;gt;I&amp;lt;/math&amp;gt; матрицы &amp;lt;math&amp;gt;A&amp;lt;/math&amp;gt; и вектора &amp;lt;math&amp;gt;B&amp;lt;/math&amp;gt; по формуле:&lt;br /&gt;
&lt;br /&gt;
:&amp;lt;math&amp;gt;&lt;br /&gt;
\begin{align}&lt;br /&gt;
&amp;amp; c_{i} = \sum\limits_{j = IAA_{i}}^{IAB_{i}} AN(j)B(JA(j)), \quad i \in [1, N] \\&lt;br /&gt;
\end{align}&lt;br /&gt;
&amp;lt;/math&amp;gt;&lt;br /&gt;
&lt;br /&gt;
== Макроструктура алгоритма ==&lt;br /&gt;
&lt;br /&gt;
Основу алгоритма составляет вычисление значения &amp;lt;math&amp;gt;i&amp;lt;/math&amp;gt;-го элемента &amp;lt;math&amp;gt;c_{i}&amp;lt;/math&amp;gt; вектора-произведения:&lt;br /&gt;
&lt;br /&gt;
:&amp;lt;math&amp;gt;&lt;br /&gt;
\begin{align}&lt;br /&gt;
&amp;amp; c_{i} = \sum\limits_{j = IAA_{i}}^{IAB_{i}} AN(j)B(JA(j)), \quad i \in [1, N] \\&lt;br /&gt;
\end{align}&lt;br /&gt;
&amp;lt;/math&amp;gt;&lt;br /&gt;
&lt;br /&gt;
== Схема реализации последовательного алгоритма ==&lt;br /&gt;
&lt;br /&gt;
Последовательность исполнения метода следующая: &lt;br /&gt;
&lt;br /&gt;
Далее для всех &amp;lt;math&amp;gt;i&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; по нарастанию выполняются:&lt;br /&gt;
&lt;br /&gt;
1. &amp;lt;math&amp;gt; c_{i} = 0; IAA = IA(i); IAB = IA(i + 1 ) - 1 &amp;lt;/math&amp;gt;&lt;br /&gt;
&lt;br /&gt;
После этого, если &amp;lt;math&amp;gt;(IAB \le IAA)&amp;lt;/math&amp;gt;:&lt;br /&gt;
&lt;br /&gt;
2. Для всех &amp;lt;math&amp;gt;j&amp;lt;/math&amp;gt; от &amp;lt;math&amp;gt;IAA&amp;lt;/math&amp;gt; до &amp;lt;math&amp;gt;IAB&amp;lt;/math&amp;gt; выполняется: &lt;br /&gt;
&lt;br /&gt;
&amp;lt;math&amp;gt;c_{i} = \sum\limits_{j = IAA_{i}}^{IAB_{i}} AN(j)B(JA(j))&amp;lt;/math&amp;gt;&lt;br /&gt;
&lt;br /&gt;
Псевдокод алгоритма: &lt;br /&gt;
&lt;br /&gt;
    FOR I = 1, N                          (1)&lt;br /&gt;
       U = 0.                             (2) &lt;br /&gt;
       IAA = IA(I)                        (3) &lt;br /&gt;
       IAB = IA(I + 1 ) - 1               (4)&lt;br /&gt;
       IF NOT(IAB.LT.IAA)                 (5)&lt;br /&gt;
           FOR J = IAA, IAB               (6)&lt;br /&gt;
           C(I) = U + AN(J)*B(JA(J))      (7)&lt;br /&gt;
&lt;br /&gt;
== Последовательная сложность алгоритма ==&lt;br /&gt;
&lt;br /&gt;
Для всего алгоритма потребуется выполнить &amp;lt;math&amp;gt;O(k)&amp;lt;/math&amp;gt; операций, как в строке стр.7 псевдокода алгоритма ([[#Схема реализации последовательного алгоритма|п.1.5]]), где &amp;lt;math&amp;gt;k&amp;lt;/math&amp;gt; - число ненулевых эле­ментов матрицы.&lt;br /&gt;
&lt;br /&gt;
== Информационный граф ==&lt;br /&gt;
&lt;br /&gt;
[[file:InfoGrafMatrixRRCUandVextor.jpg|thumb|center|1200px|Рисунок 1. Информационный граф алгоритма.]]&lt;br /&gt;
 &lt;br /&gt;
По оси &amp;lt;math&amp;gt;X&amp;lt;/math&amp;gt; для отдельной строки &amp;lt;math&amp;gt;I&amp;lt;/math&amp;gt; матрицы отложены в пределах первой &amp;lt;math&amp;gt;IAA&amp;lt;/math&amp;gt; и последней &amp;lt;math&amp;gt;IAB&amp;lt;/math&amp;gt; позиций ненулевых элементов значения &amp;lt;math&amp;gt;AN&amp;lt;/math&amp;gt; и соответствуюие им по столбцовомым индексам, хранимимым в &amp;lt;math&amp;gt;JA&amp;lt;/math&amp;gt;, значения &amp;lt;math&amp;gt;B&amp;lt;/math&amp;gt; элементов. &lt;br /&gt;
Пары этих значений обозначены желтыми квадратиками &amp;lt;math&amp;gt;(in)&amp;lt;/math&amp;gt;. Значения in попарно скалярно перемножаются (зеленый кружочек) и суммируются (синий кружочек) в результат значения элемента вектора-произведения &amp;lt;math&amp;gt;c_{i}&amp;lt;/math&amp;gt;, т.е &amp;lt;math&amp;gt;out&amp;lt;/math&amp;gt;(красный квадратик) с строковым индексом, соответствующем номеру строки матрицы.&lt;br /&gt;
&lt;br /&gt;
По оси &amp;lt;math&amp;gt;Y&amp;lt;/math&amp;gt; отложена схема вычисление значения каждого элемента вектора-произведения для каждой строки матрицы. &lt;br /&gt;
&lt;br /&gt;
== Ресурс параллелизма алгоритма ==&lt;br /&gt;
&lt;br /&gt;
== Входные и выходные данные алгоритма ==&lt;br /&gt;
&#039;&#039;&#039;Входные данные:&#039;&#039;&#039;&lt;br /&gt;
&lt;br /&gt;
* &amp;lt;math&amp;gt;IA, JA, AN&amp;lt;/math&amp;gt; - заданная матрица в форме &#039;&#039;&#039;(RR (С) U)&#039;&#039;&#039; c &amp;lt;math&amp;gt;k&amp;lt;/math&amp;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;B&amp;lt;/math&amp;gt; - заданный заполненный вектор c &amp;lt;math&amp;gt;m&amp;lt;/math&amp;gt; элементами;&lt;br /&gt;
&#039;&#039;&#039;&lt;br /&gt;
&#039;&#039;&#039;Объем входных данных&#039;&#039;&#039;: &amp;lt;math&amp;gt;k + m&amp;lt;/math&amp;gt;&lt;br /&gt;
&lt;br /&gt;
&#039;&#039;&#039;Выходные данные:&#039;&#039;&#039; &amp;lt;math&amp;gt;C&amp;lt;/math&amp;gt; вектор-произведение размерности &amp;lt;math&amp;gt;N&amp;lt;/math&amp;gt;.&lt;br /&gt;
&lt;br /&gt;
&#039;&#039;&#039;Объем выходных данных&#039;&#039;&#039;: &amp;lt;math&amp;gt;N&amp;lt;/math&amp;gt;&lt;br /&gt;
&lt;br /&gt;
== Свойства алгоритма ==&lt;br /&gt;
&lt;br /&gt;
Алгоритм в рамках выбранной версии полностью детерминирован.&lt;br /&gt;
&lt;br /&gt;
Вычислительная мощность алгоритма, как отношение числа операций к суммарному объему входных и выходных данных – константа.&lt;br /&gt;
&lt;br /&gt;
= Программная реализация алгоритма =&lt;br /&gt;
&lt;br /&gt;
== Масштабируемость алгоритма и его реализации ==&lt;br /&gt;
&lt;br /&gt;
== Существующие реализации алгоритма ==&lt;br /&gt;
&lt;br /&gt;
= Литература =&lt;br /&gt;
&lt;br /&gt;
[1] С. Писсанецки. Технология разреженных матриц. Изд. Мир, 1988.&lt;/div&gt;</summary>
		<author><name>Lexaloris</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:Lexaloris/%D0%A3%D0%BC%D0%BD%D0%BE%D0%B6%D0%B5%D0%BD%D0%B8%D0%B5_%D1%80%D0%B0%D0%B7%D1%80%D0%B5%D0%B6%D0%B5%D0%BD%D0%BD%D0%BE%D0%B9_%D0%BC%D0%B0%D1%82%D1%80%D0%B8%D1%86%D1%8B_%D0%BD%D0%B0_%D0%B2%D0%B5%D0%BA%D1%82%D0%BE%D1%80&amp;diff=10565</id>
		<title>Участник:Lexaloris/Умножение разреженной матрицы на вектор</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:Lexaloris/%D0%A3%D0%BC%D0%BD%D0%BE%D0%B6%D0%B5%D0%BD%D0%B8%D0%B5_%D1%80%D0%B0%D0%B7%D1%80%D0%B5%D0%B6%D0%B5%D0%BD%D0%BD%D0%BE%D0%B9_%D0%BC%D0%B0%D1%82%D1%80%D0%B8%D1%86%D1%8B_%D0%BD%D0%B0_%D0%B2%D0%B5%D0%BA%D1%82%D0%BE%D1%80&amp;diff=10565"/>
		<updated>2016-10-15T16:39:43Z</updated>

		<summary type="html">&lt;p&gt;Lexaloris: &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(k)&amp;lt;/math&amp;gt;&lt;br /&gt;
| pf_height         = &amp;lt;math&amp;gt;O(m)&amp;lt;/math&amp;gt;&lt;br /&gt;
| pf_width          = &amp;lt;math&amp;gt;O(n)&amp;lt;/math&amp;gt;&lt;br /&gt;
| input_data        = &amp;lt;math&amp;gt;k + m&amp;lt;/math&amp;gt;&lt;br /&gt;
| output_data       = &amp;lt;math&amp;gt;n&amp;lt;/math&amp;gt;&lt;br /&gt;
}}&lt;br /&gt;
&lt;br /&gt;
&lt;br /&gt;
&#039;&#039;&#039;Авторы страницы:&#039;&#039;&#039; [[Участник:Lexaloris|A.Д. Новоселов]] и [[Участник:kochet|П.А. Кочетков]]&lt;br /&gt;
&lt;br /&gt;
= Свойства и структура алгоритмов =&lt;br /&gt;
&lt;br /&gt;
== Общее описание алгоритма ==&lt;br /&gt;
&lt;br /&gt;
=== Хранение ненулевых элементов разреженной матрицы ===&lt;br /&gt;
&lt;br /&gt;
==== Разреженный строчной формат ====&lt;br /&gt;
&lt;br /&gt;
Одной из наиболее ши­роко используемых схем хранения разреженных матриц является &#039;&#039;разреженный строчный формат&#039;&#039;. Эта&lt;br /&gt;
схема предъявляет минимальные требования к памяти и в то же время оказывается очень удобной для умножения разреженной матрицы на вектор.&lt;br /&gt;
Например, рассмотрим формат хранения разряженной матрицы &amp;lt;math&amp;gt;A&amp;lt;/math&amp;gt;:&lt;br /&gt;
&lt;br /&gt;
[[File:RRCOMatrix.png]]&lt;br /&gt;
&lt;br /&gt;
Значения нену­левых элементов матрицы и соответствующие столбцовые индексы хранятся в этой схеме по строкам в двух массивах &amp;lt;math&amp;gt;AN&amp;lt;/math&amp;gt; и &amp;lt;math&amp;gt;JA&amp;lt;/math&amp;gt; соответственно. Используется также массив указателей &amp;lt;math&amp;gt;IA&amp;lt;/math&amp;gt;, отмечающих позиции массивов &amp;lt;math&amp;gt;AN&amp;lt;/math&amp;gt; и &amp;lt;math&amp;gt;JA&amp;lt;/math&amp;gt;, с которых начинается описание очередной строки. Дополнительная компо­нента в &amp;lt;math&amp;gt;IA&amp;lt;/math&amp;gt; содержит указатель первой свободной позиции в &amp;lt;math&amp;gt;JA&amp;lt;/math&amp;gt; и &amp;lt;math&amp;gt;AN&amp;lt;/math&amp;gt;.&lt;br /&gt;
&lt;br /&gt;
Таким образом &amp;lt;math&amp;gt;A&amp;lt;/math&amp;gt; представляется в виде:&lt;br /&gt;
&lt;br /&gt;
   IA = [ 1 4 4 6 ]&lt;br /&gt;
   JA = [ 3 4 8 6 8 ]&lt;br /&gt;
   AN = [ 1 3 5 7 1 ]&lt;br /&gt;
&lt;br /&gt;
Данный способ представления называют &#039;&#039;полным&#039;&#039;, поскольку представлена вся матрица &amp;lt;math&amp;gt;A&amp;lt;/math&amp;gt;, и &#039;&#039;упорядоченным&#039;&#039;, поскольку эле­менты каждой строки хранятся в соответствии с возрастанием столбцовых индексов. Таким образом, это строчное представление, полное и упорядоченное, или сокращенно &#039;&#039;&#039;(RR (С) О)&#039;&#039;&#039;.&lt;br /&gt;
&lt;br /&gt;
==== Неупорядоченное представление ====&lt;br /&gt;
&lt;br /&gt;
Представления разреженных матриц необязательно должны быть упорядочены в том смысле, что, хотя упорядоченность строк поддерживается, внутри каждой строки элементы могут храниться в произвольном порядке. Для матрицы А нашего примера вполне можно было бы использовать и строчное представление, полное, но &#039;&#039;неупорядоченное&#039;&#039; &#039;&#039;&#039;(RR (С) U )&#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;
   IA = [ 1 4 4 6 ]&lt;br /&gt;
   JA = [ 8 3 4 8 6 ]&lt;br /&gt;
   AN = [ 5 1 3 1 7 ]&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; — число строк матрицы. &lt;br /&gt;
Для каждой ее строки &amp;lt;math&amp;gt;I&amp;lt;/math&amp;gt; матрицы мы находим с помощью &amp;lt;math&amp;gt;IA&amp;lt;/math&amp;gt; значения первой &amp;lt;math&amp;gt;IAA&amp;lt;/math&amp;gt; и последней &amp;lt;math&amp;gt;IAB&amp;lt;/math&amp;gt; позиций, занимаемых элементами строки &amp;lt;math&amp;gt;I&amp;lt;/math&amp;gt; в массивах &amp;lt;math&amp;gt;JA&amp;lt;/math&amp;gt; и &amp;lt;math&amp;gt;AN&amp;lt;/math&amp;gt;. Затем, чтобы вычислить скалярное произведение строки &amp;lt;math&amp;gt;I&amp;lt;/math&amp;gt; и вектора &amp;lt;math&amp;gt;B&amp;lt;/math&amp;gt;, мы просто просматриваем &amp;lt;math&amp;gt;JA&amp;lt;/math&amp;gt; и &amp;lt;math&amp;gt;AN&amp;lt;/math&amp;gt; на отрезке от &amp;lt;math&amp;gt;IAA&amp;lt;/math&amp;gt; до &amp;lt;math&amp;gt;IAB&amp;lt;/math&amp;gt;:&lt;br /&gt;
каждое значение, хранимое в &amp;lt;math&amp;gt;JA&amp;lt;/math&amp;gt;, есть столбцовый индекс и используется для извлечения из массива &amp;lt;math&amp;gt;B&amp;lt;/math&amp;gt; элемента, который должен быть умножен на соответствующее число из &amp;lt;math&amp;gt;AN&amp;lt;/math&amp;gt;. Результат каж­дого умножения прибавляется к &amp;lt;math&amp;gt;C(I)&amp;lt;/math&amp;gt;.&lt;br /&gt;
&lt;br /&gt;
== Математическое описание алгоритма ==&lt;br /&gt;
&lt;br /&gt;
&#039;&#039;&#039;Исходные данные:&#039;&#039;&#039; &lt;br /&gt;
&lt;br /&gt;
&amp;lt;math&amp;gt;IA, JA, AN&amp;lt;/math&amp;gt; - заданная матрица в форме &#039;&#039;&#039;(RR (С) U)&#039;&#039;&#039;;&lt;br /&gt;
&lt;br /&gt;
&amp;lt;math&amp;gt;B&amp;lt;/math&amp;gt; - заданный заполненный вектор;&lt;br /&gt;
&lt;br /&gt;
&amp;lt;math&amp;gt;N&amp;lt;/math&amp;gt; - число строк матрицы.&lt;br /&gt;
&lt;br /&gt;
&#039;&#039;&#039;Выход:&#039;&#039;&#039; &amp;lt;math&amp;gt;C&amp;lt;/math&amp;gt; вектор-произведение размерности &amp;lt;math&amp;gt;N&amp;lt;/math&amp;gt;.&lt;br /&gt;
&lt;br /&gt;
&#039;&#039;&#039;Формулы метода:&#039;&#039;&#039;&lt;br /&gt;
&lt;br /&gt;
:&amp;lt;math&amp;gt;&lt;br /&gt;
\begin{align}&lt;br /&gt;
&amp;amp; IAA_{i} = IA(i), \quad i \in [1, N], \\&lt;br /&gt;
&amp;amp; IAB_{i} = IA(i + 1) - 1, \quad i \in [1, N], \\&lt;br /&gt;
&amp;amp; c_{i} = \sum\limits_{j = IAA_{i}}^{IAB_{i}} AN(j)B(JA(j)), \quad i \in [1, N] \\&lt;br /&gt;
\end{align}&lt;br /&gt;
&amp;lt;/math&amp;gt;&lt;br /&gt;
&lt;br /&gt;
== Вычислительное ядро алгоритма ==&lt;br /&gt;
&lt;br /&gt;
Вычислительным ядром, т.е. той частью алгоритма, на которую приходится основное время его работы, является вычисление значения &amp;lt;math&amp;gt;i&amp;lt;/math&amp;gt;-го элемента &amp;lt;math&amp;gt;c_{i}&amp;lt;/math&amp;gt; вектора-произведения, т.е произведения строки &amp;lt;math&amp;gt;I&amp;lt;/math&amp;gt; матрицы &amp;lt;math&amp;gt;A&amp;lt;/math&amp;gt; и вектора &amp;lt;math&amp;gt;B&amp;lt;/math&amp;gt; по формуле:&lt;br /&gt;
&lt;br /&gt;
:&amp;lt;math&amp;gt;&lt;br /&gt;
\begin{align}&lt;br /&gt;
&amp;amp; c_{i} = \sum\limits_{j = IAA_{i}}^{IAB_{i}} AN(j)B(JA(j)), \quad i \in [1, N] \\&lt;br /&gt;
\end{align}&lt;br /&gt;
&amp;lt;/math&amp;gt;&lt;br /&gt;
&lt;br /&gt;
== Макроструктура алгоритма ==&lt;br /&gt;
&lt;br /&gt;
Основу алгоритма составляет вычисление значения &amp;lt;math&amp;gt;i&amp;lt;/math&amp;gt;-го элемента &amp;lt;math&amp;gt;c_{i}&amp;lt;/math&amp;gt; вектора-произведения:&lt;br /&gt;
&lt;br /&gt;
:&amp;lt;math&amp;gt;&lt;br /&gt;
\begin{align}&lt;br /&gt;
&amp;amp; c_{i} = \sum\limits_{j = IAA_{i}}^{IAB_{i}} AN(j)B(JA(j)), \quad i \in [1, N] \\&lt;br /&gt;
\end{align}&lt;br /&gt;
&amp;lt;/math&amp;gt;&lt;br /&gt;
&lt;br /&gt;
== Схема реализации последовательного алгоритма ==&lt;br /&gt;
&lt;br /&gt;
Последовательность исполнения метода следующая: &lt;br /&gt;
&lt;br /&gt;
Далее для всех &amp;lt;math&amp;gt;i&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; по нарастанию выполняются:&lt;br /&gt;
&lt;br /&gt;
1. &amp;lt;math&amp;gt; c_{i} = 0; IAA = IA(i); IAB = IA(i + 1 ) - 1 &amp;lt;/math&amp;gt;&lt;br /&gt;
&lt;br /&gt;
После этого, если &amp;lt;math&amp;gt;(IAB \le IAA)&amp;lt;/math&amp;gt;:&lt;br /&gt;
&lt;br /&gt;
2. Для всех &amp;lt;math&amp;gt;j&amp;lt;/math&amp;gt; от &amp;lt;math&amp;gt;IAA&amp;lt;/math&amp;gt; до &amp;lt;math&amp;gt;IAB&amp;lt;/math&amp;gt; выполняется: &lt;br /&gt;
&lt;br /&gt;
&amp;lt;math&amp;gt;c_{i} = \sum\limits_{j = IAA_{i}}^{IAB_{i}} AN(j)B(JA(j))&amp;lt;/math&amp;gt;&lt;br /&gt;
&lt;br /&gt;
Псевдокод алгоритма: &lt;br /&gt;
&lt;br /&gt;
    FOR I = 1, N                          (1)&lt;br /&gt;
       U = 0.                             (2) &lt;br /&gt;
       IAA = IA(I)                        (3) &lt;br /&gt;
       IAB = IA(I + 1 ) - 1               (4)&lt;br /&gt;
       IF NOT(IAB.LT.IAA)                 (5)&lt;br /&gt;
           FOR J = IAA, IAB               (6)&lt;br /&gt;
           C(I) = U + AN(J)*B(JA(J))      (7)&lt;br /&gt;
&lt;br /&gt;
== Последовательная сложность алгоритма ==&lt;br /&gt;
&lt;br /&gt;
Для всего алгоритма потребуется выполнить &amp;lt;math&amp;gt;O(k)&amp;lt;/math&amp;gt; операций, как в строке стр.7 псевдокода алгоритма ([[#Схема реализации последовательного алгоритма|п.1.5]]), где &amp;lt;math&amp;gt;k&amp;lt;/math&amp;gt; - число ненулевых эле­ментов матрицы.&lt;br /&gt;
&lt;br /&gt;
== Информационный граф ==&lt;br /&gt;
&lt;br /&gt;
[[file:InfoGrafMatrixRRCUandVextor.jpg|thumb|center|1200px|Рисунок 1. Информационный граф алгоритма.]]&lt;br /&gt;
&lt;br /&gt;
== Ресурс параллелизма алгоритма ==&lt;br /&gt;
&lt;br /&gt;
== Входные и выходные данные алгоритма ==&lt;br /&gt;
&#039;&#039;&#039;Входные данные:&#039;&#039;&#039;&lt;br /&gt;
&lt;br /&gt;
* &amp;lt;math&amp;gt;IA, JA, AN&amp;lt;/math&amp;gt; - заданная матрица в форме &#039;&#039;&#039;(RR (С) U)&#039;&#039;&#039; c &amp;lt;math&amp;gt;k&amp;lt;/math&amp;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;B&amp;lt;/math&amp;gt; - заданный заполненный вектор c &amp;lt;math&amp;gt;m&amp;lt;/math&amp;gt; элементами;&lt;br /&gt;
&#039;&#039;&#039;&lt;br /&gt;
&#039;&#039;&#039;Объем входных данных&#039;&#039;&#039;: &amp;lt;math&amp;gt;k + m&amp;lt;/math&amp;gt;&lt;br /&gt;
&lt;br /&gt;
&#039;&#039;&#039;Выходные данные:&#039;&#039;&#039; &amp;lt;math&amp;gt;C&amp;lt;/math&amp;gt; вектор-произведение размерности &amp;lt;math&amp;gt;N&amp;lt;/math&amp;gt;.&lt;br /&gt;
&lt;br /&gt;
&#039;&#039;&#039;Объем выходных данных&#039;&#039;&#039;: &amp;lt;math&amp;gt;N&amp;lt;/math&amp;gt;&lt;br /&gt;
&lt;br /&gt;
== Свойства алгоритма ==&lt;br /&gt;
&lt;br /&gt;
Алгоритм в рамках выбранной версии полностью детерминирован.&lt;br /&gt;
&lt;br /&gt;
Вычислительная мощность алгоритма, как отношение числа операций к суммарному объему входных и выходных данных – константа.&lt;br /&gt;
&lt;br /&gt;
= Программная реализация алгоритма =&lt;br /&gt;
&lt;br /&gt;
== Масштабируемость алгоритма и его реализации ==&lt;br /&gt;
&lt;br /&gt;
== Существующие реализации алгоритма ==&lt;br /&gt;
&lt;br /&gt;
= Литература =&lt;br /&gt;
&lt;br /&gt;
[1] С. Писсанецки. Технология разреженных матриц. Изд. Мир, 1988.&lt;/div&gt;</summary>
		<author><name>Lexaloris</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:Lexaloris/%D0%A3%D0%BC%D0%BD%D0%BE%D0%B6%D0%B5%D0%BD%D0%B8%D0%B5_%D1%80%D0%B0%D0%B7%D1%80%D0%B5%D0%B6%D0%B5%D0%BD%D0%BD%D0%BE%D0%B9_%D0%BC%D0%B0%D1%82%D1%80%D0%B8%D1%86%D1%8B_%D0%BD%D0%B0_%D0%B2%D0%B5%D0%BA%D1%82%D0%BE%D1%80&amp;diff=10092</id>
		<title>Участник:Lexaloris/Умножение разреженной матрицы на вектор</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:Lexaloris/%D0%A3%D0%BC%D0%BD%D0%BE%D0%B6%D0%B5%D0%BD%D0%B8%D0%B5_%D1%80%D0%B0%D0%B7%D1%80%D0%B5%D0%B6%D0%B5%D0%BD%D0%BD%D0%BE%D0%B9_%D0%BC%D0%B0%D1%82%D1%80%D0%B8%D1%86%D1%8B_%D0%BD%D0%B0_%D0%B2%D0%B5%D0%BA%D1%82%D0%BE%D1%80&amp;diff=10092"/>
		<updated>2016-10-15T14:59:37Z</updated>

		<summary type="html">&lt;p&gt;Lexaloris: /* Последовательная сложность алгоритма */&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(k)&amp;lt;/math&amp;gt;&lt;br /&gt;
| pf_height         = &amp;lt;math&amp;gt;O(m)&amp;lt;/math&amp;gt;&lt;br /&gt;
| pf_width          = &amp;lt;math&amp;gt;O(n)&amp;lt;/math&amp;gt;&lt;br /&gt;
| input_data        = &amp;lt;math&amp;gt;k + m&amp;lt;/math&amp;gt;&lt;br /&gt;
| output_data       = &amp;lt;math&amp;gt;n&amp;lt;/math&amp;gt;&lt;br /&gt;
}}&lt;br /&gt;
&lt;br /&gt;
&lt;br /&gt;
&#039;&#039;&#039;Авторы страницы:&#039;&#039;&#039; [[Участник:Lexaloris|A.Д. Новоселов]] и [[Участник:kochet|П.А. Кочетков]]&lt;br /&gt;
&lt;br /&gt;
= Свойства и структура алгоритмов =&lt;br /&gt;
&lt;br /&gt;
== Общее описание алгоритма ==&lt;br /&gt;
&lt;br /&gt;
=== Хранение ненулевых элементов разреженной матрицы ===&lt;br /&gt;
&lt;br /&gt;
==== Разреженный строчной формат ====&lt;br /&gt;
&lt;br /&gt;
Одной из наиболее ши­роко используемых схем хранения разреженных матриц является &#039;&#039;разреженный строчный формат&#039;&#039;. Эта&lt;br /&gt;
схема предъявляет минимальные требования к памяти и в то же время оказывается очень удобной для умножения разреженной матрицы на вектор.&lt;br /&gt;
Например, рассмотрим формат хранения разряженной матрицы &amp;lt;math&amp;gt;A&amp;lt;/math&amp;gt;:&lt;br /&gt;
&lt;br /&gt;
[[File:RRCOMatrix.png]]&lt;br /&gt;
&lt;br /&gt;
Значения нену­левых элементов матрицы и соответствующие столбцовые индексы хранятся в этой схеме по строкам в двух массивах &amp;lt;math&amp;gt;AN&amp;lt;/math&amp;gt; и &amp;lt;math&amp;gt;JA&amp;lt;/math&amp;gt; соответственно. Используется также массив указателей &amp;lt;math&amp;gt;IA&amp;lt;/math&amp;gt;, отмечающих позиции массивов &amp;lt;math&amp;gt;AN&amp;lt;/math&amp;gt; и &amp;lt;math&amp;gt;JA&amp;lt;/math&amp;gt;, с которых начинается описание очередной строки. Дополнительная компо­нента в &amp;lt;math&amp;gt;IA&amp;lt;/math&amp;gt; содержит указатель первой свободной позиции в &amp;lt;math&amp;gt;JA&amp;lt;/math&amp;gt; и &amp;lt;math&amp;gt;AN&amp;lt;/math&amp;gt;.&lt;br /&gt;
&lt;br /&gt;
Таким образом &amp;lt;math&amp;gt;A&amp;lt;/math&amp;gt; представляется в виде:&lt;br /&gt;
&lt;br /&gt;
   IA = [ 1 4 4 6 ]&lt;br /&gt;
   JA = [ 3 4 8 6 8 ]&lt;br /&gt;
   AN = [ 1 3 5 7 1 ]&lt;br /&gt;
&lt;br /&gt;
Данный способ представления называют &#039;&#039;полным&#039;&#039;, поскольку представлена вся матрица &amp;lt;math&amp;gt;A&amp;lt;/math&amp;gt;, и &#039;&#039;упорядоченным&#039;&#039;, поскольку эле­менты каждой строки хранятся в соответствии с возрастанием столбцовых индексов. Таким образом, это строчное представление, полное и упорядоченное, или сокращенно &#039;&#039;&#039;(RR (С) О)&#039;&#039;&#039;.&lt;br /&gt;
&lt;br /&gt;
==== Неупорядоченное представление ====&lt;br /&gt;
&lt;br /&gt;
Представления разреженных матриц необязательно должны быть упорядочены в том смысле, что, хотя упорядоченность строк поддерживается, внутри каждой строки элементы могут храниться в произвольном порядке. Для матрицы А нашего примера вполне можно было бы использовать и строчное представление, полное, но &#039;&#039;неупорядоченное&#039;&#039; &#039;&#039;&#039;(RR (С) U )&#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;
   IA = [ 1 4 4 6 ]&lt;br /&gt;
   JA = [ 8 3 4 8 6 ]&lt;br /&gt;
   AN = [ 5 1 3 1 7 ]&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; — число строк матрицы. &lt;br /&gt;
Для каждой ее строки &amp;lt;math&amp;gt;I&amp;lt;/math&amp;gt; матрицы мы находим с помощью &amp;lt;math&amp;gt;IA&amp;lt;/math&amp;gt; значения первой &amp;lt;math&amp;gt;IAA&amp;lt;/math&amp;gt; и последней &amp;lt;math&amp;gt;IAB&amp;lt;/math&amp;gt; позиций, занимаемых элементами строки &amp;lt;math&amp;gt;I&amp;lt;/math&amp;gt; в массивах &amp;lt;math&amp;gt;JA&amp;lt;/math&amp;gt; и &amp;lt;math&amp;gt;AN&amp;lt;/math&amp;gt;. Затем, чтобы вычислить скалярное произведение строки &amp;lt;math&amp;gt;I&amp;lt;/math&amp;gt; и вектора &amp;lt;math&amp;gt;B&amp;lt;/math&amp;gt;, мы просто просматриваем &amp;lt;math&amp;gt;JA&amp;lt;/math&amp;gt; и &amp;lt;math&amp;gt;AN&amp;lt;/math&amp;gt; на отрезке от &amp;lt;math&amp;gt;IAA&amp;lt;/math&amp;gt; до &amp;lt;math&amp;gt;IAB&amp;lt;/math&amp;gt;:&lt;br /&gt;
каждое значение, хранимое в &amp;lt;math&amp;gt;JA&amp;lt;/math&amp;gt;, есть столбцовый индекс и используется для извлечения из массива &amp;lt;math&amp;gt;B&amp;lt;/math&amp;gt; элемента, который должен быть умножен на соответствующее число из &amp;lt;math&amp;gt;AN&amp;lt;/math&amp;gt;. Результат каж­дого умножения прибавляется к &amp;lt;math&amp;gt;C(I)&amp;lt;/math&amp;gt;.&lt;br /&gt;
&lt;br /&gt;
== Математическое описание алгоритма ==&lt;br /&gt;
&lt;br /&gt;
&#039;&#039;&#039;Исходные данные:&#039;&#039;&#039; &lt;br /&gt;
&lt;br /&gt;
&amp;lt;math&amp;gt;IA, JA, AN&amp;lt;/math&amp;gt; - заданная матрица в форме &#039;&#039;&#039;(RR (С) U)&#039;&#039;&#039;;&lt;br /&gt;
&lt;br /&gt;
&amp;lt;math&amp;gt;B&amp;lt;/math&amp;gt; - заданный заполненный вектор;&lt;br /&gt;
&lt;br /&gt;
&amp;lt;math&amp;gt;N&amp;lt;/math&amp;gt; - число строк матрицы.&lt;br /&gt;
&lt;br /&gt;
&#039;&#039;&#039;Выход:&#039;&#039;&#039; &amp;lt;math&amp;gt;C&amp;lt;/math&amp;gt; вектор-произведение размерности &amp;lt;math&amp;gt;N&amp;lt;/math&amp;gt;.&lt;br /&gt;
&lt;br /&gt;
&#039;&#039;&#039;Формулы метода:&#039;&#039;&#039;&lt;br /&gt;
&lt;br /&gt;
:&amp;lt;math&amp;gt;&lt;br /&gt;
\begin{align}&lt;br /&gt;
&amp;amp; IAA_{i} = IA(i), \quad i \in [1, N], \\&lt;br /&gt;
&amp;amp; IAB_{i} = IA(i + 1) - 1, \quad i \in [1, N], \\&lt;br /&gt;
&amp;amp; c_{i} = \sum\limits_{j = IAA_{i}}^{IAB_{i}} AN(j)B(JA(j)), \quad i \in [1, N] \\&lt;br /&gt;
\end{align}&lt;br /&gt;
&amp;lt;/math&amp;gt;&lt;br /&gt;
&lt;br /&gt;
== Вычислительное ядро алгоритма ==&lt;br /&gt;
&lt;br /&gt;
Вычислительным ядром, т.е. той частью алгоритма, на которую приходится основное время его работы, является вычисление значения &amp;lt;math&amp;gt;i&amp;lt;/math&amp;gt;-го элемента &amp;lt;math&amp;gt;c_{i}&amp;lt;/math&amp;gt; вектора-произведения, т.е произведения строки &amp;lt;math&amp;gt;I&amp;lt;/math&amp;gt; матрицы &amp;lt;math&amp;gt;A&amp;lt;/math&amp;gt; и вектора &amp;lt;math&amp;gt;B&amp;lt;/math&amp;gt; по формуле:&lt;br /&gt;
&lt;br /&gt;
:&amp;lt;math&amp;gt;&lt;br /&gt;
\begin{align}&lt;br /&gt;
&amp;amp; c_{i} = \sum\limits_{j = IAA_{i}}^{IAB_{i}} AN(j)B(JA(j)), \quad i \in [1, N] \\&lt;br /&gt;
\end{align}&lt;br /&gt;
&amp;lt;/math&amp;gt;&lt;br /&gt;
&lt;br /&gt;
== Макроструктура алгоритма ==&lt;br /&gt;
&lt;br /&gt;
Основу алгоритма составляет вычисление значения &amp;lt;math&amp;gt;i&amp;lt;/math&amp;gt;-го элемента &amp;lt;math&amp;gt;c_{i}&amp;lt;/math&amp;gt; вектора-произведения:&lt;br /&gt;
&lt;br /&gt;
:&amp;lt;math&amp;gt;&lt;br /&gt;
\begin{align}&lt;br /&gt;
&amp;amp; c_{i} = \sum\limits_{j = IAA_{i}}^{IAB_{i}} AN(j)B(JA(j)), \quad i \in [1, N] \\&lt;br /&gt;
\end{align}&lt;br /&gt;
&amp;lt;/math&amp;gt;&lt;br /&gt;
&lt;br /&gt;
== Схема реализации последовательного алгоритма ==&lt;br /&gt;
&lt;br /&gt;
Последовательность исполнения метода следующая: &lt;br /&gt;
&lt;br /&gt;
Далее для всех &amp;lt;math&amp;gt;i&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; по нарастанию выполняются:&lt;br /&gt;
&lt;br /&gt;
1. &amp;lt;math&amp;gt; c_{i} = 0; IAA = IA(i); IAB = IA(i + 1 ) - 1 &amp;lt;/math&amp;gt;&lt;br /&gt;
&lt;br /&gt;
После этого, если &amp;lt;math&amp;gt;(IAB \le IAA)&amp;lt;/math&amp;gt;:&lt;br /&gt;
&lt;br /&gt;
2. Для всех &amp;lt;math&amp;gt;j&amp;lt;/math&amp;gt; от &amp;lt;math&amp;gt;IAA&amp;lt;/math&amp;gt; до &amp;lt;math&amp;gt;IAB&amp;lt;/math&amp;gt; выполняется: &lt;br /&gt;
&lt;br /&gt;
&amp;lt;math&amp;gt;c_{i} = \sum\limits_{j = IAA_{i}}^{IAB_{i}} AN(j)B(JA(j))&amp;lt;/math&amp;gt;&lt;br /&gt;
&lt;br /&gt;
Псевдокод алгоритма: &lt;br /&gt;
&lt;br /&gt;
    FOR I = 1, N                          (1)&lt;br /&gt;
       U = 0.                             (2) &lt;br /&gt;
       IAA = IA(I)                        (3) &lt;br /&gt;
       IAB = IA(I + 1 ) - 1               (4)&lt;br /&gt;
       IF NOT(IAB.LT.IAA)                 (5)&lt;br /&gt;
           FOR J = IAA, IAB               (6)&lt;br /&gt;
           C(I) = U + AN(J)*B(JA(J))      (7)&lt;br /&gt;
&lt;br /&gt;
== Последовательная сложность алгоритма ==&lt;br /&gt;
&lt;br /&gt;
Для всего алгоритма потребуется выполнить &amp;lt;math&amp;gt;O(k)&amp;lt;/math&amp;gt; операций, как в строке стр.7 псевдокода алгоритма ([[#Схема реализации последовательного алгоритма|п.1.5]]), где &amp;lt;math&amp;gt;k&amp;lt;/math&amp;gt; - число ненулевых эле­ментов матрицы.&lt;br /&gt;
&lt;br /&gt;
== Информационный граф ==&lt;br /&gt;
&lt;br /&gt;
[[file:InfoGrafMatrixRRCUandVextor.jpg|thumb|center|1200px|Рисунок 1. Информационный граф алгоритма.]]&lt;br /&gt;
&lt;br /&gt;
== Ресурс параллелизма алгоритма ==&lt;br /&gt;
&lt;br /&gt;
== Входные и выходные данные алгоритма ==&lt;br /&gt;
&lt;br /&gt;
== Свойства алгоритма ==&lt;br /&gt;
&lt;br /&gt;
Алгоритм в рамках выбранной версии полностью детерминирован.&lt;br /&gt;
&lt;br /&gt;
Вычислительная мощность алгоритма, как отношение числа операций к суммарному объему входных и выходных данных – константа.&lt;br /&gt;
&lt;br /&gt;
= Программная реализация алгоритма =&lt;br /&gt;
&lt;br /&gt;
== Масштабируемость алгоритма и его реализации ==&lt;br /&gt;
&lt;br /&gt;
== Существующие реализации алгоритма ==&lt;br /&gt;
&lt;br /&gt;
= Литература =&lt;br /&gt;
&lt;br /&gt;
[1] С. Писсанецки. Технология разреженных матриц. Изд. Мир, 1988.&lt;/div&gt;</summary>
		<author><name>Lexaloris</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:Lexaloris/%D0%A3%D0%BC%D0%BD%D0%BE%D0%B6%D0%B5%D0%BD%D0%B8%D0%B5_%D1%80%D0%B0%D0%B7%D1%80%D0%B5%D0%B6%D0%B5%D0%BD%D0%BD%D0%BE%D0%B9_%D0%BC%D0%B0%D1%82%D1%80%D0%B8%D1%86%D1%8B_%D0%BD%D0%B0_%D0%B2%D0%B5%D0%BA%D1%82%D0%BE%D1%80&amp;diff=10088</id>
		<title>Участник:Lexaloris/Умножение разреженной матрицы на вектор</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:Lexaloris/%D0%A3%D0%BC%D0%BD%D0%BE%D0%B6%D0%B5%D0%BD%D0%B8%D0%B5_%D1%80%D0%B0%D0%B7%D1%80%D0%B5%D0%B6%D0%B5%D0%BD%D0%BD%D0%BE%D0%B9_%D0%BC%D0%B0%D1%82%D1%80%D0%B8%D1%86%D1%8B_%D0%BD%D0%B0_%D0%B2%D0%B5%D0%BA%D1%82%D0%BE%D1%80&amp;diff=10088"/>
		<updated>2016-10-15T14:59:04Z</updated>

		<summary type="html">&lt;p&gt;Lexaloris: /* Последовательная сложность алгоритма */&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(k)&amp;lt;/math&amp;gt;&lt;br /&gt;
| pf_height         = &amp;lt;math&amp;gt;O(m)&amp;lt;/math&amp;gt;&lt;br /&gt;
| pf_width          = &amp;lt;math&amp;gt;O(n)&amp;lt;/math&amp;gt;&lt;br /&gt;
| input_data        = &amp;lt;math&amp;gt;k + m&amp;lt;/math&amp;gt;&lt;br /&gt;
| output_data       = &amp;lt;math&amp;gt;n&amp;lt;/math&amp;gt;&lt;br /&gt;
}}&lt;br /&gt;
&lt;br /&gt;
&lt;br /&gt;
&#039;&#039;&#039;Авторы страницы:&#039;&#039;&#039; [[Участник:Lexaloris|A.Д. Новоселов]] и [[Участник:kochet|П.А. Кочетков]]&lt;br /&gt;
&lt;br /&gt;
= Свойства и структура алгоритмов =&lt;br /&gt;
&lt;br /&gt;
== Общее описание алгоритма ==&lt;br /&gt;
&lt;br /&gt;
=== Хранение ненулевых элементов разреженной матрицы ===&lt;br /&gt;
&lt;br /&gt;
==== Разреженный строчной формат ====&lt;br /&gt;
&lt;br /&gt;
Одной из наиболее ши­роко используемых схем хранения разреженных матриц является &#039;&#039;разреженный строчный формат&#039;&#039;. Эта&lt;br /&gt;
схема предъявляет минимальные требования к памяти и в то же время оказывается очень удобной для умножения разреженной матрицы на вектор.&lt;br /&gt;
Например, рассмотрим формат хранения разряженной матрицы &amp;lt;math&amp;gt;A&amp;lt;/math&amp;gt;:&lt;br /&gt;
&lt;br /&gt;
[[File:RRCOMatrix.png]]&lt;br /&gt;
&lt;br /&gt;
Значения нену­левых элементов матрицы и соответствующие столбцовые индексы хранятся в этой схеме по строкам в двух массивах &amp;lt;math&amp;gt;AN&amp;lt;/math&amp;gt; и &amp;lt;math&amp;gt;JA&amp;lt;/math&amp;gt; соответственно. Используется также массив указателей &amp;lt;math&amp;gt;IA&amp;lt;/math&amp;gt;, отмечающих позиции массивов &amp;lt;math&amp;gt;AN&amp;lt;/math&amp;gt; и &amp;lt;math&amp;gt;JA&amp;lt;/math&amp;gt;, с которых начинается описание очередной строки. Дополнительная компо­нента в &amp;lt;math&amp;gt;IA&amp;lt;/math&amp;gt; содержит указатель первой свободной позиции в &amp;lt;math&amp;gt;JA&amp;lt;/math&amp;gt; и &amp;lt;math&amp;gt;AN&amp;lt;/math&amp;gt;.&lt;br /&gt;
&lt;br /&gt;
Таким образом &amp;lt;math&amp;gt;A&amp;lt;/math&amp;gt; представляется в виде:&lt;br /&gt;
&lt;br /&gt;
   IA = [ 1 4 4 6 ]&lt;br /&gt;
   JA = [ 3 4 8 6 8 ]&lt;br /&gt;
   AN = [ 1 3 5 7 1 ]&lt;br /&gt;
&lt;br /&gt;
Данный способ представления называют &#039;&#039;полным&#039;&#039;, поскольку представлена вся матрица &amp;lt;math&amp;gt;A&amp;lt;/math&amp;gt;, и &#039;&#039;упорядоченным&#039;&#039;, поскольку эле­менты каждой строки хранятся в соответствии с возрастанием столбцовых индексов. Таким образом, это строчное представление, полное и упорядоченное, или сокращенно &#039;&#039;&#039;(RR (С) О)&#039;&#039;&#039;.&lt;br /&gt;
&lt;br /&gt;
==== Неупорядоченное представление ====&lt;br /&gt;
&lt;br /&gt;
Представления разреженных матриц необязательно должны быть упорядочены в том смысле, что, хотя упорядоченность строк поддерживается, внутри каждой строки элементы могут храниться в произвольном порядке. Для матрицы А нашего примера вполне можно было бы использовать и строчное представление, полное, но &#039;&#039;неупорядоченное&#039;&#039; &#039;&#039;&#039;(RR (С) U )&#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;
   IA = [ 1 4 4 6 ]&lt;br /&gt;
   JA = [ 8 3 4 8 6 ]&lt;br /&gt;
   AN = [ 5 1 3 1 7 ]&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; — число строк матрицы. &lt;br /&gt;
Для каждой ее строки &amp;lt;math&amp;gt;I&amp;lt;/math&amp;gt; матрицы мы находим с помощью &amp;lt;math&amp;gt;IA&amp;lt;/math&amp;gt; значения первой &amp;lt;math&amp;gt;IAA&amp;lt;/math&amp;gt; и последней &amp;lt;math&amp;gt;IAB&amp;lt;/math&amp;gt; позиций, занимаемых элементами строки &amp;lt;math&amp;gt;I&amp;lt;/math&amp;gt; в массивах &amp;lt;math&amp;gt;JA&amp;lt;/math&amp;gt; и &amp;lt;math&amp;gt;AN&amp;lt;/math&amp;gt;. Затем, чтобы вычислить скалярное произведение строки &amp;lt;math&amp;gt;I&amp;lt;/math&amp;gt; и вектора &amp;lt;math&amp;gt;B&amp;lt;/math&amp;gt;, мы просто просматриваем &amp;lt;math&amp;gt;JA&amp;lt;/math&amp;gt; и &amp;lt;math&amp;gt;AN&amp;lt;/math&amp;gt; на отрезке от &amp;lt;math&amp;gt;IAA&amp;lt;/math&amp;gt; до &amp;lt;math&amp;gt;IAB&amp;lt;/math&amp;gt;:&lt;br /&gt;
каждое значение, хранимое в &amp;lt;math&amp;gt;JA&amp;lt;/math&amp;gt;, есть столбцовый индекс и используется для извлечения из массива &amp;lt;math&amp;gt;B&amp;lt;/math&amp;gt; элемента, который должен быть умножен на соответствующее число из &amp;lt;math&amp;gt;AN&amp;lt;/math&amp;gt;. Результат каж­дого умножения прибавляется к &amp;lt;math&amp;gt;C(I)&amp;lt;/math&amp;gt;.&lt;br /&gt;
&lt;br /&gt;
== Математическое описание алгоритма ==&lt;br /&gt;
&lt;br /&gt;
&#039;&#039;&#039;Исходные данные:&#039;&#039;&#039; &lt;br /&gt;
&lt;br /&gt;
&amp;lt;math&amp;gt;IA, JA, AN&amp;lt;/math&amp;gt; - заданная матрица в форме &#039;&#039;&#039;(RR (С) U)&#039;&#039;&#039;;&lt;br /&gt;
&lt;br /&gt;
&amp;lt;math&amp;gt;B&amp;lt;/math&amp;gt; - заданный заполненный вектор;&lt;br /&gt;
&lt;br /&gt;
&amp;lt;math&amp;gt;N&amp;lt;/math&amp;gt; - число строк матрицы.&lt;br /&gt;
&lt;br /&gt;
&#039;&#039;&#039;Выход:&#039;&#039;&#039; &amp;lt;math&amp;gt;C&amp;lt;/math&amp;gt; вектор-произведение размерности &amp;lt;math&amp;gt;N&amp;lt;/math&amp;gt;.&lt;br /&gt;
&lt;br /&gt;
&#039;&#039;&#039;Формулы метода:&#039;&#039;&#039;&lt;br /&gt;
&lt;br /&gt;
:&amp;lt;math&amp;gt;&lt;br /&gt;
\begin{align}&lt;br /&gt;
&amp;amp; IAA_{i} = IA(i), \quad i \in [1, N], \\&lt;br /&gt;
&amp;amp; IAB_{i} = IA(i + 1) - 1, \quad i \in [1, N], \\&lt;br /&gt;
&amp;amp; c_{i} = \sum\limits_{j = IAA_{i}}^{IAB_{i}} AN(j)B(JA(j)), \quad i \in [1, N] \\&lt;br /&gt;
\end{align}&lt;br /&gt;
&amp;lt;/math&amp;gt;&lt;br /&gt;
&lt;br /&gt;
== Вычислительное ядро алгоритма ==&lt;br /&gt;
&lt;br /&gt;
Вычислительным ядром, т.е. той частью алгоритма, на которую приходится основное время его работы, является вычисление значения &amp;lt;math&amp;gt;i&amp;lt;/math&amp;gt;-го элемента &amp;lt;math&amp;gt;c_{i}&amp;lt;/math&amp;gt; вектора-произведения, т.е произведения строки &amp;lt;math&amp;gt;I&amp;lt;/math&amp;gt; матрицы &amp;lt;math&amp;gt;A&amp;lt;/math&amp;gt; и вектора &amp;lt;math&amp;gt;B&amp;lt;/math&amp;gt; по формуле:&lt;br /&gt;
&lt;br /&gt;
:&amp;lt;math&amp;gt;&lt;br /&gt;
\begin{align}&lt;br /&gt;
&amp;amp; c_{i} = \sum\limits_{j = IAA_{i}}^{IAB_{i}} AN(j)B(JA(j)), \quad i \in [1, N] \\&lt;br /&gt;
\end{align}&lt;br /&gt;
&amp;lt;/math&amp;gt;&lt;br /&gt;
&lt;br /&gt;
== Макроструктура алгоритма ==&lt;br /&gt;
&lt;br /&gt;
Основу алгоритма составляет вычисление значения &amp;lt;math&amp;gt;i&amp;lt;/math&amp;gt;-го элемента &amp;lt;math&amp;gt;c_{i}&amp;lt;/math&amp;gt; вектора-произведения:&lt;br /&gt;
&lt;br /&gt;
:&amp;lt;math&amp;gt;&lt;br /&gt;
\begin{align}&lt;br /&gt;
&amp;amp; c_{i} = \sum\limits_{j = IAA_{i}}^{IAB_{i}} AN(j)B(JA(j)), \quad i \in [1, N] \\&lt;br /&gt;
\end{align}&lt;br /&gt;
&amp;lt;/math&amp;gt;&lt;br /&gt;
&lt;br /&gt;
== Схема реализации последовательного алгоритма ==&lt;br /&gt;
&lt;br /&gt;
Последовательность исполнения метода следующая: &lt;br /&gt;
&lt;br /&gt;
Далее для всех &amp;lt;math&amp;gt;i&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; по нарастанию выполняются:&lt;br /&gt;
&lt;br /&gt;
1. &amp;lt;math&amp;gt; c_{i} = 0; IAA = IA(i); IAB = IA(i + 1 ) - 1 &amp;lt;/math&amp;gt;&lt;br /&gt;
&lt;br /&gt;
После этого, если &amp;lt;math&amp;gt;(IAB \le IAA)&amp;lt;/math&amp;gt;:&lt;br /&gt;
&lt;br /&gt;
2. Для всех &amp;lt;math&amp;gt;j&amp;lt;/math&amp;gt; от &amp;lt;math&amp;gt;IAA&amp;lt;/math&amp;gt; до &amp;lt;math&amp;gt;IAB&amp;lt;/math&amp;gt; выполняется: &lt;br /&gt;
&lt;br /&gt;
&amp;lt;math&amp;gt;c_{i} = \sum\limits_{j = IAA_{i}}^{IAB_{i}} AN(j)B(JA(j))&amp;lt;/math&amp;gt;&lt;br /&gt;
&lt;br /&gt;
Псевдокод алгоритма: &lt;br /&gt;
&lt;br /&gt;
    FOR I = 1, N                          (1)&lt;br /&gt;
       U = 0.                             (2) &lt;br /&gt;
       IAA = IA(I)                        (3) &lt;br /&gt;
       IAB = IA(I + 1 ) - 1               (4)&lt;br /&gt;
       IF NOT(IAB.LT.IAA)                 (5)&lt;br /&gt;
           FOR J = IAA, IAB               (6)&lt;br /&gt;
           C(I) = U + AN(J)*B(JA(J))      (7)&lt;br /&gt;
&lt;br /&gt;
== Последовательная сложность алгоритма ==&lt;br /&gt;
&lt;br /&gt;
Для всего алгоритма потребуется выполнить &amp;lt;math&amp;gt;O(k)&amp;lt;/math&amp;gt; операций, как в строке стр.7 псевдокода алгоритма [[#Схема реализации последовательного алгоритма|п.1.5]], где &amp;lt;math&amp;gt;k&amp;lt;/math&amp;gt; - число ненулевых эле­ментов матрицы.&lt;br /&gt;
&lt;br /&gt;
== Информационный граф ==&lt;br /&gt;
&lt;br /&gt;
[[file:InfoGrafMatrixRRCUandVextor.jpg|thumb|center|1200px|Рисунок 1. Информационный граф алгоритма.]]&lt;br /&gt;
&lt;br /&gt;
== Ресурс параллелизма алгоритма ==&lt;br /&gt;
&lt;br /&gt;
== Входные и выходные данные алгоритма ==&lt;br /&gt;
&lt;br /&gt;
== Свойства алгоритма ==&lt;br /&gt;
&lt;br /&gt;
Алгоритм в рамках выбранной версии полностью детерминирован.&lt;br /&gt;
&lt;br /&gt;
Вычислительная мощность алгоритма, как отношение числа операций к суммарному объему входных и выходных данных – константа.&lt;br /&gt;
&lt;br /&gt;
= Программная реализация алгоритма =&lt;br /&gt;
&lt;br /&gt;
== Масштабируемость алгоритма и его реализации ==&lt;br /&gt;
&lt;br /&gt;
== Существующие реализации алгоритма ==&lt;br /&gt;
&lt;br /&gt;
= Литература =&lt;br /&gt;
&lt;br /&gt;
[1] С. Писсанецки. Технология разреженных матриц. Изд. Мир, 1988.&lt;/div&gt;</summary>
		<author><name>Lexaloris</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:Lexaloris/%D0%A3%D0%BC%D0%BD%D0%BE%D0%B6%D0%B5%D0%BD%D0%B8%D0%B5_%D1%80%D0%B0%D0%B7%D1%80%D0%B5%D0%B6%D0%B5%D0%BD%D0%BD%D0%BE%D0%B9_%D0%BC%D0%B0%D1%82%D1%80%D0%B8%D1%86%D1%8B_%D0%BD%D0%B0_%D0%B2%D0%B5%D0%BA%D1%82%D0%BE%D1%80&amp;diff=10085</id>
		<title>Участник:Lexaloris/Умножение разреженной матрицы на вектор</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:Lexaloris/%D0%A3%D0%BC%D0%BD%D0%BE%D0%B6%D0%B5%D0%BD%D0%B8%D0%B5_%D1%80%D0%B0%D0%B7%D1%80%D0%B5%D0%B6%D0%B5%D0%BD%D0%BD%D0%BE%D0%B9_%D0%BC%D0%B0%D1%82%D1%80%D0%B8%D1%86%D1%8B_%D0%BD%D0%B0_%D0%B2%D0%B5%D0%BA%D1%82%D0%BE%D1%80&amp;diff=10085"/>
		<updated>2016-10-15T14:58:38Z</updated>

		<summary type="html">&lt;p&gt;Lexaloris: /* Последовательная сложность алгоритма */&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(k)&amp;lt;/math&amp;gt;&lt;br /&gt;
| pf_height         = &amp;lt;math&amp;gt;O(m)&amp;lt;/math&amp;gt;&lt;br /&gt;
| pf_width          = &amp;lt;math&amp;gt;O(n)&amp;lt;/math&amp;gt;&lt;br /&gt;
| input_data        = &amp;lt;math&amp;gt;k + m&amp;lt;/math&amp;gt;&lt;br /&gt;
| output_data       = &amp;lt;math&amp;gt;n&amp;lt;/math&amp;gt;&lt;br /&gt;
}}&lt;br /&gt;
&lt;br /&gt;
&lt;br /&gt;
&#039;&#039;&#039;Авторы страницы:&#039;&#039;&#039; [[Участник:Lexaloris|A.Д. Новоселов]] и [[Участник:kochet|П.А. Кочетков]]&lt;br /&gt;
&lt;br /&gt;
= Свойства и структура алгоритмов =&lt;br /&gt;
&lt;br /&gt;
== Общее описание алгоритма ==&lt;br /&gt;
&lt;br /&gt;
=== Хранение ненулевых элементов разреженной матрицы ===&lt;br /&gt;
&lt;br /&gt;
==== Разреженный строчной формат ====&lt;br /&gt;
&lt;br /&gt;
Одной из наиболее ши­роко используемых схем хранения разреженных матриц является &#039;&#039;разреженный строчный формат&#039;&#039;. Эта&lt;br /&gt;
схема предъявляет минимальные требования к памяти и в то же время оказывается очень удобной для умножения разреженной матрицы на вектор.&lt;br /&gt;
Например, рассмотрим формат хранения разряженной матрицы &amp;lt;math&amp;gt;A&amp;lt;/math&amp;gt;:&lt;br /&gt;
&lt;br /&gt;
[[File:RRCOMatrix.png]]&lt;br /&gt;
&lt;br /&gt;
Значения нену­левых элементов матрицы и соответствующие столбцовые индексы хранятся в этой схеме по строкам в двух массивах &amp;lt;math&amp;gt;AN&amp;lt;/math&amp;gt; и &amp;lt;math&amp;gt;JA&amp;lt;/math&amp;gt; соответственно. Используется также массив указателей &amp;lt;math&amp;gt;IA&amp;lt;/math&amp;gt;, отмечающих позиции массивов &amp;lt;math&amp;gt;AN&amp;lt;/math&amp;gt; и &amp;lt;math&amp;gt;JA&amp;lt;/math&amp;gt;, с которых начинается описание очередной строки. Дополнительная компо­нента в &amp;lt;math&amp;gt;IA&amp;lt;/math&amp;gt; содержит указатель первой свободной позиции в &amp;lt;math&amp;gt;JA&amp;lt;/math&amp;gt; и &amp;lt;math&amp;gt;AN&amp;lt;/math&amp;gt;.&lt;br /&gt;
&lt;br /&gt;
Таким образом &amp;lt;math&amp;gt;A&amp;lt;/math&amp;gt; представляется в виде:&lt;br /&gt;
&lt;br /&gt;
   IA = [ 1 4 4 6 ]&lt;br /&gt;
   JA = [ 3 4 8 6 8 ]&lt;br /&gt;
   AN = [ 1 3 5 7 1 ]&lt;br /&gt;
&lt;br /&gt;
Данный способ представления называют &#039;&#039;полным&#039;&#039;, поскольку представлена вся матрица &amp;lt;math&amp;gt;A&amp;lt;/math&amp;gt;, и &#039;&#039;упорядоченным&#039;&#039;, поскольку эле­менты каждой строки хранятся в соответствии с возрастанием столбцовых индексов. Таким образом, это строчное представление, полное и упорядоченное, или сокращенно &#039;&#039;&#039;(RR (С) О)&#039;&#039;&#039;.&lt;br /&gt;
&lt;br /&gt;
==== Неупорядоченное представление ====&lt;br /&gt;
&lt;br /&gt;
Представления разреженных матриц необязательно должны быть упорядочены в том смысле, что, хотя упорядоченность строк поддерживается, внутри каждой строки элементы могут храниться в произвольном порядке. Для матрицы А нашего примера вполне можно было бы использовать и строчное представление, полное, но &#039;&#039;неупорядоченное&#039;&#039; &#039;&#039;&#039;(RR (С) U )&#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;
   IA = [ 1 4 4 6 ]&lt;br /&gt;
   JA = [ 8 3 4 8 6 ]&lt;br /&gt;
   AN = [ 5 1 3 1 7 ]&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; — число строк матрицы. &lt;br /&gt;
Для каждой ее строки &amp;lt;math&amp;gt;I&amp;lt;/math&amp;gt; матрицы мы находим с помощью &amp;lt;math&amp;gt;IA&amp;lt;/math&amp;gt; значения первой &amp;lt;math&amp;gt;IAA&amp;lt;/math&amp;gt; и последней &amp;lt;math&amp;gt;IAB&amp;lt;/math&amp;gt; позиций, занимаемых элементами строки &amp;lt;math&amp;gt;I&amp;lt;/math&amp;gt; в массивах &amp;lt;math&amp;gt;JA&amp;lt;/math&amp;gt; и &amp;lt;math&amp;gt;AN&amp;lt;/math&amp;gt;. Затем, чтобы вычислить скалярное произведение строки &amp;lt;math&amp;gt;I&amp;lt;/math&amp;gt; и вектора &amp;lt;math&amp;gt;B&amp;lt;/math&amp;gt;, мы просто просматриваем &amp;lt;math&amp;gt;JA&amp;lt;/math&amp;gt; и &amp;lt;math&amp;gt;AN&amp;lt;/math&amp;gt; на отрезке от &amp;lt;math&amp;gt;IAA&amp;lt;/math&amp;gt; до &amp;lt;math&amp;gt;IAB&amp;lt;/math&amp;gt;:&lt;br /&gt;
каждое значение, хранимое в &amp;lt;math&amp;gt;JA&amp;lt;/math&amp;gt;, есть столбцовый индекс и используется для извлечения из массива &amp;lt;math&amp;gt;B&amp;lt;/math&amp;gt; элемента, который должен быть умножен на соответствующее число из &amp;lt;math&amp;gt;AN&amp;lt;/math&amp;gt;. Результат каж­дого умножения прибавляется к &amp;lt;math&amp;gt;C(I)&amp;lt;/math&amp;gt;.&lt;br /&gt;
&lt;br /&gt;
== Математическое описание алгоритма ==&lt;br /&gt;
&lt;br /&gt;
&#039;&#039;&#039;Исходные данные:&#039;&#039;&#039; &lt;br /&gt;
&lt;br /&gt;
&amp;lt;math&amp;gt;IA, JA, AN&amp;lt;/math&amp;gt; - заданная матрица в форме &#039;&#039;&#039;(RR (С) U)&#039;&#039;&#039;;&lt;br /&gt;
&lt;br /&gt;
&amp;lt;math&amp;gt;B&amp;lt;/math&amp;gt; - заданный заполненный вектор;&lt;br /&gt;
&lt;br /&gt;
&amp;lt;math&amp;gt;N&amp;lt;/math&amp;gt; - число строк матрицы.&lt;br /&gt;
&lt;br /&gt;
&#039;&#039;&#039;Выход:&#039;&#039;&#039; &amp;lt;math&amp;gt;C&amp;lt;/math&amp;gt; вектор-произведение размерности &amp;lt;math&amp;gt;N&amp;lt;/math&amp;gt;.&lt;br /&gt;
&lt;br /&gt;
&#039;&#039;&#039;Формулы метода:&#039;&#039;&#039;&lt;br /&gt;
&lt;br /&gt;
:&amp;lt;math&amp;gt;&lt;br /&gt;
\begin{align}&lt;br /&gt;
&amp;amp; IAA_{i} = IA(i), \quad i \in [1, N], \\&lt;br /&gt;
&amp;amp; IAB_{i} = IA(i + 1) - 1, \quad i \in [1, N], \\&lt;br /&gt;
&amp;amp; c_{i} = \sum\limits_{j = IAA_{i}}^{IAB_{i}} AN(j)B(JA(j)), \quad i \in [1, N] \\&lt;br /&gt;
\end{align}&lt;br /&gt;
&amp;lt;/math&amp;gt;&lt;br /&gt;
&lt;br /&gt;
== Вычислительное ядро алгоритма ==&lt;br /&gt;
&lt;br /&gt;
Вычислительным ядром, т.е. той частью алгоритма, на которую приходится основное время его работы, является вычисление значения &amp;lt;math&amp;gt;i&amp;lt;/math&amp;gt;-го элемента &amp;lt;math&amp;gt;c_{i}&amp;lt;/math&amp;gt; вектора-произведения, т.е произведения строки &amp;lt;math&amp;gt;I&amp;lt;/math&amp;gt; матрицы &amp;lt;math&amp;gt;A&amp;lt;/math&amp;gt; и вектора &amp;lt;math&amp;gt;B&amp;lt;/math&amp;gt; по формуле:&lt;br /&gt;
&lt;br /&gt;
:&amp;lt;math&amp;gt;&lt;br /&gt;
\begin{align}&lt;br /&gt;
&amp;amp; c_{i} = \sum\limits_{j = IAA_{i}}^{IAB_{i}} AN(j)B(JA(j)), \quad i \in [1, N] \\&lt;br /&gt;
\end{align}&lt;br /&gt;
&amp;lt;/math&amp;gt;&lt;br /&gt;
&lt;br /&gt;
== Макроструктура алгоритма ==&lt;br /&gt;
&lt;br /&gt;
Основу алгоритма составляет вычисление значения &amp;lt;math&amp;gt;i&amp;lt;/math&amp;gt;-го элемента &amp;lt;math&amp;gt;c_{i}&amp;lt;/math&amp;gt; вектора-произведения:&lt;br /&gt;
&lt;br /&gt;
:&amp;lt;math&amp;gt;&lt;br /&gt;
\begin{align}&lt;br /&gt;
&amp;amp; c_{i} = \sum\limits_{j = IAA_{i}}^{IAB_{i}} AN(j)B(JA(j)), \quad i \in [1, N] \\&lt;br /&gt;
\end{align}&lt;br /&gt;
&amp;lt;/math&amp;gt;&lt;br /&gt;
&lt;br /&gt;
== Схема реализации последовательного алгоритма ==&lt;br /&gt;
&lt;br /&gt;
Последовательность исполнения метода следующая: &lt;br /&gt;
&lt;br /&gt;
Далее для всех &amp;lt;math&amp;gt;i&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; по нарастанию выполняются:&lt;br /&gt;
&lt;br /&gt;
1. &amp;lt;math&amp;gt; c_{i} = 0; IAA = IA(i); IAB = IA(i + 1 ) - 1 &amp;lt;/math&amp;gt;&lt;br /&gt;
&lt;br /&gt;
После этого, если &amp;lt;math&amp;gt;(IAB \le IAA)&amp;lt;/math&amp;gt;:&lt;br /&gt;
&lt;br /&gt;
2. Для всех &amp;lt;math&amp;gt;j&amp;lt;/math&amp;gt; от &amp;lt;math&amp;gt;IAA&amp;lt;/math&amp;gt; до &amp;lt;math&amp;gt;IAB&amp;lt;/math&amp;gt; выполняется: &lt;br /&gt;
&lt;br /&gt;
&amp;lt;math&amp;gt;c_{i} = \sum\limits_{j = IAA_{i}}^{IAB_{i}} AN(j)B(JA(j))&amp;lt;/math&amp;gt;&lt;br /&gt;
&lt;br /&gt;
Псевдокод алгоритма: &lt;br /&gt;
&lt;br /&gt;
    FOR I = 1, N                          (1)&lt;br /&gt;
       U = 0.                             (2) &lt;br /&gt;
       IAA = IA(I)                        (3) &lt;br /&gt;
       IAB = IA(I + 1 ) - 1               (4)&lt;br /&gt;
       IF NOT(IAB.LT.IAA)                 (5)&lt;br /&gt;
           FOR J = IAA, IAB               (6)&lt;br /&gt;
           C(I) = U + AN(J)*B(JA(J))      (7)&lt;br /&gt;
&lt;br /&gt;
== Последовательная сложность алгоритма ==&lt;br /&gt;
&lt;br /&gt;
Для всего алгоритма потребуется выполнить &amp;lt;math&amp;gt;O(k)&amp;lt;/math&amp;gt; операций, как в строке стр.7 псевдокода алгоритма [[#Вычислительное ядро алгоритма|п.1.5]], где &amp;lt;math&amp;gt;k&amp;lt;/math&amp;gt; - число ненулевых эле­ментов матрицы.&lt;br /&gt;
&lt;br /&gt;
== Информационный граф ==&lt;br /&gt;
&lt;br /&gt;
[[file:InfoGrafMatrixRRCUandVextor.jpg|thumb|center|1200px|Рисунок 1. Информационный граф алгоритма.]]&lt;br /&gt;
&lt;br /&gt;
== Ресурс параллелизма алгоритма ==&lt;br /&gt;
&lt;br /&gt;
== Входные и выходные данные алгоритма ==&lt;br /&gt;
&lt;br /&gt;
== Свойства алгоритма ==&lt;br /&gt;
&lt;br /&gt;
Алгоритм в рамках выбранной версии полностью детерминирован.&lt;br /&gt;
&lt;br /&gt;
Вычислительная мощность алгоритма, как отношение числа операций к суммарному объему входных и выходных данных – константа.&lt;br /&gt;
&lt;br /&gt;
= Программная реализация алгоритма =&lt;br /&gt;
&lt;br /&gt;
== Масштабируемость алгоритма и его реализации ==&lt;br /&gt;
&lt;br /&gt;
== Существующие реализации алгоритма ==&lt;br /&gt;
&lt;br /&gt;
= Литература =&lt;br /&gt;
&lt;br /&gt;
[1] С. Писсанецки. Технология разреженных матриц. Изд. Мир, 1988.&lt;/div&gt;</summary>
		<author><name>Lexaloris</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:Lexaloris/%D0%A3%D0%BC%D0%BD%D0%BE%D0%B6%D0%B5%D0%BD%D0%B8%D0%B5_%D1%80%D0%B0%D0%B7%D1%80%D0%B5%D0%B6%D0%B5%D0%BD%D0%BD%D0%BE%D0%B9_%D0%BC%D0%B0%D1%82%D1%80%D0%B8%D1%86%D1%8B_%D0%BD%D0%B0_%D0%B2%D0%B5%D0%BA%D1%82%D0%BE%D1%80&amp;diff=10081</id>
		<title>Участник:Lexaloris/Умножение разреженной матрицы на вектор</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:Lexaloris/%D0%A3%D0%BC%D0%BD%D0%BE%D0%B6%D0%B5%D0%BD%D0%B8%D0%B5_%D1%80%D0%B0%D0%B7%D1%80%D0%B5%D0%B6%D0%B5%D0%BD%D0%BD%D0%BE%D0%B9_%D0%BC%D0%B0%D1%82%D1%80%D0%B8%D1%86%D1%8B_%D0%BD%D0%B0_%D0%B2%D0%B5%D0%BA%D1%82%D0%BE%D1%80&amp;diff=10081"/>
		<updated>2016-10-15T14:57:38Z</updated>

		<summary type="html">&lt;p&gt;Lexaloris: /* Последовательная сложность алгоритма */&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(k)&amp;lt;/math&amp;gt;&lt;br /&gt;
| pf_height         = &amp;lt;math&amp;gt;O(m)&amp;lt;/math&amp;gt;&lt;br /&gt;
| pf_width          = &amp;lt;math&amp;gt;O(n)&amp;lt;/math&amp;gt;&lt;br /&gt;
| input_data        = &amp;lt;math&amp;gt;k + m&amp;lt;/math&amp;gt;&lt;br /&gt;
| output_data       = &amp;lt;math&amp;gt;n&amp;lt;/math&amp;gt;&lt;br /&gt;
}}&lt;br /&gt;
&lt;br /&gt;
&lt;br /&gt;
&#039;&#039;&#039;Авторы страницы:&#039;&#039;&#039; [[Участник:Lexaloris|A.Д. Новоселов]] и [[Участник:kochet|П.А. Кочетков]]&lt;br /&gt;
&lt;br /&gt;
= Свойства и структура алгоритмов =&lt;br /&gt;
&lt;br /&gt;
== Общее описание алгоритма ==&lt;br /&gt;
&lt;br /&gt;
=== Хранение ненулевых элементов разреженной матрицы ===&lt;br /&gt;
&lt;br /&gt;
==== Разреженный строчной формат ====&lt;br /&gt;
&lt;br /&gt;
Одной из наиболее ши­роко используемых схем хранения разреженных матриц является &#039;&#039;разреженный строчный формат&#039;&#039;. Эта&lt;br /&gt;
схема предъявляет минимальные требования к памяти и в то же время оказывается очень удобной для умножения разреженной матрицы на вектор.&lt;br /&gt;
Например, рассмотрим формат хранения разряженной матрицы &amp;lt;math&amp;gt;A&amp;lt;/math&amp;gt;:&lt;br /&gt;
&lt;br /&gt;
[[File:RRCOMatrix.png]]&lt;br /&gt;
&lt;br /&gt;
Значения нену­левых элементов матрицы и соответствующие столбцовые индексы хранятся в этой схеме по строкам в двух массивах &amp;lt;math&amp;gt;AN&amp;lt;/math&amp;gt; и &amp;lt;math&amp;gt;JA&amp;lt;/math&amp;gt; соответственно. Используется также массив указателей &amp;lt;math&amp;gt;IA&amp;lt;/math&amp;gt;, отмечающих позиции массивов &amp;lt;math&amp;gt;AN&amp;lt;/math&amp;gt; и &amp;lt;math&amp;gt;JA&amp;lt;/math&amp;gt;, с которых начинается описание очередной строки. Дополнительная компо­нента в &amp;lt;math&amp;gt;IA&amp;lt;/math&amp;gt; содержит указатель первой свободной позиции в &amp;lt;math&amp;gt;JA&amp;lt;/math&amp;gt; и &amp;lt;math&amp;gt;AN&amp;lt;/math&amp;gt;.&lt;br /&gt;
&lt;br /&gt;
Таким образом &amp;lt;math&amp;gt;A&amp;lt;/math&amp;gt; представляется в виде:&lt;br /&gt;
&lt;br /&gt;
   IA = [ 1 4 4 6 ]&lt;br /&gt;
   JA = [ 3 4 8 6 8 ]&lt;br /&gt;
   AN = [ 1 3 5 7 1 ]&lt;br /&gt;
&lt;br /&gt;
Данный способ представления называют &#039;&#039;полным&#039;&#039;, поскольку представлена вся матрица &amp;lt;math&amp;gt;A&amp;lt;/math&amp;gt;, и &#039;&#039;упорядоченным&#039;&#039;, поскольку эле­менты каждой строки хранятся в соответствии с возрастанием столбцовых индексов. Таким образом, это строчное представление, полное и упорядоченное, или сокращенно &#039;&#039;&#039;(RR (С) О)&#039;&#039;&#039;.&lt;br /&gt;
&lt;br /&gt;
==== Неупорядоченное представление ====&lt;br /&gt;
&lt;br /&gt;
Представления разреженных матриц необязательно должны быть упорядочены в том смысле, что, хотя упорядоченность строк поддерживается, внутри каждой строки элементы могут храниться в произвольном порядке. Для матрицы А нашего примера вполне можно было бы использовать и строчное представление, полное, но &#039;&#039;неупорядоченное&#039;&#039; &#039;&#039;&#039;(RR (С) U )&#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;
   IA = [ 1 4 4 6 ]&lt;br /&gt;
   JA = [ 8 3 4 8 6 ]&lt;br /&gt;
   AN = [ 5 1 3 1 7 ]&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; — число строк матрицы. &lt;br /&gt;
Для каждой ее строки &amp;lt;math&amp;gt;I&amp;lt;/math&amp;gt; матрицы мы находим с помощью &amp;lt;math&amp;gt;IA&amp;lt;/math&amp;gt; значения первой &amp;lt;math&amp;gt;IAA&amp;lt;/math&amp;gt; и последней &amp;lt;math&amp;gt;IAB&amp;lt;/math&amp;gt; позиций, занимаемых элементами строки &amp;lt;math&amp;gt;I&amp;lt;/math&amp;gt; в массивах &amp;lt;math&amp;gt;JA&amp;lt;/math&amp;gt; и &amp;lt;math&amp;gt;AN&amp;lt;/math&amp;gt;. Затем, чтобы вычислить скалярное произведение строки &amp;lt;math&amp;gt;I&amp;lt;/math&amp;gt; и вектора &amp;lt;math&amp;gt;B&amp;lt;/math&amp;gt;, мы просто просматриваем &amp;lt;math&amp;gt;JA&amp;lt;/math&amp;gt; и &amp;lt;math&amp;gt;AN&amp;lt;/math&amp;gt; на отрезке от &amp;lt;math&amp;gt;IAA&amp;lt;/math&amp;gt; до &amp;lt;math&amp;gt;IAB&amp;lt;/math&amp;gt;:&lt;br /&gt;
каждое значение, хранимое в &amp;lt;math&amp;gt;JA&amp;lt;/math&amp;gt;, есть столбцовый индекс и используется для извлечения из массива &amp;lt;math&amp;gt;B&amp;lt;/math&amp;gt; элемента, который должен быть умножен на соответствующее число из &amp;lt;math&amp;gt;AN&amp;lt;/math&amp;gt;. Результат каж­дого умножения прибавляется к &amp;lt;math&amp;gt;C(I)&amp;lt;/math&amp;gt;.&lt;br /&gt;
&lt;br /&gt;
== Математическое описание алгоритма ==&lt;br /&gt;
&lt;br /&gt;
&#039;&#039;&#039;Исходные данные:&#039;&#039;&#039; &lt;br /&gt;
&lt;br /&gt;
&amp;lt;math&amp;gt;IA, JA, AN&amp;lt;/math&amp;gt; - заданная матрица в форме &#039;&#039;&#039;(RR (С) U)&#039;&#039;&#039;;&lt;br /&gt;
&lt;br /&gt;
&amp;lt;math&amp;gt;B&amp;lt;/math&amp;gt; - заданный заполненный вектор;&lt;br /&gt;
&lt;br /&gt;
&amp;lt;math&amp;gt;N&amp;lt;/math&amp;gt; - число строк матрицы.&lt;br /&gt;
&lt;br /&gt;
&#039;&#039;&#039;Выход:&#039;&#039;&#039; &amp;lt;math&amp;gt;C&amp;lt;/math&amp;gt; вектор-произведение размерности &amp;lt;math&amp;gt;N&amp;lt;/math&amp;gt;.&lt;br /&gt;
&lt;br /&gt;
&#039;&#039;&#039;Формулы метода:&#039;&#039;&#039;&lt;br /&gt;
&lt;br /&gt;
:&amp;lt;math&amp;gt;&lt;br /&gt;
\begin{align}&lt;br /&gt;
&amp;amp; IAA_{i} = IA(i), \quad i \in [1, N], \\&lt;br /&gt;
&amp;amp; IAB_{i} = IA(i + 1) - 1, \quad i \in [1, N], \\&lt;br /&gt;
&amp;amp; c_{i} = \sum\limits_{j = IAA_{i}}^{IAB_{i}} AN(j)B(JA(j)), \quad i \in [1, N] \\&lt;br /&gt;
\end{align}&lt;br /&gt;
&amp;lt;/math&amp;gt;&lt;br /&gt;
&lt;br /&gt;
== Вычислительное ядро алгоритма ==&lt;br /&gt;
&lt;br /&gt;
Вычислительным ядром, т.е. той частью алгоритма, на которую приходится основное время его работы, является вычисление значения &amp;lt;math&amp;gt;i&amp;lt;/math&amp;gt;-го элемента &amp;lt;math&amp;gt;c_{i}&amp;lt;/math&amp;gt; вектора-произведения, т.е произведения строки &amp;lt;math&amp;gt;I&amp;lt;/math&amp;gt; матрицы &amp;lt;math&amp;gt;A&amp;lt;/math&amp;gt; и вектора &amp;lt;math&amp;gt;B&amp;lt;/math&amp;gt; по формуле:&lt;br /&gt;
&lt;br /&gt;
:&amp;lt;math&amp;gt;&lt;br /&gt;
\begin{align}&lt;br /&gt;
&amp;amp; c_{i} = \sum\limits_{j = IAA_{i}}^{IAB_{i}} AN(j)B(JA(j)), \quad i \in [1, N] \\&lt;br /&gt;
\end{align}&lt;br /&gt;
&amp;lt;/math&amp;gt;&lt;br /&gt;
&lt;br /&gt;
== Макроструктура алгоритма ==&lt;br /&gt;
&lt;br /&gt;
Основу алгоритма составляет вычисление значения &amp;lt;math&amp;gt;i&amp;lt;/math&amp;gt;-го элемента &amp;lt;math&amp;gt;c_{i}&amp;lt;/math&amp;gt; вектора-произведения:&lt;br /&gt;
&lt;br /&gt;
:&amp;lt;math&amp;gt;&lt;br /&gt;
\begin{align}&lt;br /&gt;
&amp;amp; c_{i} = \sum\limits_{j = IAA_{i}}^{IAB_{i}} AN(j)B(JA(j)), \quad i \in [1, N] \\&lt;br /&gt;
\end{align}&lt;br /&gt;
&amp;lt;/math&amp;gt;&lt;br /&gt;
&lt;br /&gt;
== Схема реализации последовательного алгоритма ==&lt;br /&gt;
&lt;br /&gt;
Последовательность исполнения метода следующая: &lt;br /&gt;
&lt;br /&gt;
Далее для всех &amp;lt;math&amp;gt;i&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; по нарастанию выполняются:&lt;br /&gt;
&lt;br /&gt;
1. &amp;lt;math&amp;gt; c_{i} = 0; IAA = IA(i); IAB = IA(i + 1 ) - 1 &amp;lt;/math&amp;gt;&lt;br /&gt;
&lt;br /&gt;
После этого, если &amp;lt;math&amp;gt;(IAB \le IAA)&amp;lt;/math&amp;gt;:&lt;br /&gt;
&lt;br /&gt;
2. Для всех &amp;lt;math&amp;gt;j&amp;lt;/math&amp;gt; от &amp;lt;math&amp;gt;IAA&amp;lt;/math&amp;gt; до &amp;lt;math&amp;gt;IAB&amp;lt;/math&amp;gt; выполняется: &lt;br /&gt;
&lt;br /&gt;
&amp;lt;math&amp;gt;c_{i} = \sum\limits_{j = IAA_{i}}^{IAB_{i}} AN(j)B(JA(j))&amp;lt;/math&amp;gt;&lt;br /&gt;
&lt;br /&gt;
Псевдокод алгоритма: &lt;br /&gt;
&lt;br /&gt;
    FOR I = 1, N                          (1)&lt;br /&gt;
       U = 0.                             (2) &lt;br /&gt;
       IAA = IA(I)                        (3) &lt;br /&gt;
       IAB = IA(I + 1 ) - 1               (4)&lt;br /&gt;
       IF NOT(IAB.LT.IAA)                 (5)&lt;br /&gt;
           FOR J = IAA, IAB               (6)&lt;br /&gt;
           C(I) = U + AN(J)*B(JA(J))      (7)&lt;br /&gt;
&lt;br /&gt;
== Последовательная сложность алгоритма ==&lt;br /&gt;
&lt;br /&gt;
Для всего алгоритма потребуется выполнить &amp;lt;math&amp;gt;O(k)&amp;lt;/math&amp;gt; операций, как в строке стр.7 (п.1.5), где &amp;lt;math&amp;gt;k&amp;lt;/math&amp;gt; - число ненулевых эле­ментов матрицы.&lt;br /&gt;
&lt;br /&gt;
== Информационный граф ==&lt;br /&gt;
&lt;br /&gt;
[[file:InfoGrafMatrixRRCUandVextor.jpg|thumb|center|1200px|Рисунок 1. Информационный граф алгоритма.]]&lt;br /&gt;
&lt;br /&gt;
== Ресурс параллелизма алгоритма ==&lt;br /&gt;
&lt;br /&gt;
== Входные и выходные данные алгоритма ==&lt;br /&gt;
&lt;br /&gt;
== Свойства алгоритма ==&lt;br /&gt;
&lt;br /&gt;
Алгоритм в рамках выбранной версии полностью детерминирован.&lt;br /&gt;
&lt;br /&gt;
Вычислительная мощность алгоритма, как отношение числа операций к суммарному объему входных и выходных данных – константа.&lt;br /&gt;
&lt;br /&gt;
= Программная реализация алгоритма =&lt;br /&gt;
&lt;br /&gt;
== Масштабируемость алгоритма и его реализации ==&lt;br /&gt;
&lt;br /&gt;
== Существующие реализации алгоритма ==&lt;br /&gt;
&lt;br /&gt;
= Литература =&lt;br /&gt;
&lt;br /&gt;
[1] С. Писсанецки. Технология разреженных матриц. Изд. Мир, 1988.&lt;/div&gt;</summary>
		<author><name>Lexaloris</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:Lexaloris/%D0%A3%D0%BC%D0%BD%D0%BE%D0%B6%D0%B5%D0%BD%D0%B8%D0%B5_%D1%80%D0%B0%D0%B7%D1%80%D0%B5%D0%B6%D0%B5%D0%BD%D0%BD%D0%BE%D0%B9_%D0%BC%D0%B0%D1%82%D1%80%D0%B8%D1%86%D1%8B_%D0%BD%D0%B0_%D0%B2%D0%B5%D0%BA%D1%82%D0%BE%D1%80&amp;diff=10066</id>
		<title>Участник:Lexaloris/Умножение разреженной матрицы на вектор</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:Lexaloris/%D0%A3%D0%BC%D0%BD%D0%BE%D0%B6%D0%B5%D0%BD%D0%B8%D0%B5_%D1%80%D0%B0%D0%B7%D1%80%D0%B5%D0%B6%D0%B5%D0%BD%D0%BD%D0%BE%D0%B9_%D0%BC%D0%B0%D1%82%D1%80%D0%B8%D1%86%D1%8B_%D0%BD%D0%B0_%D0%B2%D0%B5%D0%BA%D1%82%D0%BE%D1%80&amp;diff=10066"/>
		<updated>2016-10-15T14:55:13Z</updated>

		<summary type="html">&lt;p&gt;Lexaloris: /* Последовательная сложность алгоритма */&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(k)&amp;lt;/math&amp;gt;&lt;br /&gt;
| pf_height         = &amp;lt;math&amp;gt;O(m)&amp;lt;/math&amp;gt;&lt;br /&gt;
| pf_width          = &amp;lt;math&amp;gt;O(n)&amp;lt;/math&amp;gt;&lt;br /&gt;
| input_data        = &amp;lt;math&amp;gt;k + m&amp;lt;/math&amp;gt;&lt;br /&gt;
| output_data       = &amp;lt;math&amp;gt;n&amp;lt;/math&amp;gt;&lt;br /&gt;
}}&lt;br /&gt;
&lt;br /&gt;
&lt;br /&gt;
&#039;&#039;&#039;Авторы страницы:&#039;&#039;&#039; [[Участник:Lexaloris|A.Д. Новоселов]] и [[Участник:kochet|П.А. Кочетков]]&lt;br /&gt;
&lt;br /&gt;
= Свойства и структура алгоритмов =&lt;br /&gt;
&lt;br /&gt;
== Общее описание алгоритма ==&lt;br /&gt;
&lt;br /&gt;
=== Хранение ненулевых элементов разреженной матрицы ===&lt;br /&gt;
&lt;br /&gt;
==== Разреженный строчной формат ====&lt;br /&gt;
&lt;br /&gt;
Одной из наиболее ши­роко используемых схем хранения разреженных матриц является &#039;&#039;разреженный строчный формат&#039;&#039;. Эта&lt;br /&gt;
схема предъявляет минимальные требования к памяти и в то же время оказывается очень удобной для умножения разреженной матрицы на вектор.&lt;br /&gt;
Например, рассмотрим формат хранения разряженной матрицы &amp;lt;math&amp;gt;A&amp;lt;/math&amp;gt;:&lt;br /&gt;
&lt;br /&gt;
[[File:RRCOMatrix.png]]&lt;br /&gt;
&lt;br /&gt;
Значения нену­левых элементов матрицы и соответствующие столбцовые индексы хранятся в этой схеме по строкам в двух массивах &amp;lt;math&amp;gt;AN&amp;lt;/math&amp;gt; и &amp;lt;math&amp;gt;JA&amp;lt;/math&amp;gt; соответственно. Используется также массив указателей &amp;lt;math&amp;gt;IA&amp;lt;/math&amp;gt;, отмечающих позиции массивов &amp;lt;math&amp;gt;AN&amp;lt;/math&amp;gt; и &amp;lt;math&amp;gt;JA&amp;lt;/math&amp;gt;, с которых начинается описание очередной строки. Дополнительная компо­нента в &amp;lt;math&amp;gt;IA&amp;lt;/math&amp;gt; содержит указатель первой свободной позиции в &amp;lt;math&amp;gt;JA&amp;lt;/math&amp;gt; и &amp;lt;math&amp;gt;AN&amp;lt;/math&amp;gt;.&lt;br /&gt;
&lt;br /&gt;
Таким образом &amp;lt;math&amp;gt;A&amp;lt;/math&amp;gt; представляется в виде:&lt;br /&gt;
&lt;br /&gt;
   IA = [ 1 4 4 6 ]&lt;br /&gt;
   JA = [ 3 4 8 6 8 ]&lt;br /&gt;
   AN = [ 1 3 5 7 1 ]&lt;br /&gt;
&lt;br /&gt;
Данный способ представления называют &#039;&#039;полным&#039;&#039;, поскольку представлена вся матрица &amp;lt;math&amp;gt;A&amp;lt;/math&amp;gt;, и &#039;&#039;упорядоченным&#039;&#039;, поскольку эле­менты каждой строки хранятся в соответствии с возрастанием столбцовых индексов. Таким образом, это строчное представление, полное и упорядоченное, или сокращенно &#039;&#039;&#039;(RR (С) О)&#039;&#039;&#039;.&lt;br /&gt;
&lt;br /&gt;
==== Неупорядоченное представление ====&lt;br /&gt;
&lt;br /&gt;
Представления разреженных матриц необязательно должны быть упорядочены в том смысле, что, хотя упорядоченность строк поддерживается, внутри каждой строки элементы могут храниться в произвольном порядке. Для матрицы А нашего примера вполне можно было бы использовать и строчное представление, полное, но &#039;&#039;неупорядоченное&#039;&#039; &#039;&#039;&#039;(RR (С) U )&#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;
   IA = [ 1 4 4 6 ]&lt;br /&gt;
   JA = [ 8 3 4 8 6 ]&lt;br /&gt;
   AN = [ 5 1 3 1 7 ]&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; — число строк матрицы. &lt;br /&gt;
Для каждой ее строки &amp;lt;math&amp;gt;I&amp;lt;/math&amp;gt; матрицы мы находим с помощью &amp;lt;math&amp;gt;IA&amp;lt;/math&amp;gt; значения первой &amp;lt;math&amp;gt;IAA&amp;lt;/math&amp;gt; и последней &amp;lt;math&amp;gt;IAB&amp;lt;/math&amp;gt; позиций, занимаемых элементами строки &amp;lt;math&amp;gt;I&amp;lt;/math&amp;gt; в массивах &amp;lt;math&amp;gt;JA&amp;lt;/math&amp;gt; и &amp;lt;math&amp;gt;AN&amp;lt;/math&amp;gt;. Затем, чтобы вычислить скалярное произведение строки &amp;lt;math&amp;gt;I&amp;lt;/math&amp;gt; и вектора &amp;lt;math&amp;gt;B&amp;lt;/math&amp;gt;, мы просто просматриваем &amp;lt;math&amp;gt;JA&amp;lt;/math&amp;gt; и &amp;lt;math&amp;gt;AN&amp;lt;/math&amp;gt; на отрезке от &amp;lt;math&amp;gt;IAA&amp;lt;/math&amp;gt; до &amp;lt;math&amp;gt;IAB&amp;lt;/math&amp;gt;:&lt;br /&gt;
каждое значение, хранимое в &amp;lt;math&amp;gt;JA&amp;lt;/math&amp;gt;, есть столбцовый индекс и используется для извлечения из массива &amp;lt;math&amp;gt;B&amp;lt;/math&amp;gt; элемента, который должен быть умножен на соответствующее число из &amp;lt;math&amp;gt;AN&amp;lt;/math&amp;gt;. Результат каж­дого умножения прибавляется к &amp;lt;math&amp;gt;C(I)&amp;lt;/math&amp;gt;.&lt;br /&gt;
&lt;br /&gt;
== Математическое описание алгоритма ==&lt;br /&gt;
&lt;br /&gt;
&#039;&#039;&#039;Исходные данные:&#039;&#039;&#039; &lt;br /&gt;
&lt;br /&gt;
&amp;lt;math&amp;gt;IA, JA, AN&amp;lt;/math&amp;gt; - заданная матрица в форме &#039;&#039;&#039;(RR (С) U)&#039;&#039;&#039;;&lt;br /&gt;
&lt;br /&gt;
&amp;lt;math&amp;gt;B&amp;lt;/math&amp;gt; - заданный заполненный вектор;&lt;br /&gt;
&lt;br /&gt;
&amp;lt;math&amp;gt;N&amp;lt;/math&amp;gt; - число строк матрицы.&lt;br /&gt;
&lt;br /&gt;
&#039;&#039;&#039;Выход:&#039;&#039;&#039; &amp;lt;math&amp;gt;C&amp;lt;/math&amp;gt; вектор-произведение размерности &amp;lt;math&amp;gt;N&amp;lt;/math&amp;gt;.&lt;br /&gt;
&lt;br /&gt;
&#039;&#039;&#039;Формулы метода:&#039;&#039;&#039;&lt;br /&gt;
&lt;br /&gt;
:&amp;lt;math&amp;gt;&lt;br /&gt;
\begin{align}&lt;br /&gt;
&amp;amp; IAA_{i} = IA(i), \quad i \in [1, N], \\&lt;br /&gt;
&amp;amp; IAB_{i} = IA(i + 1) - 1, \quad i \in [1, N], \\&lt;br /&gt;
&amp;amp; c_{i} = \sum\limits_{j = IAA_{i}}^{IAB_{i}} AN(j)B(JA(j)), \quad i \in [1, N] \\&lt;br /&gt;
\end{align}&lt;br /&gt;
&amp;lt;/math&amp;gt;&lt;br /&gt;
&lt;br /&gt;
== Вычислительное ядро алгоритма ==&lt;br /&gt;
&lt;br /&gt;
Вычислительным ядром, т.е. той частью алгоритма, на которую приходится основное время его работы, является вычисление значения &amp;lt;math&amp;gt;i&amp;lt;/math&amp;gt;-го элемента &amp;lt;math&amp;gt;c_{i}&amp;lt;/math&amp;gt; вектора-произведения, т.е произведения строки &amp;lt;math&amp;gt;I&amp;lt;/math&amp;gt; матрицы &amp;lt;math&amp;gt;A&amp;lt;/math&amp;gt; и вектора &amp;lt;math&amp;gt;B&amp;lt;/math&amp;gt; по формуле:&lt;br /&gt;
&lt;br /&gt;
:&amp;lt;math&amp;gt;&lt;br /&gt;
\begin{align}&lt;br /&gt;
&amp;amp; c_{i} = \sum\limits_{j = IAA_{i}}^{IAB_{i}} AN(j)B(JA(j)), \quad i \in [1, N] \\&lt;br /&gt;
\end{align}&lt;br /&gt;
&amp;lt;/math&amp;gt;&lt;br /&gt;
&lt;br /&gt;
== Макроструктура алгоритма ==&lt;br /&gt;
&lt;br /&gt;
Основу алгоритма составляет вычисление значения &amp;lt;math&amp;gt;i&amp;lt;/math&amp;gt;-го элемента &amp;lt;math&amp;gt;c_{i}&amp;lt;/math&amp;gt; вектора-произведения:&lt;br /&gt;
&lt;br /&gt;
:&amp;lt;math&amp;gt;&lt;br /&gt;
\begin{align}&lt;br /&gt;
&amp;amp; c_{i} = \sum\limits_{j = IAA_{i}}^{IAB_{i}} AN(j)B(JA(j)), \quad i \in [1, N] \\&lt;br /&gt;
\end{align}&lt;br /&gt;
&amp;lt;/math&amp;gt;&lt;br /&gt;
&lt;br /&gt;
== Схема реализации последовательного алгоритма ==&lt;br /&gt;
&lt;br /&gt;
Последовательность исполнения метода следующая: &lt;br /&gt;
&lt;br /&gt;
Далее для всех &amp;lt;math&amp;gt;i&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; по нарастанию выполняются:&lt;br /&gt;
&lt;br /&gt;
1. &amp;lt;math&amp;gt; c_{i} = 0; IAA = IA(i); IAB = IA(i + 1 ) - 1 &amp;lt;/math&amp;gt;&lt;br /&gt;
&lt;br /&gt;
После этого, если &amp;lt;math&amp;gt;(IAB \le IAA)&amp;lt;/math&amp;gt;:&lt;br /&gt;
&lt;br /&gt;
2. Для всех &amp;lt;math&amp;gt;j&amp;lt;/math&amp;gt; от &amp;lt;math&amp;gt;IAA&amp;lt;/math&amp;gt; до &amp;lt;math&amp;gt;IAB&amp;lt;/math&amp;gt; выполняется: &lt;br /&gt;
&lt;br /&gt;
&amp;lt;math&amp;gt;c_{i} = \sum\limits_{j = IAA_{i}}^{IAB_{i}} AN(j)B(JA(j))&amp;lt;/math&amp;gt;&lt;br /&gt;
&lt;br /&gt;
Псевдокод алгоритма: &lt;br /&gt;
&lt;br /&gt;
    FOR I = 1, N                          (1)&lt;br /&gt;
       U = 0.                             (2) &lt;br /&gt;
       IAA = IA(I)                        (3) &lt;br /&gt;
       IAB = IA(I + 1 ) - 1               (4)&lt;br /&gt;
       IF NOT(IAB.LT.IAA)                 (5)&lt;br /&gt;
           FOR J = IAA, IAB               (6)&lt;br /&gt;
           C(I) = U + AN(J)*B(JA(J))      (7)&lt;br /&gt;
&lt;br /&gt;
== Последовательная сложность алгоритма ==&lt;br /&gt;
&lt;br /&gt;
Для всего алгоритма потребуется выполнить &amp;lt;math&amp;gt;O(k)&amp;lt;/math&amp;gt; операций, как в строке [[#Вычислительное ядро алгоритма|стр.7]], где &amp;lt;math&amp;gt;k&amp;lt;/math&amp;gt; - число ненулевых эле­ментов матрицы.&lt;br /&gt;
&lt;br /&gt;
== Информационный граф ==&lt;br /&gt;
&lt;br /&gt;
[[file:InfoGrafMatrixRRCUandVextor.jpg|thumb|center|1200px|Рисунок 1. Информационный граф алгоритма.]]&lt;br /&gt;
&lt;br /&gt;
== Ресурс параллелизма алгоритма ==&lt;br /&gt;
&lt;br /&gt;
== Входные и выходные данные алгоритма ==&lt;br /&gt;
&lt;br /&gt;
== Свойства алгоритма ==&lt;br /&gt;
&lt;br /&gt;
Алгоритм в рамках выбранной версии полностью детерминирован.&lt;br /&gt;
&lt;br /&gt;
Вычислительная мощность алгоритма, как отношение числа операций к суммарному объему входных и выходных данных – константа.&lt;br /&gt;
&lt;br /&gt;
= Программная реализация алгоритма =&lt;br /&gt;
&lt;br /&gt;
== Масштабируемость алгоритма и его реализации ==&lt;br /&gt;
&lt;br /&gt;
== Существующие реализации алгоритма ==&lt;br /&gt;
&lt;br /&gt;
= Литература =&lt;br /&gt;
&lt;br /&gt;
[1] С. Писсанецки. Технология разреженных матриц. Изд. Мир, 1988.&lt;/div&gt;</summary>
		<author><name>Lexaloris</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:Lexaloris/%D0%A3%D0%BC%D0%BD%D0%BE%D0%B6%D0%B5%D0%BD%D0%B8%D0%B5_%D1%80%D0%B0%D0%B7%D1%80%D0%B5%D0%B6%D0%B5%D0%BD%D0%BD%D0%BE%D0%B9_%D0%BC%D0%B0%D1%82%D1%80%D0%B8%D1%86%D1%8B_%D0%BD%D0%B0_%D0%B2%D0%B5%D0%BA%D1%82%D0%BE%D1%80&amp;diff=10044</id>
		<title>Участник:Lexaloris/Умножение разреженной матрицы на вектор</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:Lexaloris/%D0%A3%D0%BC%D0%BD%D0%BE%D0%B6%D0%B5%D0%BD%D0%B8%D0%B5_%D1%80%D0%B0%D0%B7%D1%80%D0%B5%D0%B6%D0%B5%D0%BD%D0%BD%D0%BE%D0%B9_%D0%BC%D0%B0%D1%82%D1%80%D0%B8%D1%86%D1%8B_%D0%BD%D0%B0_%D0%B2%D0%B5%D0%BA%D1%82%D0%BE%D1%80&amp;diff=10044"/>
		<updated>2016-10-15T14:51:46Z</updated>

		<summary type="html">&lt;p&gt;Lexaloris: /* Последовательная сложность алгоритма */&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(k)&amp;lt;/math&amp;gt;&lt;br /&gt;
| pf_height         = &amp;lt;math&amp;gt;O(m)&amp;lt;/math&amp;gt;&lt;br /&gt;
| pf_width          = &amp;lt;math&amp;gt;O(n)&amp;lt;/math&amp;gt;&lt;br /&gt;
| input_data        = &amp;lt;math&amp;gt;k + m&amp;lt;/math&amp;gt;&lt;br /&gt;
| output_data       = &amp;lt;math&amp;gt;n&amp;lt;/math&amp;gt;&lt;br /&gt;
}}&lt;br /&gt;
&lt;br /&gt;
&lt;br /&gt;
&#039;&#039;&#039;Авторы страницы:&#039;&#039;&#039; [[Участник:Lexaloris|A.Д. Новоселов]] и [[Участник:kochet|П.А. Кочетков]]&lt;br /&gt;
&lt;br /&gt;
= Свойства и структура алгоритмов =&lt;br /&gt;
&lt;br /&gt;
== Общее описание алгоритма ==&lt;br /&gt;
&lt;br /&gt;
=== Хранение ненулевых элементов разреженной матрицы ===&lt;br /&gt;
&lt;br /&gt;
==== Разреженный строчной формат ====&lt;br /&gt;
&lt;br /&gt;
Одной из наиболее ши­роко используемых схем хранения разреженных матриц является &#039;&#039;разреженный строчный формат&#039;&#039;. Эта&lt;br /&gt;
схема предъявляет минимальные требования к памяти и в то же время оказывается очень удобной для умножения разреженной матрицы на вектор.&lt;br /&gt;
Например, рассмотрим формат хранения разряженной матрицы &amp;lt;math&amp;gt;A&amp;lt;/math&amp;gt;:&lt;br /&gt;
&lt;br /&gt;
[[File:RRCOMatrix.png]]&lt;br /&gt;
&lt;br /&gt;
Значения нену­левых элементов матрицы и соответствующие столбцовые индексы хранятся в этой схеме по строкам в двух массивах &amp;lt;math&amp;gt;AN&amp;lt;/math&amp;gt; и &amp;lt;math&amp;gt;JA&amp;lt;/math&amp;gt; соответственно. Используется также массив указателей &amp;lt;math&amp;gt;IA&amp;lt;/math&amp;gt;, отмечающих позиции массивов &amp;lt;math&amp;gt;AN&amp;lt;/math&amp;gt; и &amp;lt;math&amp;gt;JA&amp;lt;/math&amp;gt;, с которых начинается описание очередной строки. Дополнительная компо­нента в &amp;lt;math&amp;gt;IA&amp;lt;/math&amp;gt; содержит указатель первой свободной позиции в &amp;lt;math&amp;gt;JA&amp;lt;/math&amp;gt; и &amp;lt;math&amp;gt;AN&amp;lt;/math&amp;gt;.&lt;br /&gt;
&lt;br /&gt;
Таким образом &amp;lt;math&amp;gt;A&amp;lt;/math&amp;gt; представляется в виде:&lt;br /&gt;
&lt;br /&gt;
   IA = [ 1 4 4 6 ]&lt;br /&gt;
   JA = [ 3 4 8 6 8 ]&lt;br /&gt;
   AN = [ 1 3 5 7 1 ]&lt;br /&gt;
&lt;br /&gt;
Данный способ представления называют &#039;&#039;полным&#039;&#039;, поскольку представлена вся матрица &amp;lt;math&amp;gt;A&amp;lt;/math&amp;gt;, и &#039;&#039;упорядоченным&#039;&#039;, поскольку эле­менты каждой строки хранятся в соответствии с возрастанием столбцовых индексов. Таким образом, это строчное представление, полное и упорядоченное, или сокращенно &#039;&#039;&#039;(RR (С) О)&#039;&#039;&#039;.&lt;br /&gt;
&lt;br /&gt;
==== Неупорядоченное представление ====&lt;br /&gt;
&lt;br /&gt;
Представления разреженных матриц необязательно должны быть упорядочены в том смысле, что, хотя упорядоченность строк поддерживается, внутри каждой строки элементы могут храниться в произвольном порядке. Для матрицы А нашего примера вполне можно было бы использовать и строчное представление, полное, но &#039;&#039;неупорядоченное&#039;&#039; &#039;&#039;&#039;(RR (С) U )&#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;
   IA = [ 1 4 4 6 ]&lt;br /&gt;
   JA = [ 8 3 4 8 6 ]&lt;br /&gt;
   AN = [ 5 1 3 1 7 ]&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; — число строк матрицы. &lt;br /&gt;
Для каждой ее строки &amp;lt;math&amp;gt;I&amp;lt;/math&amp;gt; матрицы мы находим с помощью &amp;lt;math&amp;gt;IA&amp;lt;/math&amp;gt; значения первой &amp;lt;math&amp;gt;IAA&amp;lt;/math&amp;gt; и последней &amp;lt;math&amp;gt;IAB&amp;lt;/math&amp;gt; позиций, занимаемых элементами строки &amp;lt;math&amp;gt;I&amp;lt;/math&amp;gt; в массивах &amp;lt;math&amp;gt;JA&amp;lt;/math&amp;gt; и &amp;lt;math&amp;gt;AN&amp;lt;/math&amp;gt;. Затем, чтобы вычислить скалярное произведение строки &amp;lt;math&amp;gt;I&amp;lt;/math&amp;gt; и вектора &amp;lt;math&amp;gt;B&amp;lt;/math&amp;gt;, мы просто просматриваем &amp;lt;math&amp;gt;JA&amp;lt;/math&amp;gt; и &amp;lt;math&amp;gt;AN&amp;lt;/math&amp;gt; на отрезке от &amp;lt;math&amp;gt;IAA&amp;lt;/math&amp;gt; до &amp;lt;math&amp;gt;IAB&amp;lt;/math&amp;gt;:&lt;br /&gt;
каждое значение, хранимое в &amp;lt;math&amp;gt;JA&amp;lt;/math&amp;gt;, есть столбцовый индекс и используется для извлечения из массива &amp;lt;math&amp;gt;B&amp;lt;/math&amp;gt; элемента, который должен быть умножен на соответствующее число из &amp;lt;math&amp;gt;AN&amp;lt;/math&amp;gt;. Результат каж­дого умножения прибавляется к &amp;lt;math&amp;gt;C(I)&amp;lt;/math&amp;gt;.&lt;br /&gt;
&lt;br /&gt;
== Математическое описание алгоритма ==&lt;br /&gt;
&lt;br /&gt;
&#039;&#039;&#039;Исходные данные:&#039;&#039;&#039; &lt;br /&gt;
&lt;br /&gt;
&amp;lt;math&amp;gt;IA, JA, AN&amp;lt;/math&amp;gt; - заданная матрица в форме &#039;&#039;&#039;(RR (С) U)&#039;&#039;&#039;;&lt;br /&gt;
&lt;br /&gt;
&amp;lt;math&amp;gt;B&amp;lt;/math&amp;gt; - заданный заполненный вектор;&lt;br /&gt;
&lt;br /&gt;
&amp;lt;math&amp;gt;N&amp;lt;/math&amp;gt; - число строк матрицы.&lt;br /&gt;
&lt;br /&gt;
&#039;&#039;&#039;Выход:&#039;&#039;&#039; &amp;lt;math&amp;gt;C&amp;lt;/math&amp;gt; вектор-произведение размерности &amp;lt;math&amp;gt;N&amp;lt;/math&amp;gt;.&lt;br /&gt;
&lt;br /&gt;
&#039;&#039;&#039;Формулы метода:&#039;&#039;&#039;&lt;br /&gt;
&lt;br /&gt;
:&amp;lt;math&amp;gt;&lt;br /&gt;
\begin{align}&lt;br /&gt;
&amp;amp; IAA_{i} = IA(i), \quad i \in [1, N], \\&lt;br /&gt;
&amp;amp; IAB_{i} = IA(i + 1) - 1, \quad i \in [1, N], \\&lt;br /&gt;
&amp;amp; c_{i} = \sum\limits_{j = IAA_{i}}^{IAB_{i}} AN(j)B(JA(j)), \quad i \in [1, N] \\&lt;br /&gt;
\end{align}&lt;br /&gt;
&amp;lt;/math&amp;gt;&lt;br /&gt;
&lt;br /&gt;
== Вычислительное ядро алгоритма ==&lt;br /&gt;
&lt;br /&gt;
Вычислительным ядром, т.е. той частью алгоритма, на которую приходится основное время его работы, является вычисление значения &amp;lt;math&amp;gt;i&amp;lt;/math&amp;gt;-го элемента &amp;lt;math&amp;gt;c_{i}&amp;lt;/math&amp;gt; вектора-произведения, т.е произведения строки &amp;lt;math&amp;gt;I&amp;lt;/math&amp;gt; матрицы &amp;lt;math&amp;gt;A&amp;lt;/math&amp;gt; и вектора &amp;lt;math&amp;gt;B&amp;lt;/math&amp;gt; по формуле:&lt;br /&gt;
&lt;br /&gt;
:&amp;lt;math&amp;gt;&lt;br /&gt;
\begin{align}&lt;br /&gt;
&amp;amp; c_{i} = \sum\limits_{j = IAA_{i}}^{IAB_{i}} AN(j)B(JA(j)), \quad i \in [1, N] \\&lt;br /&gt;
\end{align}&lt;br /&gt;
&amp;lt;/math&amp;gt;&lt;br /&gt;
&lt;br /&gt;
== Макроструктура алгоритма ==&lt;br /&gt;
&lt;br /&gt;
Основу алгоритма составляет вычисление значения &amp;lt;math&amp;gt;i&amp;lt;/math&amp;gt;-го элемента &amp;lt;math&amp;gt;c_{i}&amp;lt;/math&amp;gt; вектора-произведения:&lt;br /&gt;
&lt;br /&gt;
:&amp;lt;math&amp;gt;&lt;br /&gt;
\begin{align}&lt;br /&gt;
&amp;amp; c_{i} = \sum\limits_{j = IAA_{i}}^{IAB_{i}} AN(j)B(JA(j)), \quad i \in [1, N] \\&lt;br /&gt;
\end{align}&lt;br /&gt;
&amp;lt;/math&amp;gt;&lt;br /&gt;
&lt;br /&gt;
== Схема реализации последовательного алгоритма ==&lt;br /&gt;
&lt;br /&gt;
Последовательность исполнения метода следующая: &lt;br /&gt;
&lt;br /&gt;
Далее для всех &amp;lt;math&amp;gt;i&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; по нарастанию выполняются:&lt;br /&gt;
&lt;br /&gt;
1. &amp;lt;math&amp;gt; c_{i} = 0; IAA = IA(i); IAB = IA(i + 1 ) - 1 &amp;lt;/math&amp;gt;&lt;br /&gt;
&lt;br /&gt;
После этого, если &amp;lt;math&amp;gt;(IAB \le IAA)&amp;lt;/math&amp;gt;:&lt;br /&gt;
&lt;br /&gt;
2. Для всех &amp;lt;math&amp;gt;j&amp;lt;/math&amp;gt; от &amp;lt;math&amp;gt;IAA&amp;lt;/math&amp;gt; до &amp;lt;math&amp;gt;IAB&amp;lt;/math&amp;gt; выполняется: &lt;br /&gt;
&lt;br /&gt;
&amp;lt;math&amp;gt;c_{i} = \sum\limits_{j = IAA_{i}}^{IAB_{i}} AN(j)B(JA(j))&amp;lt;/math&amp;gt;&lt;br /&gt;
&lt;br /&gt;
Псевдокод алгоритма: &lt;br /&gt;
&lt;br /&gt;
    FOR I = 1, N                          (1)&lt;br /&gt;
       U = 0.                             (2) &lt;br /&gt;
       IAA = IA(I)                        (3) &lt;br /&gt;
       IAB = IA(I + 1 ) - 1               (4)&lt;br /&gt;
       IF NOT(IAB.LT.IAA)                 (5)&lt;br /&gt;
           FOR J = IAA, IAB               (6)&lt;br /&gt;
           C(I) = U + AN(J)*B(JA(J))      (7)&lt;br /&gt;
&lt;br /&gt;
== Последовательная сложность алгоритма ==&lt;br /&gt;
&lt;br /&gt;
Для всего алгоритма потребуется выполнить &amp;lt;math&amp;gt;O(k)&amp;lt;/math&amp;gt; операций, где &amp;lt;math&amp;gt;k&amp;lt;/math&amp;gt; - число ненулевых эле­ментов матрицы.&lt;br /&gt;
&lt;br /&gt;
== Информационный граф ==&lt;br /&gt;
&lt;br /&gt;
[[file:InfoGrafMatrixRRCUandVextor.jpg|thumb|center|1200px|Рисунок 1. Информационный граф алгоритма.]]&lt;br /&gt;
&lt;br /&gt;
== Ресурс параллелизма алгоритма ==&lt;br /&gt;
&lt;br /&gt;
== Входные и выходные данные алгоритма ==&lt;br /&gt;
&lt;br /&gt;
== Свойства алгоритма ==&lt;br /&gt;
&lt;br /&gt;
Алгоритм в рамках выбранной версии полностью детерминирован.&lt;br /&gt;
&lt;br /&gt;
Вычислительная мощность алгоритма, как отношение числа операций к суммарному объему входных и выходных данных – константа.&lt;br /&gt;
&lt;br /&gt;
= Программная реализация алгоритма =&lt;br /&gt;
&lt;br /&gt;
== Масштабируемость алгоритма и его реализации ==&lt;br /&gt;
&lt;br /&gt;
== Существующие реализации алгоритма ==&lt;br /&gt;
&lt;br /&gt;
= Литература =&lt;br /&gt;
&lt;br /&gt;
[1] С. Писсанецки. Технология разреженных матриц. Изд. Мир, 1988.&lt;/div&gt;</summary>
		<author><name>Lexaloris</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:Lexaloris/%D0%A3%D0%BC%D0%BD%D0%BE%D0%B6%D0%B5%D0%BD%D0%B8%D0%B5_%D1%80%D0%B0%D0%B7%D1%80%D0%B5%D0%B6%D0%B5%D0%BD%D0%BD%D0%BE%D0%B9_%D0%BC%D0%B0%D1%82%D1%80%D0%B8%D1%86%D1%8B_%D0%BD%D0%B0_%D0%B2%D0%B5%D0%BA%D1%82%D0%BE%D1%80&amp;diff=9868</id>
		<title>Участник:Lexaloris/Умножение разреженной матрицы на вектор</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:Lexaloris/%D0%A3%D0%BC%D0%BD%D0%BE%D0%B6%D0%B5%D0%BD%D0%B8%D0%B5_%D1%80%D0%B0%D0%B7%D1%80%D0%B5%D0%B6%D0%B5%D0%BD%D0%BD%D0%BE%D0%B9_%D0%BC%D0%B0%D1%82%D1%80%D0%B8%D1%86%D1%8B_%D0%BD%D0%B0_%D0%B2%D0%B5%D0%BA%D1%82%D0%BE%D1%80&amp;diff=9868"/>
		<updated>2016-10-15T14:23:10Z</updated>

		<summary type="html">&lt;p&gt;Lexaloris: &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(k)&amp;lt;/math&amp;gt;&lt;br /&gt;
| pf_height         = &amp;lt;math&amp;gt;O(m)&amp;lt;/math&amp;gt;&lt;br /&gt;
| pf_width          = &amp;lt;math&amp;gt;O(n)&amp;lt;/math&amp;gt;&lt;br /&gt;
| input_data        = &amp;lt;math&amp;gt;k + m&amp;lt;/math&amp;gt;&lt;br /&gt;
| output_data       = &amp;lt;math&amp;gt;n&amp;lt;/math&amp;gt;&lt;br /&gt;
}}&lt;br /&gt;
&lt;br /&gt;
&lt;br /&gt;
&#039;&#039;&#039;Авторы страницы:&#039;&#039;&#039; [[Участник:Lexaloris|A.Д. Новоселов]] и [[Участник:kochet|П.А. Кочетков]]&lt;br /&gt;
&lt;br /&gt;
= Свойства и структура алгоритмов =&lt;br /&gt;
&lt;br /&gt;
== Общее описание алгоритма ==&lt;br /&gt;
&lt;br /&gt;
=== Хранение ненулевых элементов разреженной матрицы ===&lt;br /&gt;
&lt;br /&gt;
==== Разреженный строчной формат ====&lt;br /&gt;
&lt;br /&gt;
Одной из наиболее ши­роко используемых схем хранения разреженных матриц является &#039;&#039;разреженный строчный формат&#039;&#039;. Эта&lt;br /&gt;
схема предъявляет минимальные требования к памяти и в то же время оказывается очень удобной для умножения разреженной матрицы на вектор.&lt;br /&gt;
Например, рассмотрим формат хранения разряженной матрицы &amp;lt;math&amp;gt;A&amp;lt;/math&amp;gt;:&lt;br /&gt;
&lt;br /&gt;
[[File:RRCOMatrix.png]]&lt;br /&gt;
&lt;br /&gt;
Значения нену­левых элементов матрицы и соответствующие столбцовые индексы хранятся в этой схеме по строкам в двух массивах &amp;lt;math&amp;gt;AN&amp;lt;/math&amp;gt; и &amp;lt;math&amp;gt;JA&amp;lt;/math&amp;gt; соответственно. Используется также массив указателей &amp;lt;math&amp;gt;IA&amp;lt;/math&amp;gt;, отмечающих позиции массивов &amp;lt;math&amp;gt;AN&amp;lt;/math&amp;gt; и &amp;lt;math&amp;gt;JA&amp;lt;/math&amp;gt;, с которых начинается описание очередной строки. Дополнительная компо­нента в &amp;lt;math&amp;gt;IA&amp;lt;/math&amp;gt; содержит указатель первой свободной позиции в &amp;lt;math&amp;gt;JA&amp;lt;/math&amp;gt; и &amp;lt;math&amp;gt;AN&amp;lt;/math&amp;gt;.&lt;br /&gt;
&lt;br /&gt;
Таким образом &amp;lt;math&amp;gt;A&amp;lt;/math&amp;gt; представляется в виде:&lt;br /&gt;
&lt;br /&gt;
   IA = [ 1 4 4 6 ]&lt;br /&gt;
   JA = [ 3 4 8 6 8 ]&lt;br /&gt;
   AN = [ 1 3 5 7 1 ]&lt;br /&gt;
&lt;br /&gt;
Данный способ представления называют &#039;&#039;полным&#039;&#039;, поскольку представлена вся матрица &amp;lt;math&amp;gt;A&amp;lt;/math&amp;gt;, и &#039;&#039;упорядоченным&#039;&#039;, поскольку эле­менты каждой строки хранятся в соответствии с возрастанием столбцовых индексов. Таким образом, это строчное представление, полное и упорядоченное, или сокращенно &#039;&#039;&#039;(RR (С) О)&#039;&#039;&#039;.&lt;br /&gt;
&lt;br /&gt;
==== Неупорядоченное представление ====&lt;br /&gt;
&lt;br /&gt;
Представления разреженных матриц необязательно должны быть упорядочены в том смысле, что, хотя упорядоченность строк поддерживается, внутри каждой строки элементы могут храниться в произвольном порядке. Для матрицы А нашего примера вполне можно было бы использовать и строчное представление, полное, но &#039;&#039;неупорядоченное&#039;&#039; &#039;&#039;&#039;(RR (С) U )&#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;
   IA = [ 1 4 4 6 ]&lt;br /&gt;
   JA = [ 8 3 4 8 6 ]&lt;br /&gt;
   AN = [ 5 1 3 1 7 ]&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; — число строк матрицы. &lt;br /&gt;
Для каждой ее строки &amp;lt;math&amp;gt;I&amp;lt;/math&amp;gt; матрицы мы находим с помощью &amp;lt;math&amp;gt;IA&amp;lt;/math&amp;gt; значения первой &amp;lt;math&amp;gt;IAA&amp;lt;/math&amp;gt; и последней &amp;lt;math&amp;gt;IAB&amp;lt;/math&amp;gt; позиций, занимаемых элементами строки &amp;lt;math&amp;gt;I&amp;lt;/math&amp;gt; в массивах &amp;lt;math&amp;gt;JA&amp;lt;/math&amp;gt; и &amp;lt;math&amp;gt;AN&amp;lt;/math&amp;gt;. Затем, чтобы вычислить скалярное произведение строки &amp;lt;math&amp;gt;I&amp;lt;/math&amp;gt; и вектора &amp;lt;math&amp;gt;B&amp;lt;/math&amp;gt;, мы просто просматриваем &amp;lt;math&amp;gt;JA&amp;lt;/math&amp;gt; и &amp;lt;math&amp;gt;AN&amp;lt;/math&amp;gt; на отрезке от &amp;lt;math&amp;gt;IAA&amp;lt;/math&amp;gt; до &amp;lt;math&amp;gt;IAB&amp;lt;/math&amp;gt;:&lt;br /&gt;
каждое значение, хранимое в &amp;lt;math&amp;gt;JA&amp;lt;/math&amp;gt;, есть столбцовый индекс и используется для извлечения из массива &amp;lt;math&amp;gt;B&amp;lt;/math&amp;gt; элемента, который должен быть умножен на соответствующее число из &amp;lt;math&amp;gt;AN&amp;lt;/math&amp;gt;. Результат каж­дого умножения прибавляется к &amp;lt;math&amp;gt;C(I)&amp;lt;/math&amp;gt;.&lt;br /&gt;
&lt;br /&gt;
== Математическое описание алгоритма ==&lt;br /&gt;
&lt;br /&gt;
&#039;&#039;&#039;Исходные данные:&#039;&#039;&#039; &lt;br /&gt;
&lt;br /&gt;
&amp;lt;math&amp;gt;IA, JA, AN&amp;lt;/math&amp;gt; - заданная матрица в форме &#039;&#039;&#039;(RR (С) U)&#039;&#039;&#039;;&lt;br /&gt;
&lt;br /&gt;
&amp;lt;math&amp;gt;B&amp;lt;/math&amp;gt; - заданный заполненный вектор;&lt;br /&gt;
&lt;br /&gt;
&amp;lt;math&amp;gt;N&amp;lt;/math&amp;gt; - число строк матрицы.&lt;br /&gt;
&lt;br /&gt;
&#039;&#039;&#039;Выход:&#039;&#039;&#039; &amp;lt;math&amp;gt;C&amp;lt;/math&amp;gt; вектор-произведение размерности &amp;lt;math&amp;gt;N&amp;lt;/math&amp;gt;.&lt;br /&gt;
&lt;br /&gt;
&#039;&#039;&#039;Формулы метода:&#039;&#039;&#039;&lt;br /&gt;
&lt;br /&gt;
:&amp;lt;math&amp;gt;&lt;br /&gt;
\begin{align}&lt;br /&gt;
&amp;amp; IAA_{i} = IA(i), \quad i \in [1, N], \\&lt;br /&gt;
&amp;amp; IAB_{i} = IA(i + 1) - 1, \quad i \in [1, N], \\&lt;br /&gt;
&amp;amp; c_{i} = \sum\limits_{j = IAA_{i}}^{IAB_{i}} AN(j)B(JA(j)), \quad i \in [1, N] \\&lt;br /&gt;
\end{align}&lt;br /&gt;
&amp;lt;/math&amp;gt;&lt;br /&gt;
&lt;br /&gt;
== Вычислительное ядро алгоритма ==&lt;br /&gt;
&lt;br /&gt;
Вычислительным ядром, т.е. той частью алгоритма, на которую приходится основное время его работы, является вычисление значения &amp;lt;math&amp;gt;i&amp;lt;/math&amp;gt;-го элемента &amp;lt;math&amp;gt;c_{i}&amp;lt;/math&amp;gt; вектора-произведения, т.е произведения строки &amp;lt;math&amp;gt;I&amp;lt;/math&amp;gt; матрицы &amp;lt;math&amp;gt;A&amp;lt;/math&amp;gt; и вектора &amp;lt;math&amp;gt;B&amp;lt;/math&amp;gt; по формуле:&lt;br /&gt;
&lt;br /&gt;
:&amp;lt;math&amp;gt;&lt;br /&gt;
\begin{align}&lt;br /&gt;
&amp;amp; c_{i} = \sum\limits_{j = IAA_{i}}^{IAB_{i}} AN(j)B(JA(j)), \quad i \in [1, N] \\&lt;br /&gt;
\end{align}&lt;br /&gt;
&amp;lt;/math&amp;gt;&lt;br /&gt;
&lt;br /&gt;
== Макроструктура алгоритма ==&lt;br /&gt;
&lt;br /&gt;
Основу алгоритма составляет вычисление значения &amp;lt;math&amp;gt;i&amp;lt;/math&amp;gt;-го элемента &amp;lt;math&amp;gt;c_{i}&amp;lt;/math&amp;gt; вектора-произведения:&lt;br /&gt;
&lt;br /&gt;
:&amp;lt;math&amp;gt;&lt;br /&gt;
\begin{align}&lt;br /&gt;
&amp;amp; c_{i} = \sum\limits_{j = IAA_{i}}^{IAB_{i}} AN(j)B(JA(j)), \quad i \in [1, N] \\&lt;br /&gt;
\end{align}&lt;br /&gt;
&amp;lt;/math&amp;gt;&lt;br /&gt;
&lt;br /&gt;
== Схема реализации последовательного алгоритма ==&lt;br /&gt;
&lt;br /&gt;
Последовательность исполнения метода следующая: &lt;br /&gt;
&lt;br /&gt;
Далее для всех &amp;lt;math&amp;gt;i&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; по нарастанию выполняются:&lt;br /&gt;
&lt;br /&gt;
1. &amp;lt;math&amp;gt; c_{i} = 0; IAA = IA(i); IAB = IA(i + 1 ) - 1 &amp;lt;/math&amp;gt;&lt;br /&gt;
&lt;br /&gt;
После этого, если &amp;lt;math&amp;gt;(IAB \le IAA)&amp;lt;/math&amp;gt;:&lt;br /&gt;
&lt;br /&gt;
2. Для всех &amp;lt;math&amp;gt;j&amp;lt;/math&amp;gt; от &amp;lt;math&amp;gt;IAA&amp;lt;/math&amp;gt; до &amp;lt;math&amp;gt;IAB&amp;lt;/math&amp;gt; выполняется: &lt;br /&gt;
&lt;br /&gt;
&amp;lt;math&amp;gt;c_{i} = \sum\limits_{j = IAA_{i}}^{IAB_{i}} AN(j)B(JA(j))&amp;lt;/math&amp;gt;&lt;br /&gt;
&lt;br /&gt;
Псевдокод алгоритма: &lt;br /&gt;
&lt;br /&gt;
    FOR I = 1, N                          (1)&lt;br /&gt;
       U = 0.                             (2) &lt;br /&gt;
       IAA = IA(I)                        (3) &lt;br /&gt;
       IAB = IA(I + 1 ) - 1               (4)&lt;br /&gt;
       IF NOT(IAB.LT.IAA)                 (5)&lt;br /&gt;
           FOR J = IAA, IAB               (6)&lt;br /&gt;
           C(I) = U + AN(J)*B(JA(J))      (7)&lt;br /&gt;
&lt;br /&gt;
== Последовательная сложность алгоритма ==&lt;br /&gt;
&lt;br /&gt;
Для всего алгоритма потребуется выполнить &amp;lt;math&amp;gt;O(M)&amp;lt;/math&amp;gt; операций, где &amp;lt;math&amp;gt;M&amp;lt;/math&amp;gt; - число ненулевых эле­ментов матрицы.&lt;br /&gt;
&lt;br /&gt;
== Информационный граф ==&lt;br /&gt;
&lt;br /&gt;
[[file:InfoGrafMatrixRRCUandVextor.jpg|thumb|center|1200px|Рисунок 1. Информационный граф алгоритма.]]&lt;br /&gt;
&lt;br /&gt;
== Ресурс параллелизма алгоритма ==&lt;br /&gt;
&lt;br /&gt;
== Входные и выходные данные алгоритма ==&lt;br /&gt;
&lt;br /&gt;
== Свойства алгоритма ==&lt;br /&gt;
&lt;br /&gt;
Алгоритм в рамках выбранной версии полностью детерминирован.&lt;br /&gt;
&lt;br /&gt;
Вычислительная мощность алгоритма, как отношение числа операций к суммарному объему входных и выходных данных – константа.&lt;br /&gt;
&lt;br /&gt;
= Программная реализация алгоритма =&lt;br /&gt;
&lt;br /&gt;
== Масштабируемость алгоритма и его реализации ==&lt;br /&gt;
&lt;br /&gt;
== Существующие реализации алгоритма ==&lt;br /&gt;
&lt;br /&gt;
= Литература =&lt;br /&gt;
&lt;br /&gt;
[1] С. Писсанецки. Технология разреженных матриц. Изд. Мир, 1988.&lt;/div&gt;</summary>
		<author><name>Lexaloris</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:Lexaloris/%D0%A3%D0%BC%D0%BD%D0%BE%D0%B6%D0%B5%D0%BD%D0%B8%D0%B5_%D1%80%D0%B0%D0%B7%D1%80%D0%B5%D0%B6%D0%B5%D0%BD%D0%BD%D0%BE%D0%B9_%D0%BC%D0%B0%D1%82%D1%80%D0%B8%D1%86%D1%8B_%D0%BD%D0%B0_%D0%B2%D0%B5%D0%BA%D1%82%D0%BE%D1%80&amp;diff=9863</id>
		<title>Участник:Lexaloris/Умножение разреженной матрицы на вектор</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:Lexaloris/%D0%A3%D0%BC%D0%BD%D0%BE%D0%B6%D0%B5%D0%BD%D0%B8%D0%B5_%D1%80%D0%B0%D0%B7%D1%80%D0%B5%D0%B6%D0%B5%D0%BD%D0%BD%D0%BE%D0%B9_%D0%BC%D0%B0%D1%82%D1%80%D0%B8%D1%86%D1%8B_%D0%BD%D0%B0_%D0%B2%D0%B5%D0%BA%D1%82%D0%BE%D1%80&amp;diff=9863"/>
		<updated>2016-10-15T14:22:12Z</updated>

		<summary type="html">&lt;p&gt;Lexaloris: &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(k)&amp;lt;/math&amp;gt;&lt;br /&gt;
| pf_height         = &amp;lt;math&amp;gt;O(m)&amp;lt;/math&amp;gt;&lt;br /&gt;
| pf_width          = &amp;lt;math&amp;gt;O(n)&amp;lt;/math&amp;gt;&lt;br /&gt;
| input_data        = &amp;lt;math&amp;gt;k + m&amp;lt;/math&amp;gt;&lt;br /&gt;
| output_data       = &amp;lt;math&amp;gt;n&amp;lt;/math&amp;gt;&lt;br /&gt;
}}&lt;br /&gt;
&lt;br /&gt;
&lt;br /&gt;
&#039;&#039;&#039;Авторы страницы:&#039;&#039;&#039; [[Участник:Lexaloris|A.Д. Новоселов]] и [[Участник:kochet|П.А. Кочетков]]&lt;br /&gt;
&lt;br /&gt;
= Свойства и структура алгоритмов =&lt;br /&gt;
&lt;br /&gt;
== Общее описание алгоритма ==&lt;br /&gt;
&lt;br /&gt;
=== Хранение ненулевых элементов разреженной матрицы ===&lt;br /&gt;
&lt;br /&gt;
==== Разреженный строчной формат ====&lt;br /&gt;
&lt;br /&gt;
Одной из наиболее ши­роко используемых схем хранения разреженных матриц является &#039;&#039;разреженный строчный формат&#039;&#039;. Эта&lt;br /&gt;
схема предъявляет минимальные требования к памяти и в то же время оказывается очень удобной для умножения разреженной матрицы на вектор.&lt;br /&gt;
Например, рассмотрим формат хранения разряженной матрицы &amp;lt;math&amp;gt;A&amp;lt;/math&amp;gt;:&lt;br /&gt;
&lt;br /&gt;
[[File:RRCOMatrix.png]]&lt;br /&gt;
&lt;br /&gt;
Значения нену­левых элементов матрицы и соответствующие столбцовые индексы хранятся в этой схеме по строкам в двух массивах &amp;lt;math&amp;gt;AN&amp;lt;/math&amp;gt; и &amp;lt;math&amp;gt;JA&amp;lt;/math&amp;gt; соответственно. Используется также массив указателей &amp;lt;math&amp;gt;IA&amp;lt;/math&amp;gt;, отмечающих позиции массивов &amp;lt;math&amp;gt;AN&amp;lt;/math&amp;gt; и &amp;lt;math&amp;gt;JA&amp;lt;/math&amp;gt;, с которых начинается описание очередной строки. Дополнительная компо­нента в &amp;lt;math&amp;gt;IA&amp;lt;/math&amp;gt; содержит указатель первой свободной позиции в &amp;lt;math&amp;gt;JA&amp;lt;/math&amp;gt; и &amp;lt;math&amp;gt;AN&amp;lt;/math&amp;gt;.&lt;br /&gt;
&lt;br /&gt;
Таким образом &amp;lt;math&amp;gt;A&amp;lt;/math&amp;gt; представляется в виде:&lt;br /&gt;
&lt;br /&gt;
   IA = [ 1 4 4 6 ]&lt;br /&gt;
   JA = [ 3 4 8 6 8 ]&lt;br /&gt;
   AN = [ 1 3 5 7 1 ]&lt;br /&gt;
&lt;br /&gt;
Данный способ представления называют &#039;&#039;полным&#039;&#039;, поскольку представлена вся матрица &amp;lt;math&amp;gt;A&amp;lt;/math&amp;gt;, и &#039;&#039;упорядоченным&#039;&#039;, поскольку эле­менты каждой строки хранятся в соответствии с возрастанием столбцовых индексов. Таким образом, это строчное представление, полное и упорядоченное, или сокращенно &#039;&#039;&#039;(RR (С) О)&#039;&#039;&#039;.&lt;br /&gt;
&lt;br /&gt;
==== Неупорядоченное представление ====&lt;br /&gt;
&lt;br /&gt;
Представления разреженных матриц необязательно должны быть упорядочены в том смысле, что, хотя упорядоченность строк поддерживается, внутри каждой строки элементы могут храниться в произвольном порядке. Для матрицы А нашего примера вполне можно было бы использовать и строчное представление, полное, но &#039;&#039;неупорядоченное&#039;&#039; &#039;&#039;&#039;(RR (С) U )&#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;
   IA = [ 1 4 4 6 ]&lt;br /&gt;
   JA = [ 8 3 4 8 6 ]&lt;br /&gt;
   AN = [ 5 1 3 1 7 ]&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; — число строк матрицы. &lt;br /&gt;
Для каждой ее строки &amp;lt;math&amp;gt;I&amp;lt;/math&amp;gt; матрицы мы находим с помощью &amp;lt;math&amp;gt;IA&amp;lt;/math&amp;gt; значения первой &amp;lt;math&amp;gt;IAA&amp;lt;/math&amp;gt; и последней &amp;lt;math&amp;gt;IAB&amp;lt;/math&amp;gt; позиций, занимаемых элементами строки &amp;lt;math&amp;gt;I&amp;lt;/math&amp;gt; в массивах &amp;lt;math&amp;gt;JA&amp;lt;/math&amp;gt; и &amp;lt;math&amp;gt;AN&amp;lt;/math&amp;gt;. Затем, чтобы вычислить скалярное произведение строки &amp;lt;math&amp;gt;I&amp;lt;/math&amp;gt; и вектора &amp;lt;math&amp;gt;B&amp;lt;/math&amp;gt;, мы просто просматриваем &amp;lt;math&amp;gt;JA&amp;lt;/math&amp;gt; и &amp;lt;math&amp;gt;AN&amp;lt;/math&amp;gt; на отрезке от &amp;lt;math&amp;gt;IAA&amp;lt;/math&amp;gt; до &amp;lt;math&amp;gt;IAB&amp;lt;/math&amp;gt;:&lt;br /&gt;
каждое значение, хранимое в &amp;lt;math&amp;gt;JA&amp;lt;/math&amp;gt;, есть столбцовый индекс и используется для извлечения из массива &amp;lt;math&amp;gt;B&amp;lt;/math&amp;gt; элемента, который должен быть умножен на соответствующее число из &amp;lt;math&amp;gt;AN&amp;lt;/math&amp;gt;. Результат каж­дого умножения прибавляется к &amp;lt;math&amp;gt;C(I)&amp;lt;/math&amp;gt;.&lt;br /&gt;
&lt;br /&gt;
== Математическое описание алгоритма ==&lt;br /&gt;
&lt;br /&gt;
&#039;&#039;&#039;Исходные данные:&#039;&#039;&#039; &lt;br /&gt;
&lt;br /&gt;
&amp;lt;math&amp;gt;IA, JA, AN&amp;lt;/math&amp;gt; - заданная матрица в форме &#039;&#039;&#039;(RR (С) U)&#039;&#039;&#039;;&lt;br /&gt;
&lt;br /&gt;
&amp;lt;math&amp;gt;B&amp;lt;/math&amp;gt; - заданный заполненный вектор;&lt;br /&gt;
&lt;br /&gt;
&amp;lt;math&amp;gt;N&amp;lt;/math&amp;gt; - число строк матрицы.&lt;br /&gt;
&lt;br /&gt;
&#039;&#039;&#039;Выход:&#039;&#039;&#039; &amp;lt;math&amp;gt;C&amp;lt;/math&amp;gt; вектор-произведение размерности &amp;lt;math&amp;gt;N&amp;lt;/math&amp;gt;.&lt;br /&gt;
&lt;br /&gt;
&#039;&#039;&#039;Формулы метода:&#039;&#039;&#039;&lt;br /&gt;
&lt;br /&gt;
:&amp;lt;math&amp;gt;&lt;br /&gt;
\begin{align}&lt;br /&gt;
&amp;amp; IAA_{i} = IA(i), \quad i \in [1, N], \\&lt;br /&gt;
&amp;amp; IAB_{i} = IA(i + 1) - 1, \quad i \in [1, N], \\&lt;br /&gt;
&amp;amp; c_{i} = \sum\limits_{j = IAA_{i}}^{IAB_{i}} AN(j)B(JA(j)), \quad i \in [1, N] \\&lt;br /&gt;
\end{align}&lt;br /&gt;
&amp;lt;/math&amp;gt;&lt;br /&gt;
&lt;br /&gt;
== Вычислительное ядро алгоритма ==&lt;br /&gt;
&lt;br /&gt;
Вычислительным ядром, т.е. той частью алгоритма, на которую приходится основное время его работы, является вычисление значения &amp;lt;math&amp;gt;i&amp;lt;/math&amp;gt;-го элемента &amp;lt;math&amp;gt;c_{i}&amp;lt;/math&amp;gt; вектора-произведения, т.е произведения строки &amp;lt;math&amp;gt;I&amp;lt;/math&amp;gt; матрицы &amp;lt;math&amp;gt;A&amp;lt;/math&amp;gt; и вектора &amp;lt;math&amp;gt;B&amp;lt;/math&amp;gt; по формуле:&lt;br /&gt;
&lt;br /&gt;
:&amp;lt;math&amp;gt;&lt;br /&gt;
\begin{align}&lt;br /&gt;
&amp;amp; c_{i} = \sum\limits_{j = IAA_{i}}^{IAB_{i}} AN(j)B(JA(j)), \quad i \in [1, N] \\&lt;br /&gt;
\end{align}&lt;br /&gt;
&amp;lt;/math&amp;gt;&lt;br /&gt;
&lt;br /&gt;
== Макроструктура алгоритма ==&lt;br /&gt;
&lt;br /&gt;
Основу алгоритма составляет вычисление значения &amp;lt;math&amp;gt;i&amp;lt;/math&amp;gt;-го элемента &amp;lt;math&amp;gt;c_{i}&amp;lt;/math&amp;gt; вектора-произведения:&lt;br /&gt;
&lt;br /&gt;
:&amp;lt;math&amp;gt;&lt;br /&gt;
\begin{align}&lt;br /&gt;
&amp;amp; c_{i} = \sum\limits_{j = IAA_{i}}^{IAB_{i}} AN(j)B(JA(j)), \quad i \in [1, N] \\&lt;br /&gt;
\end{align}&lt;br /&gt;
&amp;lt;/math&amp;gt;&lt;br /&gt;
&lt;br /&gt;
== Схема реализации последовательного алгоритма ==&lt;br /&gt;
&lt;br /&gt;
Последовательность исполнения метода следующая: &lt;br /&gt;
&lt;br /&gt;
Далее для всех &amp;lt;math&amp;gt;i&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; по нарастанию выполняются:&lt;br /&gt;
&lt;br /&gt;
1. &amp;lt;math&amp;gt; c_{i} = 0; IAA = IA(i); IAB = IA(i + 1 ) - 1 &amp;lt;/math&amp;gt;&lt;br /&gt;
&lt;br /&gt;
После этого, если &amp;lt;math&amp;gt;(IAB \le IAA)&amp;lt;/math&amp;gt;:&lt;br /&gt;
&lt;br /&gt;
2. Для всех &amp;lt;math&amp;gt;j&amp;lt;/math&amp;gt; от &amp;lt;math&amp;gt;IAA&amp;lt;/math&amp;gt; до &amp;lt;math&amp;gt;IAB&amp;lt;/math&amp;gt; выполняется: &lt;br /&gt;
&lt;br /&gt;
&amp;lt;math&amp;gt;c_{i} = \sum\limits_{j = IAA_{i}}^{IAB_{i}} AN(j)B(JA(j))&amp;lt;/math&amp;gt;&lt;br /&gt;
&lt;br /&gt;
Псевдокод алгоритма: &lt;br /&gt;
&lt;br /&gt;
    FOR I = 1, N&lt;br /&gt;
        U = 0.&lt;br /&gt;
       IAA = IA(I)&lt;br /&gt;
       IAB = IA(I + 1 ) - 1&lt;br /&gt;
       IF NOT(IAB.LT.IAA)&lt;br /&gt;
           FOR J = IAA, IAB&lt;br /&gt;
           C(I) = U + AN(J)*B(JA(J))&lt;br /&gt;
&lt;br /&gt;
== Последовательная сложность алгоритма ==&lt;br /&gt;
&lt;br /&gt;
Для всего алгоритма потребуется выполнить &amp;lt;math&amp;gt;O(M)&amp;lt;/math&amp;gt; операций, где &amp;lt;math&amp;gt;M&amp;lt;/math&amp;gt; - число ненулевых эле­ментов матрицы.&lt;br /&gt;
&lt;br /&gt;
== Информационный граф ==&lt;br /&gt;
&lt;br /&gt;
[[file:InfoGrafMatrixRRCUandVextor.jpg|thumb|center|1200px|Рисунок 1. Информационный граф алгоритма.]]&lt;br /&gt;
&lt;br /&gt;
== Ресурс параллелизма алгоритма ==&lt;br /&gt;
&lt;br /&gt;
== Входные и выходные данные алгоритма ==&lt;br /&gt;
&lt;br /&gt;
== Свойства алгоритма ==&lt;br /&gt;
&lt;br /&gt;
Алгоритм в рамках выбранной версии полностью детерминирован.&lt;br /&gt;
&lt;br /&gt;
Вычислительная мощность алгоритма, как отношение числа операций к суммарному объему входных и выходных данных – константа.&lt;br /&gt;
&lt;br /&gt;
= Программная реализация алгоритма =&lt;br /&gt;
&lt;br /&gt;
== Масштабируемость алгоритма и его реализации ==&lt;br /&gt;
&lt;br /&gt;
== Существующие реализации алгоритма ==&lt;br /&gt;
&lt;br /&gt;
= Литература =&lt;br /&gt;
&lt;br /&gt;
[1] С. Писсанецки. Технология разреженных матриц. Изд. Мир, 1988.&lt;/div&gt;</summary>
		<author><name>Lexaloris</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:Lexaloris/%D0%A3%D0%BC%D0%BD%D0%BE%D0%B6%D0%B5%D0%BD%D0%B8%D0%B5_%D1%80%D0%B0%D0%B7%D1%80%D0%B5%D0%B6%D0%B5%D0%BD%D0%BD%D0%BE%D0%B9_%D0%BC%D0%B0%D1%82%D1%80%D0%B8%D1%86%D1%8B_%D0%BD%D0%B0_%D0%B2%D0%B5%D0%BA%D1%82%D0%BE%D1%80&amp;diff=9785</id>
		<title>Участник:Lexaloris/Умножение разреженной матрицы на вектор</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:Lexaloris/%D0%A3%D0%BC%D0%BD%D0%BE%D0%B6%D0%B5%D0%BD%D0%B8%D0%B5_%D1%80%D0%B0%D0%B7%D1%80%D0%B5%D0%B6%D0%B5%D0%BD%D0%BD%D0%BE%D0%B9_%D0%BC%D0%B0%D1%82%D1%80%D0%B8%D1%86%D1%8B_%D0%BD%D0%B0_%D0%B2%D0%B5%D0%BA%D1%82%D0%BE%D1%80&amp;diff=9785"/>
		<updated>2016-10-15T13:53:30Z</updated>

		<summary type="html">&lt;p&gt;Lexaloris: /* Схема реализации последовательного алгоритма */&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(k)&amp;lt;/math&amp;gt;&lt;br /&gt;
| pf_height         = &amp;lt;math&amp;gt;O(m)&amp;lt;/math&amp;gt;&lt;br /&gt;
| pf_width          = &amp;lt;math&amp;gt;O(n)&amp;lt;/math&amp;gt;&lt;br /&gt;
| input_data        = &amp;lt;math&amp;gt;k + m&amp;lt;/math&amp;gt;&lt;br /&gt;
| output_data       = &amp;lt;math&amp;gt;n&amp;lt;/math&amp;gt;&lt;br /&gt;
}}&lt;br /&gt;
&lt;br /&gt;
&lt;br /&gt;
&#039;&#039;&#039;Авторы страницы:&#039;&#039;&#039; [[Участник:Lexaloris|A.Д. Новоселов]] и [[Участник:kochet|П.А. Кочетков]]&lt;br /&gt;
&lt;br /&gt;
= Свойства и структура алгоритмов =&lt;br /&gt;
&lt;br /&gt;
== Общее описание алгоритма ==&lt;br /&gt;
&lt;br /&gt;
=== Хранение ненулевых элементов разреженной матрицы ===&lt;br /&gt;
&lt;br /&gt;
==== Разреженный строчной формат ====&lt;br /&gt;
&lt;br /&gt;
Одной из наиболее ши­роко используемых схем хранения разреженных матриц является &#039;&#039;разреженный строчный формат&#039;&#039;. Эта&lt;br /&gt;
схема предъявляет минимальные требования к памяти и в то же время оказывается очень удобной для умножения разреженной матрицы на вектор.&lt;br /&gt;
Например, рассмотрим формат хранения разряженной матрицы &amp;lt;math&amp;gt;A&amp;lt;/math&amp;gt;:&lt;br /&gt;
&lt;br /&gt;
[[File:RRCOMatrix.png]]&lt;br /&gt;
&lt;br /&gt;
Значения нену­левых элементов матрицы и соответствующие столбцовые индексы хранятся в этой схеме по строкам в двух массивах &amp;lt;math&amp;gt;AN&amp;lt;/math&amp;gt; и &amp;lt;math&amp;gt;JA&amp;lt;/math&amp;gt; соответственно. Используется также массив указателей &amp;lt;math&amp;gt;IA&amp;lt;/math&amp;gt;, отмечающих позиции массивов &amp;lt;math&amp;gt;AN&amp;lt;/math&amp;gt; и &amp;lt;math&amp;gt;JA&amp;lt;/math&amp;gt;, с которых начинается описание очередной строки. Дополнительная компо­нента в &amp;lt;math&amp;gt;IA&amp;lt;/math&amp;gt; содержит указатель первой свободной позиции в &amp;lt;math&amp;gt;JA&amp;lt;/math&amp;gt; и &amp;lt;math&amp;gt;AN&amp;lt;/math&amp;gt;.&lt;br /&gt;
&lt;br /&gt;
Таким образом &amp;lt;math&amp;gt;A&amp;lt;/math&amp;gt; представляется в виде:&lt;br /&gt;
&lt;br /&gt;
   IA = [ 1 4 4 6 ]&lt;br /&gt;
   JA = [ 3 4 8 6 8 ]&lt;br /&gt;
   AN = [ 1 3 5 7 1 ]&lt;br /&gt;
&lt;br /&gt;
Данный способ представления называют &#039;&#039;полным&#039;&#039;, поскольку представлена вся матрица &amp;lt;math&amp;gt;A&amp;lt;/math&amp;gt;, и &#039;&#039;упорядоченным&#039;&#039;, поскольку эле­менты каждой строки хранятся в соответствии с возрастанием столбцовых индексов. Таким образом, это строчное представление, полное и упорядоченное, или сокращенно &#039;&#039;&#039;(RR (С) О)&#039;&#039;&#039;.&lt;br /&gt;
&lt;br /&gt;
==== Неупорядоченное представление ====&lt;br /&gt;
&lt;br /&gt;
Представления разреженных матриц необязательно должны быть упорядочены в том смысле, что, хотя упорядоченность строк поддерживается, внутри каждой строки элементы могут храниться в произвольном порядке. Для матрицы А нашего примера вполне можно было бы использовать и строчное представление, полное, но &#039;&#039;неупорядоченное&#039;&#039; &#039;&#039;&#039;(RR (С) U )&#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;
   IA = [ 1 4 4 6 ]&lt;br /&gt;
   JA = [ 8 3 4 8 6 ]&lt;br /&gt;
   AN = [ 5 1 3 1 7 ]&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; — число строк матрицы. &lt;br /&gt;
Для каждой ее строки &amp;lt;math&amp;gt;I&amp;lt;/math&amp;gt; матрицы мы находим с помощью &amp;lt;math&amp;gt;IA&amp;lt;/math&amp;gt; значения первой &amp;lt;math&amp;gt;IAA&amp;lt;/math&amp;gt; и последней &amp;lt;math&amp;gt;IAB&amp;lt;/math&amp;gt; позиций, занимаемых элементами строки &amp;lt;math&amp;gt;I&amp;lt;/math&amp;gt; в массивах &amp;lt;math&amp;gt;JA&amp;lt;/math&amp;gt; и &amp;lt;math&amp;gt;AN&amp;lt;/math&amp;gt;. Затем, чтобы вычислить скалярное произведение строки &amp;lt;math&amp;gt;I&amp;lt;/math&amp;gt; и вектора &amp;lt;math&amp;gt;B&amp;lt;/math&amp;gt;, мы просто просматриваем &amp;lt;math&amp;gt;JA&amp;lt;/math&amp;gt; и &amp;lt;math&amp;gt;AN&amp;lt;/math&amp;gt; на отрезке от &amp;lt;math&amp;gt;IAA&amp;lt;/math&amp;gt; до &amp;lt;math&amp;gt;IAB&amp;lt;/math&amp;gt;:&lt;br /&gt;
каждое значение, хранимое в &amp;lt;math&amp;gt;JA&amp;lt;/math&amp;gt;, есть столбцовый индекс и используется для извлечения из массива &amp;lt;math&amp;gt;B&amp;lt;/math&amp;gt; элемента, который должен быть умножен на соответствующее число из &amp;lt;math&amp;gt;AN&amp;lt;/math&amp;gt;. Результат каж­дого умножения прибавляется к &amp;lt;math&amp;gt;C(I)&amp;lt;/math&amp;gt;.&lt;br /&gt;
&lt;br /&gt;
== Математическое описание алгоритма ==&lt;br /&gt;
&lt;br /&gt;
&#039;&#039;&#039;Исходные данные:&#039;&#039;&#039; &lt;br /&gt;
&lt;br /&gt;
&amp;lt;math&amp;gt;IA, JA, AN&amp;lt;/math&amp;gt; - заданная матрица в форме &#039;&#039;&#039;(RR (С) U)&#039;&#039;&#039;;&lt;br /&gt;
&lt;br /&gt;
&amp;lt;math&amp;gt;B&amp;lt;/math&amp;gt; - заданный заполненный вектор;&lt;br /&gt;
&lt;br /&gt;
&amp;lt;math&amp;gt;N&amp;lt;/math&amp;gt; - число строк матрицы.&lt;br /&gt;
&lt;br /&gt;
&#039;&#039;&#039;Выход:&#039;&#039;&#039; &amp;lt;math&amp;gt;C&amp;lt;/math&amp;gt; вектор-произведение размерности &amp;lt;math&amp;gt;N&amp;lt;/math&amp;gt;.&lt;br /&gt;
&lt;br /&gt;
&#039;&#039;&#039;Формулы метода:&#039;&#039;&#039;&lt;br /&gt;
&lt;br /&gt;
:&amp;lt;math&amp;gt;&lt;br /&gt;
\begin{align}&lt;br /&gt;
&amp;amp; IAA_{i} = IA(i), \quad i \in [1, N], \\&lt;br /&gt;
&amp;amp; IAB_{i} = IA(i + 1) - 1, \quad i \in [1, N], \\&lt;br /&gt;
&amp;amp; c_{i} = \sum\limits_{j = IAA_{i}}^{IAB_{i}} AN(j)B(JA(j)), \quad i \in [1, N] \\&lt;br /&gt;
\end{align}&lt;br /&gt;
&amp;lt;/math&amp;gt;&lt;br /&gt;
&lt;br /&gt;
== Вычислительное ядро алгоритма ==&lt;br /&gt;
&lt;br /&gt;
Вычислительным ядром, т.е. той частью алгоритма, на которую приходится основное время его работы, является вычисление значения &amp;lt;math&amp;gt;i&amp;lt;/math&amp;gt;-го элемента &amp;lt;math&amp;gt;c_{i}&amp;lt;/math&amp;gt; вектора-произведения, т.е произведения строки &amp;lt;math&amp;gt;I&amp;lt;/math&amp;gt; матрицы &amp;lt;math&amp;gt;A&amp;lt;/math&amp;gt; и вектора &amp;lt;math&amp;gt;B&amp;lt;/math&amp;gt; по формуле:&lt;br /&gt;
&lt;br /&gt;
:&amp;lt;math&amp;gt;&lt;br /&gt;
\begin{align}&lt;br /&gt;
&amp;amp; c_{i} = \sum\limits_{j = IAA_{i}}^{IAB_{i}} AN(j)B(JA(j)), \quad i \in [1, N] \\&lt;br /&gt;
\end{align}&lt;br /&gt;
&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;i&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; по нарастанию выполняются:&lt;br /&gt;
&lt;br /&gt;
1. &amp;lt;math&amp;gt; c_{i} = 0; IAA = IA(i); IAB = IA(i + 1 ) - 1 &amp;lt;/math&amp;gt;&lt;br /&gt;
&lt;br /&gt;
После этого, если &amp;lt;math&amp;gt;(IAB \le IAA)&amp;lt;/math&amp;gt;:&lt;br /&gt;
&lt;br /&gt;
2. Для всех &amp;lt;math&amp;gt;j&amp;lt;/math&amp;gt; от &amp;lt;math&amp;gt;IAA&amp;lt;/math&amp;gt; до &amp;lt;math&amp;gt;IAB&amp;lt;/math&amp;gt; выполняется: &lt;br /&gt;
&lt;br /&gt;
&amp;lt;math&amp;gt;c_{i} = \sum\limits_{j = IAA_{i}}^{IAB_{i}} AN(j)B(JA(j))&amp;lt;/math&amp;gt;&lt;br /&gt;
&lt;br /&gt;
== Последовательная сложность алгоритма ==&lt;br /&gt;
&lt;br /&gt;
Для всего алгоритма потребуется выполнить &amp;lt;math&amp;gt;O(M)&amp;lt;/math&amp;gt; операций, где &amp;lt;math&amp;gt;M&amp;lt;/math&amp;gt; - число ненулевых эле­ментов матрицы.&lt;br /&gt;
&lt;br /&gt;
== Информационный граф ==&lt;br /&gt;
&lt;br /&gt;
[[file:InfoGrafMatrixRRCUandVextor.jpg|thumb|center|1200px|Рисунок 1. Информационный граф алгоритма.]]&lt;br /&gt;
&lt;br /&gt;
== Ресурс параллелизма алгоритма ==&lt;br /&gt;
&lt;br /&gt;
== Входные и выходные данные алгоритма ==&lt;br /&gt;
&lt;br /&gt;
== Свойства алгоритма ==&lt;br /&gt;
&lt;br /&gt;
Алгоритм в рамках выбранной версии полностью детерминирован.&lt;br /&gt;
&lt;br /&gt;
Вычислительная мощность алгоритма, как отношение числа операций к суммарному объему входных и выходных данных – константа.&lt;br /&gt;
&lt;br /&gt;
= Программная реализация алгоритма =&lt;br /&gt;
&lt;br /&gt;
== Масштабируемость алгоритма и его реализации ==&lt;br /&gt;
&lt;br /&gt;
== Существующие реализации алгоритма ==&lt;br /&gt;
&lt;br /&gt;
= Литература =&lt;br /&gt;
&lt;br /&gt;
[1] С. Писсанецки. Технология разреженных матриц. Изд. Мир, 1988.&lt;/div&gt;</summary>
		<author><name>Lexaloris</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:Lexaloris/%D0%A3%D0%BC%D0%BD%D0%BE%D0%B6%D0%B5%D0%BD%D0%B8%D0%B5_%D1%80%D0%B0%D0%B7%D1%80%D0%B5%D0%B6%D0%B5%D0%BD%D0%BD%D0%BE%D0%B9_%D0%BC%D0%B0%D1%82%D1%80%D0%B8%D1%86%D1%8B_%D0%BD%D0%B0_%D0%B2%D0%B5%D0%BA%D1%82%D0%BE%D1%80&amp;diff=9771</id>
		<title>Участник:Lexaloris/Умножение разреженной матрицы на вектор</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:Lexaloris/%D0%A3%D0%BC%D0%BD%D0%BE%D0%B6%D0%B5%D0%BD%D0%B8%D0%B5_%D1%80%D0%B0%D0%B7%D1%80%D0%B5%D0%B6%D0%B5%D0%BD%D0%BD%D0%BE%D0%B9_%D0%BC%D0%B0%D1%82%D1%80%D0%B8%D1%86%D1%8B_%D0%BD%D0%B0_%D0%B2%D0%B5%D0%BA%D1%82%D0%BE%D1%80&amp;diff=9771"/>
		<updated>2016-10-15T13:48:25Z</updated>

		<summary type="html">&lt;p&gt;Lexaloris: &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(k)&amp;lt;/math&amp;gt;&lt;br /&gt;
| pf_height         = &amp;lt;math&amp;gt;O(m)&amp;lt;/math&amp;gt;&lt;br /&gt;
| pf_width          = &amp;lt;math&amp;gt;O(n)&amp;lt;/math&amp;gt;&lt;br /&gt;
| input_data        = &amp;lt;math&amp;gt;k + m&amp;lt;/math&amp;gt;&lt;br /&gt;
| output_data       = &amp;lt;math&amp;gt;n&amp;lt;/math&amp;gt;&lt;br /&gt;
}}&lt;br /&gt;
&lt;br /&gt;
&lt;br /&gt;
&#039;&#039;&#039;Авторы страницы:&#039;&#039;&#039; [[Участник:Lexaloris|A.Д. Новоселов]] и [[Участник:kochet|П.А. Кочетков]]&lt;br /&gt;
&lt;br /&gt;
= Свойства и структура алгоритмов =&lt;br /&gt;
&lt;br /&gt;
== Общее описание алгоритма ==&lt;br /&gt;
&lt;br /&gt;
=== Хранение ненулевых элементов разреженной матрицы ===&lt;br /&gt;
&lt;br /&gt;
==== Разреженный строчной формат ====&lt;br /&gt;
&lt;br /&gt;
Одной из наиболее ши­роко используемых схем хранения разреженных матриц является &#039;&#039;разреженный строчный формат&#039;&#039;. Эта&lt;br /&gt;
схема предъявляет минимальные требования к памяти и в то же время оказывается очень удобной для умножения разреженной матрицы на вектор.&lt;br /&gt;
Например, рассмотрим формат хранения разряженной матрицы &amp;lt;math&amp;gt;A&amp;lt;/math&amp;gt;:&lt;br /&gt;
&lt;br /&gt;
[[File:RRCOMatrix.png]]&lt;br /&gt;
&lt;br /&gt;
Значения нену­левых элементов матрицы и соответствующие столбцовые индексы хранятся в этой схеме по строкам в двух массивах &amp;lt;math&amp;gt;AN&amp;lt;/math&amp;gt; и &amp;lt;math&amp;gt;JA&amp;lt;/math&amp;gt; соответственно. Используется также массив указателей &amp;lt;math&amp;gt;IA&amp;lt;/math&amp;gt;, отмечающих позиции массивов &amp;lt;math&amp;gt;AN&amp;lt;/math&amp;gt; и &amp;lt;math&amp;gt;JA&amp;lt;/math&amp;gt;, с которых начинается описание очередной строки. Дополнительная компо­нента в &amp;lt;math&amp;gt;IA&amp;lt;/math&amp;gt; содержит указатель первой свободной позиции в &amp;lt;math&amp;gt;JA&amp;lt;/math&amp;gt; и &amp;lt;math&amp;gt;AN&amp;lt;/math&amp;gt;.&lt;br /&gt;
&lt;br /&gt;
Таким образом &amp;lt;math&amp;gt;A&amp;lt;/math&amp;gt; представляется в виде:&lt;br /&gt;
&lt;br /&gt;
   IA = [ 1 4 4 6 ]&lt;br /&gt;
   JA = [ 3 4 8 6 8 ]&lt;br /&gt;
   AN = [ 1 3 5 7 1 ]&lt;br /&gt;
&lt;br /&gt;
Данный способ представления называют &#039;&#039;полным&#039;&#039;, поскольку представлена вся матрица &amp;lt;math&amp;gt;A&amp;lt;/math&amp;gt;, и &#039;&#039;упорядоченным&#039;&#039;, поскольку эле­менты каждой строки хранятся в соответствии с возрастанием столбцовых индексов. Таким образом, это строчное представление, полное и упорядоченное, или сокращенно &#039;&#039;&#039;(RR (С) О)&#039;&#039;&#039;.&lt;br /&gt;
&lt;br /&gt;
==== Неупорядоченное представление ====&lt;br /&gt;
&lt;br /&gt;
Представления разреженных матриц необязательно должны быть упорядочены в том смысле, что, хотя упорядоченность строк поддерживается, внутри каждой строки элементы могут храниться в произвольном порядке. Для матрицы А нашего примера вполне можно было бы использовать и строчное представление, полное, но &#039;&#039;неупорядоченное&#039;&#039; &#039;&#039;&#039;(RR (С) U )&#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;
   IA = [ 1 4 4 6 ]&lt;br /&gt;
   JA = [ 8 3 4 8 6 ]&lt;br /&gt;
   AN = [ 5 1 3 1 7 ]&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; — число строк матрицы. &lt;br /&gt;
Для каждой ее строки &amp;lt;math&amp;gt;I&amp;lt;/math&amp;gt; матрицы мы находим с помощью &amp;lt;math&amp;gt;IA&amp;lt;/math&amp;gt; значения первой &amp;lt;math&amp;gt;IAA&amp;lt;/math&amp;gt; и последней &amp;lt;math&amp;gt;IAB&amp;lt;/math&amp;gt; позиций, занимаемых элементами строки &amp;lt;math&amp;gt;I&amp;lt;/math&amp;gt; в массивах &amp;lt;math&amp;gt;JA&amp;lt;/math&amp;gt; и &amp;lt;math&amp;gt;AN&amp;lt;/math&amp;gt;. Затем, чтобы вычислить скалярное произведение строки &amp;lt;math&amp;gt;I&amp;lt;/math&amp;gt; и вектора &amp;lt;math&amp;gt;B&amp;lt;/math&amp;gt;, мы просто просматриваем &amp;lt;math&amp;gt;JA&amp;lt;/math&amp;gt; и &amp;lt;math&amp;gt;AN&amp;lt;/math&amp;gt; на отрезке от &amp;lt;math&amp;gt;IAA&amp;lt;/math&amp;gt; до &amp;lt;math&amp;gt;IAB&amp;lt;/math&amp;gt;:&lt;br /&gt;
каждое значение, хранимое в &amp;lt;math&amp;gt;JA&amp;lt;/math&amp;gt;, есть столбцовый индекс и используется для извлечения из массива &amp;lt;math&amp;gt;B&amp;lt;/math&amp;gt; элемента, который должен быть умножен на соответствующее число из &amp;lt;math&amp;gt;AN&amp;lt;/math&amp;gt;. Результат каж­дого умножения прибавляется к &amp;lt;math&amp;gt;C(I)&amp;lt;/math&amp;gt;.&lt;br /&gt;
&lt;br /&gt;
== Математическое описание алгоритма ==&lt;br /&gt;
&lt;br /&gt;
&#039;&#039;&#039;Исходные данные:&#039;&#039;&#039; &lt;br /&gt;
&lt;br /&gt;
&amp;lt;math&amp;gt;IA, JA, AN&amp;lt;/math&amp;gt; - заданная матрица в форме &#039;&#039;&#039;(RR (С) U)&#039;&#039;&#039;;&lt;br /&gt;
&lt;br /&gt;
&amp;lt;math&amp;gt;B&amp;lt;/math&amp;gt; - заданный заполненный вектор;&lt;br /&gt;
&lt;br /&gt;
&amp;lt;math&amp;gt;N&amp;lt;/math&amp;gt; - число строк матрицы.&lt;br /&gt;
&lt;br /&gt;
&#039;&#039;&#039;Выход:&#039;&#039;&#039; &amp;lt;math&amp;gt;C&amp;lt;/math&amp;gt; вектор-произведение размерности &amp;lt;math&amp;gt;N&amp;lt;/math&amp;gt;.&lt;br /&gt;
&lt;br /&gt;
&#039;&#039;&#039;Формулы метода:&#039;&#039;&#039;&lt;br /&gt;
&lt;br /&gt;
:&amp;lt;math&amp;gt;&lt;br /&gt;
\begin{align}&lt;br /&gt;
&amp;amp; IAA_{i} = IA(i), \quad i \in [1, N], \\&lt;br /&gt;
&amp;amp; IAB_{i} = IA(i + 1) - 1, \quad i \in [1, N], \\&lt;br /&gt;
&amp;amp; c_{i} = \sum\limits_{j = IAA_{i}}^{IAB_{i}} AN(j)B(JA(j)), \quad i \in [1, N] \\&lt;br /&gt;
\end{align}&lt;br /&gt;
&amp;lt;/math&amp;gt;&lt;br /&gt;
&lt;br /&gt;
== Вычислительное ядро алгоритма ==&lt;br /&gt;
&lt;br /&gt;
Вычислительным ядром, т.е. той частью алгоритма, на которую приходится основное время его работы, является вычисление значения &amp;lt;math&amp;gt;i&amp;lt;/math&amp;gt;-го элемента &amp;lt;math&amp;gt;c_{i}&amp;lt;/math&amp;gt; вектора-произведения, т.е произведения строки &amp;lt;math&amp;gt;I&amp;lt;/math&amp;gt; матрицы &amp;lt;math&amp;gt;A&amp;lt;/math&amp;gt; и вектора &amp;lt;math&amp;gt;B&amp;lt;/math&amp;gt; по формуле:&lt;br /&gt;
&lt;br /&gt;
:&amp;lt;math&amp;gt;&lt;br /&gt;
\begin{align}&lt;br /&gt;
&amp;amp; c_{i} = \sum\limits_{j = IAA_{i}}^{IAB_{i}} AN(j)B(JA(j)), \quad i \in [1, N] \\&lt;br /&gt;
\end{align}&lt;br /&gt;
&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;i&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; по нарастанию выполняются:&lt;br /&gt;
&lt;br /&gt;
1. &amp;lt;math&amp;gt; c_{i} = 0; IAA = IA(i); IAB = IA(i + 1 ) - 1 &amp;lt;/math&amp;gt;&lt;br /&gt;
&lt;br /&gt;
После этого, если &amp;lt;math&amp;gt;(IAB &amp;lt;= IAA)&amp;lt;/math&amp;gt;:&lt;br /&gt;
&lt;br /&gt;
2. Для всех &amp;lt;math&amp;gt;j&amp;lt;/math&amp;gt; от &amp;lt;math&amp;gt;IAA&amp;lt;/math&amp;gt; до &amp;lt;math&amp;gt;IAB&amp;lt;/math&amp;gt; выполняется: &lt;br /&gt;
&lt;br /&gt;
&amp;lt;math&amp;gt;c_{i} = \sum\limits_{j = IAA_{i}}^{IAB_{i}} AN(j)B(JA(j))&amp;lt;/math&amp;gt;&lt;br /&gt;
&lt;br /&gt;
== Последовательная сложность алгоритма ==&lt;br /&gt;
&lt;br /&gt;
Для всего алгоритма потребуется выполнить &amp;lt;math&amp;gt;O(M)&amp;lt;/math&amp;gt; операций, где &amp;lt;math&amp;gt;M&amp;lt;/math&amp;gt; - число ненулевых эле­ментов матрицы.&lt;br /&gt;
&lt;br /&gt;
== Информационный граф ==&lt;br /&gt;
&lt;br /&gt;
[[file:InfoGrafMatrixRRCUandVextor.jpg|thumb|center|1200px|Рисунок 1. Информационный граф алгоритма.]]&lt;br /&gt;
&lt;br /&gt;
== Ресурс параллелизма алгоритма ==&lt;br /&gt;
&lt;br /&gt;
== Входные и выходные данные алгоритма ==&lt;br /&gt;
&lt;br /&gt;
== Свойства алгоритма ==&lt;br /&gt;
&lt;br /&gt;
Алгоритм в рамках выбранной версии полностью детерминирован.&lt;br /&gt;
&lt;br /&gt;
Вычислительная мощность алгоритма, как отношение числа операций к суммарному объему входных и выходных данных – константа.&lt;br /&gt;
&lt;br /&gt;
= Программная реализация алгоритма =&lt;br /&gt;
&lt;br /&gt;
== Масштабируемость алгоритма и его реализации ==&lt;br /&gt;
&lt;br /&gt;
== Существующие реализации алгоритма ==&lt;br /&gt;
&lt;br /&gt;
= Литература =&lt;br /&gt;
&lt;br /&gt;
[1] С. Писсанецки. Технология разреженных матриц. Изд. Мир, 1988.&lt;/div&gt;</summary>
		<author><name>Lexaloris</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:Lexaloris/%D0%A3%D0%BC%D0%BD%D0%BE%D0%B6%D0%B5%D0%BD%D0%B8%D0%B5_%D1%80%D0%B0%D0%B7%D1%80%D0%B5%D0%B6%D0%B5%D0%BD%D0%BD%D0%BE%D0%B9_%D0%BC%D0%B0%D1%82%D1%80%D0%B8%D1%86%D1%8B_%D0%BD%D0%B0_%D0%B2%D0%B5%D0%BA%D1%82%D0%BE%D1%80&amp;diff=9654</id>
		<title>Участник:Lexaloris/Умножение разреженной матрицы на вектор</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:Lexaloris/%D0%A3%D0%BC%D0%BD%D0%BE%D0%B6%D0%B5%D0%BD%D0%B8%D0%B5_%D1%80%D0%B0%D0%B7%D1%80%D0%B5%D0%B6%D0%B5%D0%BD%D0%BD%D0%BE%D0%B9_%D0%BC%D0%B0%D1%82%D1%80%D0%B8%D1%86%D1%8B_%D0%BD%D0%B0_%D0%B2%D0%B5%D0%BA%D1%82%D0%BE%D1%80&amp;diff=9654"/>
		<updated>2016-10-15T13:19:48Z</updated>

		<summary type="html">&lt;p&gt;Lexaloris: /* Хранение ненулевых элементов разреженной матрицы */&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(k)&amp;lt;/math&amp;gt;&lt;br /&gt;
| pf_height         = &amp;lt;math&amp;gt;O(m)&amp;lt;/math&amp;gt;&lt;br /&gt;
| pf_width          = &amp;lt;math&amp;gt;O(n)&amp;lt;/math&amp;gt;&lt;br /&gt;
| input_data        = &amp;lt;math&amp;gt;k + m&amp;lt;/math&amp;gt;&lt;br /&gt;
| output_data       = &amp;lt;math&amp;gt;n&amp;lt;/math&amp;gt;&lt;br /&gt;
}}&lt;br /&gt;
&lt;br /&gt;
&lt;br /&gt;
&#039;&#039;&#039;Авторы страницы:&#039;&#039;&#039; [[Участник:Lexaloris|A.Д. Новоселов]] и [[Участник:kochet|П.А. Кочетков]]&lt;br /&gt;
&lt;br /&gt;
= Свойства и структура алгоритмов =&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;A&amp;lt;/math&amp;gt;:&lt;br /&gt;
&lt;br /&gt;
[[File:RRCOMatrix.png]]&lt;br /&gt;
&lt;br /&gt;
Значения нену­левых элементов матрицы и соответствующие столбцовые индексы хранятся в этой схеме по строкам в двух массивах; назовем их соответственно &amp;lt;math&amp;gt;AN&amp;lt;/math&amp;gt; и &amp;lt;math&amp;gt;JA&amp;lt;/math&amp;gt;. Используется также массив указателей &amp;lt;math&amp;gt;IA&amp;lt;/math&amp;gt;, отмечающих позиции массивов &amp;lt;math&amp;gt;AN&amp;lt;/math&amp;gt; и &amp;lt;math&amp;gt;JA&amp;lt;/math&amp;gt;, с которых начинается описание очередной строки. Дополнительная компо­нента в &amp;lt;math&amp;gt;IA&amp;lt;/math&amp;gt; содержит указатель первой свободной позиции в &amp;lt;math&amp;gt;JA&amp;lt;/math&amp;gt; и &amp;lt;math&amp;gt;AN&amp;lt;/math&amp;gt;.&lt;br /&gt;
&lt;br /&gt;
Таким образом &amp;lt;math&amp;gt;A&amp;lt;/math&amp;gt; представляется в виде:&lt;br /&gt;
   &lt;br /&gt;
IA = 1 4 4 6&lt;br /&gt;
JA = 3 4 8 6 8&lt;br /&gt;
AN = 1 3 5 7 1&lt;br /&gt;
&lt;br /&gt;
Данный способ представления называют полным, поскольку представлена вся матрица А, и упорядоченным, поскольку эле­менты каждой строки хранятся в соответствии с возрастанием столбцовых индексов. Таким образом, это строчное представление, полное и упорядоченное, или сокращенно RR (С) О.&lt;br /&gt;
&lt;br /&gt;
Пусть &amp;lt;math&amp;gt;N&amp;lt;/math&amp;gt; — число строк матрицы. &lt;br /&gt;
Для каждой ее строки &amp;lt;math&amp;gt;I&amp;lt;/math&amp;gt; матрийы мы находим с помощью &amp;lt;math&amp;gt;IA&amp;lt;/math&amp;gt; значения первой &amp;lt;math&amp;gt;IAA&amp;lt;/math&amp;gt; и последней &amp;lt;math&amp;gt;IAB&amp;lt;/math&amp;gt; позиций, занимаемых элементами строки &amp;lt;math&amp;gt;I&amp;lt;/math&amp;gt; в массивах &amp;lt;math&amp;gt;JA&amp;lt;/math&amp;gt; и &amp;lt;math&amp;gt;AN&amp;lt;/math&amp;gt;. Затем, чтобы вычислить скалярное произведение строки &amp;lt;math&amp;gt;I&amp;lt;/math&amp;gt; и вектора &amp;lt;math&amp;gt;B&amp;lt;/math&amp;gt;, мы просто просматриваем &amp;lt;math&amp;gt;JA&amp;lt;/math&amp;gt; и &amp;lt;math&amp;gt;AN&amp;lt;/math&amp;gt; на отрезке от &amp;lt;math&amp;gt;IAA&amp;lt;/math&amp;gt; до &amp;lt;math&amp;gt;IAB&amp;lt;/math&amp;gt;:&lt;br /&gt;
каждое значение, хранимое в &amp;lt;math&amp;gt;JA&amp;lt;/math&amp;gt;, есть столбцовый индекс и используется для извлечения из массива &amp;lt;math&amp;gt;B&amp;lt;/math&amp;gt; элемента, который должен быть умножен на соответствующее число из &amp;lt;math&amp;gt;AN&amp;lt;/math&amp;gt;. Результат каж­дого умножения прибавляется к &amp;lt;math&amp;gt;C(I)&amp;lt;/math&amp;gt;.&lt;br /&gt;
&lt;br /&gt;
== Математическое описание алгоритма ==&lt;br /&gt;
&lt;br /&gt;
&#039;&#039;&#039;Исходные данные:&#039;&#039;&#039; &lt;br /&gt;
&lt;br /&gt;
&amp;lt;math&amp;gt;IA, JA, AN&amp;lt;/math&amp;gt; - заданная матрица в форме RR (С) U;&lt;br /&gt;
&lt;br /&gt;
&amp;lt;math&amp;gt;B&amp;lt;/math&amp;gt; - заданный заполненный вектор;&lt;br /&gt;
&lt;br /&gt;
&amp;lt;math&amp;gt;N&amp;lt;/math&amp;gt; - число строк матрицы.&lt;br /&gt;
&lt;br /&gt;
&#039;&#039;&#039;Выход:&#039;&#039;&#039; &amp;lt;math&amp;gt;C&amp;lt;/math&amp;gt; вектор-произведение размерности &amp;lt;math&amp;gt;N&amp;lt;/math&amp;gt;.&lt;br /&gt;
&lt;br /&gt;
&#039;&#039;&#039;Формулы метода:&#039;&#039;&#039;&lt;br /&gt;
&lt;br /&gt;
:&amp;lt;math&amp;gt;&lt;br /&gt;
\begin{align}&lt;br /&gt;
&amp;amp; IAA_{i} = IA(i), \quad i \in [1, N], \\&lt;br /&gt;
&amp;amp; IAB_{i} = IA(i + 1) - 1, \quad i \in [1, N], \\&lt;br /&gt;
&amp;amp; c_{i} = \sum\limits_{j = IAA_{i}}^{IAB_{i}} AN(j)B(JA(j)), \quad i \in [1, N] \\&lt;br /&gt;
\end{align}&lt;br /&gt;
&amp;lt;/math&amp;gt;&lt;br /&gt;
&lt;br /&gt;
== Вычислительное ядро алгоритма ==&lt;br /&gt;
&lt;br /&gt;
Вычислительным ядром, т.е. той частью алгоритма, на которую приходится основное время его работы, является вычисление значения &amp;lt;math&amp;gt;i&amp;lt;/math&amp;gt;-го элемента &amp;lt;math&amp;gt;c_{i}&amp;lt;/math&amp;gt; вектора-произведения, т.е произведения строки &amp;lt;math&amp;gt;I&amp;lt;/math&amp;gt; матрицы &amp;lt;math&amp;gt;A&amp;lt;/math&amp;gt; и вектора &amp;lt;math&amp;gt;B&amp;lt;/math&amp;gt; по формуле:&lt;br /&gt;
&lt;br /&gt;
:&amp;lt;math&amp;gt;&lt;br /&gt;
\begin{align}&lt;br /&gt;
&amp;amp; c_{i} = \sum\limits_{j = IAA_{i}}^{IAB_{i}} AN(j)B(JA(j)), \quad i \in [1, N] \\&lt;br /&gt;
\end{align}&lt;br /&gt;
&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;i&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; по нарастанию выполняются:&lt;br /&gt;
&lt;br /&gt;
1. &amp;lt;math&amp;gt; c_{i} = 0; IAA = IA(i); IAB = IA(i + 1 ) - 1 &amp;lt;/math&amp;gt;&lt;br /&gt;
&lt;br /&gt;
После этого, если &amp;lt;math&amp;gt;(IAB &amp;lt;= IAA)&amp;lt;/math&amp;gt;:&lt;br /&gt;
&lt;br /&gt;
2. Для всех &amp;lt;math&amp;gt;j&amp;lt;/math&amp;gt; от &amp;lt;math&amp;gt;IAA&amp;lt;/math&amp;gt; до &amp;lt;math&amp;gt;IAB&amp;lt;/math&amp;gt; выполняется: &lt;br /&gt;
&lt;br /&gt;
&amp;lt;math&amp;gt;c_{i} = \sum\limits_{j = IAA_{i}}^{IAB_{i}} AN(j)B(JA(j))&amp;lt;/math&amp;gt;&lt;br /&gt;
&lt;br /&gt;
== Последовательная сложность алгоритма ==&lt;br /&gt;
&lt;br /&gt;
Для всего алгоритма потребуется выполнить &amp;lt;math&amp;gt;O(M)&amp;lt;/math&amp;gt; операций, где &amp;lt;math&amp;gt;M&amp;lt;/math&amp;gt; - число ненулевых эле­ментов матрицы.&lt;br /&gt;
&lt;br /&gt;
== Информационный граф ==&lt;br /&gt;
&lt;br /&gt;
[[file:InfoGrafMatrixRRCUandVextor.jpg|thumb|center|1200px|Рисунок 1. Информационный граф алгоритма.]]&lt;br /&gt;
&lt;br /&gt;
== Ресурс параллелизма алгоритма ==&lt;br /&gt;
&lt;br /&gt;
== Входные и выходные данные алгоритма ==&lt;br /&gt;
&lt;br /&gt;
== Свойства алгоритма ==&lt;br /&gt;
&lt;br /&gt;
Алгоритм в рамках выбранной версии полностью детерминирован.&lt;br /&gt;
&lt;br /&gt;
Вычислительная мощность алгоритма, как отношение числа операций к суммарному объему входных и выходных данных – константа.&lt;br /&gt;
&lt;br /&gt;
= Программная реализация алгоритма =&lt;br /&gt;
&lt;br /&gt;
== Масштабируемость алгоритма и его реализации ==&lt;br /&gt;
&lt;br /&gt;
== Существующие реализации алгоритма ==&lt;br /&gt;
&lt;br /&gt;
= Литература =&lt;br /&gt;
&lt;br /&gt;
[1] С. Писсанецки. Технология разреженных матриц. Изд. Мир, 1988.&lt;/div&gt;</summary>
		<author><name>Lexaloris</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:Lexaloris/%D0%A3%D0%BC%D0%BD%D0%BE%D0%B6%D0%B5%D0%BD%D0%B8%D0%B5_%D1%80%D0%B0%D0%B7%D1%80%D0%B5%D0%B6%D0%B5%D0%BD%D0%BD%D0%BE%D0%B9_%D0%BC%D0%B0%D1%82%D1%80%D0%B8%D1%86%D1%8B_%D0%BD%D0%B0_%D0%B2%D0%B5%D0%BA%D1%82%D0%BE%D1%80&amp;diff=9605</id>
		<title>Участник:Lexaloris/Умножение разреженной матрицы на вектор</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:Lexaloris/%D0%A3%D0%BC%D0%BD%D0%BE%D0%B6%D0%B5%D0%BD%D0%B8%D0%B5_%D1%80%D0%B0%D0%B7%D1%80%D0%B5%D0%B6%D0%B5%D0%BD%D0%BD%D0%BE%D0%B9_%D0%BC%D0%B0%D1%82%D1%80%D0%B8%D1%86%D1%8B_%D0%BD%D0%B0_%D0%B2%D0%B5%D0%BA%D1%82%D0%BE%D1%80&amp;diff=9605"/>
		<updated>2016-10-15T13:07:28Z</updated>

		<summary type="html">&lt;p&gt;Lexaloris: /* Хранение ненулевых элементов разреженной матрицы */&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(k)&amp;lt;/math&amp;gt;&lt;br /&gt;
| pf_height         = &amp;lt;math&amp;gt;O(m)&amp;lt;/math&amp;gt;&lt;br /&gt;
| pf_width          = &amp;lt;math&amp;gt;O(n)&amp;lt;/math&amp;gt;&lt;br /&gt;
| input_data        = &amp;lt;math&amp;gt;k + m&amp;lt;/math&amp;gt;&lt;br /&gt;
| output_data       = &amp;lt;math&amp;gt;n&amp;lt;/math&amp;gt;&lt;br /&gt;
}}&lt;br /&gt;
&lt;br /&gt;
&lt;br /&gt;
&#039;&#039;&#039;Авторы страницы:&#039;&#039;&#039; [[Участник:Lexaloris|A.Д. Новоселов]] и [[Участник:kochet|П.А. Кочетков]]&lt;br /&gt;
&lt;br /&gt;
= Свойства и структура алгоритмов =&lt;br /&gt;
&lt;br /&gt;
== Общее описание алгоритма ==&lt;br /&gt;
&lt;br /&gt;
=== Хранение ненулевых элементов разреженной матрицы ===&lt;br /&gt;
&lt;br /&gt;
Одной из наиболее ши­роко используемых схем хранения разреженных матриц является разреженный строчный формат. Эта&lt;br /&gt;
схема предъявляет минимальные требования к памяти и в то же время оказывается очень удобной для умножения разреженной матрицы на вектор.&lt;br /&gt;
Значения нену­левых элементов матрицы и соответствующие столбцовые индексы хранятся в этой схеме по строкам в двух массивах; назовем их соответственно AN и JA. Используется также массив указателей IA, отмечающих позиции массивов AN и JA, с которых начинается описание очередной строки. Дополнительная компо­нента в IA содержит указатель первой свободной позиции в JA и AN. Например, Рассмотрим матрицу:&lt;br /&gt;
&lt;br /&gt;
[[file:RRCOMatrix.png]]&lt;br /&gt;
&lt;br /&gt;
&lt;br /&gt;
Пусть &amp;lt;math&amp;gt;N&amp;lt;/math&amp;gt; — число строк матрицы. &lt;br /&gt;
Для каждой ее строки &amp;lt;math&amp;gt;I&amp;lt;/math&amp;gt; матрийы мы находим с помощью &amp;lt;math&amp;gt;IA&amp;lt;/math&amp;gt; значения первой &amp;lt;math&amp;gt;IAA&amp;lt;/math&amp;gt; и последней &amp;lt;math&amp;gt;IAB&amp;lt;/math&amp;gt; позиций, занимаемых элементами строки &amp;lt;math&amp;gt;I&amp;lt;/math&amp;gt; в массивах &amp;lt;math&amp;gt;JA&amp;lt;/math&amp;gt; и &amp;lt;math&amp;gt;AN&amp;lt;/math&amp;gt;. Затем, чтобы вычислить скалярное произведение строки &amp;lt;math&amp;gt;I&amp;lt;/math&amp;gt; и вектора &amp;lt;math&amp;gt;B&amp;lt;/math&amp;gt;, мы просто просматриваем &amp;lt;math&amp;gt;JA&amp;lt;/math&amp;gt; и &amp;lt;math&amp;gt;AN&amp;lt;/math&amp;gt; на отрезке от &amp;lt;math&amp;gt;IAA&amp;lt;/math&amp;gt; до &amp;lt;math&amp;gt;IAB&amp;lt;/math&amp;gt;:&lt;br /&gt;
каждое значение, хранимое в &amp;lt;math&amp;gt;JA&amp;lt;/math&amp;gt;, есть столбцовый индекс и используется для извлечения из массива &amp;lt;math&amp;gt;B&amp;lt;/math&amp;gt; элемента, который должен быть умножен на соответствующее число из &amp;lt;math&amp;gt;AN&amp;lt;/math&amp;gt;. Результат каж­дого умножения прибавляется к &amp;lt;math&amp;gt;C(I)&amp;lt;/math&amp;gt;.&lt;br /&gt;
&lt;br /&gt;
== Математическое описание алгоритма ==&lt;br /&gt;
&lt;br /&gt;
&#039;&#039;&#039;Исходные данные:&#039;&#039;&#039; &lt;br /&gt;
&lt;br /&gt;
&amp;lt;math&amp;gt;IA, JA, AN&amp;lt;/math&amp;gt; - заданная матрица в форме RR (С) U;&lt;br /&gt;
&lt;br /&gt;
&amp;lt;math&amp;gt;B&amp;lt;/math&amp;gt; - заданный заполненный вектор;&lt;br /&gt;
&lt;br /&gt;
&amp;lt;math&amp;gt;N&amp;lt;/math&amp;gt; - число строк матрицы.&lt;br /&gt;
&lt;br /&gt;
&#039;&#039;&#039;Выход:&#039;&#039;&#039; &amp;lt;math&amp;gt;C&amp;lt;/math&amp;gt; вектор-произведение размерности &amp;lt;math&amp;gt;N&amp;lt;/math&amp;gt;.&lt;br /&gt;
&lt;br /&gt;
&#039;&#039;&#039;Формулы метода:&#039;&#039;&#039;&lt;br /&gt;
&lt;br /&gt;
:&amp;lt;math&amp;gt;&lt;br /&gt;
\begin{align}&lt;br /&gt;
&amp;amp; IAA_{i} = IA(i), \quad i \in [1, N], \\&lt;br /&gt;
&amp;amp; IAB_{i} = IA(i + 1) - 1, \quad i \in [1, N], \\&lt;br /&gt;
&amp;amp; c_{i} = \sum\limits_{j = IAA_{i}}^{IAB_{i}} AN(j)B(JA(j)), \quad i \in [1, N] \\&lt;br /&gt;
\end{align}&lt;br /&gt;
&amp;lt;/math&amp;gt;&lt;br /&gt;
&lt;br /&gt;
== Вычислительное ядро алгоритма ==&lt;br /&gt;
&lt;br /&gt;
Вычислительным ядром, т.е. той частью алгоритма, на которую приходится основное время его работы, является вычисление значения &amp;lt;math&amp;gt;i&amp;lt;/math&amp;gt;-го элемента &amp;lt;math&amp;gt;c_{i}&amp;lt;/math&amp;gt; вектора-произведения, т.е произведения строки &amp;lt;math&amp;gt;I&amp;lt;/math&amp;gt; матрицы &amp;lt;math&amp;gt;A&amp;lt;/math&amp;gt; и вектора &amp;lt;math&amp;gt;B&amp;lt;/math&amp;gt; по формуле:&lt;br /&gt;
&lt;br /&gt;
:&amp;lt;math&amp;gt;&lt;br /&gt;
\begin{align}&lt;br /&gt;
&amp;amp; c_{i} = \sum\limits_{j = IAA_{i}}^{IAB_{i}} AN(j)B(JA(j)), \quad i \in [1, N] \\&lt;br /&gt;
\end{align}&lt;br /&gt;
&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;i&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; по нарастанию выполняются:&lt;br /&gt;
&lt;br /&gt;
1. &amp;lt;math&amp;gt; c_{i} = 0; IAA = IA(i); IAB = IA(i + 1 ) - 1 &amp;lt;/math&amp;gt;&lt;br /&gt;
&lt;br /&gt;
После этого, если &amp;lt;math&amp;gt;(IAB &amp;lt;= IAA)&amp;lt;/math&amp;gt;:&lt;br /&gt;
&lt;br /&gt;
2. Для всех &amp;lt;math&amp;gt;j&amp;lt;/math&amp;gt; от &amp;lt;math&amp;gt;IAA&amp;lt;/math&amp;gt; до &amp;lt;math&amp;gt;IAB&amp;lt;/math&amp;gt; выполняется: &lt;br /&gt;
&lt;br /&gt;
&amp;lt;math&amp;gt;c_{i} = \sum\limits_{j = IAA_{i}}^{IAB_{i}} AN(j)B(JA(j))&amp;lt;/math&amp;gt;&lt;br /&gt;
&lt;br /&gt;
== Последовательная сложность алгоритма ==&lt;br /&gt;
&lt;br /&gt;
Для всего алгоритма потребуется выполнить &amp;lt;math&amp;gt;O(M)&amp;lt;/math&amp;gt; операций, где &amp;lt;math&amp;gt;M&amp;lt;/math&amp;gt; - число ненулевых эле­ментов матрицы.&lt;br /&gt;
&lt;br /&gt;
== Информационный граф ==&lt;br /&gt;
&lt;br /&gt;
[[file:InfoGrafMatrixRRCUandVextor.jpg|thumb|center|1200px|Рисунок 1. Информационный граф алгоритма.]]&lt;br /&gt;
&lt;br /&gt;
== Ресурс параллелизма алгоритма ==&lt;br /&gt;
&lt;br /&gt;
== Входные и выходные данные алгоритма ==&lt;br /&gt;
&lt;br /&gt;
== Свойства алгоритма ==&lt;br /&gt;
&lt;br /&gt;
Алгоритм в рамках выбранной версии полностью детерминирован.&lt;br /&gt;
&lt;br /&gt;
Вычислительная мощность алгоритма, как отношение числа операций к суммарному объему входных и выходных данных – константа.&lt;br /&gt;
&lt;br /&gt;
= Программная реализация алгоритма =&lt;br /&gt;
&lt;br /&gt;
== Масштабируемость алгоритма и его реализации ==&lt;br /&gt;
&lt;br /&gt;
== Существующие реализации алгоритма ==&lt;br /&gt;
&lt;br /&gt;
= Литература =&lt;br /&gt;
&lt;br /&gt;
[1] С. Писсанецки. Технология разреженных матриц. Изд. Мир, 1988.&lt;/div&gt;</summary>
		<author><name>Lexaloris</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:Lexaloris/%D0%A3%D0%BC%D0%BD%D0%BE%D0%B6%D0%B5%D0%BD%D0%B8%D0%B5_%D1%80%D0%B0%D0%B7%D1%80%D0%B5%D0%B6%D0%B5%D0%BD%D0%BD%D0%BE%D0%B9_%D0%BC%D0%B0%D1%82%D1%80%D0%B8%D1%86%D1%8B_%D0%BD%D0%B0_%D0%B2%D0%B5%D0%BA%D1%82%D0%BE%D1%80&amp;diff=9603</id>
		<title>Участник:Lexaloris/Умножение разреженной матрицы на вектор</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:Lexaloris/%D0%A3%D0%BC%D0%BD%D0%BE%D0%B6%D0%B5%D0%BD%D0%B8%D0%B5_%D1%80%D0%B0%D0%B7%D1%80%D0%B5%D0%B6%D0%B5%D0%BD%D0%BD%D0%BE%D0%B9_%D0%BC%D0%B0%D1%82%D1%80%D0%B8%D1%86%D1%8B_%D0%BD%D0%B0_%D0%B2%D0%B5%D0%BA%D1%82%D0%BE%D1%80&amp;diff=9603"/>
		<updated>2016-10-15T13:07:05Z</updated>

		<summary type="html">&lt;p&gt;Lexaloris: /* Свойства и структура алгоритмов */&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(k)&amp;lt;/math&amp;gt;&lt;br /&gt;
| pf_height         = &amp;lt;math&amp;gt;O(m)&amp;lt;/math&amp;gt;&lt;br /&gt;
| pf_width          = &amp;lt;math&amp;gt;O(n)&amp;lt;/math&amp;gt;&lt;br /&gt;
| input_data        = &amp;lt;math&amp;gt;k + m&amp;lt;/math&amp;gt;&lt;br /&gt;
| output_data       = &amp;lt;math&amp;gt;n&amp;lt;/math&amp;gt;&lt;br /&gt;
}}&lt;br /&gt;
&lt;br /&gt;
&lt;br /&gt;
&#039;&#039;&#039;Авторы страницы:&#039;&#039;&#039; [[Участник:Lexaloris|A.Д. Новоселов]] и [[Участник:kochet|П.А. Кочетков]]&lt;br /&gt;
&lt;br /&gt;
= Свойства и структура алгоритмов =&lt;br /&gt;
&lt;br /&gt;
== Общее описание алгоритма ==&lt;br /&gt;
&lt;br /&gt;
=== Хранение ненулевых элементов разреженной матрицы ===&lt;br /&gt;
&lt;br /&gt;
Одной из наиболее ши­роко используемых схем хранения разреженных матриц является разреженный строчный формат. Эта&lt;br /&gt;
схема предъявляет минимальные требования к памяти и в то же время оказывается очень удобной для умножения разреженной матрицы на вектор.&lt;br /&gt;
Значения нену­левых элементов матрицы и соответствующие столбцовые индексы хранятся в этой схеме по строкам в двух массивах; назовем их соответственно AN и JA. Используется также массив указателей IA, отмечающих позиции массивов AN и JA, с которых начинается описание очередной строки. Дополнительная компо­нента в IA содержит указатель первой свободной позиции в JA и AN. Например, Рассмотрим матрицу:&lt;br /&gt;
&lt;br /&gt;
[[file:RRCOMatrix.jpg]]&lt;br /&gt;
&lt;br /&gt;
&lt;br /&gt;
Пусть &amp;lt;math&amp;gt;N&amp;lt;/math&amp;gt; — число строк матрицы. &lt;br /&gt;
Для каждой ее строки &amp;lt;math&amp;gt;I&amp;lt;/math&amp;gt; матрийы мы находим с помощью &amp;lt;math&amp;gt;IA&amp;lt;/math&amp;gt; значения первой &amp;lt;math&amp;gt;IAA&amp;lt;/math&amp;gt; и последней &amp;lt;math&amp;gt;IAB&amp;lt;/math&amp;gt; позиций, занимаемых элементами строки &amp;lt;math&amp;gt;I&amp;lt;/math&amp;gt; в массивах &amp;lt;math&amp;gt;JA&amp;lt;/math&amp;gt; и &amp;lt;math&amp;gt;AN&amp;lt;/math&amp;gt;. Затем, чтобы вычислить скалярное произведение строки &amp;lt;math&amp;gt;I&amp;lt;/math&amp;gt; и вектора &amp;lt;math&amp;gt;B&amp;lt;/math&amp;gt;, мы просто просматриваем &amp;lt;math&amp;gt;JA&amp;lt;/math&amp;gt; и &amp;lt;math&amp;gt;AN&amp;lt;/math&amp;gt; на отрезке от &amp;lt;math&amp;gt;IAA&amp;lt;/math&amp;gt; до &amp;lt;math&amp;gt;IAB&amp;lt;/math&amp;gt;:&lt;br /&gt;
каждое значение, хранимое в &amp;lt;math&amp;gt;JA&amp;lt;/math&amp;gt;, есть столбцовый индекс и используется для извлечения из массива &amp;lt;math&amp;gt;B&amp;lt;/math&amp;gt; элемента, который должен быть умножен на соответствующее число из &amp;lt;math&amp;gt;AN&amp;lt;/math&amp;gt;. Результат каж­дого умножения прибавляется к &amp;lt;math&amp;gt;C(I)&amp;lt;/math&amp;gt;.&lt;br /&gt;
&lt;br /&gt;
== Математическое описание алгоритма ==&lt;br /&gt;
&lt;br /&gt;
&#039;&#039;&#039;Исходные данные:&#039;&#039;&#039; &lt;br /&gt;
&lt;br /&gt;
&amp;lt;math&amp;gt;IA, JA, AN&amp;lt;/math&amp;gt; - заданная матрица в форме RR (С) U;&lt;br /&gt;
&lt;br /&gt;
&amp;lt;math&amp;gt;B&amp;lt;/math&amp;gt; - заданный заполненный вектор;&lt;br /&gt;
&lt;br /&gt;
&amp;lt;math&amp;gt;N&amp;lt;/math&amp;gt; - число строк матрицы.&lt;br /&gt;
&lt;br /&gt;
&#039;&#039;&#039;Выход:&#039;&#039;&#039; &amp;lt;math&amp;gt;C&amp;lt;/math&amp;gt; вектор-произведение размерности &amp;lt;math&amp;gt;N&amp;lt;/math&amp;gt;.&lt;br /&gt;
&lt;br /&gt;
&#039;&#039;&#039;Формулы метода:&#039;&#039;&#039;&lt;br /&gt;
&lt;br /&gt;
:&amp;lt;math&amp;gt;&lt;br /&gt;
\begin{align}&lt;br /&gt;
&amp;amp; IAA_{i} = IA(i), \quad i \in [1, N], \\&lt;br /&gt;
&amp;amp; IAB_{i} = IA(i + 1) - 1, \quad i \in [1, N], \\&lt;br /&gt;
&amp;amp; c_{i} = \sum\limits_{j = IAA_{i}}^{IAB_{i}} AN(j)B(JA(j)), \quad i \in [1, N] \\&lt;br /&gt;
\end{align}&lt;br /&gt;
&amp;lt;/math&amp;gt;&lt;br /&gt;
&lt;br /&gt;
== Вычислительное ядро алгоритма ==&lt;br /&gt;
&lt;br /&gt;
Вычислительным ядром, т.е. той частью алгоритма, на которую приходится основное время его работы, является вычисление значения &amp;lt;math&amp;gt;i&amp;lt;/math&amp;gt;-го элемента &amp;lt;math&amp;gt;c_{i}&amp;lt;/math&amp;gt; вектора-произведения, т.е произведения строки &amp;lt;math&amp;gt;I&amp;lt;/math&amp;gt; матрицы &amp;lt;math&amp;gt;A&amp;lt;/math&amp;gt; и вектора &amp;lt;math&amp;gt;B&amp;lt;/math&amp;gt; по формуле:&lt;br /&gt;
&lt;br /&gt;
:&amp;lt;math&amp;gt;&lt;br /&gt;
\begin{align}&lt;br /&gt;
&amp;amp; c_{i} = \sum\limits_{j = IAA_{i}}^{IAB_{i}} AN(j)B(JA(j)), \quad i \in [1, N] \\&lt;br /&gt;
\end{align}&lt;br /&gt;
&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;i&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; по нарастанию выполняются:&lt;br /&gt;
&lt;br /&gt;
1. &amp;lt;math&amp;gt; c_{i} = 0; IAA = IA(i); IAB = IA(i + 1 ) - 1 &amp;lt;/math&amp;gt;&lt;br /&gt;
&lt;br /&gt;
После этого, если &amp;lt;math&amp;gt;(IAB &amp;lt;= IAA)&amp;lt;/math&amp;gt;:&lt;br /&gt;
&lt;br /&gt;
2. Для всех &amp;lt;math&amp;gt;j&amp;lt;/math&amp;gt; от &amp;lt;math&amp;gt;IAA&amp;lt;/math&amp;gt; до &amp;lt;math&amp;gt;IAB&amp;lt;/math&amp;gt; выполняется: &lt;br /&gt;
&lt;br /&gt;
&amp;lt;math&amp;gt;c_{i} = \sum\limits_{j = IAA_{i}}^{IAB_{i}} AN(j)B(JA(j))&amp;lt;/math&amp;gt;&lt;br /&gt;
&lt;br /&gt;
== Последовательная сложность алгоритма ==&lt;br /&gt;
&lt;br /&gt;
Для всего алгоритма потребуется выполнить &amp;lt;math&amp;gt;O(M)&amp;lt;/math&amp;gt; операций, где &amp;lt;math&amp;gt;M&amp;lt;/math&amp;gt; - число ненулевых эле­ментов матрицы.&lt;br /&gt;
&lt;br /&gt;
== Информационный граф ==&lt;br /&gt;
&lt;br /&gt;
[[file:InfoGrafMatrixRRCUandVextor.jpg|thumb|center|1200px|Рисунок 1. Информационный граф алгоритма.]]&lt;br /&gt;
&lt;br /&gt;
== Ресурс параллелизма алгоритма ==&lt;br /&gt;
&lt;br /&gt;
== Входные и выходные данные алгоритма ==&lt;br /&gt;
&lt;br /&gt;
== Свойства алгоритма ==&lt;br /&gt;
&lt;br /&gt;
Алгоритм в рамках выбранной версии полностью детерминирован.&lt;br /&gt;
&lt;br /&gt;
Вычислительная мощность алгоритма, как отношение числа операций к суммарному объему входных и выходных данных – константа.&lt;br /&gt;
&lt;br /&gt;
= Программная реализация алгоритма =&lt;br /&gt;
&lt;br /&gt;
== Масштабируемость алгоритма и его реализации ==&lt;br /&gt;
&lt;br /&gt;
== Существующие реализации алгоритма ==&lt;br /&gt;
&lt;br /&gt;
= Литература =&lt;br /&gt;
&lt;br /&gt;
[1] С. Писсанецки. Технология разреженных матриц. Изд. Мир, 1988.&lt;/div&gt;</summary>
		<author><name>Lexaloris</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:Lexaloris/%D0%A3%D0%BC%D0%BD%D0%BE%D0%B6%D0%B5%D0%BD%D0%B8%D0%B5_%D1%80%D0%B0%D0%B7%D1%80%D0%B5%D0%B6%D0%B5%D0%BD%D0%BD%D0%BE%D0%B9_%D0%BC%D0%B0%D1%82%D1%80%D0%B8%D1%86%D1%8B_%D0%BD%D0%B0_%D0%B2%D0%B5%D0%BA%D1%82%D0%BE%D1%80&amp;diff=9518</id>
		<title>Участник:Lexaloris/Умножение разреженной матрицы на вектор</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:Lexaloris/%D0%A3%D0%BC%D0%BD%D0%BE%D0%B6%D0%B5%D0%BD%D0%B8%D0%B5_%D1%80%D0%B0%D0%B7%D1%80%D0%B5%D0%B6%D0%B5%D0%BD%D0%BD%D0%BE%D0%B9_%D0%BC%D0%B0%D1%82%D1%80%D0%B8%D1%86%D1%8B_%D0%BD%D0%B0_%D0%B2%D0%B5%D0%BA%D1%82%D0%BE%D1%80&amp;diff=9518"/>
		<updated>2016-10-15T12:41:35Z</updated>

		<summary type="html">&lt;p&gt;Lexaloris: &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(k)&amp;lt;/math&amp;gt;&lt;br /&gt;
| pf_height         = &amp;lt;math&amp;gt;O(m)&amp;lt;/math&amp;gt;&lt;br /&gt;
| pf_width          = &amp;lt;math&amp;gt;O(n)&amp;lt;/math&amp;gt;&lt;br /&gt;
| input_data        = &amp;lt;math&amp;gt;k + m&amp;lt;/math&amp;gt;&lt;br /&gt;
| output_data       = &amp;lt;math&amp;gt;n&amp;lt;/math&amp;gt;&lt;br /&gt;
}}&lt;br /&gt;
&lt;br /&gt;
&lt;br /&gt;
&#039;&#039;&#039;Авторы страницы:&#039;&#039;&#039; [[Участник:Lexaloris|A.Д. Новоселов]] и [[Участник:kochet|П.А. Кочетков]]&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; — число строк матрицы. &lt;br /&gt;
Для каждой ее строки &amp;lt;math&amp;gt;I&amp;lt;/math&amp;gt; матрийы мы находим с помощью &amp;lt;math&amp;gt;IA&amp;lt;/math&amp;gt; значения первой &amp;lt;math&amp;gt;IAA&amp;lt;/math&amp;gt; и последней &amp;lt;math&amp;gt;IAB&amp;lt;/math&amp;gt; позиций, занимаемых элементами строки &amp;lt;math&amp;gt;I&amp;lt;/math&amp;gt; в массивах &amp;lt;math&amp;gt;JA&amp;lt;/math&amp;gt; и &amp;lt;math&amp;gt;AN&amp;lt;/math&amp;gt;. Затем, чтобы вычислить скалярное произведение строки &amp;lt;math&amp;gt;I&amp;lt;/math&amp;gt; и вектора &amp;lt;math&amp;gt;B&amp;lt;/math&amp;gt;, мы просто просматриваем &amp;lt;math&amp;gt;JA&amp;lt;/math&amp;gt; и &amp;lt;math&amp;gt;AN&amp;lt;/math&amp;gt; на отрезке от &amp;lt;math&amp;gt;IAA&amp;lt;/math&amp;gt; до &amp;lt;math&amp;gt;IAB&amp;lt;/math&amp;gt;:&lt;br /&gt;
каждое значение, хранимое в &amp;lt;math&amp;gt;JA&amp;lt;/math&amp;gt;, есть столбцовый индекс и используется для извлечения из массива &amp;lt;math&amp;gt;B&amp;lt;/math&amp;gt; элемента, который должен быть умножен на соответствующее число из &amp;lt;math&amp;gt;AN&amp;lt;/math&amp;gt;. Результат каж­дого умножения прибавляется к &amp;lt;math&amp;gt;C(I)&amp;lt;/math&amp;gt;.&lt;br /&gt;
&lt;br /&gt;
== Математическое описание алгоритма ==&lt;br /&gt;
&lt;br /&gt;
&#039;&#039;&#039;Исходные данные:&#039;&#039;&#039; &lt;br /&gt;
&lt;br /&gt;
&amp;lt;math&amp;gt;IA, JA, AN&amp;lt;/math&amp;gt; - заданная матрица в форме RR (С) U;&lt;br /&gt;
&lt;br /&gt;
&amp;lt;math&amp;gt;B&amp;lt;/math&amp;gt; - заданный заполненный вектор;&lt;br /&gt;
&lt;br /&gt;
&amp;lt;math&amp;gt;N&amp;lt;/math&amp;gt; - число строк матрицы.&lt;br /&gt;
&lt;br /&gt;
&#039;&#039;&#039;Выход:&#039;&#039;&#039; &amp;lt;math&amp;gt;C&amp;lt;/math&amp;gt; вектор-произведение размерности &amp;lt;math&amp;gt;N&amp;lt;/math&amp;gt;.&lt;br /&gt;
&lt;br /&gt;
&#039;&#039;&#039;Формулы метода:&#039;&#039;&#039;&lt;br /&gt;
&lt;br /&gt;
:&amp;lt;math&amp;gt;&lt;br /&gt;
\begin{align}&lt;br /&gt;
&amp;amp; IAA_{i} = IA(i), \quad i \in [1, N], \\&lt;br /&gt;
&amp;amp; IAB_{i} = IA(i + 1) - 1, \quad i \in [1, N], \\&lt;br /&gt;
&amp;amp; c_{i} = \sum\limits_{j = IAA_{i}}^{IAB_{i}} AN(j)B(JA(j)), \quad i \in [1, N] \\&lt;br /&gt;
\end{align}&lt;br /&gt;
&amp;lt;/math&amp;gt;&lt;br /&gt;
&lt;br /&gt;
== Вычислительное ядро алгоритма ==&lt;br /&gt;
&lt;br /&gt;
Вычислительным ядром, т.е. той частью алгоритма, на которую приходится основное время его работы, является вычисление значения &amp;lt;math&amp;gt;i&amp;lt;/math&amp;gt;-го элемента &amp;lt;math&amp;gt;c_{i}&amp;lt;/math&amp;gt; вектора-произведения, т.е произведения строки &amp;lt;math&amp;gt;I&amp;lt;/math&amp;gt; матрицы &amp;lt;math&amp;gt;A&amp;lt;/math&amp;gt; и вектора &amp;lt;math&amp;gt;B&amp;lt;/math&amp;gt; по формуле:&lt;br /&gt;
&lt;br /&gt;
:&amp;lt;math&amp;gt;&lt;br /&gt;
\begin{align}&lt;br /&gt;
&amp;amp; c_{i} = \sum\limits_{j = IAA_{i}}^{IAB_{i}} AN(j)B(JA(j)), \quad i \in [1, N] \\&lt;br /&gt;
\end{align}&lt;br /&gt;
&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;i&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; по нарастанию выполняются:&lt;br /&gt;
&lt;br /&gt;
1. &amp;lt;math&amp;gt; c_{i} = 0; IAA = IA(i); IAB = IA(i + 1 ) - 1 &amp;lt;/math&amp;gt;&lt;br /&gt;
&lt;br /&gt;
После этого, если &amp;lt;math&amp;gt;(IAB &amp;lt;= IAA)&amp;lt;/math&amp;gt;:&lt;br /&gt;
&lt;br /&gt;
2. Для всех &amp;lt;math&amp;gt;j&amp;lt;/math&amp;gt; от &amp;lt;math&amp;gt;IAA&amp;lt;/math&amp;gt; до &amp;lt;math&amp;gt;IAB&amp;lt;/math&amp;gt; выполняется: &lt;br /&gt;
&lt;br /&gt;
&amp;lt;math&amp;gt;c_{i} = \sum\limits_{j = IAA_{i}}^{IAB_{i}} AN(j)B(JA(j))&amp;lt;/math&amp;gt;&lt;br /&gt;
&lt;br /&gt;
== Последовательная сложность алгоритма ==&lt;br /&gt;
&lt;br /&gt;
Для всего алгоритма потребуется выполнить &amp;lt;math&amp;gt;O(M)&amp;lt;/math&amp;gt; операций, где &amp;lt;math&amp;gt;M&amp;lt;/math&amp;gt; - число ненулевых эле­ментов матрицы.&lt;br /&gt;
&lt;br /&gt;
== Информационный граф ==&lt;br /&gt;
&lt;br /&gt;
[[file:InfoGrafMatrixRRCUandVextor.jpg|thumb|center|1200px|Рисунок 1. Информационный граф алгоритма.]]&lt;br /&gt;
&lt;br /&gt;
== Ресурс параллелизма алгоритма ==&lt;br /&gt;
&lt;br /&gt;
== Входные и выходные данные алгоритма ==&lt;br /&gt;
&lt;br /&gt;
== Свойства алгоритма ==&lt;br /&gt;
&lt;br /&gt;
Алгоритм в рамках выбранной версии полностью детерминирован.&lt;br /&gt;
&lt;br /&gt;
Вычислительная мощность алгоритма, как отношение числа операций к суммарному объему входных и выходных данных – константа.&lt;br /&gt;
&lt;br /&gt;
= Программная реализация алгоритма =&lt;br /&gt;
&lt;br /&gt;
== Масштабируемость алгоритма и его реализации ==&lt;br /&gt;
&lt;br /&gt;
== Существующие реализации алгоритма ==&lt;br /&gt;
&lt;br /&gt;
= Литература =&lt;br /&gt;
&lt;br /&gt;
[1] С. Писсанецки. Технология разреженных матриц. Изд. Мир, 1988.&lt;/div&gt;</summary>
		<author><name>Lexaloris</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:Kochet&amp;diff=9500</id>
		<title>Участник:Kochet</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:Kochet&amp;diff=9500"/>
		<updated>2016-10-15T12:37:08Z</updated>

		<summary type="html">&lt;p&gt;Lexaloris: Новая страница: «Кочетков Павел Александрович Группа 621.»&lt;/p&gt;
&lt;hr /&gt;
&lt;div&gt;Кочетков Павел Александрович Группа 621.&lt;/div&gt;</summary>
		<author><name>Lexaloris</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:Lexaloris/%D0%A3%D0%BC%D0%BD%D0%BE%D0%B6%D0%B5%D0%BD%D0%B8%D0%B5_%D1%80%D0%B0%D0%B7%D1%80%D0%B5%D0%B6%D0%B5%D0%BD%D0%BD%D0%BE%D0%B9_%D0%BC%D0%B0%D1%82%D1%80%D0%B8%D1%86%D1%8B_%D0%BD%D0%B0_%D0%B2%D0%B5%D0%BA%D1%82%D0%BE%D1%80&amp;diff=8657</id>
		<title>Участник:Lexaloris/Умножение разреженной матрицы на вектор</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:Lexaloris/%D0%A3%D0%BC%D0%BD%D0%BE%D0%B6%D0%B5%D0%BD%D0%B8%D0%B5_%D1%80%D0%B0%D0%B7%D1%80%D0%B5%D0%B6%D0%B5%D0%BD%D0%BD%D0%BE%D0%B9_%D0%BC%D0%B0%D1%82%D1%80%D0%B8%D1%86%D1%8B_%D0%BD%D0%B0_%D0%B2%D0%B5%D0%BA%D1%82%D0%BE%D1%80&amp;diff=8657"/>
		<updated>2016-10-15T05:21:12Z</updated>

		<summary type="html">&lt;p&gt;Lexaloris: /* Литература */&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(k)&amp;lt;/math&amp;gt;&lt;br /&gt;
| pf_height         = &amp;lt;math&amp;gt;O(m)&amp;lt;/math&amp;gt;&lt;br /&gt;
| pf_width          = &amp;lt;math&amp;gt;O(n)&amp;lt;/math&amp;gt;&lt;br /&gt;
| input_data        = &amp;lt;math&amp;gt;k + m&amp;lt;/math&amp;gt;&lt;br /&gt;
| output_data       = &amp;lt;math&amp;gt;n&amp;lt;/math&amp;gt;&lt;br /&gt;
}}&lt;br /&gt;
&lt;br /&gt;
&lt;br /&gt;
&#039;&#039;&#039;Авторы страницы:&#039;&#039;&#039; Кочетков П.А и Новоселов А.Д.&lt;br /&gt;
&lt;br /&gt;
= Свойства и структура алгоритмов =&lt;br /&gt;
&lt;br /&gt;
== Общее описание алгоритма ==&lt;br /&gt;
&lt;br /&gt;
Пусть &amp;lt;math&amp;gt;N&amp;lt;/math&amp;gt; — число строк матрицы. &lt;br /&gt;
Для каждой ее строки &amp;lt;math&amp;gt;I&amp;lt;/math&amp;gt; матрийы мы находим с помощью &amp;lt;math&amp;gt;IA&amp;lt;/math&amp;gt; значения первой &amp;lt;math&amp;gt;IAA&amp;lt;/math&amp;gt; и последней &amp;lt;math&amp;gt;IAB&amp;lt;/math&amp;gt; позиций, занимаемых элементами строки &amp;lt;math&amp;gt;I&amp;lt;/math&amp;gt; в массивах &amp;lt;math&amp;gt;JA&amp;lt;/math&amp;gt; и &amp;lt;math&amp;gt;AN&amp;lt;/math&amp;gt;. Затем, чтобы вычислить скалярное произведение строки &amp;lt;math&amp;gt;I&amp;lt;/math&amp;gt; и вектора &amp;lt;math&amp;gt;B&amp;lt;/math&amp;gt;, мы просто просматриваем &amp;lt;math&amp;gt;JA&amp;lt;/math&amp;gt; и &amp;lt;math&amp;gt;AN&amp;lt;/math&amp;gt; на отрезке от &amp;lt;math&amp;gt;IAA&amp;lt;/math&amp;gt; до &amp;lt;math&amp;gt;IAB&amp;lt;/math&amp;gt;:&lt;br /&gt;
каждое значение, хранимое в &amp;lt;math&amp;gt;JA&amp;lt;/math&amp;gt;, есть столбцовый индекс и используется для извлечения из массива &amp;lt;math&amp;gt;B&amp;lt;/math&amp;gt; элемента, который должен быть умножен на соответствующее число из &amp;lt;math&amp;gt;AN&amp;lt;/math&amp;gt;. Результат каж­дого умножения прибавляется к &amp;lt;math&amp;gt;C(I)&amp;lt;/math&amp;gt;.&lt;br /&gt;
&lt;br /&gt;
== Математическое описание алгоритма ==&lt;br /&gt;
&lt;br /&gt;
&#039;&#039;&#039;Исходные данные:&#039;&#039;&#039; &lt;br /&gt;
&lt;br /&gt;
&amp;lt;math&amp;gt;IA, JA, AN&amp;lt;/math&amp;gt; - заданная матрица в форме RR (С) U;&lt;br /&gt;
&lt;br /&gt;
&amp;lt;math&amp;gt;B&amp;lt;/math&amp;gt; - заданный заполненный вектор;&lt;br /&gt;
&lt;br /&gt;
&amp;lt;math&amp;gt;N&amp;lt;/math&amp;gt; - число строк матрицы.&lt;br /&gt;
&lt;br /&gt;
&#039;&#039;&#039;Выход:&#039;&#039;&#039; &amp;lt;math&amp;gt;C&amp;lt;/math&amp;gt; вектор-произведение размерности &amp;lt;math&amp;gt;N&amp;lt;/math&amp;gt;.&lt;br /&gt;
&lt;br /&gt;
&#039;&#039;&#039;Формулы метода:&#039;&#039;&#039;&lt;br /&gt;
&lt;br /&gt;
:&amp;lt;math&amp;gt;&lt;br /&gt;
\begin{align}&lt;br /&gt;
&amp;amp; IAA_{i} = IA(i), \quad i \in [1, N], \\&lt;br /&gt;
&amp;amp; IAB_{i} = IA(i + 1) - 1, \quad i \in [1, N], \\&lt;br /&gt;
&amp;amp; c_{i} = \sum\limits_{j = IAA_{i}}^{IAB_{i}} AN(j)B(JA(j)), \quad i \in [1, N] \\&lt;br /&gt;
\end{align}&lt;br /&gt;
&amp;lt;/math&amp;gt;&lt;br /&gt;
&lt;br /&gt;
== Вычислительное ядро алгоритма ==&lt;br /&gt;
&lt;br /&gt;
Вычислительным ядром, т.е. той частью алгоритма, на которую приходится основное время работы алгоритма, является вычисление значения &amp;lt;math&amp;gt;i&amp;lt;/math&amp;gt;-го элемента &amp;lt;math&amp;gt;c_{i}&amp;lt;/math&amp;gt; вектора-произведения, т.е произведения строки &amp;lt;math&amp;gt;I&amp;lt;/math&amp;gt; матрицы &amp;lt;math&amp;gt;A&amp;lt;/math&amp;gt; и вектора &amp;lt;math&amp;gt;B&amp;lt;/math&amp;gt; по формуле:&lt;br /&gt;
&lt;br /&gt;
:&amp;lt;math&amp;gt;&lt;br /&gt;
\begin{align}&lt;br /&gt;
&amp;amp; c_{i} = \sum\limits_{j = IAA_{i}}^{IAB_{i}} AN(j)B(JA(j)), \quad i \in [1, N] \\&lt;br /&gt;
\end{align}&lt;br /&gt;
&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;i&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; по нарастанию выполняются:&lt;br /&gt;
&lt;br /&gt;
1. &amp;lt;math&amp;gt; c_{i} = 0; IAA = IA(i); IAB = IA(i + 1 ) - 1 &amp;lt;/math&amp;gt;&lt;br /&gt;
&lt;br /&gt;
После этого, если &amp;lt;math&amp;gt;(IAB &amp;lt;= IAA)&amp;lt;/math&amp;gt;:&lt;br /&gt;
&lt;br /&gt;
2. Для всех &amp;lt;math&amp;gt;j&amp;lt;/math&amp;gt; от &amp;lt;math&amp;gt;IAA&amp;lt;/math&amp;gt; до &amp;lt;math&amp;gt;IAB&amp;lt;/math&amp;gt; выполняется: &lt;br /&gt;
&lt;br /&gt;
&amp;lt;math&amp;gt;c_{i} = \sum\limits_{j = IAA_{i}}^{IAB_{i}} AN(j)B(JA(j))&amp;lt;/math&amp;gt;&lt;br /&gt;
&lt;br /&gt;
== Последовательная сложность алгоритма ==&lt;br /&gt;
&lt;br /&gt;
Для всего алгоритма потребуется выполнить &amp;lt;math&amp;gt;O(M)&amp;lt;/math&amp;gt; операций, где &amp;lt;math&amp;gt;M&amp;lt;/math&amp;gt; - число ненулевых эле­ментов матрицы.&lt;br /&gt;
&lt;br /&gt;
== Информационный граф ==&lt;br /&gt;
&lt;br /&gt;
[[File:InfoGrafMatrixRRCUandVextor.jpg]]&lt;br /&gt;
&lt;br /&gt;
== Ресурс параллелизма алгоритма ==&lt;br /&gt;
&lt;br /&gt;
== Входные и выходные данные алгоритма ==&lt;br /&gt;
&lt;br /&gt;
== Свойства алгоритма ==&lt;br /&gt;
&lt;br /&gt;
Алгоритм в рамках выбранной версии полностью детерминирован.&lt;br /&gt;
&lt;br /&gt;
Вычислительная мощность алгоритма, как отношение числа операций к суммарному объему входных и выходных данных – константа.&lt;br /&gt;
&lt;br /&gt;
= Программная реализация алгоритма =&lt;br /&gt;
&lt;br /&gt;
== Масштабируемость алгоритма и его реализации ==&lt;br /&gt;
&lt;br /&gt;
== Существующие реализации алгоритма ==&lt;br /&gt;
&lt;br /&gt;
= Литература =&lt;br /&gt;
&lt;br /&gt;
[1] С. Писсанецки. Технология разреженных матриц. Изд. Мир, 1988.&lt;/div&gt;</summary>
		<author><name>Lexaloris</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:Lexaloris/%D0%A3%D0%BC%D0%BD%D0%BE%D0%B6%D0%B5%D0%BD%D0%B8%D0%B5_%D1%80%D0%B0%D0%B7%D1%80%D0%B5%D0%B6%D0%B5%D0%BD%D0%BD%D0%BE%D0%B9_%D0%BC%D0%B0%D1%82%D1%80%D0%B8%D1%86%D1%8B_%D0%BD%D0%B0_%D0%B2%D0%B5%D0%BA%D1%82%D0%BE%D1%80&amp;diff=8656</id>
		<title>Участник:Lexaloris/Умножение разреженной матрицы на вектор</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:Lexaloris/%D0%A3%D0%BC%D0%BD%D0%BE%D0%B6%D0%B5%D0%BD%D0%B8%D0%B5_%D1%80%D0%B0%D0%B7%D1%80%D0%B5%D0%B6%D0%B5%D0%BD%D0%BD%D0%BE%D0%B9_%D0%BC%D0%B0%D1%82%D1%80%D0%B8%D1%86%D1%8B_%D0%BD%D0%B0_%D0%B2%D0%B5%D0%BA%D1%82%D0%BE%D1%80&amp;diff=8656"/>
		<updated>2016-10-15T05:19:01Z</updated>

		<summary type="html">&lt;p&gt;Lexaloris: &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(k)&amp;lt;/math&amp;gt;&lt;br /&gt;
| pf_height         = &amp;lt;math&amp;gt;O(m)&amp;lt;/math&amp;gt;&lt;br /&gt;
| pf_width          = &amp;lt;math&amp;gt;O(n)&amp;lt;/math&amp;gt;&lt;br /&gt;
| input_data        = &amp;lt;math&amp;gt;k + m&amp;lt;/math&amp;gt;&lt;br /&gt;
| output_data       = &amp;lt;math&amp;gt;n&amp;lt;/math&amp;gt;&lt;br /&gt;
}}&lt;br /&gt;
&lt;br /&gt;
&lt;br /&gt;
&#039;&#039;&#039;Авторы страницы:&#039;&#039;&#039; Кочетков П.А и Новоселов А.Д.&lt;br /&gt;
&lt;br /&gt;
= Свойства и структура алгоритмов =&lt;br /&gt;
&lt;br /&gt;
== Общее описание алгоритма ==&lt;br /&gt;
&lt;br /&gt;
Пусть &amp;lt;math&amp;gt;N&amp;lt;/math&amp;gt; — число строк матрицы. &lt;br /&gt;
Для каждой ее строки &amp;lt;math&amp;gt;I&amp;lt;/math&amp;gt; матрийы мы находим с помощью &amp;lt;math&amp;gt;IA&amp;lt;/math&amp;gt; значения первой &amp;lt;math&amp;gt;IAA&amp;lt;/math&amp;gt; и последней &amp;lt;math&amp;gt;IAB&amp;lt;/math&amp;gt; позиций, занимаемых элементами строки &amp;lt;math&amp;gt;I&amp;lt;/math&amp;gt; в массивах &amp;lt;math&amp;gt;JA&amp;lt;/math&amp;gt; и &amp;lt;math&amp;gt;AN&amp;lt;/math&amp;gt;. Затем, чтобы вычислить скалярное произведение строки &amp;lt;math&amp;gt;I&amp;lt;/math&amp;gt; и вектора &amp;lt;math&amp;gt;B&amp;lt;/math&amp;gt;, мы просто просматриваем &amp;lt;math&amp;gt;JA&amp;lt;/math&amp;gt; и &amp;lt;math&amp;gt;AN&amp;lt;/math&amp;gt; на отрезке от &amp;lt;math&amp;gt;IAA&amp;lt;/math&amp;gt; до &amp;lt;math&amp;gt;IAB&amp;lt;/math&amp;gt;:&lt;br /&gt;
каждое значение, хранимое в &amp;lt;math&amp;gt;JA&amp;lt;/math&amp;gt;, есть столбцовый индекс и используется для извлечения из массива &amp;lt;math&amp;gt;B&amp;lt;/math&amp;gt; элемента, который должен быть умножен на соответствующее число из &amp;lt;math&amp;gt;AN&amp;lt;/math&amp;gt;. Результат каж­дого умножения прибавляется к &amp;lt;math&amp;gt;C(I)&amp;lt;/math&amp;gt;.&lt;br /&gt;
&lt;br /&gt;
== Математическое описание алгоритма ==&lt;br /&gt;
&lt;br /&gt;
&#039;&#039;&#039;Исходные данные:&#039;&#039;&#039; &lt;br /&gt;
&lt;br /&gt;
&amp;lt;math&amp;gt;IA, JA, AN&amp;lt;/math&amp;gt; - заданная матрица в форме RR (С) U;&lt;br /&gt;
&lt;br /&gt;
&amp;lt;math&amp;gt;B&amp;lt;/math&amp;gt; - заданный заполненный вектор;&lt;br /&gt;
&lt;br /&gt;
&amp;lt;math&amp;gt;N&amp;lt;/math&amp;gt; - число строк матрицы.&lt;br /&gt;
&lt;br /&gt;
&#039;&#039;&#039;Выход:&#039;&#039;&#039; &amp;lt;math&amp;gt;C&amp;lt;/math&amp;gt; вектор-произведение размерности &amp;lt;math&amp;gt;N&amp;lt;/math&amp;gt;.&lt;br /&gt;
&lt;br /&gt;
&#039;&#039;&#039;Формулы метода:&#039;&#039;&#039;&lt;br /&gt;
&lt;br /&gt;
:&amp;lt;math&amp;gt;&lt;br /&gt;
\begin{align}&lt;br /&gt;
&amp;amp; IAA_{i} = IA(i), \quad i \in [1, N], \\&lt;br /&gt;
&amp;amp; IAB_{i} = IA(i + 1) - 1, \quad i \in [1, N], \\&lt;br /&gt;
&amp;amp; c_{i} = \sum\limits_{j = IAA_{i}}^{IAB_{i}} AN(j)B(JA(j)), \quad i \in [1, N] \\&lt;br /&gt;
\end{align}&lt;br /&gt;
&amp;lt;/math&amp;gt;&lt;br /&gt;
&lt;br /&gt;
== Вычислительное ядро алгоритма ==&lt;br /&gt;
&lt;br /&gt;
Вычислительным ядром, т.е. той частью алгоритма, на которую приходится основное время работы алгоритма, является вычисление значения &amp;lt;math&amp;gt;i&amp;lt;/math&amp;gt;-го элемента &amp;lt;math&amp;gt;c_{i}&amp;lt;/math&amp;gt; вектора-произведения, т.е произведения строки &amp;lt;math&amp;gt;I&amp;lt;/math&amp;gt; матрицы &amp;lt;math&amp;gt;A&amp;lt;/math&amp;gt; и вектора &amp;lt;math&amp;gt;B&amp;lt;/math&amp;gt; по формуле:&lt;br /&gt;
&lt;br /&gt;
:&amp;lt;math&amp;gt;&lt;br /&gt;
\begin{align}&lt;br /&gt;
&amp;amp; c_{i} = \sum\limits_{j = IAA_{i}}^{IAB_{i}} AN(j)B(JA(j)), \quad i \in [1, N] \\&lt;br /&gt;
\end{align}&lt;br /&gt;
&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;i&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; по нарастанию выполняются:&lt;br /&gt;
&lt;br /&gt;
1. &amp;lt;math&amp;gt; c_{i} = 0; IAA = IA(i); IAB = IA(i + 1 ) - 1 &amp;lt;/math&amp;gt;&lt;br /&gt;
&lt;br /&gt;
После этого, если &amp;lt;math&amp;gt;(IAB &amp;lt;= IAA)&amp;lt;/math&amp;gt;:&lt;br /&gt;
&lt;br /&gt;
2. Для всех &amp;lt;math&amp;gt;j&amp;lt;/math&amp;gt; от &amp;lt;math&amp;gt;IAA&amp;lt;/math&amp;gt; до &amp;lt;math&amp;gt;IAB&amp;lt;/math&amp;gt; выполняется: &lt;br /&gt;
&lt;br /&gt;
&amp;lt;math&amp;gt;c_{i} = \sum\limits_{j = IAA_{i}}^{IAB_{i}} AN(j)B(JA(j))&amp;lt;/math&amp;gt;&lt;br /&gt;
&lt;br /&gt;
== Последовательная сложность алгоритма ==&lt;br /&gt;
&lt;br /&gt;
Для всего алгоритма потребуется выполнить &amp;lt;math&amp;gt;O(M)&amp;lt;/math&amp;gt; операций, где &amp;lt;math&amp;gt;M&amp;lt;/math&amp;gt; - число ненулевых эле­ментов матрицы.&lt;br /&gt;
&lt;br /&gt;
== Информационный граф ==&lt;br /&gt;
&lt;br /&gt;
[[File:InfoGrafMatrixRRCUandVextor.jpg]]&lt;br /&gt;
&lt;br /&gt;
== Ресурс параллелизма алгоритма ==&lt;br /&gt;
&lt;br /&gt;
== Входные и выходные данные алгоритма ==&lt;br /&gt;
&lt;br /&gt;
== Свойства алгоритма ==&lt;br /&gt;
&lt;br /&gt;
Алгоритм в рамках выбранной версии полностью детерминирован.&lt;br /&gt;
&lt;br /&gt;
Вычислительная мощность алгоритма, как отношение числа операций к суммарному объему входных и выходных данных – константа.&lt;br /&gt;
&lt;br /&gt;
= Программная реализация алгоритма =&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;references \&amp;gt;&lt;/div&gt;</summary>
		<author><name>Lexaloris</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:Lexaloris/%D0%A3%D0%BC%D0%BD%D0%BE%D0%B6%D0%B5%D0%BD%D0%B8%D0%B5_%D1%80%D0%B0%D0%B7%D1%80%D0%B5%D0%B6%D0%B5%D0%BD%D0%BD%D0%BE%D0%B9_%D0%BC%D0%B0%D1%82%D1%80%D0%B8%D1%86%D1%8B_%D0%BD%D0%B0_%D0%B2%D0%B5%D0%BA%D1%82%D0%BE%D1%80&amp;diff=8654</id>
		<title>Участник:Lexaloris/Умножение разреженной матрицы на вектор</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:Lexaloris/%D0%A3%D0%BC%D0%BD%D0%BE%D0%B6%D0%B5%D0%BD%D0%B8%D0%B5_%D1%80%D0%B0%D0%B7%D1%80%D0%B5%D0%B6%D0%B5%D0%BD%D0%BD%D0%BE%D0%B9_%D0%BC%D0%B0%D1%82%D1%80%D0%B8%D1%86%D1%8B_%D0%BD%D0%B0_%D0%B2%D0%B5%D0%BA%D1%82%D0%BE%D1%80&amp;diff=8654"/>
		<updated>2016-10-15T05:05:03Z</updated>

		<summary type="html">&lt;p&gt;Lexaloris: /* Вычислительное ядро алгоритма */&lt;/p&gt;
&lt;hr /&gt;
&lt;div&gt;&#039;&#039;&#039;Авторы страницы:&#039;&#039;&#039; Кочетков П.А и Новоселов А.Д.&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; — число строк матрицы. &lt;br /&gt;
Для каждой ее строки &amp;lt;math&amp;gt;I&amp;lt;/math&amp;gt; матрийы мы находим с помощью &amp;lt;math&amp;gt;IA&amp;lt;/math&amp;gt; значения первой &amp;lt;math&amp;gt;IAA&amp;lt;/math&amp;gt; и последней &amp;lt;math&amp;gt;IAB&amp;lt;/math&amp;gt; позиций, занимаемых элементами строки &amp;lt;math&amp;gt;I&amp;lt;/math&amp;gt; в массивах &amp;lt;math&amp;gt;JA&amp;lt;/math&amp;gt; и &amp;lt;math&amp;gt;AN&amp;lt;/math&amp;gt;. Затем, чтобы вычислить скалярное произведение строки &amp;lt;math&amp;gt;I&amp;lt;/math&amp;gt; и вектора &amp;lt;math&amp;gt;B&amp;lt;/math&amp;gt;, мы просто просматриваем &amp;lt;math&amp;gt;JA&amp;lt;/math&amp;gt; и &amp;lt;math&amp;gt;AN&amp;lt;/math&amp;gt; на отрезке от &amp;lt;math&amp;gt;IAA&amp;lt;/math&amp;gt; до &amp;lt;math&amp;gt;IAB&amp;lt;/math&amp;gt;:&lt;br /&gt;
каждое значение, хранимое в &amp;lt;math&amp;gt;JA&amp;lt;/math&amp;gt;, есть столбцовый индекс и используется для извлечения из массива &amp;lt;math&amp;gt;B&amp;lt;/math&amp;gt; элемента, который должен быть умножен на соответствующее число из &amp;lt;math&amp;gt;AN&amp;lt;/math&amp;gt;. Результат каж­дого умножения прибавляется к &amp;lt;math&amp;gt;C(I)&amp;lt;/math&amp;gt;.&lt;br /&gt;
&lt;br /&gt;
== Математическое описание алгоритма ==&lt;br /&gt;
&lt;br /&gt;
&#039;&#039;&#039;Исходные данные:&#039;&#039;&#039; &lt;br /&gt;
&lt;br /&gt;
&amp;lt;math&amp;gt;IA, JA, AN&amp;lt;/math&amp;gt; - заданная матрица в форме RR (С) U;&lt;br /&gt;
&lt;br /&gt;
&amp;lt;math&amp;gt;B&amp;lt;/math&amp;gt; - заданный заполненный вектор;&lt;br /&gt;
&lt;br /&gt;
&amp;lt;math&amp;gt;N&amp;lt;/math&amp;gt; - число строк матрицы.&lt;br /&gt;
&lt;br /&gt;
&#039;&#039;&#039;Выход:&#039;&#039;&#039; &amp;lt;math&amp;gt;C&amp;lt;/math&amp;gt; вектор-произведение размерности &amp;lt;math&amp;gt;N&amp;lt;/math&amp;gt;.&lt;br /&gt;
&lt;br /&gt;
&#039;&#039;&#039;Формулы метода:&#039;&#039;&#039;&lt;br /&gt;
&lt;br /&gt;
:&amp;lt;math&amp;gt;&lt;br /&gt;
\begin{align}&lt;br /&gt;
&amp;amp; IAA_{i} = IA(i), \quad i \in [1, N], \\&lt;br /&gt;
&amp;amp; IAB_{i} = IA(i + 1) - 1, \quad i \in [1, N], \\&lt;br /&gt;
&amp;amp; c_{i} = \sum\limits_{j = IAA_{i}}^{IAB_{i}} AN(j)B(JA(j)), \quad i \in [1, N] \\&lt;br /&gt;
\end{align}&lt;br /&gt;
&amp;lt;/math&amp;gt;&lt;br /&gt;
&lt;br /&gt;
== Вычислительное ядро алгоритма ==&lt;br /&gt;
&lt;br /&gt;
Вычислительным ядром, т.е. той частью алгоритма, на которую приходится основное время работы алгоритма, является вычисление значения &amp;lt;math&amp;gt;i&amp;lt;/math&amp;gt;-го элемента &amp;lt;math&amp;gt;c_{i}&amp;lt;/math&amp;gt; вектора-произведения, т.е произведения строки &amp;lt;math&amp;gt;I&amp;lt;/math&amp;gt; матрицы &amp;lt;math&amp;gt;A&amp;lt;/math&amp;gt; и вектора &amp;lt;math&amp;gt;B&amp;lt;/math&amp;gt; по формуле:&lt;br /&gt;
&lt;br /&gt;
:&amp;lt;math&amp;gt;&lt;br /&gt;
\begin{align}&lt;br /&gt;
&amp;amp; c_{i} = \sum\limits_{j = IAA_{i}}^{IAB_{i}} AN(j)B(JA(j)), \quad i \in [1, N] \\&lt;br /&gt;
\end{align}&lt;br /&gt;
&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;i&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; по нарастанию выполняются:&lt;br /&gt;
&lt;br /&gt;
1. &amp;lt;math&amp;gt; c_{i} = 0; IAA = IA(i); IAB = IA(i + 1 ) - 1 &amp;lt;/math&amp;gt;&lt;br /&gt;
&lt;br /&gt;
После этого, если &amp;lt;math&amp;gt;(IAB &amp;lt;= IAA)&amp;lt;/math&amp;gt;:&lt;br /&gt;
&lt;br /&gt;
2. Для всех &amp;lt;math&amp;gt;j&amp;lt;/math&amp;gt; от &amp;lt;math&amp;gt;IAA&amp;lt;/math&amp;gt; до &amp;lt;math&amp;gt;IAB&amp;lt;/math&amp;gt; выполняется: &lt;br /&gt;
&lt;br /&gt;
&amp;lt;math&amp;gt;c_{i} = \sum\limits_{j = IAA_{i}}^{IAB_{i}} AN(j)B(JA(j))&amp;lt;/math&amp;gt;&lt;br /&gt;
&lt;br /&gt;
== Последовательная сложность алгоритма ==&lt;br /&gt;
&lt;br /&gt;
Для всего алгоритма потребуется выполнить &amp;lt;math&amp;gt;O(M)&amp;lt;/math&amp;gt; операций, где &amp;lt;math&amp;gt;M&amp;lt;/math&amp;gt; - число ненулевых эле­ментов матрицы.&lt;br /&gt;
&lt;br /&gt;
== Информационный граф ==&lt;br /&gt;
&lt;br /&gt;
[[File:InfoGrafMatrixRRCUandVextor.jpg]]&lt;br /&gt;
&lt;br /&gt;
== Ресурс параллелизма алгоритма ==&lt;br /&gt;
&lt;br /&gt;
== Входные и выходные данные алгоритма ==&lt;br /&gt;
&lt;br /&gt;
== Свойства алгоритма ==&lt;br /&gt;
&lt;br /&gt;
Алгоритм в рамках выбранной версии полностью детерминирован.&lt;br /&gt;
&lt;br /&gt;
Вычислительная мощность алгоритма, как отношение числа операций к суммарному объему входных и выходных данных – константа.&lt;br /&gt;
&lt;br /&gt;
= Программная реализация алгоритма =&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;references \&amp;gt;&lt;/div&gt;</summary>
		<author><name>Lexaloris</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:Lexaloris/%D0%A3%D0%BC%D0%BD%D0%BE%D0%B6%D0%B5%D0%BD%D0%B8%D0%B5_%D1%80%D0%B0%D0%B7%D1%80%D0%B5%D0%B6%D0%B5%D0%BD%D0%BD%D0%BE%D0%B9_%D0%BC%D0%B0%D1%82%D1%80%D0%B8%D1%86%D1%8B_%D0%BD%D0%B0_%D0%B2%D0%B5%D0%BA%D1%82%D0%BE%D1%80&amp;diff=8652</id>
		<title>Участник:Lexaloris/Умножение разреженной матрицы на вектор</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:Lexaloris/%D0%A3%D0%BC%D0%BD%D0%BE%D0%B6%D0%B5%D0%BD%D0%B8%D0%B5_%D1%80%D0%B0%D0%B7%D1%80%D0%B5%D0%B6%D0%B5%D0%BD%D0%BD%D0%BE%D0%B9_%D0%BC%D0%B0%D1%82%D1%80%D0%B8%D1%86%D1%8B_%D0%BD%D0%B0_%D0%B2%D0%B5%D0%BA%D1%82%D0%BE%D1%80&amp;diff=8652"/>
		<updated>2016-10-15T05:03:10Z</updated>

		<summary type="html">&lt;p&gt;Lexaloris: /* Вычислительное ядро алгоритма */&lt;/p&gt;
&lt;hr /&gt;
&lt;div&gt;&#039;&#039;&#039;Авторы страницы:&#039;&#039;&#039; Кочетков П.А и Новоселов А.Д.&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; — число строк матрицы. &lt;br /&gt;
Для каждой ее строки &amp;lt;math&amp;gt;I&amp;lt;/math&amp;gt; матрийы мы находим с помощью &amp;lt;math&amp;gt;IA&amp;lt;/math&amp;gt; значения первой &amp;lt;math&amp;gt;IAA&amp;lt;/math&amp;gt; и последней &amp;lt;math&amp;gt;IAB&amp;lt;/math&amp;gt; позиций, занимаемых элементами строки &amp;lt;math&amp;gt;I&amp;lt;/math&amp;gt; в массивах &amp;lt;math&amp;gt;JA&amp;lt;/math&amp;gt; и &amp;lt;math&amp;gt;AN&amp;lt;/math&amp;gt;. Затем, чтобы вычислить скалярное произведение строки &amp;lt;math&amp;gt;I&amp;lt;/math&amp;gt; и вектора &amp;lt;math&amp;gt;B&amp;lt;/math&amp;gt;, мы просто просматриваем &amp;lt;math&amp;gt;JA&amp;lt;/math&amp;gt; и &amp;lt;math&amp;gt;AN&amp;lt;/math&amp;gt; на отрезке от &amp;lt;math&amp;gt;IAA&amp;lt;/math&amp;gt; до &amp;lt;math&amp;gt;IAB&amp;lt;/math&amp;gt;:&lt;br /&gt;
каждое значение, хранимое в &amp;lt;math&amp;gt;JA&amp;lt;/math&amp;gt;, есть столбцовый индекс и используется для извлечения из массива &amp;lt;math&amp;gt;B&amp;lt;/math&amp;gt; элемента, который должен быть умножен на соответствующее число из &amp;lt;math&amp;gt;AN&amp;lt;/math&amp;gt;. Результат каж­дого умножения прибавляется к &amp;lt;math&amp;gt;C(I)&amp;lt;/math&amp;gt;.&lt;br /&gt;
&lt;br /&gt;
== Математическое описание алгоритма ==&lt;br /&gt;
&lt;br /&gt;
&#039;&#039;&#039;Исходные данные:&#039;&#039;&#039; &lt;br /&gt;
&lt;br /&gt;
&amp;lt;math&amp;gt;IA, JA, AN&amp;lt;/math&amp;gt; - заданная матрица в форме RR (С) U;&lt;br /&gt;
&lt;br /&gt;
&amp;lt;math&amp;gt;B&amp;lt;/math&amp;gt; - заданный заполненный вектор;&lt;br /&gt;
&lt;br /&gt;
&amp;lt;math&amp;gt;N&amp;lt;/math&amp;gt; - число строк матрицы.&lt;br /&gt;
&lt;br /&gt;
&#039;&#039;&#039;Выход:&#039;&#039;&#039; &amp;lt;math&amp;gt;C&amp;lt;/math&amp;gt; вектор-произведение размерности &amp;lt;math&amp;gt;N&amp;lt;/math&amp;gt;.&lt;br /&gt;
&lt;br /&gt;
&#039;&#039;&#039;Формулы метода:&#039;&#039;&#039;&lt;br /&gt;
&lt;br /&gt;
:&amp;lt;math&amp;gt;&lt;br /&gt;
\begin{align}&lt;br /&gt;
&amp;amp; IAA_{i} = IA(i), \quad i \in [1, N], \\&lt;br /&gt;
&amp;amp; IAB_{i} = IA(i + 1) - 1, \quad i \in [1, N], \\&lt;br /&gt;
&amp;amp; c_{i} = \sum\limits_{j = IAA_{i}}^{IAB_{i}} AN(j)B(JA(j)), \quad i \in [1, N] \\&lt;br /&gt;
\end{align}&lt;br /&gt;
&amp;lt;/math&amp;gt;&lt;br /&gt;
&lt;br /&gt;
== Вычислительное ядро алгоритма ==&lt;br /&gt;
&lt;br /&gt;
Вычислительным ядром, т.е. той частью алгоритма, на которую приходится основное время работы алгоритма, является вычисление значения &amp;lt;math&amp;gt;c_{i}&amp;lt;/math&amp;gt; вектора-произведения, т.е произведения строки &amp;lt;math&amp;gt;I&amp;lt;/math&amp;gt; матрицы &amp;lt;math&amp;gt;A&amp;lt;/math&amp;gt; и вектора &amp;lt;math&amp;gt;B&amp;lt;/math&amp;gt; по формуле:&lt;br /&gt;
&lt;br /&gt;
:&amp;lt;math&amp;gt;&lt;br /&gt;
\begin{align}&lt;br /&gt;
&amp;amp; c_{i} = \sum\limits_{j = IAA_{i}}^{IAB_{i}} AN(j)B(JA(j)), \quad i \in [1, N] \\&lt;br /&gt;
\end{align}&lt;br /&gt;
&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;i&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; по нарастанию выполняются:&lt;br /&gt;
&lt;br /&gt;
1. &amp;lt;math&amp;gt; c_{i} = 0; IAA = IA(i); IAB = IA(i + 1 ) - 1 &amp;lt;/math&amp;gt;&lt;br /&gt;
&lt;br /&gt;
После этого, если &amp;lt;math&amp;gt;(IAB &amp;lt;= IAA)&amp;lt;/math&amp;gt;:&lt;br /&gt;
&lt;br /&gt;
2. Для всех &amp;lt;math&amp;gt;j&amp;lt;/math&amp;gt; от &amp;lt;math&amp;gt;IAA&amp;lt;/math&amp;gt; до &amp;lt;math&amp;gt;IAB&amp;lt;/math&amp;gt; выполняется: &lt;br /&gt;
&lt;br /&gt;
&amp;lt;math&amp;gt;c_{i} = \sum\limits_{j = IAA_{i}}^{IAB_{i}} AN(j)B(JA(j))&amp;lt;/math&amp;gt;&lt;br /&gt;
&lt;br /&gt;
== Последовательная сложность алгоритма ==&lt;br /&gt;
&lt;br /&gt;
Для всего алгоритма потребуется выполнить &amp;lt;math&amp;gt;O(M)&amp;lt;/math&amp;gt; операций, где &amp;lt;math&amp;gt;M&amp;lt;/math&amp;gt; - число ненулевых эле­ментов матрицы.&lt;br /&gt;
&lt;br /&gt;
== Информационный граф ==&lt;br /&gt;
&lt;br /&gt;
[[File:InfoGrafMatrixRRCUandVextor.jpg]]&lt;br /&gt;
&lt;br /&gt;
== Ресурс параллелизма алгоритма ==&lt;br /&gt;
&lt;br /&gt;
== Входные и выходные данные алгоритма ==&lt;br /&gt;
&lt;br /&gt;
== Свойства алгоритма ==&lt;br /&gt;
&lt;br /&gt;
Алгоритм в рамках выбранной версии полностью детерминирован.&lt;br /&gt;
&lt;br /&gt;
Вычислительная мощность алгоритма, как отношение числа операций к суммарному объему входных и выходных данных – константа.&lt;br /&gt;
&lt;br /&gt;
= Программная реализация алгоритма =&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;references \&amp;gt;&lt;/div&gt;</summary>
		<author><name>Lexaloris</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:Lexaloris/%D0%A3%D0%BC%D0%BD%D0%BE%D0%B6%D0%B5%D0%BD%D0%B8%D0%B5_%D1%80%D0%B0%D0%B7%D1%80%D0%B5%D0%B6%D0%B5%D0%BD%D0%BD%D0%BE%D0%B9_%D0%BC%D0%B0%D1%82%D1%80%D0%B8%D1%86%D1%8B_%D0%BD%D0%B0_%D0%B2%D0%B5%D0%BA%D1%82%D0%BE%D1%80&amp;diff=8651</id>
		<title>Участник:Lexaloris/Умножение разреженной матрицы на вектор</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:Lexaloris/%D0%A3%D0%BC%D0%BD%D0%BE%D0%B6%D0%B5%D0%BD%D0%B8%D0%B5_%D1%80%D0%B0%D0%B7%D1%80%D0%B5%D0%B6%D0%B5%D0%BD%D0%BD%D0%BE%D0%B9_%D0%BC%D0%B0%D1%82%D1%80%D0%B8%D1%86%D1%8B_%D0%BD%D0%B0_%D0%B2%D0%B5%D0%BA%D1%82%D0%BE%D1%80&amp;diff=8651"/>
		<updated>2016-10-15T04:59:17Z</updated>

		<summary type="html">&lt;p&gt;Lexaloris: /* Вычислительное ядро алгоритма */&lt;/p&gt;
&lt;hr /&gt;
&lt;div&gt;&#039;&#039;&#039;Авторы страницы:&#039;&#039;&#039; Кочетков П.А и Новоселов А.Д.&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; — число строк матрицы. &lt;br /&gt;
Для каждой ее строки &amp;lt;math&amp;gt;I&amp;lt;/math&amp;gt; матрийы мы находим с помощью &amp;lt;math&amp;gt;IA&amp;lt;/math&amp;gt; значения первой &amp;lt;math&amp;gt;IAA&amp;lt;/math&amp;gt; и последней &amp;lt;math&amp;gt;IAB&amp;lt;/math&amp;gt; позиций, занимаемых элементами строки &amp;lt;math&amp;gt;I&amp;lt;/math&amp;gt; в массивах &amp;lt;math&amp;gt;JA&amp;lt;/math&amp;gt; и &amp;lt;math&amp;gt;AN&amp;lt;/math&amp;gt;. Затем, чтобы вычислить скалярное произведение строки &amp;lt;math&amp;gt;I&amp;lt;/math&amp;gt; и вектора &amp;lt;math&amp;gt;B&amp;lt;/math&amp;gt;, мы просто просматриваем &amp;lt;math&amp;gt;JA&amp;lt;/math&amp;gt; и &amp;lt;math&amp;gt;AN&amp;lt;/math&amp;gt; на отрезке от &amp;lt;math&amp;gt;IAA&amp;lt;/math&amp;gt; до &amp;lt;math&amp;gt;IAB&amp;lt;/math&amp;gt;:&lt;br /&gt;
каждое значение, хранимое в &amp;lt;math&amp;gt;JA&amp;lt;/math&amp;gt;, есть столбцовый индекс и используется для извлечения из массива &amp;lt;math&amp;gt;B&amp;lt;/math&amp;gt; элемента, который должен быть умножен на соответствующее число из &amp;lt;math&amp;gt;AN&amp;lt;/math&amp;gt;. Результат каж­дого умножения прибавляется к &amp;lt;math&amp;gt;C(I)&amp;lt;/math&amp;gt;.&lt;br /&gt;
&lt;br /&gt;
== Математическое описание алгоритма ==&lt;br /&gt;
&lt;br /&gt;
&#039;&#039;&#039;Исходные данные:&#039;&#039;&#039; &lt;br /&gt;
&lt;br /&gt;
&amp;lt;math&amp;gt;IA, JA, AN&amp;lt;/math&amp;gt; - заданная матрица в форме RR (С) U;&lt;br /&gt;
&lt;br /&gt;
&amp;lt;math&amp;gt;B&amp;lt;/math&amp;gt; - заданный заполненный вектор;&lt;br /&gt;
&lt;br /&gt;
&amp;lt;math&amp;gt;N&amp;lt;/math&amp;gt; - число строк матрицы.&lt;br /&gt;
&lt;br /&gt;
&#039;&#039;&#039;Выход:&#039;&#039;&#039; &amp;lt;math&amp;gt;C&amp;lt;/math&amp;gt; вектор-произведение размерности &amp;lt;math&amp;gt;N&amp;lt;/math&amp;gt;.&lt;br /&gt;
&lt;br /&gt;
&#039;&#039;&#039;Формулы метода:&#039;&#039;&#039;&lt;br /&gt;
&lt;br /&gt;
:&amp;lt;math&amp;gt;&lt;br /&gt;
\begin{align}&lt;br /&gt;
&amp;amp; IAA_{i} = IA(i), \quad i \in [1, N], \\&lt;br /&gt;
&amp;amp; IAB_{i} = IA(i + 1) - 1, \quad i \in [1, N], \\&lt;br /&gt;
&amp;amp; c_{i} = \sum\limits_{j = IAA_{i}}^{IAB_{i}} AN(j)B(JA(j)), \quad i \in [1, N] \\&lt;br /&gt;
\end{align}&lt;br /&gt;
&amp;lt;/math&amp;gt;&lt;br /&gt;
&lt;br /&gt;
== Вычислительное ядро алгоритма ==&lt;br /&gt;
&lt;br /&gt;
Вычислительным ядром, т.е. той частью алгоритма, на которую приходится основное время работы алгоритма, является вычисление скалярное произведение строки &amp;lt;math&amp;gt;I&amp;lt;/math&amp;gt; матрицы &amp;lt;math&amp;gt;A&amp;lt;/math&amp;gt; и вектора &amp;lt;math&amp;gt;B&amp;lt;/math&amp;gt; по формуле:&lt;br /&gt;
&lt;br /&gt;
:&amp;lt;math&amp;gt;&lt;br /&gt;
\begin{align}&lt;br /&gt;
&amp;amp; c_{i} = \sum\limits_{j = IAA_{i}}^{IAB_{i}} AN(j)B(JA(j)), \quad i \in [1, N] \\&lt;br /&gt;
\end{align}&lt;br /&gt;
&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;i&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; по нарастанию выполняются:&lt;br /&gt;
&lt;br /&gt;
1. &amp;lt;math&amp;gt; c_{i} = 0; IAA = IA(i); IAB = IA(i + 1 ) - 1 &amp;lt;/math&amp;gt;&lt;br /&gt;
&lt;br /&gt;
После этого, если &amp;lt;math&amp;gt;(IAB &amp;lt;= IAA)&amp;lt;/math&amp;gt;:&lt;br /&gt;
&lt;br /&gt;
2. Для всех &amp;lt;math&amp;gt;j&amp;lt;/math&amp;gt; от &amp;lt;math&amp;gt;IAA&amp;lt;/math&amp;gt; до &amp;lt;math&amp;gt;IAB&amp;lt;/math&amp;gt; выполняется: &lt;br /&gt;
&lt;br /&gt;
&amp;lt;math&amp;gt;c_{i} = \sum\limits_{j = IAA_{i}}^{IAB_{i}} AN(j)B(JA(j))&amp;lt;/math&amp;gt;&lt;br /&gt;
&lt;br /&gt;
== Последовательная сложность алгоритма ==&lt;br /&gt;
&lt;br /&gt;
Для всего алгоритма потребуется выполнить &amp;lt;math&amp;gt;O(M)&amp;lt;/math&amp;gt; операций, где &amp;lt;math&amp;gt;M&amp;lt;/math&amp;gt; - число ненулевых эле­ментов матрицы.&lt;br /&gt;
&lt;br /&gt;
== Информационный граф ==&lt;br /&gt;
&lt;br /&gt;
[[File:InfoGrafMatrixRRCUandVextor.jpg]]&lt;br /&gt;
&lt;br /&gt;
== Ресурс параллелизма алгоритма ==&lt;br /&gt;
&lt;br /&gt;
== Входные и выходные данные алгоритма ==&lt;br /&gt;
&lt;br /&gt;
== Свойства алгоритма ==&lt;br /&gt;
&lt;br /&gt;
Алгоритм в рамках выбранной версии полностью детерминирован.&lt;br /&gt;
&lt;br /&gt;
Вычислительная мощность алгоритма, как отношение числа операций к суммарному объему входных и выходных данных – константа.&lt;br /&gt;
&lt;br /&gt;
= Программная реализация алгоритма =&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;references \&amp;gt;&lt;/div&gt;</summary>
		<author><name>Lexaloris</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:Lexaloris/%D0%A3%D0%BC%D0%BD%D0%BE%D0%B6%D0%B5%D0%BD%D0%B8%D0%B5_%D1%80%D0%B0%D0%B7%D1%80%D0%B5%D0%B6%D0%B5%D0%BD%D0%BD%D0%BE%D0%B9_%D0%BC%D0%B0%D1%82%D1%80%D0%B8%D1%86%D1%8B_%D0%BD%D0%B0_%D0%B2%D0%B5%D0%BA%D1%82%D0%BE%D1%80&amp;diff=8648</id>
		<title>Участник:Lexaloris/Умножение разреженной матрицы на вектор</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:Lexaloris/%D0%A3%D0%BC%D0%BD%D0%BE%D0%B6%D0%B5%D0%BD%D0%B8%D0%B5_%D1%80%D0%B0%D0%B7%D1%80%D0%B5%D0%B6%D0%B5%D0%BD%D0%BD%D0%BE%D0%B9_%D0%BC%D0%B0%D1%82%D1%80%D0%B8%D1%86%D1%8B_%D0%BD%D0%B0_%D0%B2%D0%B5%D0%BA%D1%82%D0%BE%D1%80&amp;diff=8648"/>
		<updated>2016-10-15T04:37:49Z</updated>

		<summary type="html">&lt;p&gt;Lexaloris: /* Информационный граф */&lt;/p&gt;
&lt;hr /&gt;
&lt;div&gt;&#039;&#039;&#039;Авторы страницы:&#039;&#039;&#039; Кочетков П.А и Новоселов А.Д.&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; — число строк матрицы. &lt;br /&gt;
Для каждой ее строки &amp;lt;math&amp;gt;I&amp;lt;/math&amp;gt; матрийы мы находим с помощью &amp;lt;math&amp;gt;IA&amp;lt;/math&amp;gt; значения первой &amp;lt;math&amp;gt;IAA&amp;lt;/math&amp;gt; и последней &amp;lt;math&amp;gt;IAB&amp;lt;/math&amp;gt; позиций, занимаемых элементами строки &amp;lt;math&amp;gt;I&amp;lt;/math&amp;gt; в массивах &amp;lt;math&amp;gt;JA&amp;lt;/math&amp;gt; и &amp;lt;math&amp;gt;AN&amp;lt;/math&amp;gt;. Затем, чтобы вычислить скалярное произведение строки &amp;lt;math&amp;gt;I&amp;lt;/math&amp;gt; и вектора &amp;lt;math&amp;gt;B&amp;lt;/math&amp;gt;, мы просто просматриваем &amp;lt;math&amp;gt;JA&amp;lt;/math&amp;gt; и &amp;lt;math&amp;gt;AN&amp;lt;/math&amp;gt; на отрезке от &amp;lt;math&amp;gt;IAA&amp;lt;/math&amp;gt; до &amp;lt;math&amp;gt;IAB&amp;lt;/math&amp;gt;:&lt;br /&gt;
каждое значение, хранимое в &amp;lt;math&amp;gt;JA&amp;lt;/math&amp;gt;, есть столбцовый индекс и используется для извлечения из массива &amp;lt;math&amp;gt;B&amp;lt;/math&amp;gt; элемента, который должен быть умножен на соответствующее число из &amp;lt;math&amp;gt;AN&amp;lt;/math&amp;gt;. Результат каж­дого умножения прибавляется к &amp;lt;math&amp;gt;C(I)&amp;lt;/math&amp;gt;.&lt;br /&gt;
&lt;br /&gt;
== Математическое описание алгоритма ==&lt;br /&gt;
&lt;br /&gt;
&#039;&#039;&#039;Исходные данные:&#039;&#039;&#039; &lt;br /&gt;
&lt;br /&gt;
&amp;lt;math&amp;gt;IA, JA, AN&amp;lt;/math&amp;gt; - заданная матрица в форме RR (С) U;&lt;br /&gt;
&lt;br /&gt;
&amp;lt;math&amp;gt;B&amp;lt;/math&amp;gt; - заданный заполненный вектор;&lt;br /&gt;
&lt;br /&gt;
&amp;lt;math&amp;gt;N&amp;lt;/math&amp;gt; - число строк матрицы.&lt;br /&gt;
&lt;br /&gt;
&#039;&#039;&#039;Выход:&#039;&#039;&#039; &amp;lt;math&amp;gt;C&amp;lt;/math&amp;gt; вектор-произведение размерности &amp;lt;math&amp;gt;N&amp;lt;/math&amp;gt;.&lt;br /&gt;
&lt;br /&gt;
&#039;&#039;&#039;Формулы метода:&#039;&#039;&#039;&lt;br /&gt;
&lt;br /&gt;
:&amp;lt;math&amp;gt;&lt;br /&gt;
\begin{align}&lt;br /&gt;
&amp;amp; IAA_{i} = IA(i), \quad i \in [1, N], \\&lt;br /&gt;
&amp;amp; IAB_{i} = IA(i + 1) - 1, \quad i \in [1, N], \\&lt;br /&gt;
&amp;amp; c_{i} = \sum\limits_{j = IAA_{i}}^{IAB_{i}} AN(j)B(JA(j)), \quad i \in [1, N] \\&lt;br /&gt;
\end{align}&lt;br /&gt;
&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;
Далее для всех &amp;lt;math&amp;gt;i&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; по нарастанию выполняются:&lt;br /&gt;
&lt;br /&gt;
1. &amp;lt;math&amp;gt; c_{i} = 0; IAA = IA(i); IAB = IA(i + 1 ) - 1 &amp;lt;/math&amp;gt;&lt;br /&gt;
&lt;br /&gt;
После этого, если &amp;lt;math&amp;gt;(IAB &amp;lt;= IAA)&amp;lt;/math&amp;gt;:&lt;br /&gt;
&lt;br /&gt;
2. Для всех &amp;lt;math&amp;gt;j&amp;lt;/math&amp;gt; от &amp;lt;math&amp;gt;IAA&amp;lt;/math&amp;gt; до &amp;lt;math&amp;gt;IAB&amp;lt;/math&amp;gt; выполняется: &lt;br /&gt;
&lt;br /&gt;
&amp;lt;math&amp;gt;c_{i} = \sum\limits_{j = IAA_{i}}^{IAB_{i}} AN(j)B(JA(j))&amp;lt;/math&amp;gt;&lt;br /&gt;
&lt;br /&gt;
== Последовательная сложность алгоритма ==&lt;br /&gt;
&lt;br /&gt;
Для всего алгоритма потребуется выполнить &amp;lt;math&amp;gt;O(M)&amp;lt;/math&amp;gt; операций, где &amp;lt;math&amp;gt;M&amp;lt;/math&amp;gt; - число ненулевых эле­ментов матрицы.&lt;br /&gt;
&lt;br /&gt;
== Информационный граф ==&lt;br /&gt;
&lt;br /&gt;
[[File:InfoGrafMatrixRRCUandVextor.jpg]]&lt;br /&gt;
&lt;br /&gt;
== Ресурс параллелизма алгоритма ==&lt;br /&gt;
&lt;br /&gt;
== Входные и выходные данные алгоритма ==&lt;br /&gt;
&lt;br /&gt;
== Свойства алгоритма ==&lt;br /&gt;
&lt;br /&gt;
Алгоритм в рамках выбранной версии полностью детерминирован.&lt;br /&gt;
&lt;br /&gt;
Вычислительная мощность алгоритма, как отношение числа операций к суммарному объему входных и выходных данных – константа.&lt;br /&gt;
&lt;br /&gt;
= Программная реализация алгоритма =&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;references \&amp;gt;&lt;/div&gt;</summary>
		<author><name>Lexaloris</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:Lexaloris/%D0%A3%D0%BC%D0%BD%D0%BE%D0%B6%D0%B5%D0%BD%D0%B8%D0%B5_%D1%80%D0%B0%D0%B7%D1%80%D0%B5%D0%B6%D0%B5%D0%BD%D0%BD%D0%BE%D0%B9_%D0%BC%D0%B0%D1%82%D1%80%D0%B8%D1%86%D1%8B_%D0%BD%D0%B0_%D0%B2%D0%B5%D0%BA%D1%82%D0%BE%D1%80&amp;diff=8646</id>
		<title>Участник:Lexaloris/Умножение разреженной матрицы на вектор</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:Lexaloris/%D0%A3%D0%BC%D0%BD%D0%BE%D0%B6%D0%B5%D0%BD%D0%B8%D0%B5_%D1%80%D0%B0%D0%B7%D1%80%D0%B5%D0%B6%D0%B5%D0%BD%D0%BD%D0%BE%D0%B9_%D0%BC%D0%B0%D1%82%D1%80%D0%B8%D1%86%D1%8B_%D0%BD%D0%B0_%D0%B2%D0%B5%D0%BA%D1%82%D0%BE%D1%80&amp;diff=8646"/>
		<updated>2016-10-15T04:37:38Z</updated>

		<summary type="html">&lt;p&gt;Lexaloris: /* Информационный граф */&lt;/p&gt;
&lt;hr /&gt;
&lt;div&gt;&#039;&#039;&#039;Авторы страницы:&#039;&#039;&#039; Кочетков П.А и Новоселов А.Д.&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; — число строк матрицы. &lt;br /&gt;
Для каждой ее строки &amp;lt;math&amp;gt;I&amp;lt;/math&amp;gt; матрийы мы находим с помощью &amp;lt;math&amp;gt;IA&amp;lt;/math&amp;gt; значения первой &amp;lt;math&amp;gt;IAA&amp;lt;/math&amp;gt; и последней &amp;lt;math&amp;gt;IAB&amp;lt;/math&amp;gt; позиций, занимаемых элементами строки &amp;lt;math&amp;gt;I&amp;lt;/math&amp;gt; в массивах &amp;lt;math&amp;gt;JA&amp;lt;/math&amp;gt; и &amp;lt;math&amp;gt;AN&amp;lt;/math&amp;gt;. Затем, чтобы вычислить скалярное произведение строки &amp;lt;math&amp;gt;I&amp;lt;/math&amp;gt; и вектора &amp;lt;math&amp;gt;B&amp;lt;/math&amp;gt;, мы просто просматриваем &amp;lt;math&amp;gt;JA&amp;lt;/math&amp;gt; и &amp;lt;math&amp;gt;AN&amp;lt;/math&amp;gt; на отрезке от &amp;lt;math&amp;gt;IAA&amp;lt;/math&amp;gt; до &amp;lt;math&amp;gt;IAB&amp;lt;/math&amp;gt;:&lt;br /&gt;
каждое значение, хранимое в &amp;lt;math&amp;gt;JA&amp;lt;/math&amp;gt;, есть столбцовый индекс и используется для извлечения из массива &amp;lt;math&amp;gt;B&amp;lt;/math&amp;gt; элемента, который должен быть умножен на соответствующее число из &amp;lt;math&amp;gt;AN&amp;lt;/math&amp;gt;. Результат каж­дого умножения прибавляется к &amp;lt;math&amp;gt;C(I)&amp;lt;/math&amp;gt;.&lt;br /&gt;
&lt;br /&gt;
== Математическое описание алгоритма ==&lt;br /&gt;
&lt;br /&gt;
&#039;&#039;&#039;Исходные данные:&#039;&#039;&#039; &lt;br /&gt;
&lt;br /&gt;
&amp;lt;math&amp;gt;IA, JA, AN&amp;lt;/math&amp;gt; - заданная матрица в форме RR (С) U;&lt;br /&gt;
&lt;br /&gt;
&amp;lt;math&amp;gt;B&amp;lt;/math&amp;gt; - заданный заполненный вектор;&lt;br /&gt;
&lt;br /&gt;
&amp;lt;math&amp;gt;N&amp;lt;/math&amp;gt; - число строк матрицы.&lt;br /&gt;
&lt;br /&gt;
&#039;&#039;&#039;Выход:&#039;&#039;&#039; &amp;lt;math&amp;gt;C&amp;lt;/math&amp;gt; вектор-произведение размерности &amp;lt;math&amp;gt;N&amp;lt;/math&amp;gt;.&lt;br /&gt;
&lt;br /&gt;
&#039;&#039;&#039;Формулы метода:&#039;&#039;&#039;&lt;br /&gt;
&lt;br /&gt;
:&amp;lt;math&amp;gt;&lt;br /&gt;
\begin{align}&lt;br /&gt;
&amp;amp; IAA_{i} = IA(i), \quad i \in [1, N], \\&lt;br /&gt;
&amp;amp; IAB_{i} = IA(i + 1) - 1, \quad i \in [1, N], \\&lt;br /&gt;
&amp;amp; c_{i} = \sum\limits_{j = IAA_{i}}^{IAB_{i}} AN(j)B(JA(j)), \quad i \in [1, N] \\&lt;br /&gt;
\end{align}&lt;br /&gt;
&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;
Далее для всех &amp;lt;math&amp;gt;i&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; по нарастанию выполняются:&lt;br /&gt;
&lt;br /&gt;
1. &amp;lt;math&amp;gt; c_{i} = 0; IAA = IA(i); IAB = IA(i + 1 ) - 1 &amp;lt;/math&amp;gt;&lt;br /&gt;
&lt;br /&gt;
После этого, если &amp;lt;math&amp;gt;(IAB &amp;lt;= IAA)&amp;lt;/math&amp;gt;:&lt;br /&gt;
&lt;br /&gt;
2. Для всех &amp;lt;math&amp;gt;j&amp;lt;/math&amp;gt; от &amp;lt;math&amp;gt;IAA&amp;lt;/math&amp;gt; до &amp;lt;math&amp;gt;IAB&amp;lt;/math&amp;gt; выполняется: &lt;br /&gt;
&lt;br /&gt;
&amp;lt;math&amp;gt;c_{i} = \sum\limits_{j = IAA_{i}}^{IAB_{i}} AN(j)B(JA(j))&amp;lt;/math&amp;gt;&lt;br /&gt;
&lt;br /&gt;
== Последовательная сложность алгоритма ==&lt;br /&gt;
&lt;br /&gt;
Для всего алгоритма потребуется выполнить &amp;lt;math&amp;gt;O(M)&amp;lt;/math&amp;gt; операций, где &amp;lt;math&amp;gt;M&amp;lt;/math&amp;gt; - число ненулевых эле­ментов матрицы.&lt;br /&gt;
&lt;br /&gt;
== Информационный граф ==&lt;br /&gt;
&lt;br /&gt;
[[File:InfoGrafMatrixRRCUandVextor.jpg]]&lt;br /&gt;
[[Файл:InfoGrafMatrixRRCUandVextor.jpg]]&lt;br /&gt;
&lt;br /&gt;
== Ресурс параллелизма алгоритма ==&lt;br /&gt;
&lt;br /&gt;
== Входные и выходные данные алгоритма ==&lt;br /&gt;
&lt;br /&gt;
== Свойства алгоритма ==&lt;br /&gt;
&lt;br /&gt;
Алгоритм в рамках выбранной версии полностью детерминирован.&lt;br /&gt;
&lt;br /&gt;
Вычислительная мощность алгоритма, как отношение числа операций к суммарному объему входных и выходных данных – константа.&lt;br /&gt;
&lt;br /&gt;
= Программная реализация алгоритма =&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;references \&amp;gt;&lt;/div&gt;</summary>
		<author><name>Lexaloris</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:Lexaloris/%D0%A3%D0%BC%D0%BD%D0%BE%D0%B6%D0%B5%D0%BD%D0%B8%D0%B5_%D1%80%D0%B0%D0%B7%D1%80%D0%B5%D0%B6%D0%B5%D0%BD%D0%BD%D0%BE%D0%B9_%D0%BC%D0%B0%D1%82%D1%80%D0%B8%D1%86%D1%8B_%D0%BD%D0%B0_%D0%B2%D0%B5%D0%BA%D1%82%D0%BE%D1%80&amp;diff=8642</id>
		<title>Участник:Lexaloris/Умножение разреженной матрицы на вектор</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:Lexaloris/%D0%A3%D0%BC%D0%BD%D0%BE%D0%B6%D0%B5%D0%BD%D0%B8%D0%B5_%D1%80%D0%B0%D0%B7%D1%80%D0%B5%D0%B6%D0%B5%D0%BD%D0%BD%D0%BE%D0%B9_%D0%BC%D0%B0%D1%82%D1%80%D0%B8%D1%86%D1%8B_%D0%BD%D0%B0_%D0%B2%D0%B5%D0%BA%D1%82%D0%BE%D1%80&amp;diff=8642"/>
		<updated>2016-10-15T04:34:24Z</updated>

		<summary type="html">&lt;p&gt;Lexaloris: /* Информационный граф */&lt;/p&gt;
&lt;hr /&gt;
&lt;div&gt;&#039;&#039;&#039;Авторы страницы:&#039;&#039;&#039; Кочетков П.А и Новоселов А.Д.&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; — число строк матрицы. &lt;br /&gt;
Для каждой ее строки &amp;lt;math&amp;gt;I&amp;lt;/math&amp;gt; матрийы мы находим с помощью &amp;lt;math&amp;gt;IA&amp;lt;/math&amp;gt; значения первой &amp;lt;math&amp;gt;IAA&amp;lt;/math&amp;gt; и последней &amp;lt;math&amp;gt;IAB&amp;lt;/math&amp;gt; позиций, занимаемых элементами строки &amp;lt;math&amp;gt;I&amp;lt;/math&amp;gt; в массивах &amp;lt;math&amp;gt;JA&amp;lt;/math&amp;gt; и &amp;lt;math&amp;gt;AN&amp;lt;/math&amp;gt;. Затем, чтобы вычислить скалярное произведение строки &amp;lt;math&amp;gt;I&amp;lt;/math&amp;gt; и вектора &amp;lt;math&amp;gt;B&amp;lt;/math&amp;gt;, мы просто просматриваем &amp;lt;math&amp;gt;JA&amp;lt;/math&amp;gt; и &amp;lt;math&amp;gt;AN&amp;lt;/math&amp;gt; на отрезке от &amp;lt;math&amp;gt;IAA&amp;lt;/math&amp;gt; до &amp;lt;math&amp;gt;IAB&amp;lt;/math&amp;gt;:&lt;br /&gt;
каждое значение, хранимое в &amp;lt;math&amp;gt;JA&amp;lt;/math&amp;gt;, есть столбцовый индекс и используется для извлечения из массива &amp;lt;math&amp;gt;B&amp;lt;/math&amp;gt; элемента, который должен быть умножен на соответствующее число из &amp;lt;math&amp;gt;AN&amp;lt;/math&amp;gt;. Результат каж­дого умножения прибавляется к &amp;lt;math&amp;gt;C(I)&amp;lt;/math&amp;gt;.&lt;br /&gt;
&lt;br /&gt;
== Математическое описание алгоритма ==&lt;br /&gt;
&lt;br /&gt;
&#039;&#039;&#039;Исходные данные:&#039;&#039;&#039; &lt;br /&gt;
&lt;br /&gt;
&amp;lt;math&amp;gt;IA, JA, AN&amp;lt;/math&amp;gt; - заданная матрица в форме RR (С) U;&lt;br /&gt;
&lt;br /&gt;
&amp;lt;math&amp;gt;B&amp;lt;/math&amp;gt; - заданный заполненный вектор;&lt;br /&gt;
&lt;br /&gt;
&amp;lt;math&amp;gt;N&amp;lt;/math&amp;gt; - число строк матрицы.&lt;br /&gt;
&lt;br /&gt;
&#039;&#039;&#039;Выход:&#039;&#039;&#039; &amp;lt;math&amp;gt;C&amp;lt;/math&amp;gt; вектор-произведение размерности &amp;lt;math&amp;gt;N&amp;lt;/math&amp;gt;.&lt;br /&gt;
&lt;br /&gt;
&#039;&#039;&#039;Формулы метода:&#039;&#039;&#039;&lt;br /&gt;
&lt;br /&gt;
:&amp;lt;math&amp;gt;&lt;br /&gt;
\begin{align}&lt;br /&gt;
&amp;amp; IAA_{i} = IA(i), \quad i \in [1, N], \\&lt;br /&gt;
&amp;amp; IAB_{i} = IA(i + 1) - 1, \quad i \in [1, N], \\&lt;br /&gt;
&amp;amp; c_{i} = \sum\limits_{j = IAA_{i}}^{IAB_{i}} AN(j)B(JA(j)), \quad i \in [1, N] \\&lt;br /&gt;
\end{align}&lt;br /&gt;
&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;
Далее для всех &amp;lt;math&amp;gt;i&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; по нарастанию выполняются:&lt;br /&gt;
&lt;br /&gt;
1. &amp;lt;math&amp;gt; c_{i} = 0; IAA = IA(i); IAB = IA(i + 1 ) - 1 &amp;lt;/math&amp;gt;&lt;br /&gt;
&lt;br /&gt;
После этого, если &amp;lt;math&amp;gt;(IAB &amp;lt;= IAA)&amp;lt;/math&amp;gt;:&lt;br /&gt;
&lt;br /&gt;
2. Для всех &amp;lt;math&amp;gt;j&amp;lt;/math&amp;gt; от &amp;lt;math&amp;gt;IAA&amp;lt;/math&amp;gt; до &amp;lt;math&amp;gt;IAB&amp;lt;/math&amp;gt; выполняется: &lt;br /&gt;
&lt;br /&gt;
&amp;lt;math&amp;gt;c_{i} = \sum\limits_{j = IAA_{i}}^{IAB_{i}} AN(j)B(JA(j))&amp;lt;/math&amp;gt;&lt;br /&gt;
&lt;br /&gt;
== Последовательная сложность алгоритма ==&lt;br /&gt;
&lt;br /&gt;
Для всего алгоритма потребуется выполнить &amp;lt;math&amp;gt;O(M)&amp;lt;/math&amp;gt; операций, где &amp;lt;math&amp;gt;M&amp;lt;/math&amp;gt; - число ненулевых эле­ментов матрицы.&lt;br /&gt;
&lt;br /&gt;
== Информационный граф ==&lt;br /&gt;
&lt;br /&gt;
[[Файл:InfoGrafMatrixRRCUandVextor.jpg]]&lt;br /&gt;
&lt;br /&gt;
== Ресурс параллелизма алгоритма ==&lt;br /&gt;
&lt;br /&gt;
== Входные и выходные данные алгоритма ==&lt;br /&gt;
&lt;br /&gt;
== Свойства алгоритма ==&lt;br /&gt;
&lt;br /&gt;
Алгоритм в рамках выбранной версии полностью детерминирован.&lt;br /&gt;
&lt;br /&gt;
Вычислительная мощность алгоритма, как отношение числа операций к суммарному объему входных и выходных данных – константа.&lt;br /&gt;
&lt;br /&gt;
= Программная реализация алгоритма =&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;references \&amp;gt;&lt;/div&gt;</summary>
		<author><name>Lexaloris</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:Lexaloris&amp;diff=8641</id>
		<title>Участник:Lexaloris</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:Lexaloris&amp;diff=8641"/>
		<updated>2016-10-15T04:31:35Z</updated>

		<summary type="html">&lt;p&gt;Lexaloris: Новая страница: «Новоселов Алексей Дмитриевич. Студент МГУ ВМК. Группа 621.»&lt;/p&gt;
&lt;hr /&gt;
&lt;div&gt;Новоселов Алексей Дмитриевич. Студент МГУ ВМК. Группа 621.&lt;/div&gt;</summary>
		<author><name>Lexaloris</name></author>
	</entry>
	<entry>
		<id>https://xn--80aecvaldz.xn--80ahdrnmvk.xn--p1ai/w/ru/index.php?title=%D0%9E%D0%B1%D1%81%D1%83%D0%B6%D0%B4%D0%B5%D0%BD%D0%B8%D0%B5_%D1%83%D1%87%D0%B0%D1%81%D1%82%D0%BD%D0%B8%D0%BA%D0%B0:Lineprinter&amp;diff=8640</id>
		<title>Обсуждение участника:Lineprinter</title>
		<link rel="alternate" type="text/html" href="https://xn--80aecvaldz.xn--80ahdrnmvk.xn--p1ai/w/ru/index.php?title=%D0%9E%D0%B1%D1%81%D1%83%D0%B6%D0%B4%D0%B5%D0%BD%D0%B8%D0%B5_%D1%83%D1%87%D0%B0%D1%81%D1%82%D0%BD%D0%B8%D0%BA%D0%B0:Lineprinter&amp;diff=8640"/>
		<updated>2016-10-15T04:30:15Z</updated>

		<summary type="html">&lt;p&gt;Lexaloris: /* Перенос */&lt;/p&gt;
&lt;hr /&gt;
&lt;div&gt;== Перенос ==&lt;br /&gt;
Статья: [[Участники: Бобошко А., Юмакаева А./Решение начальной задачи Коши для системы ОДУ методом Рунге-Кутта 4-го порядка]];&lt;br /&gt;
Выполняют: Бобошко Алексей и Юмакаева Алина&lt;br /&gt;
&lt;br /&gt;
Статья: [[Алгоритм кластеризации, основанный на сетях Кохоннена]];&lt;br /&gt;
Выполняют:  Логвиненко Александра и Адиев Тохтар&lt;br /&gt;
&lt;br /&gt;
Статья: [[Ортогонализация Грама-Шмидта]];&lt;br /&gt;
Выполняют: [[Участник:KibAndrey| Кибанов Андрей]] и Аджиева Татьяна&lt;br /&gt;
&lt;br /&gt;
Статья: [[Самоорганизующиеся карты Кохонена]];&lt;br /&gt;
Выполняет: [[Участник:Anton goy| Гой Антон]]&lt;br /&gt;
&lt;br /&gt;
Статья:[[ЕМ-алгоритм_(Тематическое_моделирование)]];&lt;br /&gt;
Выполняют: Мурат Апишев и Андрей Заночкин&lt;br /&gt;
&lt;br /&gt;
Статья:[[Алгоритм_Ланцоша_с_полной_переортогонализацией]];&lt;br /&gt;
Выполняет:[[Участник:Sfedotov| Федотов С.А.]]&lt;br /&gt;
&lt;br /&gt;
Статья: [[Алгоритм_k-средних]]&lt;br /&gt;
Выполняют: [[Участник:Error2407|Богомазов Евгений]], [[Участник:Илья_Егоров|Егоров Илья]]&lt;br /&gt;
&lt;br /&gt;
Статья: [[Нечеткий_алгоритм_С_средних]]&lt;br /&gt;
Выполняют: [[Участник:Demon smd|Д.А.Гуськов]], [[Участник:marina abramenkova|М.А.Абраменкова]]&lt;br /&gt;
&lt;br /&gt;
Статья: [[Решение_задачи_Коши_для_системы_ОДУ_методом_Рунге-Кутты_4_порядка]];&lt;br /&gt;
Выполняют: [[Участник:Алимов_Дамир_Алиевич|Алимов Дамир]] и [[Участник:Anlesnichiy|Антон Лесничий]]&lt;br /&gt;
&lt;br /&gt;
Статья: [[Строгий_алгоритм_С_средних_(Hard_C-Means,_HCM)]];&lt;br /&gt;
Выполняют: [[Участник:Светлана_Лукьяненко|Лукьяненко Светлана]] и [[Участник:Юрий_Комаров|Комаров Юрий]]&lt;br /&gt;
&lt;br /&gt;
Статья: [[Алгоритм кластеризации, основанный на минимальном остовном дереве]];&lt;br /&gt;
Выполняет: [[Участник:Astandrik | Стандрик Антон Сергеевич]]&lt;br /&gt;
&lt;br /&gt;
Статья: [[Умножение разреженной матрицы на вектор]];&lt;br /&gt;
Выполняет: [[Участник:Lexaloris | Новоселов Алексей]], Выполняет: [[Участник:pahom | Кочетков Павел]]&lt;br /&gt;
&lt;br /&gt;
Статья: [[Нахождение_собственных_чисел_квадратной_матрицы_методом_QR_разложения_(3)|Нахождение собственных чисел квадратной матрицы методом QR разложения (3)]];&lt;br /&gt;
Выполняют: [[Участник:Смирнова_Александра|Смирнова А.С.]], [[Участник:Александра_Киямова|Киямова А.]]&lt;br /&gt;
&lt;br /&gt;
Статья: [[Метод_Якоби_вычисления_сингулярных_чисел_и_векторов]];&lt;br /&gt;
Выполняют: [[Участница:Почернина_Елена| Почернина Елена]] и [[Участница:Светлана|Костюкова Светлана]]&lt;br /&gt;
&lt;br /&gt;
Статья: [[Метод_Ньютона_для_решения_систем_нелинейных_уравнений(2)]];&lt;br /&gt;
Выполняют: [[Участник:Oleggium|Гирняк О.Р.]], [[Участник:Dimx19|Васильков Д.А.]]&lt;br /&gt;
&lt;br /&gt;
Статья: [[Алгоритм_кластеризации_с_использованием_представлений]];&lt;br /&gt;
Выполняют: [[Участник:Cookie|Шатков С.А.]], [[Антохина Ю.А.]]&lt;br /&gt;
&lt;br /&gt;
Статья: [[Быстрое_преобразование_Фурье_(FFT)|Быстрое преобразование Фурье (FFT)]];&lt;br /&gt;
Выполняют: [[Участник:Victoria_Stepanischeva|Степанищева Виктория]] и [[Участник:Igor_Munkin|Мунькин Игорь]]&lt;br /&gt;
&lt;br /&gt;
Статья: [[Быстрое_дискретное_преобразование_Фурье|Быстрое_дискретное_преобразование_Фурье]];&lt;br /&gt;
Выполняют: [[Участник:ivanov.kir.m | К.М.Иванов]], [[Участник:Pumpkin | А.C.Сапин]]&lt;br /&gt;
&lt;br /&gt;
Статья:[[Алгоритм_k_средних]]&lt;br /&gt;
Выполняют: [[Участник:Parkhomenko|Пархоменко Павел]], [[Участник:ivan.mashonskiy|Машонский Иван]]&lt;br /&gt;
&lt;br /&gt;
Статья:[[EM-алгоритм_кластеризации]]&lt;br /&gt;
Выполняет: [[Участник:Noite|Зинченко Дмитрий]]&lt;br /&gt;
&lt;br /&gt;
Статья:[[Алгоритм_k_means]]&lt;br /&gt;
Выполняют: [[Участник:IanaV| Валуйская Яна]], [[Глотов Евгений]]&lt;br /&gt;
&lt;br /&gt;
Статья: [[Метод Якоби вычисления собственных значений симметричной матрицы ЗП |Метод Якоби вычисления собственных значений симметричной матрицы ЗП]];&lt;br /&gt;
Выполняют: [[Участник:Зиновьев Владимир|Зиновьев В.С.]], [[Участник:Пронин Андрей|Пронин А.М.]]&lt;br /&gt;
&lt;br /&gt;
Статья:[[Алгоритм_кластеризации,_основанный_на_минимальном_покрывающем_дереве]]&lt;br /&gt;
Выполняет: [[Участник:Kanast74|Дмитриева Анастасия]]&lt;br /&gt;
&lt;br /&gt;
Статья:[[Нахождение_собственных_чисел_квадратной_матрицы_методом_QR_разложения_(4)]]&lt;br /&gt;
Выполняют: [[Участник:F-morozov|Морозов Ф. В.]], [[Участник:Nataliya|Пащенко Н. Ф.]]&lt;br /&gt;
&lt;br /&gt;
Статья:[[Хранение_ненулевых_элементов_разреженных_матриц._Умножение_разреженной_матрицы_на_вектор]];&lt;br /&gt;
Выполняют: [[Участник:Trrufina|Третьякова Р.М.]] и [[Участник:Екатерина_Буторина|Буторина Е.В.]]&lt;br /&gt;
&lt;br /&gt;
Статья: [[Алгоритм_кластеризации_с_использованием_представлений2]];&lt;br /&gt;
Выполняет: [[Участник:Лукьянова Анна|Лукьянова А.Я.]]&lt;br /&gt;
&lt;br /&gt;
Статья: [[Метод Якоби вычисления собственных значений симметричной матрицы]];&lt;br /&gt;
Выполняют: [[Участник: Galkina|Галкина А.С.]], [[Участник: Игорь|Плахов И.А.]]&lt;br /&gt;
&lt;br /&gt;
Статья: [[Метод рекурсивной координатной бисекции]];&lt;br /&gt;
Выполняют: [[Участник: Obirvalger|Гордеев Михаил]], [[Участник: KolmakovEA|Колмаков Евгений]]&lt;br /&gt;
&lt;br /&gt;
Статья: [[Итерационный метод решения системы линейных алгебраических уравнений GMRES (обобщенный метод минимальных невязок)]];&lt;br /&gt;
Выполняют: [[Участник: Эльвира Ахиярова|Ахиярова Эльвира]]&lt;br /&gt;
&lt;br /&gt;
Статья: [[Хранение ненулевых элементов разреженной матрицы. Умножение разреженной матрицы на вектор]];&lt;br /&gt;
Выполняют: [[Участник: Janyell|Сычева Евгения]], [[Участник: Ahahalin|Хахалин Анатолий]]&lt;br /&gt;
&lt;br /&gt;
Статья: [[Построение матрицы Адамара произвольного размера]];&lt;br /&gt;
Выполняют: [[Участник: Бугаков Юрий|Бугаков Юрий]], Кужамалиев Ернур&lt;br /&gt;
&lt;br /&gt;
Статья: [[Вычисление определенного интеграла с использованием адаптивно сгущающейся сетки (1)]]&lt;br /&gt;
Выполняют: [[Участница:Sannikovats| Санникова Татьяна Сергеевна]], [[Участник:Plukshin| Лукшин Петр Андреевич]]&lt;br /&gt;
&lt;br /&gt;
Статья: [[Алгоритм кластеризации, основанный на построении каркаса]];&lt;br /&gt;
Выполняют: [[Участник:SenderovichNikita| Сендерович Никита]]&lt;br /&gt;
&lt;br /&gt;
Статья: [[Алгоритм кластеризации, основанный на максимизации ожидания]];&lt;br /&gt;
Выполняют: Готман Мария, Лукашкина Юлия&lt;br /&gt;
&lt;br /&gt;
Статья: [[Partitioning_Around_Medoids_(PAM)]]&lt;br /&gt;
Выполняют: [[Участник:Avasilenko|А.Э.Василенко]], [[Участник:Anastasia|А.В.Тузикова]]&lt;br /&gt;
&lt;br /&gt;
Статья: [[Участник:Муромцев Н.А. и Дворецкий М.С ./ Нечеткий алгоритм С средних (Fuzzy C-means) (23)]]&lt;br /&gt;
Выполняют: [[Участник:Nikmedoed|Н.А. Муромцев]], Дворецкий Михаил Сергеевич&lt;/div&gt;</summary>
		<author><name>Lexaloris</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:Lexaloris/%D0%A3%D0%BC%D0%BD%D0%BE%D0%B6%D0%B5%D0%BD%D0%B8%D0%B5_%D1%80%D0%B0%D0%B7%D1%80%D0%B5%D0%B6%D0%B5%D0%BD%D0%BD%D0%BE%D0%B9_%D0%BC%D0%B0%D1%82%D1%80%D0%B8%D1%86%D1%8B_%D0%BD%D0%B0_%D0%B2%D0%B5%D0%BA%D1%82%D0%BE%D1%80&amp;diff=5694</id>
		<title>Участник:Lexaloris/Умножение разреженной матрицы на вектор</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:Lexaloris/%D0%A3%D0%BC%D0%BD%D0%BE%D0%B6%D0%B5%D0%BD%D0%B8%D0%B5_%D1%80%D0%B0%D0%B7%D1%80%D0%B5%D0%B6%D0%B5%D0%BD%D0%BD%D0%BE%D0%B9_%D0%BC%D0%B0%D1%82%D1%80%D0%B8%D1%86%D1%8B_%D0%BD%D0%B0_%D0%B2%D0%B5%D0%BA%D1%82%D0%BE%D1%80&amp;diff=5694"/>
		<updated>2016-10-12T11:14:24Z</updated>

		<summary type="html">&lt;p&gt;Lexaloris: /* Свойства алгоритма */&lt;/p&gt;
&lt;hr /&gt;
&lt;div&gt;&#039;&#039;&#039;Авторы страницы:&#039;&#039;&#039; Кочетков П.А и Новоселов А.Д.&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; — число строк матрицы. &lt;br /&gt;
Для каждой ее строки &amp;lt;math&amp;gt;I&amp;lt;/math&amp;gt; матрийы мы находим с помощью &amp;lt;math&amp;gt;IA&amp;lt;/math&amp;gt; значения первой &amp;lt;math&amp;gt;IAA&amp;lt;/math&amp;gt; и последней &amp;lt;math&amp;gt;IAB&amp;lt;/math&amp;gt; позиций, занимаемых элементами строки &amp;lt;math&amp;gt;I&amp;lt;/math&amp;gt; в массивах &amp;lt;math&amp;gt;JA&amp;lt;/math&amp;gt; и &amp;lt;math&amp;gt;AN&amp;lt;/math&amp;gt;. Затем, чтобы вычислить скалярное произведение строки &amp;lt;math&amp;gt;I&amp;lt;/math&amp;gt; и вектора &amp;lt;math&amp;gt;B&amp;lt;/math&amp;gt;, мы просто просматриваем &amp;lt;math&amp;gt;JA&amp;lt;/math&amp;gt; и &amp;lt;math&amp;gt;AN&amp;lt;/math&amp;gt; на отрезке от &amp;lt;math&amp;gt;IAA&amp;lt;/math&amp;gt; до &amp;lt;math&amp;gt;IAB&amp;lt;/math&amp;gt;:&lt;br /&gt;
каждое значение, хранимое в &amp;lt;math&amp;gt;JA&amp;lt;/math&amp;gt;, есть столбцовый индекс и используется для извлечения из массива &amp;lt;math&amp;gt;B&amp;lt;/math&amp;gt; элемента, который должен быть умножен на соответствующее число из &amp;lt;math&amp;gt;AN&amp;lt;/math&amp;gt;. Результат каж­дого умножения прибавляется к &amp;lt;math&amp;gt;C(I)&amp;lt;/math&amp;gt;.&lt;br /&gt;
&lt;br /&gt;
== Математическое описание алгоритма ==&lt;br /&gt;
&lt;br /&gt;
&#039;&#039;&#039;Исходные данные:&#039;&#039;&#039; &lt;br /&gt;
&lt;br /&gt;
&amp;lt;math&amp;gt;IA, JA, AN&amp;lt;/math&amp;gt; - заданная матрица в форме RR (С) U;&lt;br /&gt;
&lt;br /&gt;
&amp;lt;math&amp;gt;B&amp;lt;/math&amp;gt; - заданный заполненный вектор;&lt;br /&gt;
&lt;br /&gt;
&amp;lt;math&amp;gt;N&amp;lt;/math&amp;gt; - число строк матрицы.&lt;br /&gt;
&lt;br /&gt;
&#039;&#039;&#039;Выход:&#039;&#039;&#039; &amp;lt;math&amp;gt;C&amp;lt;/math&amp;gt; вектор-произведение размерности &amp;lt;math&amp;gt;N&amp;lt;/math&amp;gt;.&lt;br /&gt;
&lt;br /&gt;
&#039;&#039;&#039;Формулы метода:&#039;&#039;&#039;&lt;br /&gt;
&lt;br /&gt;
:&amp;lt;math&amp;gt;&lt;br /&gt;
\begin{align}&lt;br /&gt;
&amp;amp; IAA_{i} = IA(i), \quad i \in [1, N], \\&lt;br /&gt;
&amp;amp; IAB_{i} = IA(i + 1) - 1, \quad i \in [1, N], \\&lt;br /&gt;
&amp;amp; c_{i} = \sum\limits_{j = IAA_{i}}^{IAB_{i}} AN(j)B(JA(j)), \quad i \in [1, N] \\&lt;br /&gt;
\end{align}&lt;br /&gt;
&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;
Далее для всех &amp;lt;math&amp;gt;i&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; по нарастанию выполняются:&lt;br /&gt;
&lt;br /&gt;
1. &amp;lt;math&amp;gt; c_{i} = 0; IAA = IA(i); IAB = IA(i + 1 ) - 1 &amp;lt;/math&amp;gt;&lt;br /&gt;
&lt;br /&gt;
После этого, если &amp;lt;math&amp;gt;(IAB &amp;lt;= IAA)&amp;lt;/math&amp;gt;:&lt;br /&gt;
&lt;br /&gt;
2. Для всех &amp;lt;math&amp;gt;j&amp;lt;/math&amp;gt; от &amp;lt;math&amp;gt;IAA&amp;lt;/math&amp;gt; до &amp;lt;math&amp;gt;IAB&amp;lt;/math&amp;gt; выполняется: &lt;br /&gt;
&lt;br /&gt;
&amp;lt;math&amp;gt;c_{i} = \sum\limits_{j = IAA_{i}}^{IAB_{i}} AN(j)B(JA(j))&amp;lt;/math&amp;gt;&lt;br /&gt;
&lt;br /&gt;
== Последовательная сложность алгоритма ==&lt;br /&gt;
&lt;br /&gt;
Для всего алгоритма потребуется выполнить &amp;lt;math&amp;gt;O(M)&amp;lt;/math&amp;gt; операций, где &amp;lt;math&amp;gt;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;
== Свойства алгоритма ==&lt;br /&gt;
&lt;br /&gt;
Алгоритм в рамках выбранной версии полностью детерминирован.&lt;br /&gt;
&lt;br /&gt;
Вычислительная мощность алгоритма, как отношение числа операций к суммарному объему входных и выходных данных – константа.&lt;br /&gt;
&lt;br /&gt;
= Программная реализация алгоритма =&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;references \&amp;gt;&lt;/div&gt;</summary>
		<author><name>Lexaloris</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:Lexaloris/%D0%A3%D0%BC%D0%BD%D0%BE%D0%B6%D0%B5%D0%BD%D0%B8%D0%B5_%D1%80%D0%B0%D0%B7%D1%80%D0%B5%D0%B6%D0%B5%D0%BD%D0%BD%D0%BE%D0%B9_%D0%BC%D0%B0%D1%82%D1%80%D0%B8%D1%86%D1%8B_%D0%BD%D0%B0_%D0%B2%D0%B5%D0%BA%D1%82%D0%BE%D1%80&amp;diff=5674</id>
		<title>Участник:Lexaloris/Умножение разреженной матрицы на вектор</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:Lexaloris/%D0%A3%D0%BC%D0%BD%D0%BE%D0%B6%D0%B5%D0%BD%D0%B8%D0%B5_%D1%80%D0%B0%D0%B7%D1%80%D0%B5%D0%B6%D0%B5%D0%BD%D0%BD%D0%BE%D0%B9_%D0%BC%D0%B0%D1%82%D1%80%D0%B8%D1%86%D1%8B_%D0%BD%D0%B0_%D0%B2%D0%B5%D0%BA%D1%82%D0%BE%D1%80&amp;diff=5674"/>
		<updated>2016-10-12T10:36:44Z</updated>

		<summary type="html">&lt;p&gt;Lexaloris: /* Общее описание алгоритма */&lt;/p&gt;
&lt;hr /&gt;
&lt;div&gt;&#039;&#039;&#039;Авторы страницы:&#039;&#039;&#039; Кочетков П.А и Новоселов А.Д.&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; — число строк матрицы. &lt;br /&gt;
Для каждой ее строки &amp;lt;math&amp;gt;I&amp;lt;/math&amp;gt; матрийы мы находим с помощью &amp;lt;math&amp;gt;IA&amp;lt;/math&amp;gt; значения первой &amp;lt;math&amp;gt;IAA&amp;lt;/math&amp;gt; и последней &amp;lt;math&amp;gt;IAB&amp;lt;/math&amp;gt; позиций, занимаемых элементами строки &amp;lt;math&amp;gt;I&amp;lt;/math&amp;gt; в массивах &amp;lt;math&amp;gt;JA&amp;lt;/math&amp;gt; и &amp;lt;math&amp;gt;AN&amp;lt;/math&amp;gt;. Затем, чтобы вычислить скалярное произведение строки &amp;lt;math&amp;gt;I&amp;lt;/math&amp;gt; и вектора &amp;lt;math&amp;gt;B&amp;lt;/math&amp;gt;, мы просто просматриваем &amp;lt;math&amp;gt;JA&amp;lt;/math&amp;gt; и &amp;lt;math&amp;gt;AN&amp;lt;/math&amp;gt; на отрезке от &amp;lt;math&amp;gt;IAA&amp;lt;/math&amp;gt; до &amp;lt;math&amp;gt;IAB&amp;lt;/math&amp;gt;:&lt;br /&gt;
каждое значение, хранимое в &amp;lt;math&amp;gt;JA&amp;lt;/math&amp;gt;, есть столбцовый индекс и используется для извлечения из массива &amp;lt;math&amp;gt;B&amp;lt;/math&amp;gt; элемента, который должен быть умножен на соответствующее число из &amp;lt;math&amp;gt;AN&amp;lt;/math&amp;gt;. Результат каж­дого умножения прибавляется к &amp;lt;math&amp;gt;C(I)&amp;lt;/math&amp;gt;.&lt;br /&gt;
&lt;br /&gt;
== Математическое описание алгоритма ==&lt;br /&gt;
&lt;br /&gt;
&#039;&#039;&#039;Исходные данные:&#039;&#039;&#039; &lt;br /&gt;
&lt;br /&gt;
&amp;lt;math&amp;gt;IA, JA, AN&amp;lt;/math&amp;gt; - заданная матрица в форме RR (С) U;&lt;br /&gt;
&lt;br /&gt;
&amp;lt;math&amp;gt;B&amp;lt;/math&amp;gt; - заданный заполненный вектор;&lt;br /&gt;
&lt;br /&gt;
&amp;lt;math&amp;gt;N&amp;lt;/math&amp;gt; - число строк матрицы.&lt;br /&gt;
&lt;br /&gt;
&#039;&#039;&#039;Выход:&#039;&#039;&#039; &amp;lt;math&amp;gt;C&amp;lt;/math&amp;gt; вектор-произведение размерности &amp;lt;math&amp;gt;N&amp;lt;/math&amp;gt;.&lt;br /&gt;
&lt;br /&gt;
&#039;&#039;&#039;Формулы метода:&#039;&#039;&#039;&lt;br /&gt;
&lt;br /&gt;
:&amp;lt;math&amp;gt;&lt;br /&gt;
\begin{align}&lt;br /&gt;
&amp;amp; IAA_{i} = IA(i), \quad i \in [1, N], \\&lt;br /&gt;
&amp;amp; IAB_{i} = IA(i + 1) - 1, \quad i \in [1, N], \\&lt;br /&gt;
&amp;amp; c_{i} = \sum\limits_{j = IAA_{i}}^{IAB_{i}} AN(j)B(JA(j)), \quad i \in [1, N] \\&lt;br /&gt;
\end{align}&lt;br /&gt;
&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;
Далее для всех &amp;lt;math&amp;gt;i&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; по нарастанию выполняются:&lt;br /&gt;
&lt;br /&gt;
1. &amp;lt;math&amp;gt; c_{i} = 0; IAA = IA(i); IAB = IA(i + 1 ) - 1 &amp;lt;/math&amp;gt;&lt;br /&gt;
&lt;br /&gt;
После этого, если &amp;lt;math&amp;gt;(IAB &amp;lt;= IAA)&amp;lt;/math&amp;gt;:&lt;br /&gt;
&lt;br /&gt;
2. Для всех &amp;lt;math&amp;gt;j&amp;lt;/math&amp;gt; от &amp;lt;math&amp;gt;IAA&amp;lt;/math&amp;gt; до &amp;lt;math&amp;gt;IAB&amp;lt;/math&amp;gt; выполняется: &lt;br /&gt;
&lt;br /&gt;
&amp;lt;math&amp;gt;c_{i} = \sum\limits_{j = IAA_{i}}^{IAB_{i}} AN(j)B(JA(j))&amp;lt;/math&amp;gt;&lt;br /&gt;
&lt;br /&gt;
== Последовательная сложность алгоритма ==&lt;br /&gt;
&lt;br /&gt;
Для всего алгоритма потребуется выполнить &amp;lt;math&amp;gt;O(M)&amp;lt;/math&amp;gt; операций, где &amp;lt;math&amp;gt;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;
== Свойства алгоритма ==&lt;br /&gt;
&lt;br /&gt;
Алгоритм в рамках выбранной версии полностью детерминирован.&lt;br /&gt;
&lt;br /&gt;
= Программная реализация алгоритма =&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;references \&amp;gt;&lt;/div&gt;</summary>
		<author><name>Lexaloris</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:Lexaloris/%D0%A3%D0%BC%D0%BD%D0%BE%D0%B6%D0%B5%D0%BD%D0%B8%D0%B5_%D1%80%D0%B0%D0%B7%D1%80%D0%B5%D0%B6%D0%B5%D0%BD%D0%BD%D0%BE%D0%B9_%D0%BC%D0%B0%D1%82%D1%80%D0%B8%D1%86%D1%8B_%D0%BD%D0%B0_%D0%B2%D0%B5%D0%BA%D1%82%D0%BE%D1%80&amp;diff=5667</id>
		<title>Участник:Lexaloris/Умножение разреженной матрицы на вектор</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:Lexaloris/%D0%A3%D0%BC%D0%BD%D0%BE%D0%B6%D0%B5%D0%BD%D0%B8%D0%B5_%D1%80%D0%B0%D0%B7%D1%80%D0%B5%D0%B6%D0%B5%D0%BD%D0%BD%D0%BE%D0%B9_%D0%BC%D0%B0%D1%82%D1%80%D0%B8%D1%86%D1%8B_%D0%BD%D0%B0_%D0%B2%D0%B5%D0%BA%D1%82%D0%BE%D1%80&amp;diff=5667"/>
		<updated>2016-10-12T10:30:13Z</updated>

		<summary type="html">&lt;p&gt;Lexaloris: /* Общее описание алгоритма */&lt;/p&gt;
&lt;hr /&gt;
&lt;div&gt;&#039;&#039;&#039;Авторы страницы:&#039;&#039;&#039; Кочетков П.А и Новоселов А.Д.&lt;br /&gt;
&lt;br /&gt;
= Свойства и структура алгоритмов =&lt;br /&gt;
&lt;br /&gt;
== Общее описание алгоритма ==&lt;br /&gt;
&lt;br /&gt;
Пусть N — число строк матрицы. Если b — заполненный, то к его элементам, находящимся в В, доступ может быть про­извольным.&lt;br /&gt;
Для каждой ее строки I матрицы мы находим с помощью IA значения первой IAA и последней IAB позиций, занимаемых элементами строки I в массивах JA и AN. Затем, чтобы вычислить скалярное произведение строки I и вектора В, мы просто просматриваем JA и AN на отрезке от IAA до IAB:&lt;br /&gt;
каждое значение, хранимое в JA, есть столбцовый индекс и используется для извлечения из массива В элемента, который должен бытьумножен на соответствующее число из AN. Результат каж­дого умножения прибавляется к С (I).&lt;br /&gt;
&lt;br /&gt;
== Математическое описание алгоритма ==&lt;br /&gt;
&lt;br /&gt;
&#039;&#039;&#039;Исходные данные:&#039;&#039;&#039; &lt;br /&gt;
&lt;br /&gt;
&amp;lt;math&amp;gt;IA, JA, AN&amp;lt;/math&amp;gt; - заданная матрица в форме RR (С) U;&lt;br /&gt;
&lt;br /&gt;
&amp;lt;math&amp;gt;B&amp;lt;/math&amp;gt; - заданный заполненный вектор;&lt;br /&gt;
&lt;br /&gt;
&amp;lt;math&amp;gt;N&amp;lt;/math&amp;gt; - число строк матрицы.&lt;br /&gt;
&lt;br /&gt;
&#039;&#039;&#039;Выход:&#039;&#039;&#039; &amp;lt;math&amp;gt;C&amp;lt;/math&amp;gt; вектор-произведение размерности &amp;lt;math&amp;gt;N&amp;lt;/math&amp;gt;.&lt;br /&gt;
&lt;br /&gt;
&#039;&#039;&#039;Формулы метода:&#039;&#039;&#039;&lt;br /&gt;
&lt;br /&gt;
:&amp;lt;math&amp;gt;&lt;br /&gt;
\begin{align}&lt;br /&gt;
&amp;amp; IAA_{i} = IA(i), \quad i \in [1, N], \\&lt;br /&gt;
&amp;amp; IAB_{i} = IA(i + 1) - 1, \quad i \in [1, N], \\&lt;br /&gt;
&amp;amp; c_{i} = \sum\limits_{j = IAA_{i}}^{IAB_{i}} AN(j)B(JA(j)), \quad i \in [1, N] \\&lt;br /&gt;
\end{align}&lt;br /&gt;
&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;
Далее для всех &amp;lt;math&amp;gt;i&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; по нарастанию выполняются:&lt;br /&gt;
&lt;br /&gt;
1. &amp;lt;math&amp;gt; c_{i} = 0; IAA = IA(i); IAB = IA(i + 1 ) - 1 &amp;lt;/math&amp;gt;&lt;br /&gt;
&lt;br /&gt;
После этого, если &amp;lt;math&amp;gt;(IAB &amp;lt;= IAA)&amp;lt;/math&amp;gt;:&lt;br /&gt;
&lt;br /&gt;
2. Для всех &amp;lt;math&amp;gt;j&amp;lt;/math&amp;gt; от &amp;lt;math&amp;gt;IAA&amp;lt;/math&amp;gt; до &amp;lt;math&amp;gt;IAB&amp;lt;/math&amp;gt; выполняется: &lt;br /&gt;
&lt;br /&gt;
&amp;lt;math&amp;gt;c_{i} = \sum\limits_{j = IAA_{i}}^{IAB_{i}} AN(j)B(JA(j))&amp;lt;/math&amp;gt;&lt;br /&gt;
&lt;br /&gt;
== Последовательная сложность алгоритма ==&lt;br /&gt;
&lt;br /&gt;
Для всего алгоритма потребуется выполнить &amp;lt;math&amp;gt;O(M)&amp;lt;/math&amp;gt; операций, где &amp;lt;math&amp;gt;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;
== Свойства алгоритма ==&lt;br /&gt;
&lt;br /&gt;
Алгоритм в рамках выбранной версии полностью детерминирован.&lt;br /&gt;
&lt;br /&gt;
= Программная реализация алгоритма =&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;references \&amp;gt;&lt;/div&gt;</summary>
		<author><name>Lexaloris</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:Lexaloris/%D0%A3%D0%BC%D0%BD%D0%BE%D0%B6%D0%B5%D0%BD%D0%B8%D0%B5_%D1%80%D0%B0%D0%B7%D1%80%D0%B5%D0%B6%D0%B5%D0%BD%D0%BD%D0%BE%D0%B9_%D0%BC%D0%B0%D1%82%D1%80%D0%B8%D1%86%D1%8B_%D0%BD%D0%B0_%D0%B2%D0%B5%D0%BA%D1%82%D0%BE%D1%80&amp;diff=5664</id>
		<title>Участник:Lexaloris/Умножение разреженной матрицы на вектор</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:Lexaloris/%D0%A3%D0%BC%D0%BD%D0%BE%D0%B6%D0%B5%D0%BD%D0%B8%D0%B5_%D1%80%D0%B0%D0%B7%D1%80%D0%B5%D0%B6%D0%B5%D0%BD%D0%BD%D0%BE%D0%B9_%D0%BC%D0%B0%D1%82%D1%80%D0%B8%D1%86%D1%8B_%D0%BD%D0%B0_%D0%B2%D0%B5%D0%BA%D1%82%D0%BE%D1%80&amp;diff=5664"/>
		<updated>2016-10-12T10:25:40Z</updated>

		<summary type="html">&lt;p&gt;Lexaloris: /* Последовательная сложность алгоритма */&lt;/p&gt;
&lt;hr /&gt;
&lt;div&gt;&#039;&#039;&#039;Авторы страницы:&#039;&#039;&#039; Кочетков П.А и Новоселов А.Д.&lt;br /&gt;
&lt;br /&gt;
= Свойства и структура алгоритмов =&lt;br /&gt;
&lt;br /&gt;
== Общее описание алгоритма ==&lt;br /&gt;
&lt;br /&gt;
== Математическое описание алгоритма ==&lt;br /&gt;
&lt;br /&gt;
&#039;&#039;&#039;Исходные данные:&#039;&#039;&#039; &lt;br /&gt;
&lt;br /&gt;
&amp;lt;math&amp;gt;IA, JA, AN&amp;lt;/math&amp;gt; - заданная матрица в форме RR (С) U;&lt;br /&gt;
&lt;br /&gt;
&amp;lt;math&amp;gt;B&amp;lt;/math&amp;gt; - заданный заполненный вектор;&lt;br /&gt;
&lt;br /&gt;
&amp;lt;math&amp;gt;N&amp;lt;/math&amp;gt; - число строк матрицы.&lt;br /&gt;
&lt;br /&gt;
&#039;&#039;&#039;Выход:&#039;&#039;&#039; &amp;lt;math&amp;gt;C&amp;lt;/math&amp;gt; вектор-произведение размерности &amp;lt;math&amp;gt;N&amp;lt;/math&amp;gt;.&lt;br /&gt;
&lt;br /&gt;
&#039;&#039;&#039;Формулы метода:&#039;&#039;&#039;&lt;br /&gt;
&lt;br /&gt;
:&amp;lt;math&amp;gt;&lt;br /&gt;
\begin{align}&lt;br /&gt;
&amp;amp; IAA_{i} = IA(i), \quad i \in [1, N], \\&lt;br /&gt;
&amp;amp; IAB_{i} = IA(i + 1) - 1, \quad i \in [1, N], \\&lt;br /&gt;
&amp;amp; c_{i} = \sum\limits_{j = IAA_{i}}^{IAB_{i}} AN(j)B(JA(j)), \quad i \in [1, N] \\&lt;br /&gt;
\end{align}&lt;br /&gt;
&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;
Далее для всех &amp;lt;math&amp;gt;i&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; по нарастанию выполняются:&lt;br /&gt;
&lt;br /&gt;
1. &amp;lt;math&amp;gt; c_{i} = 0; IAA = IA(i); IAB = IA(i + 1 ) - 1 &amp;lt;/math&amp;gt;&lt;br /&gt;
&lt;br /&gt;
После этого, если &amp;lt;math&amp;gt;(IAB &amp;lt;= IAA)&amp;lt;/math&amp;gt;:&lt;br /&gt;
&lt;br /&gt;
2. Для всех &amp;lt;math&amp;gt;j&amp;lt;/math&amp;gt; от &amp;lt;math&amp;gt;IAA&amp;lt;/math&amp;gt; до &amp;lt;math&amp;gt;IAB&amp;lt;/math&amp;gt; выполняется: &lt;br /&gt;
&lt;br /&gt;
&amp;lt;math&amp;gt;c_{i} = \sum\limits_{j = IAA_{i}}^{IAB_{i}} AN(j)B(JA(j))&amp;lt;/math&amp;gt;&lt;br /&gt;
&lt;br /&gt;
== Последовательная сложность алгоритма ==&lt;br /&gt;
&lt;br /&gt;
Для всего алгоритма потребуется выполнить &amp;lt;math&amp;gt;O(M)&amp;lt;/math&amp;gt; операций, где &amp;lt;math&amp;gt;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;
== Свойства алгоритма ==&lt;br /&gt;
&lt;br /&gt;
Алгоритм в рамках выбранной версии полностью детерминирован.&lt;br /&gt;
&lt;br /&gt;
= Программная реализация алгоритма =&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;references \&amp;gt;&lt;/div&gt;</summary>
		<author><name>Lexaloris</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:Lexaloris/%D0%A3%D0%BC%D0%BD%D0%BE%D0%B6%D0%B5%D0%BD%D0%B8%D0%B5_%D1%80%D0%B0%D0%B7%D1%80%D0%B5%D0%B6%D0%B5%D0%BD%D0%BD%D0%BE%D0%B9_%D0%BC%D0%B0%D1%82%D1%80%D0%B8%D1%86%D1%8B_%D0%BD%D0%B0_%D0%B2%D0%B5%D0%BA%D1%82%D0%BE%D1%80&amp;diff=5661</id>
		<title>Участник:Lexaloris/Умножение разреженной матрицы на вектор</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:Lexaloris/%D0%A3%D0%BC%D0%BD%D0%BE%D0%B6%D0%B5%D0%BD%D0%B8%D0%B5_%D1%80%D0%B0%D0%B7%D1%80%D0%B5%D0%B6%D0%B5%D0%BD%D0%BD%D0%BE%D0%B9_%D0%BC%D0%B0%D1%82%D1%80%D0%B8%D1%86%D1%8B_%D0%BD%D0%B0_%D0%B2%D0%B5%D0%BA%D1%82%D0%BE%D1%80&amp;diff=5661"/>
		<updated>2016-10-12T10:22:21Z</updated>

		<summary type="html">&lt;p&gt;Lexaloris: /* Свойства алгоритма */&lt;/p&gt;
&lt;hr /&gt;
&lt;div&gt;&#039;&#039;&#039;Авторы страницы:&#039;&#039;&#039; Кочетков П.А и Новоселов А.Д.&lt;br /&gt;
&lt;br /&gt;
= Свойства и структура алгоритмов =&lt;br /&gt;
&lt;br /&gt;
== Общее описание алгоритма ==&lt;br /&gt;
&lt;br /&gt;
== Математическое описание алгоритма ==&lt;br /&gt;
&lt;br /&gt;
&#039;&#039;&#039;Исходные данные:&#039;&#039;&#039; &lt;br /&gt;
&lt;br /&gt;
&amp;lt;math&amp;gt;IA, JA, AN&amp;lt;/math&amp;gt; - заданная матрица в форме RR (С) U;&lt;br /&gt;
&lt;br /&gt;
&amp;lt;math&amp;gt;B&amp;lt;/math&amp;gt; - заданный заполненный вектор;&lt;br /&gt;
&lt;br /&gt;
&amp;lt;math&amp;gt;N&amp;lt;/math&amp;gt; - число строк матрицы.&lt;br /&gt;
&lt;br /&gt;
&#039;&#039;&#039;Выход:&#039;&#039;&#039; &amp;lt;math&amp;gt;C&amp;lt;/math&amp;gt; вектор-произведение размерности &amp;lt;math&amp;gt;N&amp;lt;/math&amp;gt;.&lt;br /&gt;
&lt;br /&gt;
&#039;&#039;&#039;Формулы метода:&#039;&#039;&#039;&lt;br /&gt;
&lt;br /&gt;
:&amp;lt;math&amp;gt;&lt;br /&gt;
\begin{align}&lt;br /&gt;
&amp;amp; IAA_{i} = IA(i), \quad i \in [1, N], \\&lt;br /&gt;
&amp;amp; IAB_{i} = IA(i + 1) - 1, \quad i \in [1, N], \\&lt;br /&gt;
&amp;amp; c_{i} = \sum\limits_{j = IAA_{i}}^{IAB_{i}} AN(j)B(JA(j)), \quad i \in [1, N] \\&lt;br /&gt;
\end{align}&lt;br /&gt;
&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;
Далее для всех &amp;lt;math&amp;gt;i&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; по нарастанию выполняются:&lt;br /&gt;
&lt;br /&gt;
1. &amp;lt;math&amp;gt; c_{i} = 0; IAA = IA(i); IAB = IA(i + 1 ) - 1 &amp;lt;/math&amp;gt;&lt;br /&gt;
&lt;br /&gt;
После этого, если &amp;lt;math&amp;gt;(IAB &amp;lt;= IAA)&amp;lt;/math&amp;gt;:&lt;br /&gt;
&lt;br /&gt;
2. Для всех &amp;lt;math&amp;gt;j&amp;lt;/math&amp;gt; от &amp;lt;math&amp;gt;IAA&amp;lt;/math&amp;gt; до &amp;lt;math&amp;gt;IAB&amp;lt;/math&amp;gt; выполняется: &lt;br /&gt;
&lt;br /&gt;
&amp;lt;math&amp;gt;c_{i} = \sum\limits_{j = IAA_{i}}^{IAB_{i}} AN(j)B(JA(j))&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;
&lt;br /&gt;
== Масштабируемость алгоритма и его реализации ==&lt;br /&gt;
&lt;br /&gt;
== Существующие реализации алгоритма ==&lt;br /&gt;
&lt;br /&gt;
= Литература =&lt;br /&gt;
&lt;br /&gt;
&amp;lt;references \&amp;gt;&lt;/div&gt;</summary>
		<author><name>Lexaloris</name></author>
	</entry>
</feed>