<?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=%D0%95%D0%BA%D0%B0%D1%82%D0%B5%D1%80%D0%B8%D0%BD%D0%B0+%D0%91%D1%83%D1%82%D0%BE%D1%80%D0%B8%D0%BD%D0%B0</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=%D0%95%D0%BA%D0%B0%D1%82%D0%B5%D1%80%D0%B8%D0%BD%D0%B0+%D0%91%D1%83%D1%82%D0%BE%D1%80%D0%B8%D0%BD%D0%B0"/>
	<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/%D0%95%D0%BA%D0%B0%D1%82%D0%B5%D1%80%D0%B8%D0%BD%D0%B0_%D0%91%D1%83%D1%82%D0%BE%D1%80%D0%B8%D0%BD%D0%B0"/>
	<updated>2026-10-22T23:31:25Z</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:%D0%A0%D1%83%D1%84%D0%B8%D0%BD%D0%B0_%D0%A2%D1%80%D0%B5%D1%82%D1%8C%D1%8F%D0%BA%D0%BE%D0%B2%D0%B0/%D0%A5%D1%80%D0%B0%D0%BD%D0%B5%D0%BD%D0%B8%D0%B5_%D0%BD%D0%B5%D0%BD%D1%83%D0%BB%D0%B5%D0%B2%D1%8B%D1%85_%D1%8D%D0%BB%D0%B5%D0%BC%D0%B5%D0%BD%D1%82%D0%BE%D0%B2_%D1%80%D0%B0%D0%B7%D1%80%D0%B5%D0%B6%D0%B5%D0%BD%D0%BD%D1%8B%D1%85_%D0%BC%D0%B0%D1%82%D1%80%D0%B8%D1%86._%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=16076</id>
		<title>Участник:Руфина Третьякова/Хранение ненулевых элементов разреженных матриц. Умножение разреженной матрицы на вектор</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:%D0%A0%D1%83%D1%84%D0%B8%D0%BD%D0%B0_%D0%A2%D1%80%D0%B5%D1%82%D1%8C%D1%8F%D0%BA%D0%BE%D0%B2%D0%B0/%D0%A5%D1%80%D0%B0%D0%BD%D0%B5%D0%BD%D0%B8%D0%B5_%D0%BD%D0%B5%D0%BD%D1%83%D0%BB%D0%B5%D0%B2%D1%8B%D1%85_%D1%8D%D0%BB%D0%B5%D0%BC%D0%B5%D0%BD%D1%82%D0%BE%D0%B2_%D1%80%D0%B0%D0%B7%D1%80%D0%B5%D0%B6%D0%B5%D0%BD%D0%BD%D1%8B%D1%85_%D0%BC%D0%B0%D1%82%D1%80%D0%B8%D1%86._%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=16076"/>
		<updated>2016-11-07T18:34:23Z</updated>

		<summary type="html">&lt;p&gt;Екатерина Буторина: &lt;/p&gt;
&lt;hr /&gt;
&lt;div&gt;{{Assignment}}&lt;br /&gt;
{{algorithm&lt;br /&gt;
| name              = Умножение разреженной матрицы на вектор&lt;br /&gt;
| serial_complexity = &amp;lt;math&amp;gt;nnz&amp;lt;/math&amp;gt;&lt;br /&gt;
| pf_height         = &amp;lt;math&amp;gt;O(n)&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;2(nnz+n)+1&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;
Авторы статьи: [[Участница:Руфина_Третьякова|Третьякова Р. М.]] (группа 603), [[Участница:Екатерина_Буторина|Буторина Е. В.]] (группа 603)&lt;br /&gt;
&lt;br /&gt;
Руфина Третьякова отвечает за программную реализацию алгоритма, Екатерина Буторина - за написание статьи.&lt;br /&gt;
&lt;br /&gt;
&lt;br /&gt;
==ЧАСТЬ. Свойства и структура алгоритма ==&lt;br /&gt;
&lt;br /&gt;
=== Общее описание алгоритма ===&lt;br /&gt;
Разрежённая матрица — это матрица с преимущественно нулевыми элементами. В противном случае, если бо́льшая часть элементов матрицы ненулевые, матрица считается плотной.&lt;br /&gt;
Среди специалистов нет единства в определении того, какое именно количество ненулевых элементов делает матрицу разрежённой. Разные авторы предлагают различные варианты. &lt;br /&gt;
Огромные разрежённые матрицы часто возникают при решении таких задач, как дифференциальное уравнение в частных производных или операции с графами.&lt;br /&gt;
При хранении и преобразовании разрежённых матриц в компьютере бывает полезно, а часто и необходимо, использовать специальные алгоритмы и структуры данных, которые учитывают разрежённую структуру матрицы. Операции и алгоритмы, применяемые для работы с обычными, плотными матрицами, применительно к большим разрежённым матрицам работают относительно медленно и требуют значительных объёмов памяти. Однако разрежённые матрицы могут быть легко сжаты путём записи только своих ненулевых элементов, что снижает требования к компьютерной памяти.&lt;br /&gt;
Сложность операции с разреженными матрицами чаще всего определяется не их размером но числом ненулевых элементов. Далее будет показано, что умножение разреженной матрицы на плотный вектор можно произвести ровно за столько умножений сколько в матрице ненулевых элементов.&lt;br /&gt;
&lt;br /&gt;
=== Математическое описание алгоритма ===&lt;br /&gt;
Исходные данные:  разреженная матрица &amp;lt;math&amp;gt;M^{n*n}&amp;lt;/math&amp;gt;, вектор &amp;lt;math&amp;gt;x^n&amp;lt;/math&amp;gt; &lt;br /&gt;
&lt;br /&gt;
Наиболее удобным форматом для вычисления произведения матрицы на вектор является &amp;quot;Compressed Sparse Row&amp;quot; или сокращенно CSR-формат.&lt;br /&gt;
&lt;br /&gt;
Рассмотрим CSR-представление разреженной матрицы: пусть число ненулевых элементов матрицы равно &amp;lt;math&amp;gt;nnz&amp;lt;/math&amp;gt;&lt;br /&gt;
CSR-формат представляет матрицу &amp;lt;math&amp;gt;M&amp;lt;/math&amp;gt; в виде 3-х одномерных массивов:&lt;br /&gt;
&lt;br /&gt;
массив &amp;lt;math&amp;gt;A&amp;lt;/math&amp;gt; размера &amp;lt;math&amp;gt;nnz&amp;lt;/math&amp;gt; содержит ненулевые значения матрицы,&lt;br /&gt;
&amp;lt;math&amp;gt;JA&amp;lt;/math&amp;gt; размера &amp;lt;math&amp;gt;nnz&amp;lt;/math&amp;gt; - номера столбцов ненулевых элементов., &lt;br /&gt;
&amp;lt;math&amp;gt;IA&amp;lt;/math&amp;gt; размера &amp;lt;math&amp;gt;n&amp;lt;/math&amp;gt;- содержит номер с которого начинается описание элементов строки в массивах &amp;lt;math&amp;gt;A&amp;lt;/math&amp;gt; и &amp;lt;math&amp;gt;JA&amp;lt;/math&amp;gt;.&lt;br /&gt;
&lt;br /&gt;
Этот формат позволяет производить перемножение матрицы &amp;lt;math&amp;gt;M&amp;lt;/math&amp;gt; на вектор &amp;lt;math&amp;gt;x&amp;lt;/math&amp;gt; за &amp;lt;math&amp;gt;O(nnz)&amp;lt;/math&amp;gt; умножений и сложений. &lt;br /&gt;
Если при умножении плотной матрицы на вектор каждый элемент результата определяется по формуле &lt;br /&gt;
&amp;lt;math&amp;gt;y_i = \sum_{k = 1}^{n} A_{ik} x_k&amp;lt;/math&amp;gt;, &lt;br /&gt;
то в случае разреженной матрицы достаточно выполнять умножения только для ненулевых элементов &amp;lt;math&amp;gt;A_ik&amp;lt;/math&amp;gt;, которые хранятся в массиве &amp;lt;math&amp;gt;A&amp;lt;/math&amp;gt; в части соответствующей строке &amp;lt;math&amp;gt;i&amp;lt;/math&amp;gt; (элементы с индексами от &amp;lt;math&amp;gt;IA_i&amp;lt;/math&amp;gt; до &amp;lt;math&amp;gt;IA_{i+1}&amp;lt;/math&amp;gt;). Необходимо также знать на какой элемент вектора должен быть домножен данный ненулевой элемент массива, то есть нужен столбцовый индекс каждого элемента &amp;lt;math&amp;gt;A&amp;lt;/math&amp;gt;. Для этого используется массив &amp;lt;math&amp;gt;JA&amp;lt;/math&amp;gt;. Таким образом, каждый элемент итогового вектора определятся формулой&lt;br /&gt;
:&amp;lt;math&amp;gt;y_i = \sum_{k = IA_i}^{IA_{i+1}} A_k x_{JA_k}&amp;lt;/math&amp;gt;&lt;br /&gt;
Нетрудно заметить, что общее число операций умножения равно числу элементов &amp;lt;math&amp;gt;A&amp;lt;/math&amp;gt;, то есть числу ненулевых элементов разреженной матрицы.&lt;br /&gt;
&lt;br /&gt;
Например, это разреженная матрица с 4-мя ненулевыми элементами&lt;br /&gt;
:: &amp;lt;math&amp;gt;\begin{pmatrix}&lt;br /&gt;
0 &amp;amp; 0 &amp;amp; 0 &amp;amp; 0 \\&lt;br /&gt;
2 &amp;amp; 0 &amp;amp; 0 &amp;amp; 1 \\&lt;br /&gt;
0 &amp;amp; 0 &amp;amp; 3 &amp;amp; 0 \\&lt;br /&gt;
0 &amp;amp; 4 &amp;amp; 0 &amp;amp; 0 \\&lt;br /&gt;
\end{pmatrix}&amp;lt;/math&amp;gt;,&lt;br /&gt;
представляемая в формате CSR &lt;br /&gt;
    A  = [ 2 1 3 4 ]&lt;br /&gt;
    IA = [ 0 0 2 3 4 ]&lt;br /&gt;
    JA = [ 0 3 2 1 ]&lt;br /&gt;
домножим ее на вектор&lt;br /&gt;
    x  = [ 5 6 7 8 ]&lt;br /&gt;
получим&lt;br /&gt;
    y[0] = 0&lt;br /&gt;
    y[1] = a[0]*x[0] + a[1]*x[3] = 18&lt;br /&gt;
    y[2] = a[2]*x[2] = 21&lt;br /&gt;
    y[3] = a[3]*x[1] = 24 &lt;br /&gt;
&lt;br /&gt;
Алгоритм умножения матрицы на вектор полностью детерминирован и не зависит от порядка хранения элементов принадлежащих одной строке.&lt;br /&gt;
&lt;br /&gt;
=== Вычислительное ядро алгоритма ===&lt;br /&gt;
Вычислительным ядром алгоритма является формула умножения разреженной матрицы на плотный вектор:&lt;br /&gt;
:&amp;lt;math&amp;gt;y_i = \sum_{k = IA_i}^{IA_{i+1}} A_k x_{JA_k}&amp;lt;/math&amp;gt;&lt;br /&gt;
для всех &amp;lt;math&amp;gt;i = 1,n&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;
    число строк матрицы &#039;&#039;n&#039;&#039;; &lt;br /&gt;
    разреженная матрица в формате CSR:&lt;br /&gt;
      строчные указатели &#039;&#039;IA&#039;&#039;,&lt;br /&gt;
      столбцовые указатели&#039;&#039;JA&#039;&#039;, &lt;br /&gt;
      ненулевые элементы &#039;&#039;A&#039;&#039;;&lt;br /&gt;
    вектор &#039;&#039;x&#039;&#039;.&lt;br /&gt;
  &#039;&#039;&#039;Выходные данные&#039;&#039;&#039;: произведение матрицы на вектор &#039;&#039;y&#039;&#039;.&lt;br /&gt;
  &#039;&#039;&#039;read CSR&#039;&#039;&#039; &#039;&#039;n&#039;&#039;, &#039;&#039;IA&#039;&#039;, &#039;&#039;JA&#039;&#039;, &#039;&#039;A&#039;&#039;;&lt;br /&gt;
  &#039;&#039;&#039;read&#039;&#039;&#039; &#039;&#039;x&#039;&#039;&lt;br /&gt;
  &#039;&#039;&#039;for&#039;&#039;&#039; &#039;&#039;i&#039;&#039; = 1,n:&lt;br /&gt;
    &#039;&#039;&#039;for&#039;&#039;&#039; &#039;&#039;k&#039;&#039; = &#039;&#039;IA(i)&#039;&#039;, &#039;&#039;IA(i+1)-1&#039;&#039;:&lt;br /&gt;
            &#039;&#039;y(i)&#039;&#039; += &#039;&#039;A(k)&#039;&#039;*&#039;&#039;x(JA(k))&#039;&#039;;&lt;br /&gt;
  &#039;&#039;&#039;write&#039;&#039;&#039; &#039;&#039;y&#039;&#039;;&lt;br /&gt;
&lt;br /&gt;
=== Схема реализации последовательного алгоритма ===&lt;br /&gt;
Метод можно описать следующим образом:&lt;br /&gt;
# привести матрицу &amp;lt;math&amp;gt;M&amp;lt;/math&amp;gt; к формату CSR&lt;br /&gt;
# для &amp;lt;math&amp;gt;i&amp;lt;/math&amp;gt; от &amp;lt;math&amp;gt;0&amp;lt;/math&amp;gt; до &amp;lt;math&amp;gt;n-1&amp;lt;/math&amp;gt; вычислить &amp;lt;math&amp;gt;y_i&amp;lt;/math&amp;gt; по формуле &amp;lt;math&amp;gt;y_i = \sum_{k = IA_i}^{IA_{i+1}} A_k x_{JA_k}&amp;lt;/math&amp;gt;&lt;br /&gt;
&lt;br /&gt;
=== Последовательная сложность алгоритма ===&lt;br /&gt;
Для вычисления матрично-векторного произведения матрицы размера &amp;lt;math&amp;gt;n*n&amp;lt;/math&amp;gt; и вектора размера n в последовательном варианте требуется:&lt;br /&gt;
&lt;br /&gt;
* &amp;lt;math&amp;gt;nnz&amp;lt;/math&amp;gt; сложений,&lt;br /&gt;
* &amp;lt;math&amp;gt;nnz&amp;lt;/math&amp;gt; умножений.&lt;br /&gt;
&lt;br /&gt;
=== Информационный граф ===&lt;br /&gt;
&lt;br /&gt;
Для того чтобы построить информационный граф рассмотрим процесс вычисления значения одного элемента результирующего вектора &amp;lt;math&amp;gt;y_i&amp;lt;/math&amp;gt;. Число последовательных ярусов равно числу последовательных операций -- &amp;lt;math&amp;gt; AI_{i+1} - AI_i &amp;lt;/math&amp;gt; (в данном случае умножение и сложение будем считать за одну операцию).&lt;br /&gt;
Если же вычисления всех &amp;lt;math&amp;gt;y_i&amp;lt;/math&amp;gt; производить параллельно, на каждом ярусе будет производиться &amp;lt;math&amp;gt;n&amp;lt;/math&amp;gt; операций.&lt;br /&gt;
&lt;br /&gt;
&lt;br /&gt;
[[Файл:Pic.jpg|800x800px|center|thumb|Информационный граф алгоритма умножения разреженной матрицы на плотный вектор &lt;br /&gt;
(Рисунок составлен самостоятельно)]]&lt;br /&gt;
&lt;br /&gt;
=== Ресурс параллелизма алгоритма ===&lt;br /&gt;
&lt;br /&gt;
Возможность параллельной реализации алгоритма появляется благодаря независимости вычисления каждого элемента результирующего вектора &amp;lt;math&amp;gt;y_i&amp;lt;/math&amp;gt;. Предположим, что имеется неограниченное число процессоров (теоретически, для максимальной эффективности требуется &amp;lt;math&amp;gt;n&amp;lt;/math&amp;gt; процессоров). Каждый процессор работает с одной строкой разреженной матрицы и хранит в памяти только те части массивов &lt;br /&gt;
&amp;lt;math&amp;gt; AJ &amp;lt;/math&amp;gt; и &amp;lt;math&amp;gt; A &amp;lt;/math&amp;gt;, которые соответствуют данной строке. Вектор &amp;lt;math&amp;gt; x &amp;lt;/math&amp;gt; хранится в памяти всех процессоров. Таким образом достигается экономия памяти (объем данных для i-ого процессора  &amp;lt;math&amp;gt; 2(AI_{i+1} - AI_i) + n &amp;lt;/math&amp;gt;). На данном процессоре выполняется &lt;br /&gt;
&amp;lt;math&amp;gt; AI_{i+1} - AI_i &amp;lt;/math&amp;gt; последовательных операций умножения и сложения. Число ярусов для i-ого процессора равно &amp;lt;math&amp;gt; AI_{i+1} - AI_i &amp;lt;/math&amp;gt;. Поскольку изначальная разреженная матрица имеет произвольную структуру, число ярусов на различных процессорах может быть различно. В худшем случае (если в строке все элементы ненулевые) число ярусов будет равно &amp;lt;math&amp;gt;n&amp;lt;/math&amp;gt;.  &lt;br /&gt;
&lt;br /&gt;
Таким образом, для алгоритма умножения разреженной матрицы на плотный вектор в параллельном варианте требуется последовательно выполнить:&lt;br /&gt;
&lt;br /&gt;
* не более чем &amp;lt;math&amp;gt;n&amp;lt;/math&amp;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;линейной&#039;&#039;.&lt;br /&gt;
&lt;br /&gt;
&#039;&#039;Замечание:&#039;&#039; если число процессоров &amp;lt;math&amp;gt;k&amp;lt;/math&amp;gt; меньше числа строк, но отношение &amp;lt;math&amp;gt;\frac{n}{k} = c&amp;lt;/math&amp;gt; является константой, то каждый процессор вычисляет &amp;lt;math&amp;gt;c&amp;lt;/math&amp;gt; элементов результирующего вектора, и число ярусов не более чем &amp;lt;math&amp;gt;cn&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; AI &amp;lt;/math&amp;gt; размерности &amp;lt;math&amp;gt; n+1 &amp;lt;/math&amp;gt;;&lt;br /&gt;
# вектор &amp;lt;math&amp;gt; AJ &amp;lt;/math&amp;gt; размерности &amp;lt;math&amp;gt; nnz &amp;lt;/math&amp;gt;;&lt;br /&gt;
# вектор &amp;lt;math&amp;gt; A &amp;lt;/math&amp;gt; размерности &amp;lt;math&amp;gt; nnz &amp;lt;/math&amp;gt;;&lt;br /&gt;
# вектор &amp;lt;math&amp;gt; x &amp;lt;/math&amp;gt; размерности &amp;lt;math&amp;gt; n &amp;lt;/math&amp;gt;.&lt;br /&gt;
&lt;br /&gt;
Суммарная размерность входных данных: &amp;lt;math&amp;gt; 2(nnz + n) + 1 &amp;lt;/math&amp;gt;&lt;br /&gt;
&lt;br /&gt;
Выходными данными является&lt;br /&gt;
# вектор &amp;lt;math&amp;gt; y &amp;lt;/math&amp;gt; размерности &amp;lt;math&amp;gt; n &amp;lt;/math&amp;gt;.&lt;br /&gt;
&lt;br /&gt;
Объем выходных данных: &amp;lt;math&amp;gt; n &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;, число ненулевых элементов &amp;lt;math&amp;gt;nnz&amp;lt;/math&amp;gt;, для вычисления используется &amp;lt;math&amp;gt;k&amp;lt;/math&amp;gt; процессоров тогда: &lt;br /&gt;
&lt;br /&gt;
*Каждый процессор оперирует с &amp;lt;math&amp;gt;\frac{n}{k}&amp;lt;/math&amp;gt; строками, в каждой из которых примерно &amp;lt;math&amp;gt;\frac{nnz}{n}&amp;lt;/math&amp;gt; элементов. Параллельная сложность алгоритма - &amp;lt;math&amp;gt;O(\frac{nnz}{k})&amp;lt;/math&amp;gt;.&lt;br /&gt;
&lt;br /&gt;
*Вычислительная мощность алгоритма (отношение числа операций к суммарному объему входных и выходных данных) - &amp;lt;math&amp;gt;O(\frac{nnz}{2nnz + 3n}) = O(1)&amp;lt;/math&amp;gt; - для последовательного алгоритма; &amp;lt;math&amp;gt;O(\frac{nnz}{n} / (2\frac{nnz}{n} + n)) = O(1) &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;
Последовательная реализация имеется в пакете SPARSKIT [http://w3.pppl.gov/~hammett/work/2006/gmres/SPARSKIT2/BLASSM/matvec.f], Python.Scipy [https://docs.scipy.org/doc/scipy-0.14.0/reference/generated/scipy.sparse.csr_matrix.html]&lt;br /&gt;
&lt;br /&gt;
Параллельный алгоритм реализован в библиотеке Matlab [http://citeseerx.ist.psu.edu/viewdoc/download?doi=10.1.1.83.6692&amp;amp;rep=rep1&amp;amp;type=pdf], Intel MKL [https://software.intel.com/en-us/node/468536#D09FB46A-B404-44CC-94ED-1C434C41B6E1]&lt;br /&gt;
&lt;br /&gt;
== Литература ==&lt;br /&gt;
[1] С. Писсанецки. Технология разреженных матриц. Изд. Мир, 1988.&lt;br /&gt;
&lt;br /&gt;
[2] В. В. Воеводин, Вл.В. Воеводин. Параллельные вычисления. – СПб.: БХВ - Петербург, 2002.&lt;/div&gt;</summary>
		<author><name>Екатерина Буторина</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:%D0%A0%D1%83%D1%84%D0%B8%D0%BD%D0%B0_%D0%A2%D1%80%D0%B5%D1%82%D1%8C%D1%8F%D0%BA%D0%BE%D0%B2%D0%B0/%D0%A5%D1%80%D0%B0%D0%BD%D0%B5%D0%BD%D0%B8%D0%B5_%D0%BD%D0%B5%D0%BD%D1%83%D0%BB%D0%B5%D0%B2%D1%8B%D1%85_%D1%8D%D0%BB%D0%B5%D0%BC%D0%B5%D0%BD%D1%82%D0%BE%D0%B2_%D1%80%D0%B0%D0%B7%D1%80%D0%B5%D0%B6%D0%B5%D0%BD%D0%BD%D1%8B%D1%85_%D0%BC%D0%B0%D1%82%D1%80%D0%B8%D1%86._%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=16075</id>
		<title>Участник:Руфина Третьякова/Хранение ненулевых элементов разреженных матриц. Умножение разреженной матрицы на вектор</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:%D0%A0%D1%83%D1%84%D0%B8%D0%BD%D0%B0_%D0%A2%D1%80%D0%B5%D1%82%D1%8C%D1%8F%D0%BA%D0%BE%D0%B2%D0%B0/%D0%A5%D1%80%D0%B0%D0%BD%D0%B5%D0%BD%D0%B8%D0%B5_%D0%BD%D0%B5%D0%BD%D1%83%D0%BB%D0%B5%D0%B2%D1%8B%D1%85_%D1%8D%D0%BB%D0%B5%D0%BC%D0%B5%D0%BD%D1%82%D0%BE%D0%B2_%D1%80%D0%B0%D0%B7%D1%80%D0%B5%D0%B6%D0%B5%D0%BD%D0%BD%D1%8B%D1%85_%D0%BC%D0%B0%D1%82%D1%80%D0%B8%D1%86._%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=16075"/>
		<updated>2016-11-07T18:32:54Z</updated>

		<summary type="html">&lt;p&gt;Екатерина Буторина: /* Информационный граф */&lt;/p&gt;
&lt;hr /&gt;
&lt;div&gt;{{algorithm&lt;br /&gt;
| name              = Умножение разреженной матрицы на вектор&lt;br /&gt;
| serial_complexity = &amp;lt;math&amp;gt;nnz&amp;lt;/math&amp;gt;&lt;br /&gt;
| pf_height         = &amp;lt;math&amp;gt;O(n)&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;2(nnz+n)+1&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;
Авторы статьи: [[Участница:Руфина_Третьякова|Третьякова Р. М.]] (группа 603), [[Участница:Екатерина_Буторина|Буторина Е. В.]] (группа 603)&lt;br /&gt;
&lt;br /&gt;
Руфина Третьякова отвечает за программную реализацию алгоритма, Екатерина Буторина - за написание статьи.&lt;br /&gt;
&lt;br /&gt;
&lt;br /&gt;
==ЧАСТЬ. Свойства и структура алгоритма ==&lt;br /&gt;
&lt;br /&gt;
=== Общее описание алгоритма ===&lt;br /&gt;
Разрежённая матрица — это матрица с преимущественно нулевыми элементами. В противном случае, если бо́льшая часть элементов матрицы ненулевые, матрица считается плотной.&lt;br /&gt;
Среди специалистов нет единства в определении того, какое именно количество ненулевых элементов делает матрицу разрежённой. Разные авторы предлагают различные варианты. &lt;br /&gt;
Огромные разрежённые матрицы часто возникают при решении таких задач, как дифференциальное уравнение в частных производных или операции с графами.&lt;br /&gt;
При хранении и преобразовании разрежённых матриц в компьютере бывает полезно, а часто и необходимо, использовать специальные алгоритмы и структуры данных, которые учитывают разрежённую структуру матрицы. Операции и алгоритмы, применяемые для работы с обычными, плотными матрицами, применительно к большим разрежённым матрицам работают относительно медленно и требуют значительных объёмов памяти. Однако разрежённые матрицы могут быть легко сжаты путём записи только своих ненулевых элементов, что снижает требования к компьютерной памяти.&lt;br /&gt;
Сложность операции с разреженными матрицами чаще всего определяется не их размером но числом ненулевых элементов. Далее будет показано, что умножение разреженной матрицы на плотный вектор можно произвести ровно за столько умножений сколько в матрице ненулевых элементов.&lt;br /&gt;
&lt;br /&gt;
=== Математическое описание алгоритма ===&lt;br /&gt;
Исходные данные:  разреженная матрица &amp;lt;math&amp;gt;M^{n*n}&amp;lt;/math&amp;gt;, вектор &amp;lt;math&amp;gt;x^n&amp;lt;/math&amp;gt; &lt;br /&gt;
&lt;br /&gt;
Наиболее удобным форматом для вычисления произведения матрицы на вектор является &amp;quot;Compressed Sparse Row&amp;quot; или сокращенно CSR-формат.&lt;br /&gt;
&lt;br /&gt;
Рассмотрим CSR-представление разреженной матрицы: пусть число ненулевых элементов матрицы равно &amp;lt;math&amp;gt;nnz&amp;lt;/math&amp;gt;&lt;br /&gt;
CSR-формат представляет матрицу &amp;lt;math&amp;gt;M&amp;lt;/math&amp;gt; в виде 3-х одномерных массивов:&lt;br /&gt;
&lt;br /&gt;
массив &amp;lt;math&amp;gt;A&amp;lt;/math&amp;gt; размера &amp;lt;math&amp;gt;nnz&amp;lt;/math&amp;gt; содержит ненулевые значения матрицы,&lt;br /&gt;
&amp;lt;math&amp;gt;JA&amp;lt;/math&amp;gt; размера &amp;lt;math&amp;gt;nnz&amp;lt;/math&amp;gt; - номера столбцов ненулевых элементов., &lt;br /&gt;
&amp;lt;math&amp;gt;IA&amp;lt;/math&amp;gt; размера &amp;lt;math&amp;gt;n&amp;lt;/math&amp;gt;- содержит номер с которого начинается описание элементов строки в массивах &amp;lt;math&amp;gt;A&amp;lt;/math&amp;gt; и &amp;lt;math&amp;gt;JA&amp;lt;/math&amp;gt;.&lt;br /&gt;
&lt;br /&gt;
Этот формат позволяет производить перемножение матрицы &amp;lt;math&amp;gt;M&amp;lt;/math&amp;gt; на вектор &amp;lt;math&amp;gt;x&amp;lt;/math&amp;gt; за &amp;lt;math&amp;gt;O(nnz)&amp;lt;/math&amp;gt; умножений и сложений. &lt;br /&gt;
Если при умножении плотной матрицы на вектор каждый элемент результата определяется по формуле &lt;br /&gt;
&amp;lt;math&amp;gt;y_i = \sum_{k = 1}^{n} A_{ik} x_k&amp;lt;/math&amp;gt;, &lt;br /&gt;
то в случае разреженной матрицы достаточно выполнять умножения только для ненулевых элементов &amp;lt;math&amp;gt;A_ik&amp;lt;/math&amp;gt;, которые хранятся в массиве &amp;lt;math&amp;gt;A&amp;lt;/math&amp;gt; в части соответствующей строке &amp;lt;math&amp;gt;i&amp;lt;/math&amp;gt; (элементы с индексами от &amp;lt;math&amp;gt;IA_i&amp;lt;/math&amp;gt; до &amp;lt;math&amp;gt;IA_{i+1}&amp;lt;/math&amp;gt;). Необходимо также знать на какой элемент вектора должен быть домножен данный ненулевой элемент массива, то есть нужен столбцовый индекс каждого элемента &amp;lt;math&amp;gt;A&amp;lt;/math&amp;gt;. Для этого используется массив &amp;lt;math&amp;gt;JA&amp;lt;/math&amp;gt;. Таким образом, каждый элемент итогового вектора определятся формулой&lt;br /&gt;
:&amp;lt;math&amp;gt;y_i = \sum_{k = IA_i}^{IA_{i+1}} A_k x_{JA_k}&amp;lt;/math&amp;gt;&lt;br /&gt;
Нетрудно заметить, что общее число операций умножения равно числу элементов &amp;lt;math&amp;gt;A&amp;lt;/math&amp;gt;, то есть числу ненулевых элементов разреженной матрицы.&lt;br /&gt;
&lt;br /&gt;
Например, это разреженная матрица с 4-мя ненулевыми элементами&lt;br /&gt;
:: &amp;lt;math&amp;gt;\begin{pmatrix}&lt;br /&gt;
0 &amp;amp; 0 &amp;amp; 0 &amp;amp; 0 \\&lt;br /&gt;
2 &amp;amp; 0 &amp;amp; 0 &amp;amp; 1 \\&lt;br /&gt;
0 &amp;amp; 0 &amp;amp; 3 &amp;amp; 0 \\&lt;br /&gt;
0 &amp;amp; 4 &amp;amp; 0 &amp;amp; 0 \\&lt;br /&gt;
\end{pmatrix}&amp;lt;/math&amp;gt;,&lt;br /&gt;
представляемая в формате CSR &lt;br /&gt;
    A  = [ 2 1 3 4 ]&lt;br /&gt;
    IA = [ 0 0 2 3 4 ]&lt;br /&gt;
    JA = [ 0 3 2 1 ]&lt;br /&gt;
домножим ее на вектор&lt;br /&gt;
    x  = [ 5 6 7 8 ]&lt;br /&gt;
получим&lt;br /&gt;
    y[0] = 0&lt;br /&gt;
    y[1] = a[0]*x[0] + a[1]*x[3] = 18&lt;br /&gt;
    y[2] = a[2]*x[2] = 21&lt;br /&gt;
    y[3] = a[3]*x[1] = 24 &lt;br /&gt;
&lt;br /&gt;
Алгоритм умножения матрицы на вектор полностью детерминирован и не зависит от порядка хранения элементов принадлежащих одной строке.&lt;br /&gt;
&lt;br /&gt;
=== Вычислительное ядро алгоритма ===&lt;br /&gt;
Вычислительным ядром алгоритма является формула умножения разреженной матрицы на плотный вектор:&lt;br /&gt;
:&amp;lt;math&amp;gt;y_i = \sum_{k = IA_i}^{IA_{i+1}} A_k x_{JA_k}&amp;lt;/math&amp;gt;&lt;br /&gt;
для всех &amp;lt;math&amp;gt;i = 1,n&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;
    число строк матрицы &#039;&#039;n&#039;&#039;; &lt;br /&gt;
    разреженная матрица в формате CSR:&lt;br /&gt;
      строчные указатели &#039;&#039;IA&#039;&#039;,&lt;br /&gt;
      столбцовые указатели&#039;&#039;JA&#039;&#039;, &lt;br /&gt;
      ненулевые элементы &#039;&#039;A&#039;&#039;;&lt;br /&gt;
    вектор &#039;&#039;x&#039;&#039;.&lt;br /&gt;
  &#039;&#039;&#039;Выходные данные&#039;&#039;&#039;: произведение матрицы на вектор &#039;&#039;y&#039;&#039;.&lt;br /&gt;
  &#039;&#039;&#039;read CSR&#039;&#039;&#039; &#039;&#039;n&#039;&#039;, &#039;&#039;IA&#039;&#039;, &#039;&#039;JA&#039;&#039;, &#039;&#039;A&#039;&#039;;&lt;br /&gt;
  &#039;&#039;&#039;read&#039;&#039;&#039; &#039;&#039;x&#039;&#039;&lt;br /&gt;
  &#039;&#039;&#039;for&#039;&#039;&#039; &#039;&#039;i&#039;&#039; = 1,n:&lt;br /&gt;
    &#039;&#039;&#039;for&#039;&#039;&#039; &#039;&#039;k&#039;&#039; = &#039;&#039;IA(i)&#039;&#039;, &#039;&#039;IA(i+1)-1&#039;&#039;:&lt;br /&gt;
            &#039;&#039;y(i)&#039;&#039; += &#039;&#039;A(k)&#039;&#039;*&#039;&#039;x(JA(k))&#039;&#039;;&lt;br /&gt;
  &#039;&#039;&#039;write&#039;&#039;&#039; &#039;&#039;y&#039;&#039;;&lt;br /&gt;
&lt;br /&gt;
=== Схема реализации последовательного алгоритма ===&lt;br /&gt;
Метод можно описать следующим образом:&lt;br /&gt;
# привести матрицу &amp;lt;math&amp;gt;M&amp;lt;/math&amp;gt; к формату CSR&lt;br /&gt;
# для &amp;lt;math&amp;gt;i&amp;lt;/math&amp;gt; от &amp;lt;math&amp;gt;0&amp;lt;/math&amp;gt; до &amp;lt;math&amp;gt;n-1&amp;lt;/math&amp;gt; вычислить &amp;lt;math&amp;gt;y_i&amp;lt;/math&amp;gt; по формуле &amp;lt;math&amp;gt;y_i = \sum_{k = IA_i}^{IA_{i+1}} A_k x_{JA_k}&amp;lt;/math&amp;gt;&lt;br /&gt;
&lt;br /&gt;
=== Последовательная сложность алгоритма ===&lt;br /&gt;
Для вычисления матрично-векторного произведения матрицы размера &amp;lt;math&amp;gt;n*n&amp;lt;/math&amp;gt; и вектора размера n в последовательном варианте требуется:&lt;br /&gt;
&lt;br /&gt;
* &amp;lt;math&amp;gt;nnz&amp;lt;/math&amp;gt; сложений,&lt;br /&gt;
* &amp;lt;math&amp;gt;nnz&amp;lt;/math&amp;gt; умножений.&lt;br /&gt;
&lt;br /&gt;
=== Информационный граф ===&lt;br /&gt;
&lt;br /&gt;
Для того чтобы построить информационный граф рассмотрим процесс вычисления значения одного элемента результирующего вектора &amp;lt;math&amp;gt;y_i&amp;lt;/math&amp;gt;. Число последовательных ярусов равно числу последовательных операций -- &amp;lt;math&amp;gt; AI_{i+1} - AI_i &amp;lt;/math&amp;gt; (в данном случае умножение и сложение будем считать за одну операцию).&lt;br /&gt;
Если же вычисления всех &amp;lt;math&amp;gt;y_i&amp;lt;/math&amp;gt; производить параллельно, на каждом ярусе будет производиться &amp;lt;math&amp;gt;n&amp;lt;/math&amp;gt; операций.&lt;br /&gt;
&lt;br /&gt;
&lt;br /&gt;
[[Файл:Pic.jpg|800x800px|center|thumb|Информационный граф алгоритма умножения разреженной матрицы на плотный вектор &lt;br /&gt;
(Рисунок составлен самостоятельно)]]&lt;br /&gt;
&lt;br /&gt;
=== Ресурс параллелизма алгоритма ===&lt;br /&gt;
&lt;br /&gt;
Возможность параллельной реализации алгоритма появляется благодаря независимости вычисления каждого элемента результирующего вектора &amp;lt;math&amp;gt;y_i&amp;lt;/math&amp;gt;. Предположим, что имеется неограниченное число процессоров (теоретически, для максимальной эффективности требуется &amp;lt;math&amp;gt;n&amp;lt;/math&amp;gt; процессоров). Каждый процессор работает с одной строкой разреженной матрицы и хранит в памяти только те части массивов &lt;br /&gt;
&amp;lt;math&amp;gt; AJ &amp;lt;/math&amp;gt; и &amp;lt;math&amp;gt; A &amp;lt;/math&amp;gt;, которые соответствуют данной строке. Вектор &amp;lt;math&amp;gt; x &amp;lt;/math&amp;gt; хранится в памяти всех процессоров. Таким образом достигается экономия памяти (объем данных для i-ого процессора  &amp;lt;math&amp;gt; 2(AI_{i+1} - AI_i) + n &amp;lt;/math&amp;gt;). На данном процессоре выполняется &lt;br /&gt;
&amp;lt;math&amp;gt; AI_{i+1} - AI_i &amp;lt;/math&amp;gt; последовательных операций умножения и сложения. Число ярусов для i-ого процессора равно &amp;lt;math&amp;gt; AI_{i+1} - AI_i &amp;lt;/math&amp;gt;. Поскольку изначальная разреженная матрица имеет произвольную структуру, число ярусов на различных процессорах может быть различно. В худшем случае (если в строке все элементы ненулевые) число ярусов будет равно &amp;lt;math&amp;gt;n&amp;lt;/math&amp;gt;.  &lt;br /&gt;
&lt;br /&gt;
Таким образом, для алгоритма умножения разреженной матрицы на плотный вектор в параллельном варианте требуется последовательно выполнить:&lt;br /&gt;
&lt;br /&gt;
* не более чем &amp;lt;math&amp;gt;n&amp;lt;/math&amp;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;линейной&#039;&#039;.&lt;br /&gt;
&lt;br /&gt;
&#039;&#039;Замечание:&#039;&#039; если число процессоров &amp;lt;math&amp;gt;k&amp;lt;/math&amp;gt; меньше числа строк, но отношение &amp;lt;math&amp;gt;\frac{n}{k} = c&amp;lt;/math&amp;gt; является константой, то каждый процессор вычисляет &amp;lt;math&amp;gt;c&amp;lt;/math&amp;gt; элементов результирующего вектора, и число ярусов не более чем &amp;lt;math&amp;gt;cn&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; AI &amp;lt;/math&amp;gt; размерности &amp;lt;math&amp;gt; n+1 &amp;lt;/math&amp;gt;;&lt;br /&gt;
# вектор &amp;lt;math&amp;gt; AJ &amp;lt;/math&amp;gt; размерности &amp;lt;math&amp;gt; nnz &amp;lt;/math&amp;gt;;&lt;br /&gt;
# вектор &amp;lt;math&amp;gt; A &amp;lt;/math&amp;gt; размерности &amp;lt;math&amp;gt; nnz &amp;lt;/math&amp;gt;;&lt;br /&gt;
# вектор &amp;lt;math&amp;gt; x &amp;lt;/math&amp;gt; размерности &amp;lt;math&amp;gt; n &amp;lt;/math&amp;gt;.&lt;br /&gt;
&lt;br /&gt;
Суммарная размерность входных данных: &amp;lt;math&amp;gt; 2(nnz + n) + 1 &amp;lt;/math&amp;gt;&lt;br /&gt;
&lt;br /&gt;
Выходными данными является&lt;br /&gt;
# вектор &amp;lt;math&amp;gt; y &amp;lt;/math&amp;gt; размерности &amp;lt;math&amp;gt; n &amp;lt;/math&amp;gt;.&lt;br /&gt;
&lt;br /&gt;
Объем выходных данных: &amp;lt;math&amp;gt; n &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;, число ненулевых элементов &amp;lt;math&amp;gt;nnz&amp;lt;/math&amp;gt;, для вычисления используется &amp;lt;math&amp;gt;k&amp;lt;/math&amp;gt; процессоров тогда: &lt;br /&gt;
&lt;br /&gt;
*Каждый процессор оперирует с &amp;lt;math&amp;gt;\frac{n}{k}&amp;lt;/math&amp;gt; строками, в каждой из которых примерно &amp;lt;math&amp;gt;\frac{nnz}{n}&amp;lt;/math&amp;gt; элементов. Параллельная сложность алгоритма - &amp;lt;math&amp;gt;O(\frac{nnz}{k})&amp;lt;/math&amp;gt;.&lt;br /&gt;
&lt;br /&gt;
*Вычислительная мощность алгоритма (отношение числа операций к суммарному объему входных и выходных данных) - &amp;lt;math&amp;gt;O(\frac{nnz}{2nnz + 3n}) = O(1)&amp;lt;/math&amp;gt; - для последовательного алгоритма; &amp;lt;math&amp;gt;O(\frac{nnz}{n} / (2\frac{nnz}{n} + n)) = O(1) &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;
Последовательная реализация имеется в пакете SPARSKIT [http://w3.pppl.gov/~hammett/work/2006/gmres/SPARSKIT2/BLASSM/matvec.f], Python.Scipy [https://docs.scipy.org/doc/scipy-0.14.0/reference/generated/scipy.sparse.csr_matrix.html]&lt;br /&gt;
&lt;br /&gt;
Параллельный алгоритм реализован в библиотеке Matlab [http://citeseerx.ist.psu.edu/viewdoc/download?doi=10.1.1.83.6692&amp;amp;rep=rep1&amp;amp;type=pdf], Intel MKL [https://software.intel.com/en-us/node/468536#D09FB46A-B404-44CC-94ED-1C434C41B6E1]&lt;br /&gt;
&lt;br /&gt;
== Литература ==&lt;br /&gt;
[1] С. Писсанецки. Технология разреженных матриц. Изд. Мир, 1988.&lt;br /&gt;
&lt;br /&gt;
[2] В. В. Воеводин, Вл.В. Воеводин. Параллельные вычисления. – СПб.: БХВ - Петербург, 2002.&lt;/div&gt;</summary>
		<author><name>Екатерина Буторина</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:%D0%A0%D1%83%D1%84%D0%B8%D0%BD%D0%B0_%D0%A2%D1%80%D0%B5%D1%82%D1%8C%D1%8F%D0%BA%D0%BE%D0%B2%D0%B0/%D0%A5%D1%80%D0%B0%D0%BD%D0%B5%D0%BD%D0%B8%D0%B5_%D0%BD%D0%B5%D0%BD%D1%83%D0%BB%D0%B5%D0%B2%D1%8B%D1%85_%D1%8D%D0%BB%D0%B5%D0%BC%D0%B5%D0%BD%D1%82%D0%BE%D0%B2_%D1%80%D0%B0%D0%B7%D1%80%D0%B5%D0%B6%D0%B5%D0%BD%D0%BD%D1%8B%D1%85_%D0%BC%D0%B0%D1%82%D1%80%D0%B8%D1%86._%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=16074</id>
		<title>Участник:Руфина Третьякова/Хранение ненулевых элементов разреженных матриц. Умножение разреженной матрицы на вектор</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:%D0%A0%D1%83%D1%84%D0%B8%D0%BD%D0%B0_%D0%A2%D1%80%D0%B5%D1%82%D1%8C%D1%8F%D0%BA%D0%BE%D0%B2%D0%B0/%D0%A5%D1%80%D0%B0%D0%BD%D0%B5%D0%BD%D0%B8%D0%B5_%D0%BD%D0%B5%D0%BD%D1%83%D0%BB%D0%B5%D0%B2%D1%8B%D1%85_%D1%8D%D0%BB%D0%B5%D0%BC%D0%B5%D0%BD%D1%82%D0%BE%D0%B2_%D1%80%D0%B0%D0%B7%D1%80%D0%B5%D0%B6%D0%B5%D0%BD%D0%BD%D1%8B%D1%85_%D0%BC%D0%B0%D1%82%D1%80%D0%B8%D1%86._%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=16074"/>
		<updated>2016-11-07T18:28:14Z</updated>

		<summary type="html">&lt;p&gt;Екатерина Буторина: &lt;/p&gt;
&lt;hr /&gt;
&lt;div&gt;{{algorithm&lt;br /&gt;
| name              = Умножение разреженной матрицы на вектор&lt;br /&gt;
| serial_complexity = &amp;lt;math&amp;gt;nnz&amp;lt;/math&amp;gt;&lt;br /&gt;
| pf_height         = &amp;lt;math&amp;gt;O(n)&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;2(nnz+n)+1&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;
Авторы статьи: [[Участница:Руфина_Третьякова|Третьякова Р. М.]] (группа 603), [[Участница:Екатерина_Буторина|Буторина Е. В.]] (группа 603)&lt;br /&gt;
&lt;br /&gt;
Руфина Третьякова отвечает за программную реализацию алгоритма, Екатерина Буторина - за написание статьи.&lt;br /&gt;
&lt;br /&gt;
&lt;br /&gt;
==ЧАСТЬ. Свойства и структура алгоритма ==&lt;br /&gt;
&lt;br /&gt;
=== Общее описание алгоритма ===&lt;br /&gt;
Разрежённая матрица — это матрица с преимущественно нулевыми элементами. В противном случае, если бо́льшая часть элементов матрицы ненулевые, матрица считается плотной.&lt;br /&gt;
Среди специалистов нет единства в определении того, какое именно количество ненулевых элементов делает матрицу разрежённой. Разные авторы предлагают различные варианты. &lt;br /&gt;
Огромные разрежённые матрицы часто возникают при решении таких задач, как дифференциальное уравнение в частных производных или операции с графами.&lt;br /&gt;
При хранении и преобразовании разрежённых матриц в компьютере бывает полезно, а часто и необходимо, использовать специальные алгоритмы и структуры данных, которые учитывают разрежённую структуру матрицы. Операции и алгоритмы, применяемые для работы с обычными, плотными матрицами, применительно к большим разрежённым матрицам работают относительно медленно и требуют значительных объёмов памяти. Однако разрежённые матрицы могут быть легко сжаты путём записи только своих ненулевых элементов, что снижает требования к компьютерной памяти.&lt;br /&gt;
Сложность операции с разреженными матрицами чаще всего определяется не их размером но числом ненулевых элементов. Далее будет показано, что умножение разреженной матрицы на плотный вектор можно произвести ровно за столько умножений сколько в матрице ненулевых элементов.&lt;br /&gt;
&lt;br /&gt;
=== Математическое описание алгоритма ===&lt;br /&gt;
Исходные данные:  разреженная матрица &amp;lt;math&amp;gt;M^{n*n}&amp;lt;/math&amp;gt;, вектор &amp;lt;math&amp;gt;x^n&amp;lt;/math&amp;gt; &lt;br /&gt;
&lt;br /&gt;
Наиболее удобным форматом для вычисления произведения матрицы на вектор является &amp;quot;Compressed Sparse Row&amp;quot; или сокращенно CSR-формат.&lt;br /&gt;
&lt;br /&gt;
Рассмотрим CSR-представление разреженной матрицы: пусть число ненулевых элементов матрицы равно &amp;lt;math&amp;gt;nnz&amp;lt;/math&amp;gt;&lt;br /&gt;
CSR-формат представляет матрицу &amp;lt;math&amp;gt;M&amp;lt;/math&amp;gt; в виде 3-х одномерных массивов:&lt;br /&gt;
&lt;br /&gt;
массив &amp;lt;math&amp;gt;A&amp;lt;/math&amp;gt; размера &amp;lt;math&amp;gt;nnz&amp;lt;/math&amp;gt; содержит ненулевые значения матрицы,&lt;br /&gt;
&amp;lt;math&amp;gt;JA&amp;lt;/math&amp;gt; размера &amp;lt;math&amp;gt;nnz&amp;lt;/math&amp;gt; - номера столбцов ненулевых элементов., &lt;br /&gt;
&amp;lt;math&amp;gt;IA&amp;lt;/math&amp;gt; размера &amp;lt;math&amp;gt;n&amp;lt;/math&amp;gt;- содержит номер с которого начинается описание элементов строки в массивах &amp;lt;math&amp;gt;A&amp;lt;/math&amp;gt; и &amp;lt;math&amp;gt;JA&amp;lt;/math&amp;gt;.&lt;br /&gt;
&lt;br /&gt;
Этот формат позволяет производить перемножение матрицы &amp;lt;math&amp;gt;M&amp;lt;/math&amp;gt; на вектор &amp;lt;math&amp;gt;x&amp;lt;/math&amp;gt; за &amp;lt;math&amp;gt;O(nnz)&amp;lt;/math&amp;gt; умножений и сложений. &lt;br /&gt;
Если при умножении плотной матрицы на вектор каждый элемент результата определяется по формуле &lt;br /&gt;
&amp;lt;math&amp;gt;y_i = \sum_{k = 1}^{n} A_{ik} x_k&amp;lt;/math&amp;gt;, &lt;br /&gt;
то в случае разреженной матрицы достаточно выполнять умножения только для ненулевых элементов &amp;lt;math&amp;gt;A_ik&amp;lt;/math&amp;gt;, которые хранятся в массиве &amp;lt;math&amp;gt;A&amp;lt;/math&amp;gt; в части соответствующей строке &amp;lt;math&amp;gt;i&amp;lt;/math&amp;gt; (элементы с индексами от &amp;lt;math&amp;gt;IA_i&amp;lt;/math&amp;gt; до &amp;lt;math&amp;gt;IA_{i+1}&amp;lt;/math&amp;gt;). Необходимо также знать на какой элемент вектора должен быть домножен данный ненулевой элемент массива, то есть нужен столбцовый индекс каждого элемента &amp;lt;math&amp;gt;A&amp;lt;/math&amp;gt;. Для этого используется массив &amp;lt;math&amp;gt;JA&amp;lt;/math&amp;gt;. Таким образом, каждый элемент итогового вектора определятся формулой&lt;br /&gt;
:&amp;lt;math&amp;gt;y_i = \sum_{k = IA_i}^{IA_{i+1}} A_k x_{JA_k}&amp;lt;/math&amp;gt;&lt;br /&gt;
Нетрудно заметить, что общее число операций умножения равно числу элементов &amp;lt;math&amp;gt;A&amp;lt;/math&amp;gt;, то есть числу ненулевых элементов разреженной матрицы.&lt;br /&gt;
&lt;br /&gt;
Например, это разреженная матрица с 4-мя ненулевыми элементами&lt;br /&gt;
:: &amp;lt;math&amp;gt;\begin{pmatrix}&lt;br /&gt;
0 &amp;amp; 0 &amp;amp; 0 &amp;amp; 0 \\&lt;br /&gt;
2 &amp;amp; 0 &amp;amp; 0 &amp;amp; 1 \\&lt;br /&gt;
0 &amp;amp; 0 &amp;amp; 3 &amp;amp; 0 \\&lt;br /&gt;
0 &amp;amp; 4 &amp;amp; 0 &amp;amp; 0 \\&lt;br /&gt;
\end{pmatrix}&amp;lt;/math&amp;gt;,&lt;br /&gt;
представляемая в формате CSR &lt;br /&gt;
    A  = [ 2 1 3 4 ]&lt;br /&gt;
    IA = [ 0 0 2 3 4 ]&lt;br /&gt;
    JA = [ 0 3 2 1 ]&lt;br /&gt;
домножим ее на вектор&lt;br /&gt;
    x  = [ 5 6 7 8 ]&lt;br /&gt;
получим&lt;br /&gt;
    y[0] = 0&lt;br /&gt;
    y[1] = a[0]*x[0] + a[1]*x[3] = 18&lt;br /&gt;
    y[2] = a[2]*x[2] = 21&lt;br /&gt;
    y[3] = a[3]*x[1] = 24 &lt;br /&gt;
&lt;br /&gt;
Алгоритм умножения матрицы на вектор полностью детерминирован и не зависит от порядка хранения элементов принадлежащих одной строке.&lt;br /&gt;
&lt;br /&gt;
=== Вычислительное ядро алгоритма ===&lt;br /&gt;
Вычислительным ядром алгоритма является формула умножения разреженной матрицы на плотный вектор:&lt;br /&gt;
:&amp;lt;math&amp;gt;y_i = \sum_{k = IA_i}^{IA_{i+1}} A_k x_{JA_k}&amp;lt;/math&amp;gt;&lt;br /&gt;
для всех &amp;lt;math&amp;gt;i = 1,n&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;
    число строк матрицы &#039;&#039;n&#039;&#039;; &lt;br /&gt;
    разреженная матрица в формате CSR:&lt;br /&gt;
      строчные указатели &#039;&#039;IA&#039;&#039;,&lt;br /&gt;
      столбцовые указатели&#039;&#039;JA&#039;&#039;, &lt;br /&gt;
      ненулевые элементы &#039;&#039;A&#039;&#039;;&lt;br /&gt;
    вектор &#039;&#039;x&#039;&#039;.&lt;br /&gt;
  &#039;&#039;&#039;Выходные данные&#039;&#039;&#039;: произведение матрицы на вектор &#039;&#039;y&#039;&#039;.&lt;br /&gt;
  &#039;&#039;&#039;read CSR&#039;&#039;&#039; &#039;&#039;n&#039;&#039;, &#039;&#039;IA&#039;&#039;, &#039;&#039;JA&#039;&#039;, &#039;&#039;A&#039;&#039;;&lt;br /&gt;
  &#039;&#039;&#039;read&#039;&#039;&#039; &#039;&#039;x&#039;&#039;&lt;br /&gt;
  &#039;&#039;&#039;for&#039;&#039;&#039; &#039;&#039;i&#039;&#039; = 1,n:&lt;br /&gt;
    &#039;&#039;&#039;for&#039;&#039;&#039; &#039;&#039;k&#039;&#039; = &#039;&#039;IA(i)&#039;&#039;, &#039;&#039;IA(i+1)-1&#039;&#039;:&lt;br /&gt;
            &#039;&#039;y(i)&#039;&#039; += &#039;&#039;A(k)&#039;&#039;*&#039;&#039;x(JA(k))&#039;&#039;;&lt;br /&gt;
  &#039;&#039;&#039;write&#039;&#039;&#039; &#039;&#039;y&#039;&#039;;&lt;br /&gt;
&lt;br /&gt;
=== Схема реализации последовательного алгоритма ===&lt;br /&gt;
Метод можно описать следующим образом:&lt;br /&gt;
# привести матрицу &amp;lt;math&amp;gt;M&amp;lt;/math&amp;gt; к формату CSR&lt;br /&gt;
# для &amp;lt;math&amp;gt;i&amp;lt;/math&amp;gt; от &amp;lt;math&amp;gt;0&amp;lt;/math&amp;gt; до &amp;lt;math&amp;gt;n-1&amp;lt;/math&amp;gt; вычислить &amp;lt;math&amp;gt;y_i&amp;lt;/math&amp;gt; по формуле &amp;lt;math&amp;gt;y_i = \sum_{k = IA_i}^{IA_{i+1}} A_k x_{JA_k}&amp;lt;/math&amp;gt;&lt;br /&gt;
&lt;br /&gt;
=== Последовательная сложность алгоритма ===&lt;br /&gt;
Для вычисления матрично-векторного произведения матрицы размера &amp;lt;math&amp;gt;n*n&amp;lt;/math&amp;gt; и вектора размера n в последовательном варианте требуется:&lt;br /&gt;
&lt;br /&gt;
* &amp;lt;math&amp;gt;nnz&amp;lt;/math&amp;gt; сложений,&lt;br /&gt;
* &amp;lt;math&amp;gt;nnz&amp;lt;/math&amp;gt; умножений.&lt;br /&gt;
&lt;br /&gt;
=== Информационный граф ===&lt;br /&gt;
&lt;br /&gt;
Для того чтобы построить информационный граф рассмотрим процесс вычисления значения одного элемента результирующего вектора &amp;lt;math&amp;gt;y_i&amp;lt;/math&amp;gt;. Число последовательных ярусов равно числу последовательных операций -- &amp;lt;math&amp;gt; AI_{i+1} - AI_i &amp;lt;/math&amp;gt; (в данном случае умножение и сложение будем считать за одну операцию).&lt;br /&gt;
Если же вычисления всех &amp;lt;math&amp;gt;y_i&amp;lt;/math&amp;gt; производить параллельно, на каждом ярусе будет производиться &amp;lt;math&amp;gt;n&amp;lt;/math&amp;gt; операций.&lt;br /&gt;
&lt;br /&gt;
&lt;br /&gt;
[[Файл:pic.jpg|800x800px|center|thumb|Информационный граф алгоритма умножения разреженной матрицы на плотный вектор &lt;br /&gt;
(Рисунок составлен самостоятельно)]]&lt;br /&gt;
&lt;br /&gt;
=== Ресурс параллелизма алгоритма ===&lt;br /&gt;
&lt;br /&gt;
Возможность параллельной реализации алгоритма появляется благодаря независимости вычисления каждого элемента результирующего вектора &amp;lt;math&amp;gt;y_i&amp;lt;/math&amp;gt;. Предположим, что имеется неограниченное число процессоров (теоретически, для максимальной эффективности требуется &amp;lt;math&amp;gt;n&amp;lt;/math&amp;gt; процессоров). Каждый процессор работает с одной строкой разреженной матрицы и хранит в памяти только те части массивов &lt;br /&gt;
&amp;lt;math&amp;gt; AJ &amp;lt;/math&amp;gt; и &amp;lt;math&amp;gt; A &amp;lt;/math&amp;gt;, которые соответствуют данной строке. Вектор &amp;lt;math&amp;gt; x &amp;lt;/math&amp;gt; хранится в памяти всех процессоров. Таким образом достигается экономия памяти (объем данных для i-ого процессора  &amp;lt;math&amp;gt; 2(AI_{i+1} - AI_i) + n &amp;lt;/math&amp;gt;). На данном процессоре выполняется &lt;br /&gt;
&amp;lt;math&amp;gt; AI_{i+1} - AI_i &amp;lt;/math&amp;gt; последовательных операций умножения и сложения. Число ярусов для i-ого процессора равно &amp;lt;math&amp;gt; AI_{i+1} - AI_i &amp;lt;/math&amp;gt;. Поскольку изначальная разреженная матрица имеет произвольную структуру, число ярусов на различных процессорах может быть различно. В худшем случае (если в строке все элементы ненулевые) число ярусов будет равно &amp;lt;math&amp;gt;n&amp;lt;/math&amp;gt;.  &lt;br /&gt;
&lt;br /&gt;
Таким образом, для алгоритма умножения разреженной матрицы на плотный вектор в параллельном варианте требуется последовательно выполнить:&lt;br /&gt;
&lt;br /&gt;
* не более чем &amp;lt;math&amp;gt;n&amp;lt;/math&amp;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;линейной&#039;&#039;.&lt;br /&gt;
&lt;br /&gt;
&#039;&#039;Замечание:&#039;&#039; если число процессоров &amp;lt;math&amp;gt;k&amp;lt;/math&amp;gt; меньше числа строк, но отношение &amp;lt;math&amp;gt;\frac{n}{k} = c&amp;lt;/math&amp;gt; является константой, то каждый процессор вычисляет &amp;lt;math&amp;gt;c&amp;lt;/math&amp;gt; элементов результирующего вектора, и число ярусов не более чем &amp;lt;math&amp;gt;cn&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; AI &amp;lt;/math&amp;gt; размерности &amp;lt;math&amp;gt; n+1 &amp;lt;/math&amp;gt;;&lt;br /&gt;
# вектор &amp;lt;math&amp;gt; AJ &amp;lt;/math&amp;gt; размерности &amp;lt;math&amp;gt; nnz &amp;lt;/math&amp;gt;;&lt;br /&gt;
# вектор &amp;lt;math&amp;gt; A &amp;lt;/math&amp;gt; размерности &amp;lt;math&amp;gt; nnz &amp;lt;/math&amp;gt;;&lt;br /&gt;
# вектор &amp;lt;math&amp;gt; x &amp;lt;/math&amp;gt; размерности &amp;lt;math&amp;gt; n &amp;lt;/math&amp;gt;.&lt;br /&gt;
&lt;br /&gt;
Суммарная размерность входных данных: &amp;lt;math&amp;gt; 2(nnz + n) + 1 &amp;lt;/math&amp;gt;&lt;br /&gt;
&lt;br /&gt;
Выходными данными является&lt;br /&gt;
# вектор &amp;lt;math&amp;gt; y &amp;lt;/math&amp;gt; размерности &amp;lt;math&amp;gt; n &amp;lt;/math&amp;gt;.&lt;br /&gt;
&lt;br /&gt;
Объем выходных данных: &amp;lt;math&amp;gt; n &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;, число ненулевых элементов &amp;lt;math&amp;gt;nnz&amp;lt;/math&amp;gt;, для вычисления используется &amp;lt;math&amp;gt;k&amp;lt;/math&amp;gt; процессоров тогда: &lt;br /&gt;
&lt;br /&gt;
*Каждый процессор оперирует с &amp;lt;math&amp;gt;\frac{n}{k}&amp;lt;/math&amp;gt; строками, в каждой из которых примерно &amp;lt;math&amp;gt;\frac{nnz}{n}&amp;lt;/math&amp;gt; элементов. Параллельная сложность алгоритма - &amp;lt;math&amp;gt;O(\frac{nnz}{k})&amp;lt;/math&amp;gt;.&lt;br /&gt;
&lt;br /&gt;
*Вычислительная мощность алгоритма (отношение числа операций к суммарному объему входных и выходных данных) - &amp;lt;math&amp;gt;O(\frac{nnz}{2nnz + 3n}) = O(1)&amp;lt;/math&amp;gt; - для последовательного алгоритма; &amp;lt;math&amp;gt;O(\frac{nnz}{n} / (2\frac{nnz}{n} + n)) = O(1) &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;
Последовательная реализация имеется в пакете SPARSKIT [http://w3.pppl.gov/~hammett/work/2006/gmres/SPARSKIT2/BLASSM/matvec.f], Python.Scipy [https://docs.scipy.org/doc/scipy-0.14.0/reference/generated/scipy.sparse.csr_matrix.html]&lt;br /&gt;
&lt;br /&gt;
Параллельный алгоритм реализован в библиотеке Matlab [http://citeseerx.ist.psu.edu/viewdoc/download?doi=10.1.1.83.6692&amp;amp;rep=rep1&amp;amp;type=pdf], Intel MKL [https://software.intel.com/en-us/node/468536#D09FB46A-B404-44CC-94ED-1C434C41B6E1]&lt;br /&gt;
&lt;br /&gt;
== Литература ==&lt;br /&gt;
[1] С. Писсанецки. Технология разреженных матриц. Изд. Мир, 1988.&lt;br /&gt;
&lt;br /&gt;
[2] В. В. Воеводин, Вл.В. Воеводин. Параллельные вычисления. – СПб.: БХВ - Петербург, 2002.&lt;/div&gt;</summary>
		<author><name>Екатерина Буторина</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:%D0%A0%D1%83%D1%84%D0%B8%D0%BD%D0%B0_%D0%A2%D1%80%D0%B5%D1%82%D1%8C%D1%8F%D0%BA%D0%BE%D0%B2%D0%B0/%D0%A5%D1%80%D0%B0%D0%BD%D0%B5%D0%BD%D0%B8%D0%B5_%D0%BD%D0%B5%D0%BD%D1%83%D0%BB%D0%B5%D0%B2%D1%8B%D1%85_%D1%8D%D0%BB%D0%B5%D0%BC%D0%B5%D0%BD%D1%82%D0%BE%D0%B2_%D1%80%D0%B0%D0%B7%D1%80%D0%B5%D0%B6%D0%B5%D0%BD%D0%BD%D1%8B%D1%85_%D0%BC%D0%B0%D1%82%D1%80%D0%B8%D1%86._%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=16073</id>
		<title>Участник:Руфина Третьякова/Хранение ненулевых элементов разреженных матриц. Умножение разреженной матрицы на вектор</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:%D0%A0%D1%83%D1%84%D0%B8%D0%BD%D0%B0_%D0%A2%D1%80%D0%B5%D1%82%D1%8C%D1%8F%D0%BA%D0%BE%D0%B2%D0%B0/%D0%A5%D1%80%D0%B0%D0%BD%D0%B5%D0%BD%D0%B8%D0%B5_%D0%BD%D0%B5%D0%BD%D1%83%D0%BB%D0%B5%D0%B2%D1%8B%D1%85_%D1%8D%D0%BB%D0%B5%D0%BC%D0%B5%D0%BD%D1%82%D0%BE%D0%B2_%D1%80%D0%B0%D0%B7%D1%80%D0%B5%D0%B6%D0%B5%D0%BD%D0%BD%D1%8B%D1%85_%D0%BC%D0%B0%D1%82%D1%80%D0%B8%D1%86._%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=16073"/>
		<updated>2016-11-07T18:28:02Z</updated>

		<summary type="html">&lt;p&gt;Екатерина Буторина: &lt;/p&gt;
&lt;hr /&gt;
&lt;div&gt;{{algorithm&lt;br /&gt;
| name              = Умножение разреженной матрицы на вектор&lt;br /&gt;
| serial_complexity = &amp;lt;math&amp;gt;nnz&amp;lt;/math&amp;gt;&lt;br /&gt;
| pf_height         = &amp;lt;math&amp;gt;O(n)&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;2(nnz+n)+1&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;
Авторы статьи: [[Участница:Руфина_Третьякова|Третьякова Р. М.]] (группа 603), [[Участница:Екатерина_Буторина|Буторина Е. В.]] (группа 603)&lt;br /&gt;
&lt;br /&gt;
Руфина Третьякова отвечает за программную реализацию алгоритма, Екатерина Буторина - за написание статьи.&lt;br /&gt;
&lt;br /&gt;
&lt;br /&gt;
==ЧАСТЬ. Свойства и структура алгоритма ==&lt;br /&gt;
&lt;br /&gt;
=== Общее описание алгоритма ===&lt;br /&gt;
Разрежённая матрица — это матрица с преимущественно нулевыми элементами. В противном случае, если бо́льшая часть элементов матрицы ненулевые, матрица считается плотной.&lt;br /&gt;
Среди специалистов нет единства в определении того, какое именно количество ненулевых элементов делает матрицу разрежённой. Разные авторы предлагают различные варианты. &lt;br /&gt;
Огромные разрежённые матрицы часто возникают при решении таких задач, как дифференциальное уравнение в частных производных или операции с графами.&lt;br /&gt;
При хранении и преобразовании разрежённых матриц в компьютере бывает полезно, а часто и необходимо, использовать специальные алгоритмы и структуры данных, которые учитывают разрежённую структуру матрицы. Операции и алгоритмы, применяемые для работы с обычными, плотными матрицами, применительно к большим разрежённым матрицам работают относительно медленно и требуют значительных объёмов памяти. Однако разрежённые матрицы могут быть легко сжаты путём записи только своих ненулевых элементов, что снижает требования к компьютерной памяти.&lt;br /&gt;
Сложность операции с разреженными матрицами чаще всего определяется не их размером но числом ненулевых элементов. Далее будет показано, что умножение разреженной матрицы на плотный вектор можно произвести ровно за столько умножений сколько в матрице ненулевых элементов.&lt;br /&gt;
&lt;br /&gt;
=== Математическое описание алгоритма ===&lt;br /&gt;
Исходные данные:  разреженная матрица &amp;lt;math&amp;gt;M^{n*n}&amp;lt;/math&amp;gt;, вектор &amp;lt;math&amp;gt;x^n&amp;lt;/math&amp;gt; &lt;br /&gt;
&lt;br /&gt;
Наиболее удобным форматом для вычисления произведения матрицы на вектор является &amp;quot;Compressed Sparse Row&amp;quot; или сокращенно CSR-формат.&lt;br /&gt;
&lt;br /&gt;
Рассмотрим CSR-представление разреженной матрицы: пусть число ненулевых элементов матрицы равно &amp;lt;math&amp;gt;nnz&amp;lt;/math&amp;gt;&lt;br /&gt;
CSR-формат представляет матрицу &amp;lt;math&amp;gt;M&amp;lt;/math&amp;gt; в виде 3-х одномерных массивов:&lt;br /&gt;
&lt;br /&gt;
массив &amp;lt;math&amp;gt;A&amp;lt;/math&amp;gt; размера &amp;lt;math&amp;gt;nnz&amp;lt;/math&amp;gt; содержит ненулевые значения матрицы,&lt;br /&gt;
&amp;lt;math&amp;gt;JA&amp;lt;/math&amp;gt; размера &amp;lt;math&amp;gt;nnz&amp;lt;/math&amp;gt; - номера столбцов ненулевых элементов., &lt;br /&gt;
&amp;lt;math&amp;gt;IA&amp;lt;/math&amp;gt; размера &amp;lt;math&amp;gt;n&amp;lt;/math&amp;gt;- содержит номер с которого начинается описание элементов строки в массивах &amp;lt;math&amp;gt;A&amp;lt;/math&amp;gt; и &amp;lt;math&amp;gt;JA&amp;lt;/math&amp;gt;.&lt;br /&gt;
&lt;br /&gt;
Этот формат позволяет производить перемножение матрицы &amp;lt;math&amp;gt;M&amp;lt;/math&amp;gt; на вектор &amp;lt;math&amp;gt;x&amp;lt;/math&amp;gt; за &amp;lt;math&amp;gt;O(nnz)&amp;lt;/math&amp;gt; умножений и сложений. &lt;br /&gt;
Если при умножении плотной матрицы на вектор каждый элемент результата определяется по формуле &lt;br /&gt;
&amp;lt;math&amp;gt;y_i = \sum_{k = 1}^{n} A_{ik} x_k&amp;lt;/math&amp;gt;, &lt;br /&gt;
то в случае разреженной матрицы достаточно выполнять умножения только для ненулевых элементов &amp;lt;math&amp;gt;A_ik&amp;lt;/math&amp;gt;, которые хранятся в массиве &amp;lt;math&amp;gt;A&amp;lt;/math&amp;gt; в части соответствующей строке &amp;lt;math&amp;gt;i&amp;lt;/math&amp;gt; (элементы с индексами от &amp;lt;math&amp;gt;IA_i&amp;lt;/math&amp;gt; до &amp;lt;math&amp;gt;IA_{i+1}&amp;lt;/math&amp;gt;). Необходимо также знать на какой элемент вектора должен быть домножен данный ненулевой элемент массива, то есть нужен столбцовый индекс каждого элемента &amp;lt;math&amp;gt;A&amp;lt;/math&amp;gt;. Для этого используется массив &amp;lt;math&amp;gt;JA&amp;lt;/math&amp;gt;. Таким образом, каждый элемент итогового вектора определятся формулой&lt;br /&gt;
:&amp;lt;math&amp;gt;y_i = \sum_{k = IA_i}^{IA_{i+1}} A_k x_{JA_k}&amp;lt;/math&amp;gt;&lt;br /&gt;
Нетрудно заметить, что общее число операций умножения равно числу элементов &amp;lt;math&amp;gt;A&amp;lt;/math&amp;gt;, то есть числу ненулевых элементов разреженной матрицы.&lt;br /&gt;
&lt;br /&gt;
Например, это разреженная матрица с 4-мя ненулевыми элементами&lt;br /&gt;
:: &amp;lt;math&amp;gt;\begin{pmatrix}&lt;br /&gt;
0 &amp;amp; 0 &amp;amp; 0 &amp;amp; 0 \\&lt;br /&gt;
2 &amp;amp; 0 &amp;amp; 0 &amp;amp; 1 \\&lt;br /&gt;
0 &amp;amp; 0 &amp;amp; 3 &amp;amp; 0 \\&lt;br /&gt;
0 &amp;amp; 4 &amp;amp; 0 &amp;amp; 0 \\&lt;br /&gt;
\end{pmatrix}&amp;lt;/math&amp;gt;,&lt;br /&gt;
представляемая в формате CSR &lt;br /&gt;
    A  = [ 2 1 3 4 ]&lt;br /&gt;
    IA = [ 0 0 2 3 4 ]&lt;br /&gt;
    JA = [ 0 3 2 1 ]&lt;br /&gt;
домножим ее на вектор&lt;br /&gt;
    x  = [ 5 6 7 8 ]&lt;br /&gt;
получим&lt;br /&gt;
    y[0] = 0&lt;br /&gt;
    y[1] = a[0]*x[0] + a[1]*x[3] = 18&lt;br /&gt;
    y[2] = a[2]*x[2] = 21&lt;br /&gt;
    y[3] = a[3]*x[1] = 24 &lt;br /&gt;
&lt;br /&gt;
Алгоритм умножения матрицы на вектор полностью детерминирован и не зависит от порядка хранения элементов принадлежащих одной строке.&lt;br /&gt;
&lt;br /&gt;
=== Вычислительное ядро алгоритма ===&lt;br /&gt;
Вычислительным ядром алгоритма является формула умножения разреженной матрицы на плотный вектор:&lt;br /&gt;
:&amp;lt;math&amp;gt;y_i = \sum_{k = IA_i}^{IA_{i+1}} A_k x_{JA_k}&amp;lt;/math&amp;gt;&lt;br /&gt;
для всех &amp;lt;math&amp;gt;i = 1,n&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;
    число строк матрицы &#039;&#039;n&#039;&#039;; &lt;br /&gt;
    разреженная матрица в формате CSR:&lt;br /&gt;
      строчные указатели &#039;&#039;IA&#039;&#039;,&lt;br /&gt;
      столбцовые указатели&#039;&#039;JA&#039;&#039;, &lt;br /&gt;
      ненулевые элементы &#039;&#039;A&#039;&#039;;&lt;br /&gt;
    вектор &#039;&#039;x&#039;&#039;.&lt;br /&gt;
  &#039;&#039;&#039;Выходные данные&#039;&#039;&#039;: произведение матрицы на вектор &#039;&#039;y&#039;&#039;.&lt;br /&gt;
  &#039;&#039;&#039;read CSR&#039;&#039;&#039; &#039;&#039;n&#039;&#039;, &#039;&#039;IA&#039;&#039;, &#039;&#039;JA&#039;&#039;, &#039;&#039;A&#039;&#039;;&lt;br /&gt;
  &#039;&#039;&#039;read&#039;&#039;&#039; &#039;&#039;x&#039;&#039;&lt;br /&gt;
  &#039;&#039;&#039;for&#039;&#039;&#039; &#039;&#039;i&#039;&#039; = 1,n:&lt;br /&gt;
    &#039;&#039;&#039;for&#039;&#039;&#039; &#039;&#039;k&#039;&#039; = &#039;&#039;IA(i)&#039;&#039;, &#039;&#039;IA(i+1)-1&#039;&#039;:&lt;br /&gt;
            &#039;&#039;y(i)&#039;&#039; += &#039;&#039;A(k)&#039;&#039;*&#039;&#039;x(JA(k))&#039;&#039;;&lt;br /&gt;
  &#039;&#039;&#039;write&#039;&#039;&#039; &#039;&#039;y&#039;&#039;;&lt;br /&gt;
&lt;br /&gt;
=== Схема реализации последовательного алгоритма ===&lt;br /&gt;
Метод можно описать следующим образом:&lt;br /&gt;
# привести матрицу &amp;lt;math&amp;gt;M&amp;lt;/math&amp;gt; к формату CSR&lt;br /&gt;
# для &amp;lt;math&amp;gt;i&amp;lt;/math&amp;gt; от &amp;lt;math&amp;gt;0&amp;lt;/math&amp;gt; до &amp;lt;math&amp;gt;n-1&amp;lt;/math&amp;gt; вычислить &amp;lt;math&amp;gt;y_i&amp;lt;/math&amp;gt; по формуле &amp;lt;math&amp;gt;y_i = \sum_{k = IA_i}^{IA_{i+1}} A_k x_{JA_k}&amp;lt;/math&amp;gt;&lt;br /&gt;
&lt;br /&gt;
=== Последовательная сложность алгоритма ===&lt;br /&gt;
Для вычисления матрично-векторного произведения матрицы размера &amp;lt;math&amp;gt;n*n&amp;lt;/math&amp;gt; и вектора размера n в последовательном варианте требуется:&lt;br /&gt;
&lt;br /&gt;
* &amp;lt;math&amp;gt;nnz&amp;lt;/math&amp;gt; сложений,&lt;br /&gt;
* &amp;lt;math&amp;gt;nnz&amp;lt;/math&amp;gt; умножений.&lt;br /&gt;
&lt;br /&gt;
=== Информационный граф ===&lt;br /&gt;
&lt;br /&gt;
Для того чтобы построить информационный граф рассмотрим процесс вычисления значения одного элемента результирующего вектора &amp;lt;math&amp;gt;y_i&amp;lt;/math&amp;gt;. Число последовательных ярусов равно числу последовательных операций -- &amp;lt;math&amp;gt; AI_{i+1} - AI_i &amp;lt;/math&amp;gt; (в данном случае умножение и сложение будем считать за одну операцию).&lt;br /&gt;
Если же вычисления всех &amp;lt;math&amp;gt;y_i&amp;lt;/math&amp;gt; производить параллельно, на каждом ярусе будет производиться &amp;lt;math&amp;gt;n&amp;lt;/math&amp;gt; операций.&lt;br /&gt;
&lt;br /&gt;
&lt;br /&gt;
[[Файл:.jpg|800x800px|center|thumb|Информационный граф алгоритма умножения разреженной матрицы на плотный вектор &lt;br /&gt;
(Рисунок составлен самостоятельно)]]&lt;br /&gt;
&lt;br /&gt;
=== Ресурс параллелизма алгоритма ===&lt;br /&gt;
&lt;br /&gt;
Возможность параллельной реализации алгоритма появляется благодаря независимости вычисления каждого элемента результирующего вектора &amp;lt;math&amp;gt;y_i&amp;lt;/math&amp;gt;. Предположим, что имеется неограниченное число процессоров (теоретически, для максимальной эффективности требуется &amp;lt;math&amp;gt;n&amp;lt;/math&amp;gt; процессоров). Каждый процессор работает с одной строкой разреженной матрицы и хранит в памяти только те части массивов &lt;br /&gt;
&amp;lt;math&amp;gt; AJ &amp;lt;/math&amp;gt; и &amp;lt;math&amp;gt; A &amp;lt;/math&amp;gt;, которые соответствуют данной строке. Вектор &amp;lt;math&amp;gt; x &amp;lt;/math&amp;gt; хранится в памяти всех процессоров. Таким образом достигается экономия памяти (объем данных для i-ого процессора  &amp;lt;math&amp;gt; 2(AI_{i+1} - AI_i) + n &amp;lt;/math&amp;gt;). На данном процессоре выполняется &lt;br /&gt;
&amp;lt;math&amp;gt; AI_{i+1} - AI_i &amp;lt;/math&amp;gt; последовательных операций умножения и сложения. Число ярусов для i-ого процессора равно &amp;lt;math&amp;gt; AI_{i+1} - AI_i &amp;lt;/math&amp;gt;. Поскольку изначальная разреженная матрица имеет произвольную структуру, число ярусов на различных процессорах может быть различно. В худшем случае (если в строке все элементы ненулевые) число ярусов будет равно &amp;lt;math&amp;gt;n&amp;lt;/math&amp;gt;.  &lt;br /&gt;
&lt;br /&gt;
Таким образом, для алгоритма умножения разреженной матрицы на плотный вектор в параллельном варианте требуется последовательно выполнить:&lt;br /&gt;
&lt;br /&gt;
* не более чем &amp;lt;math&amp;gt;n&amp;lt;/math&amp;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;линейной&#039;&#039;.&lt;br /&gt;
&lt;br /&gt;
&#039;&#039;Замечание:&#039;&#039; если число процессоров &amp;lt;math&amp;gt;k&amp;lt;/math&amp;gt; меньше числа строк, но отношение &amp;lt;math&amp;gt;\frac{n}{k} = c&amp;lt;/math&amp;gt; является константой, то каждый процессор вычисляет &amp;lt;math&amp;gt;c&amp;lt;/math&amp;gt; элементов результирующего вектора, и число ярусов не более чем &amp;lt;math&amp;gt;cn&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; AI &amp;lt;/math&amp;gt; размерности &amp;lt;math&amp;gt; n+1 &amp;lt;/math&amp;gt;;&lt;br /&gt;
# вектор &amp;lt;math&amp;gt; AJ &amp;lt;/math&amp;gt; размерности &amp;lt;math&amp;gt; nnz &amp;lt;/math&amp;gt;;&lt;br /&gt;
# вектор &amp;lt;math&amp;gt; A &amp;lt;/math&amp;gt; размерности &amp;lt;math&amp;gt; nnz &amp;lt;/math&amp;gt;;&lt;br /&gt;
# вектор &amp;lt;math&amp;gt; x &amp;lt;/math&amp;gt; размерности &amp;lt;math&amp;gt; n &amp;lt;/math&amp;gt;.&lt;br /&gt;
&lt;br /&gt;
Суммарная размерность входных данных: &amp;lt;math&amp;gt; 2(nnz + n) + 1 &amp;lt;/math&amp;gt;&lt;br /&gt;
&lt;br /&gt;
Выходными данными является&lt;br /&gt;
# вектор &amp;lt;math&amp;gt; y &amp;lt;/math&amp;gt; размерности &amp;lt;math&amp;gt; n &amp;lt;/math&amp;gt;.&lt;br /&gt;
&lt;br /&gt;
Объем выходных данных: &amp;lt;math&amp;gt; n &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;, число ненулевых элементов &amp;lt;math&amp;gt;nnz&amp;lt;/math&amp;gt;, для вычисления используется &amp;lt;math&amp;gt;k&amp;lt;/math&amp;gt; процессоров тогда: &lt;br /&gt;
&lt;br /&gt;
*Каждый процессор оперирует с &amp;lt;math&amp;gt;\frac{n}{k}&amp;lt;/math&amp;gt; строками, в каждой из которых примерно &amp;lt;math&amp;gt;\frac{nnz}{n}&amp;lt;/math&amp;gt; элементов. Параллельная сложность алгоритма - &amp;lt;math&amp;gt;O(\frac{nnz}{k})&amp;lt;/math&amp;gt;.&lt;br /&gt;
&lt;br /&gt;
*Вычислительная мощность алгоритма (отношение числа операций к суммарному объему входных и выходных данных) - &amp;lt;math&amp;gt;O(\frac{nnz}{2nnz + 3n}) = O(1)&amp;lt;/math&amp;gt; - для последовательного алгоритма; &amp;lt;math&amp;gt;O(\frac{nnz}{n} / (2\frac{nnz}{n} + n)) = O(1) &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;
Последовательная реализация имеется в пакете SPARSKIT [http://w3.pppl.gov/~hammett/work/2006/gmres/SPARSKIT2/BLASSM/matvec.f], Python.Scipy [https://docs.scipy.org/doc/scipy-0.14.0/reference/generated/scipy.sparse.csr_matrix.html]&lt;br /&gt;
&lt;br /&gt;
Параллельный алгоритм реализован в библиотеке Matlab [http://citeseerx.ist.psu.edu/viewdoc/download?doi=10.1.1.83.6692&amp;amp;rep=rep1&amp;amp;type=pdf], Intel MKL [https://software.intel.com/en-us/node/468536#D09FB46A-B404-44CC-94ED-1C434C41B6E1]&lt;br /&gt;
&lt;br /&gt;
== Литература ==&lt;br /&gt;
[1] С. Писсанецки. Технология разреженных матриц. Изд. Мир, 1988.&lt;br /&gt;
&lt;br /&gt;
[2] В. В. Воеводин, Вл.В. Воеводин. Параллельные вычисления. – СПб.: БХВ - Петербург, 2002.&lt;/div&gt;</summary>
		<author><name>Екатерина Буторина</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:%D0%A0%D1%83%D1%84%D0%B8%D0%BD%D0%B0_%D0%A2%D1%80%D0%B5%D1%82%D1%8C%D1%8F%D0%BA%D0%BE%D0%B2%D0%B0/%D0%A5%D1%80%D0%B0%D0%BD%D0%B5%D0%BD%D0%B8%D0%B5_%D0%BD%D0%B5%D0%BD%D1%83%D0%BB%D0%B5%D0%B2%D1%8B%D1%85_%D1%8D%D0%BB%D0%B5%D0%BC%D0%B5%D0%BD%D1%82%D0%BE%D0%B2_%D1%80%D0%B0%D0%B7%D1%80%D0%B5%D0%B6%D0%B5%D0%BD%D0%BD%D1%8B%D1%85_%D0%BC%D0%B0%D1%82%D1%80%D0%B8%D1%86._%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=16072</id>
		<title>Участник:Руфина Третьякова/Хранение ненулевых элементов разреженных матриц. Умножение разреженной матрицы на вектор</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:%D0%A0%D1%83%D1%84%D0%B8%D0%BD%D0%B0_%D0%A2%D1%80%D0%B5%D1%82%D1%8C%D1%8F%D0%BA%D0%BE%D0%B2%D0%B0/%D0%A5%D1%80%D0%B0%D0%BD%D0%B5%D0%BD%D0%B8%D0%B5_%D0%BD%D0%B5%D0%BD%D1%83%D0%BB%D0%B5%D0%B2%D1%8B%D1%85_%D1%8D%D0%BB%D0%B5%D0%BC%D0%B5%D0%BD%D1%82%D0%BE%D0%B2_%D1%80%D0%B0%D0%B7%D1%80%D0%B5%D0%B6%D0%B5%D0%BD%D0%BD%D1%8B%D1%85_%D0%BC%D0%B0%D1%82%D1%80%D0%B8%D1%86._%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=16072"/>
		<updated>2016-11-07T18:23:44Z</updated>

		<summary type="html">&lt;p&gt;Екатерина Буторина: &lt;/p&gt;
&lt;hr /&gt;
&lt;div&gt;{{algorithm&lt;br /&gt;
| name              = Умножение разреженной матрицы на вектор&lt;br /&gt;
| serial_complexity = &amp;lt;math&amp;gt;nnz&amp;lt;/math&amp;gt;&lt;br /&gt;
| pf_height         = &amp;lt;math&amp;gt;O(n)&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;2(nnz+n)+1&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;
Авторы статьи: [[Участница:Руфина_Третьякова|Третьякова Р. М.]] (группа 603), [[Участница:Екатерина_Буторина|Буторина Е. В.]] (группа 603)&lt;br /&gt;
&lt;br /&gt;
Руфина Третьякова отвечает за программную реализацию алгоритма, Екатерина Буторина - за написание статьи.&lt;br /&gt;
&lt;br /&gt;
&lt;br /&gt;
==ЧАСТЬ. Свойства и структура алгоритма ==&lt;br /&gt;
&lt;br /&gt;
=== Общее описание алгоритма ===&lt;br /&gt;
Разрежённая матрица — это матрица с преимущественно нулевыми элементами. В противном случае, если бо́льшая часть элементов матрицы ненулевые, матрица считается плотной.&lt;br /&gt;
Среди специалистов нет единства в определении того, какое именно количество ненулевых элементов делает матрицу разрежённой. Разные авторы предлагают различные варианты. &lt;br /&gt;
Огромные разрежённые матрицы часто возникают при решении таких задач, как дифференциальное уравнение в частных производных или операции с графами.&lt;br /&gt;
При хранении и преобразовании разрежённых матриц в компьютере бывает полезно, а часто и необходимо, использовать специальные алгоритмы и структуры данных, которые учитывают разрежённую структуру матрицы. Операции и алгоритмы, применяемые для работы с обычными, плотными матрицами, применительно к большим разрежённым матрицам работают относительно медленно и требуют значительных объёмов памяти. Однако разрежённые матрицы могут быть легко сжаты путём записи только своих ненулевых элементов, что снижает требования к компьютерной памяти.&lt;br /&gt;
Сложность операции с разреженными матрицами чаще всего определяется не их размером но числом ненулевых элементов. Далее будет показано, что умножение разреженной матрицы на плотный вектор можно произвести ровно за столько умножений сколько в матрице ненулевых элементов.&lt;br /&gt;
&lt;br /&gt;
=== Математическое описание алгоритма ===&lt;br /&gt;
Исходные данные:  разреженная матрица &amp;lt;math&amp;gt;M^{n*n}&amp;lt;/math&amp;gt;, вектор &amp;lt;math&amp;gt;x^n&amp;lt;/math&amp;gt; &lt;br /&gt;
&lt;br /&gt;
Наиболее удобным форматом для вычисления произведения матрицы на вектор является &amp;quot;Compressed Sparse Row&amp;quot; или сокращенно CSR-формат.&lt;br /&gt;
&lt;br /&gt;
Рассмотрим CSR-представление разреженной матрицы: пусть число ненулевых элементов матрицы равно &amp;lt;math&amp;gt;nnz&amp;lt;/math&amp;gt;&lt;br /&gt;
CSR-формат представляет матрицу &amp;lt;math&amp;gt;M&amp;lt;/math&amp;gt; в виде 3-х одномерных массивов:&lt;br /&gt;
&lt;br /&gt;
массив &amp;lt;math&amp;gt;A&amp;lt;/math&amp;gt; размера &amp;lt;math&amp;gt;nnz&amp;lt;/math&amp;gt; содержит ненулевые значения матрицы,&lt;br /&gt;
&amp;lt;math&amp;gt;JA&amp;lt;/math&amp;gt; размера &amp;lt;math&amp;gt;nnz&amp;lt;/math&amp;gt; - номера столбцов ненулевых элементов., &lt;br /&gt;
&amp;lt;math&amp;gt;IA&amp;lt;/math&amp;gt; размера &amp;lt;math&amp;gt;n&amp;lt;/math&amp;gt;- содержит номер с которого начинается описание элементов строки в массивах &amp;lt;math&amp;gt;A&amp;lt;/math&amp;gt; и &amp;lt;math&amp;gt;JA&amp;lt;/math&amp;gt;.&lt;br /&gt;
&lt;br /&gt;
Этот формат позволяет производить перемножение матрицы &amp;lt;math&amp;gt;M&amp;lt;/math&amp;gt; на вектор &amp;lt;math&amp;gt;x&amp;lt;/math&amp;gt; за &amp;lt;math&amp;gt;O(nnz)&amp;lt;/math&amp;gt; умножений и сложений. &lt;br /&gt;
Если при умножении плотной матрицы на вектор каждый элемент результата определяется по формуле &lt;br /&gt;
&amp;lt;math&amp;gt;y_i = \sum_{k = 1}^{n} A_{ik} x_k&amp;lt;/math&amp;gt;, &lt;br /&gt;
то в случае разреженной матрицы достаточно выполнять умножения только для ненулевых элементов &amp;lt;math&amp;gt;A_ik&amp;lt;/math&amp;gt;, которые хранятся в массиве &amp;lt;math&amp;gt;A&amp;lt;/math&amp;gt; в части соответствующей строке &amp;lt;math&amp;gt;i&amp;lt;/math&amp;gt; (элементы с индексами от &amp;lt;math&amp;gt;IA_i&amp;lt;/math&amp;gt; до &amp;lt;math&amp;gt;IA_{i+1}&amp;lt;/math&amp;gt;). Необходимо также знать на какой элемент вектора должен быть домножен данный ненулевой элемент массива, то есть нужен столбцовый индекс каждого элемента &amp;lt;math&amp;gt;A&amp;lt;/math&amp;gt;. Для этого используется массив &amp;lt;math&amp;gt;JA&amp;lt;/math&amp;gt;. Таким образом, каждый элемент итогового вектора определятся формулой&lt;br /&gt;
:&amp;lt;math&amp;gt;y_i = \sum_{k = IA_i}^{IA_{i+1}} A_k x_{JA_k}&amp;lt;/math&amp;gt;&lt;br /&gt;
Нетрудно заметить, что общее число операций умножения равно числу элементов &amp;lt;math&amp;gt;A&amp;lt;/math&amp;gt;, то есть числу ненулевых элементов разреженной матрицы.&lt;br /&gt;
&lt;br /&gt;
Например, это разреженная матрица с 4-мя ненулевыми элементами&lt;br /&gt;
:: &amp;lt;math&amp;gt;\begin{pmatrix}&lt;br /&gt;
0 &amp;amp; 0 &amp;amp; 0 &amp;amp; 0 \\&lt;br /&gt;
2 &amp;amp; 0 &amp;amp; 0 &amp;amp; 1 \\&lt;br /&gt;
0 &amp;amp; 0 &amp;amp; 3 &amp;amp; 0 \\&lt;br /&gt;
0 &amp;amp; 4 &amp;amp; 0 &amp;amp; 0 \\&lt;br /&gt;
\end{pmatrix}&amp;lt;/math&amp;gt;,&lt;br /&gt;
представляемая в формате CSR &lt;br /&gt;
    A  = [ 2 1 3 4 ]&lt;br /&gt;
    IA = [ 0 0 2 3 4 ]&lt;br /&gt;
    JA = [ 0 3 2 1 ]&lt;br /&gt;
домножим ее на вектор&lt;br /&gt;
    x  = [ 5 6 7 8 ]&lt;br /&gt;
получим&lt;br /&gt;
    y[0] = 0&lt;br /&gt;
    y[1] = a[0]*x[0] + a[1]*x[3] = 18&lt;br /&gt;
    y[2] = a[2]*x[2] = 21&lt;br /&gt;
    y[3] = a[3]*x[1] = 24 &lt;br /&gt;
&lt;br /&gt;
Алгоритм умножения матрицы на вектор полностью детерминирован и не зависит от порядка хранения элементов принадлежащих одной строке.&lt;br /&gt;
&lt;br /&gt;
=== Вычислительное ядро алгоритма ===&lt;br /&gt;
Вычислительным ядром алгоритма является формула умножения разреженной матрицы на плотный вектор:&lt;br /&gt;
:&amp;lt;math&amp;gt;y_i = \sum_{k = IA_i}^{IA_{i+1}} A_k x_{JA_k}&amp;lt;/math&amp;gt;&lt;br /&gt;
для всех &amp;lt;math&amp;gt;i = 1,n&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;
    число строк матрицы &#039;&#039;n&#039;&#039;; &lt;br /&gt;
    разреженная матрица в формате CSR:&lt;br /&gt;
      строчные указатели &#039;&#039;IA&#039;&#039;,&lt;br /&gt;
      столбцовые указатели&#039;&#039;JA&#039;&#039;, &lt;br /&gt;
      ненулевые элементы &#039;&#039;A&#039;&#039;;&lt;br /&gt;
    вектор &#039;&#039;x&#039;&#039;.&lt;br /&gt;
  &#039;&#039;&#039;Выходные данные&#039;&#039;&#039;: произведение матрицы на вектор &#039;&#039;y&#039;&#039;.&lt;br /&gt;
  &#039;&#039;&#039;read CSR&#039;&#039;&#039; &#039;&#039;n&#039;&#039;, &#039;&#039;IA&#039;&#039;, &#039;&#039;JA&#039;&#039;, &#039;&#039;A&#039;&#039;;&lt;br /&gt;
  &#039;&#039;&#039;read&#039;&#039;&#039; &#039;&#039;x&#039;&#039;&lt;br /&gt;
  &#039;&#039;&#039;for&#039;&#039;&#039; &#039;&#039;i&#039;&#039; = 1,n:&lt;br /&gt;
    &#039;&#039;&#039;for&#039;&#039;&#039; &#039;&#039;k&#039;&#039; = &#039;&#039;IA(i)&#039;&#039;, &#039;&#039;IA(i+1)-1&#039;&#039;:&lt;br /&gt;
            &#039;&#039;y(i)&#039;&#039; += &#039;&#039;A(k)&#039;&#039;*&#039;&#039;x(JA(k))&#039;&#039;;&lt;br /&gt;
  &#039;&#039;&#039;write&#039;&#039;&#039; &#039;&#039;y&#039;&#039;;&lt;br /&gt;
&lt;br /&gt;
=== Схема реализации последовательного алгоритма ===&lt;br /&gt;
Метод можно описать следующим образом:&lt;br /&gt;
# привести матрицу &amp;lt;math&amp;gt;M&amp;lt;/math&amp;gt; к формату CSR&lt;br /&gt;
# для &amp;lt;math&amp;gt;i&amp;lt;/math&amp;gt; от &amp;lt;math&amp;gt;0&amp;lt;/math&amp;gt; до &amp;lt;math&amp;gt;n-1&amp;lt;/math&amp;gt; вычислить &amp;lt;math&amp;gt;y_i&amp;lt;/math&amp;gt; по формуле &amp;lt;math&amp;gt;y_i = \sum_{k = IA_i}^{IA_{i+1}} A_k x_{JA_k}&amp;lt;/math&amp;gt;&lt;br /&gt;
&lt;br /&gt;
=== Последовательная сложность алгоритма ===&lt;br /&gt;
Для вычисления матрично-векторного произведения матрицы размера &amp;lt;math&amp;gt;n*n&amp;lt;/math&amp;gt; и вектора размера n в последовательном варианте требуется:&lt;br /&gt;
&lt;br /&gt;
* &amp;lt;math&amp;gt;nnz&amp;lt;/math&amp;gt; сложений,&lt;br /&gt;
* &amp;lt;math&amp;gt;nnz&amp;lt;/math&amp;gt; умножений.&lt;br /&gt;
&lt;br /&gt;
=== Информационный граф ===&lt;br /&gt;
&lt;br /&gt;
Для того чтобы построить информационный граф рассмотрим процесс вычисления значения одного элемента результирующего вектора &amp;lt;math&amp;gt;y_i&amp;lt;/math&amp;gt;. Число последовательных ярусов равно числу последовательных операций -- &amp;lt;math&amp;gt; AI_{i+1} - AI_i &amp;lt;/math&amp;gt; (в данном случае умножение и сложение будем считать за одну операцию).&lt;br /&gt;
Если же вычисления всех &amp;lt;math&amp;gt;y_i&amp;lt;/math&amp;gt; производить параллельно, на каждом ярусе будет производиться &amp;lt;math&amp;gt;n&amp;lt;/math&amp;gt; операций.&lt;br /&gt;
&lt;br /&gt;
&lt;br /&gt;
[[Файл:pic.jpg|800x800px|center|thumb|Информационный граф алгоритма умножения разреженной матрицы на плотный вектор &lt;br /&gt;
(Рисунок составлен самостоятельно)]]&lt;br /&gt;
&lt;br /&gt;
=== Ресурс параллелизма алгоритма ===&lt;br /&gt;
&lt;br /&gt;
Возможность параллельной реализации алгоритма появляется благодаря независимости вычисления каждого элемента результирующего вектора &amp;lt;math&amp;gt;y_i&amp;lt;/math&amp;gt;. Предположим, что имеется неограниченное число процессоров (теоретически, для максимальной эффективности требуется &amp;lt;math&amp;gt;n&amp;lt;/math&amp;gt; процессоров). Каждый процессор работает с одной строкой разреженной матрицы и хранит в памяти только те части массивов &lt;br /&gt;
&amp;lt;math&amp;gt; AJ &amp;lt;/math&amp;gt; и &amp;lt;math&amp;gt; A &amp;lt;/math&amp;gt;, которые соответствуют данной строке. Вектор &amp;lt;math&amp;gt; x &amp;lt;/math&amp;gt; хранится в памяти всех процессоров. Таким образом достигается экономия памяти (объем данных для i-ого процессора  &amp;lt;math&amp;gt; 2(AI_{i+1} - AI_i) + n &amp;lt;/math&amp;gt;). На данном процессоре выполняется &lt;br /&gt;
&amp;lt;math&amp;gt; AI_{i+1} - AI_i &amp;lt;/math&amp;gt; последовательных операций умножения и сложения. Число ярусов для i-ого процессора равно &amp;lt;math&amp;gt; AI_{i+1} - AI_i &amp;lt;/math&amp;gt;. Поскольку изначальная разреженная матрица имеет произвольную структуру, число ярусов на различных процессорах может быть различно. В худшем случае (если в строке все элементы ненулевые) число ярусов будет равно &amp;lt;math&amp;gt;n&amp;lt;/math&amp;gt;.  &lt;br /&gt;
&lt;br /&gt;
Таким образом, для алгоритма умножения разреженной матрицы на плотный вектор в параллельном варианте требуется последовательно выполнить:&lt;br /&gt;
&lt;br /&gt;
* не более чем &amp;lt;math&amp;gt;n&amp;lt;/math&amp;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;линейной&#039;&#039;.&lt;br /&gt;
&lt;br /&gt;
&#039;&#039;Замечание:&#039;&#039; если число процессоров &amp;lt;math&amp;gt;k&amp;lt;/math&amp;gt; меньше числа строк, но отношение &amp;lt;math&amp;gt;\frac{n}{k} = c&amp;lt;/math&amp;gt; является константой, то каждый процессор вычисляет &amp;lt;math&amp;gt;c&amp;lt;/math&amp;gt; элементов результирующего вектора, и число ярусов не более чем &amp;lt;math&amp;gt;cn&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; AI &amp;lt;/math&amp;gt; размерности &amp;lt;math&amp;gt; n+1 &amp;lt;/math&amp;gt;;&lt;br /&gt;
# вектор &amp;lt;math&amp;gt; AJ &amp;lt;/math&amp;gt; размерности &amp;lt;math&amp;gt; nnz &amp;lt;/math&amp;gt;;&lt;br /&gt;
# вектор &amp;lt;math&amp;gt; A &amp;lt;/math&amp;gt; размерности &amp;lt;math&amp;gt; nnz &amp;lt;/math&amp;gt;;&lt;br /&gt;
# вектор &amp;lt;math&amp;gt; x &amp;lt;/math&amp;gt; размерности &amp;lt;math&amp;gt; n &amp;lt;/math&amp;gt;.&lt;br /&gt;
&lt;br /&gt;
Суммарная размерность входных данных: &amp;lt;math&amp;gt; 2(nnz + n) + 1 &amp;lt;/math&amp;gt;&lt;br /&gt;
&lt;br /&gt;
Выходными данными является&lt;br /&gt;
# вектор &amp;lt;math&amp;gt; y &amp;lt;/math&amp;gt; размерности &amp;lt;math&amp;gt; n &amp;lt;/math&amp;gt;.&lt;br /&gt;
&lt;br /&gt;
Объем выходных данных: &amp;lt;math&amp;gt; n &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;, число ненулевых элементов &amp;lt;math&amp;gt;nnz&amp;lt;/math&amp;gt;, для вычисления используется &amp;lt;math&amp;gt;k&amp;lt;/math&amp;gt; процессоров тогда: &lt;br /&gt;
&lt;br /&gt;
*Каждый процессор оперирует с &amp;lt;math&amp;gt;\frac{n}{k}&amp;lt;/math&amp;gt; строками, в каждой из которых примерно &amp;lt;math&amp;gt;\frac{nnz}{n}&amp;lt;/math&amp;gt; элементов. Параллельная сложность алгоритма - &amp;lt;math&amp;gt;O(\frac{nnz}{k})&amp;lt;/math&amp;gt;.&lt;br /&gt;
&lt;br /&gt;
*Вычислительная мощность алгоритма (отношение числа операций к суммарному объему входных и выходных данных) - &amp;lt;math&amp;gt;O(\frac{nnz}{2nnz + 3n}) = O(1)&amp;lt;/math&amp;gt; - для последовательного алгоритма; &amp;lt;math&amp;gt;O(\frac{nnz}{n} / (2\frac{nnz}{n} + n)) = O(1) &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;
Последовательная реализация имеется в пакете SPARSKIT [http://w3.pppl.gov/~hammett/work/2006/gmres/SPARSKIT2/BLASSM/matvec.f], Python.Scipy [https://docs.scipy.org/doc/scipy-0.14.0/reference/generated/scipy.sparse.csr_matrix.html]&lt;br /&gt;
&lt;br /&gt;
Параллельный алгоритм реализован в библиотеке Matlab [http://citeseerx.ist.psu.edu/viewdoc/download?doi=10.1.1.83.6692&amp;amp;rep=rep1&amp;amp;type=pdf], Intel MKL [https://software.intel.com/en-us/node/468536#D09FB46A-B404-44CC-94ED-1C434C41B6E1]&lt;br /&gt;
&lt;br /&gt;
== Литература ==&lt;br /&gt;
[1] С. Писсанецки. Технология разреженных матриц. Изд. Мир, 1988.&lt;br /&gt;
&lt;br /&gt;
[2] В. В. Воеводин, Вл.В. Воеводин. Параллельные вычисления. – СПб.: БХВ - Петербург, 2002.&lt;/div&gt;</summary>
		<author><name>Екатерина Буторина</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:%D0%A0%D1%83%D1%84%D0%B8%D0%BD%D0%B0_%D0%A2%D1%80%D0%B5%D1%82%D1%8C%D1%8F%D0%BA%D0%BE%D0%B2%D0%B0/%D0%A5%D1%80%D0%B0%D0%BD%D0%B5%D0%BD%D0%B8%D0%B5_%D0%BD%D0%B5%D0%BD%D1%83%D0%BB%D0%B5%D0%B2%D1%8B%D1%85_%D1%8D%D0%BB%D0%B5%D0%BC%D0%B5%D0%BD%D1%82%D0%BE%D0%B2_%D1%80%D0%B0%D0%B7%D1%80%D0%B5%D0%B6%D0%B5%D0%BD%D0%BD%D1%8B%D1%85_%D0%BC%D0%B0%D1%82%D1%80%D0%B8%D1%86._%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=14417</id>
		<title>Участник:Руфина Третьякова/Хранение ненулевых элементов разреженных матриц. Умножение разреженной матрицы на вектор</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:%D0%A0%D1%83%D1%84%D0%B8%D0%BD%D0%B0_%D0%A2%D1%80%D0%B5%D1%82%D1%8C%D1%8F%D0%BA%D0%BE%D0%B2%D0%B0/%D0%A5%D1%80%D0%B0%D0%BD%D0%B5%D0%BD%D0%B8%D0%B5_%D0%BD%D0%B5%D0%BD%D1%83%D0%BB%D0%B5%D0%B2%D1%8B%D1%85_%D1%8D%D0%BB%D0%B5%D0%BC%D0%B5%D0%BD%D1%82%D0%BE%D0%B2_%D1%80%D0%B0%D0%B7%D1%80%D0%B5%D0%B6%D0%B5%D0%BD%D0%BD%D1%8B%D1%85_%D0%BC%D0%B0%D1%82%D1%80%D0%B8%D1%86._%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=14417"/>
		<updated>2016-10-28T12:56:29Z</updated>

		<summary type="html">&lt;p&gt;Екатерина Буторина: &lt;/p&gt;
&lt;hr /&gt;
&lt;div&gt; {{Assignment}}&lt;br /&gt;
{{algorithm&lt;br /&gt;
| name              = Умножение разреженной матрицы на вектор&lt;br /&gt;
| serial_complexity = &amp;lt;math&amp;gt;nnz&amp;lt;/math&amp;gt;&lt;br /&gt;
| pf_height         = &amp;lt;math&amp;gt;O(n)&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;2(nnz+n)+1&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;
Авторы статьи: [[Участница:Руфина_Третьякова|Третьякова Р. М.]] (группа 603), [[Участница:Екатерина_Буторина|Буторина Е. В.]] (группа 603)&lt;br /&gt;
&lt;br /&gt;
Руфина Третьякова отвечает за программную реализацию алгоритма, Екатерина Буторина - за написание статьи.&lt;br /&gt;
&lt;br /&gt;
&lt;br /&gt;
== Свойства и структура алгоритма ==&lt;br /&gt;
&lt;br /&gt;
=== Общее описание алгоритма ===&lt;br /&gt;
Разрежённая матрица — это матрица с преимущественно нулевыми элементами. В противном случае, если бо́льшая часть элементов матрицы ненулевые, матрица считается плотной.&lt;br /&gt;
Среди специалистов нет единства в определении того, какое именно количество ненулевых элементов делает матрицу разрежённой. Разные авторы предлагают различные варианты. &lt;br /&gt;
Огромные разрежённые матрицы часто возникают при решении таких задач, как дифференциальное уравнение в частных производных или операции с графами.&lt;br /&gt;
При хранении и преобразовании разрежённых матриц в компьютере бывает полезно, а часто и необходимо, использовать специальные алгоритмы и структуры данных, которые учитывают разрежённую структуру матрицы. Операции и алгоритмы, применяемые для работы с обычными, плотными матрицами, применительно к большим разрежённым матрицам работают относительно медленно и требуют значительных объёмов памяти. Однако разрежённые матрицы могут быть легко сжаты путём записи только своих ненулевых элементов, что снижает требования к компьютерной памяти.&lt;br /&gt;
Сложность операции с разреженными матрицами чаще всего определяется не их размером но числом ненулевых элементов. Далее будет показано, что умножение разреженной матрицы на плотный вектор можно произвести ровно за столько умножений сколько в матрице ненулевых элементов.&lt;br /&gt;
&lt;br /&gt;
=== Математическое описание алгоритма ===&lt;br /&gt;
Исходные данные:  разреженная матрица &amp;lt;math&amp;gt;M^{n*n}&amp;lt;/math&amp;gt;, вектор &amp;lt;math&amp;gt;x^n&amp;lt;/math&amp;gt; &lt;br /&gt;
&lt;br /&gt;
Наиболее удобным форматом для вычисления произведения матрицы на вектор является &amp;quot;Compressed Sparse Row&amp;quot; или сокращенно CSR-формат.&lt;br /&gt;
&lt;br /&gt;
Рассмотрим CSR-представление разреженной матрицы: пусть число ненулевых элементов матрицы равно &amp;lt;math&amp;gt;nnz&amp;lt;/math&amp;gt;&lt;br /&gt;
CSR-формат представляет матрицу &amp;lt;math&amp;gt;M&amp;lt;/math&amp;gt; в виде 3-х одномерных массивов:&lt;br /&gt;
&lt;br /&gt;
массив &amp;lt;math&amp;gt;A&amp;lt;/math&amp;gt; размера &amp;lt;math&amp;gt;nnz&amp;lt;/math&amp;gt; содержит ненулевые значения матрицы,&lt;br /&gt;
&amp;lt;math&amp;gt;JA&amp;lt;/math&amp;gt; размера &amp;lt;math&amp;gt;nnz&amp;lt;/math&amp;gt; - номера столбцов ненулевых элементов., &lt;br /&gt;
&amp;lt;math&amp;gt;IA&amp;lt;/math&amp;gt; размера &amp;lt;math&amp;gt;n&amp;lt;/math&amp;gt;- содержит номер с которого начинается описание элементов строки в массивах &amp;lt;math&amp;gt;A&amp;lt;/math&amp;gt; и &amp;lt;math&amp;gt;JA&amp;lt;/math&amp;gt;.&lt;br /&gt;
&lt;br /&gt;
Этот формат позволяет производить перемножение матрицы &amp;lt;math&amp;gt;M&amp;lt;/math&amp;gt; на вектор &amp;lt;math&amp;gt;x&amp;lt;/math&amp;gt; за &amp;lt;math&amp;gt;O(nnz)&amp;lt;/math&amp;gt; умножений и сложений. &lt;br /&gt;
Если при умножении плотной матрицы на вектор каждый элемент результата определяется по формуле &lt;br /&gt;
&amp;lt;math&amp;gt;y_i = \sum_{k = 1}^{n} A_{ik} x_k&amp;lt;/math&amp;gt;, &lt;br /&gt;
то в случае разреженной матрицы достаточно выполнять умножения только для ненулевых элементов &amp;lt;math&amp;gt;A_ik&amp;lt;/math&amp;gt;, которые хранятся в массиве &amp;lt;math&amp;gt;A&amp;lt;/math&amp;gt; в части соответствующей строке &amp;lt;math&amp;gt;i&amp;lt;/math&amp;gt; (элементы с индексами от &amp;lt;math&amp;gt;IA_i&amp;lt;/math&amp;gt; до &amp;lt;math&amp;gt;IA_{i+1}&amp;lt;/math&amp;gt;). Необходимо также знать на какой элемент вектора должен быть домножен данный ненулевой элемент массива, то есть нужен столбцовый индекс каждого элемента &amp;lt;math&amp;gt;A&amp;lt;/math&amp;gt;. Для этого используется массив &amp;lt;math&amp;gt;JA&amp;lt;/math&amp;gt;. Таким образом, каждый элемент итогового вектора определятся формулой&lt;br /&gt;
:&amp;lt;math&amp;gt;y_i = \sum_{k = IA_i}^{IA_{i+1}} A_k x_{JA_k}&amp;lt;/math&amp;gt;&lt;br /&gt;
Нетрудно заметить, что общее число операций умножения равно числу элементов &amp;lt;math&amp;gt;A&amp;lt;/math&amp;gt;, то есть числу ненулевых элементов разреженной матрицы.&lt;br /&gt;
&lt;br /&gt;
Например, это разреженная матрица с 4-мя ненулевыми элементами&lt;br /&gt;
:: &amp;lt;math&amp;gt;\begin{pmatrix}&lt;br /&gt;
0 &amp;amp; 0 &amp;amp; 0 &amp;amp; 0 \\&lt;br /&gt;
2 &amp;amp; 0 &amp;amp; 0 &amp;amp; 1 \\&lt;br /&gt;
0 &amp;amp; 0 &amp;amp; 3 &amp;amp; 0 \\&lt;br /&gt;
0 &amp;amp; 4 &amp;amp; 0 &amp;amp; 0 \\&lt;br /&gt;
\end{pmatrix}&amp;lt;/math&amp;gt;,&lt;br /&gt;
представляемая в формате CSR &lt;br /&gt;
    A  = [ 2 1 3 4 ]&lt;br /&gt;
    IA = [ 0 0 2 3 4 ]&lt;br /&gt;
    JA = [ 0 3 2 1 ]&lt;br /&gt;
домножим ее на вектор&lt;br /&gt;
    x  = [ 5 6 7 8 ]&lt;br /&gt;
получим&lt;br /&gt;
    y[0] = 0&lt;br /&gt;
    y[1] = a[0]*x[0] + a[1]*x[3] = 18&lt;br /&gt;
    y[2] = a[2]*x[2] = 21&lt;br /&gt;
    y[3] = a[3]*x[1] = 24 &lt;br /&gt;
&lt;br /&gt;
Алгоритм умножения матрицы на вектор полностью детерминирован и не зависит от порядка хранения элементов принадлежащих одной строке.&lt;br /&gt;
&lt;br /&gt;
=== Вычислительное ядро алгоритма ===&lt;br /&gt;
Вычислительным ядром алгоритма является формула умножения разреженной матрицы на плотный вектор:&lt;br /&gt;
:&amp;lt;math&amp;gt;y_i = \sum_{k = IA_i}^{IA_{i+1}} A_k x_{JA_k}&amp;lt;/math&amp;gt;&lt;br /&gt;
для всех &amp;lt;math&amp;gt;i = 1,n&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;
    число строк матрицы &#039;&#039;n&#039;&#039;; &lt;br /&gt;
    разреженная матрица в формате CSR:&lt;br /&gt;
      строчные указатели &#039;&#039;IA&#039;&#039;,&lt;br /&gt;
      столбцовые указатели&#039;&#039;JA&#039;&#039;, &lt;br /&gt;
      ненулевые элементы &#039;&#039;A&#039;&#039;;&lt;br /&gt;
    вектор &#039;&#039;x&#039;&#039;.&lt;br /&gt;
  &#039;&#039;&#039;Выходные данные&#039;&#039;&#039;: произведение матрицы на вектор &#039;&#039;y&#039;&#039;.&lt;br /&gt;
  &#039;&#039;&#039;read CSR&#039;&#039;&#039; &#039;&#039;n&#039;&#039;, &#039;&#039;IA&#039;&#039;, &#039;&#039;JA&#039;&#039;, &#039;&#039;A&#039;&#039;;&lt;br /&gt;
  &#039;&#039;&#039;read&#039;&#039;&#039; &#039;&#039;x&#039;&#039;&lt;br /&gt;
  &#039;&#039;&#039;for&#039;&#039;&#039; &#039;&#039;i&#039;&#039; = 1,n:&lt;br /&gt;
    &#039;&#039;&#039;for&#039;&#039;&#039; &#039;&#039;k&#039;&#039; = &#039;&#039;IA(i)&#039;&#039;, &#039;&#039;IA(i+1)-1&#039;&#039;:&lt;br /&gt;
            &#039;&#039;y(i)&#039;&#039; += &#039;&#039;A(k)&#039;&#039;*&#039;&#039;x(JA(k))&#039;&#039;;&lt;br /&gt;
  &#039;&#039;&#039;write&#039;&#039;&#039; &#039;&#039;y&#039;&#039;;&lt;br /&gt;
&lt;br /&gt;
=== Схема реализации последовательного алгоритма ===&lt;br /&gt;
Метод можно описать следующим образом:&lt;br /&gt;
# привести матрицу &amp;lt;math&amp;gt;M&amp;lt;/math&amp;gt; к формату CSR&lt;br /&gt;
# для &amp;lt;math&amp;gt;i&amp;lt;/math&amp;gt; от &amp;lt;math&amp;gt;0&amp;lt;/math&amp;gt; до &amp;lt;math&amp;gt;n-1&amp;lt;/math&amp;gt; вычислить &amp;lt;math&amp;gt;y_i&amp;lt;/math&amp;gt; по формуле &amp;lt;math&amp;gt;y_i = \sum_{k = IA_i}^{IA_{i+1}} A_k x_{JA_k}&amp;lt;/math&amp;gt;&lt;br /&gt;
&lt;br /&gt;
=== Последовательная сложность алгоритма ===&lt;br /&gt;
Для вычисления матрично-векторного произведения матрицы размера &amp;lt;math&amp;gt;n*n&amp;lt;/math&amp;gt; и вектора размера n в последовательном варианте требуется:&lt;br /&gt;
&lt;br /&gt;
* &amp;lt;math&amp;gt;nnz&amp;lt;/math&amp;gt; сложений,&lt;br /&gt;
* &amp;lt;math&amp;gt;nnz&amp;lt;/math&amp;gt; умножений.&lt;br /&gt;
&lt;br /&gt;
=== Информационный граф ===&lt;br /&gt;
&lt;br /&gt;
Для того чтобы построить информационный граф рассмотрим процесс вычисления значения одного элемента результирующего вектора &amp;lt;math&amp;gt;y_i&amp;lt;/math&amp;gt;. Число последовательных ярусов равно числу последовательных операций -- &amp;lt;math&amp;gt; AI_{i+1} - AI_i &amp;lt;/math&amp;gt; (в данном случае умножение и сложение будем считать за одну операцию).&lt;br /&gt;
Если же вычисления всех &amp;lt;math&amp;gt;y_i&amp;lt;/math&amp;gt; производить параллельно, на каждом ярусе будет производиться &amp;lt;math&amp;gt;n&amp;lt;/math&amp;gt; операций.&lt;br /&gt;
&lt;br /&gt;
&lt;br /&gt;
[[Файл:1111.jpg|800x800px|center|thumb|Информационный граф алгоритма умножения разреженной матрицы на плотный вектор &lt;br /&gt;
(Рисунок составлен самостоятельно)]]&lt;br /&gt;
&lt;br /&gt;
=== Ресурс параллелизма алгоритма ===&lt;br /&gt;
&lt;br /&gt;
Возможность параллельной реализации алгоритма появляется благодаря независимости вычисления каждого элемента результирующего вектора &amp;lt;math&amp;gt;y_i&amp;lt;/math&amp;gt;. Предположим, что имеется неограниченное число процессоров (теоретически, для максимальной эффективности требуется &amp;lt;math&amp;gt;n&amp;lt;/math&amp;gt; процессоров). Каждый процессор работает с одной строкой разреженной матрицы и хранит в памяти только те части массивов &lt;br /&gt;
&amp;lt;math&amp;gt; AJ &amp;lt;/math&amp;gt; и &amp;lt;math&amp;gt; A &amp;lt;/math&amp;gt;, которые соответствуют данной строке. Вектор &amp;lt;math&amp;gt; x &amp;lt;/math&amp;gt; хранится в памяти всех процессоров. Таким образом достигается экономия памяти (объем данных для i-ого процессора  &amp;lt;math&amp;gt; 2(AI_{i+1} - AI_i) + n &amp;lt;/math&amp;gt;). На данном процессоре выполняется &lt;br /&gt;
&amp;lt;math&amp;gt; AI_{i+1} - AI_i &amp;lt;/math&amp;gt; последовательных операций умножения и сложения. Число ярусов для i-ого процессора равно &amp;lt;math&amp;gt; AI_{i+1} - AI_i &amp;lt;/math&amp;gt;. Поскольку изначальная разреженная матрица имеет произвольную структуру, число ярусов на различных процессорах может быть различно. В худшем случае (если в строке все элементы ненулевые) число ярусов будет равно &amp;lt;math&amp;gt;n&amp;lt;/math&amp;gt;.  &lt;br /&gt;
&lt;br /&gt;
Таким образом, для алгоритма умножения разреженной матрицы на плотный вектор в параллельном варианте требуется последовательно выполнить:&lt;br /&gt;
&lt;br /&gt;
* не более чем &amp;lt;math&amp;gt;n&amp;lt;/math&amp;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;линейной&#039;&#039;.&lt;br /&gt;
&lt;br /&gt;
&#039;&#039;Замечание:&#039;&#039; если число процессоров &amp;lt;math&amp;gt;k&amp;lt;/math&amp;gt; меньше числа строк, но отношение &amp;lt;math&amp;gt;\frac{n}{k} = c&amp;lt;/math&amp;gt; является константой, то каждый процессор вычисляет &amp;lt;math&amp;gt;c&amp;lt;/math&amp;gt; элементов результирующего вектора, и число ярусов не более чем &amp;lt;math&amp;gt;cn&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; AI &amp;lt;/math&amp;gt; размерности &amp;lt;math&amp;gt; n+1 &amp;lt;/math&amp;gt;;&lt;br /&gt;
# вектор &amp;lt;math&amp;gt; AJ &amp;lt;/math&amp;gt; размерности &amp;lt;math&amp;gt; nnz &amp;lt;/math&amp;gt;;&lt;br /&gt;
# вектор &amp;lt;math&amp;gt; A &amp;lt;/math&amp;gt; размерности &amp;lt;math&amp;gt; nnz &amp;lt;/math&amp;gt;;&lt;br /&gt;
# вектор &amp;lt;math&amp;gt; x &amp;lt;/math&amp;gt; размерности &amp;lt;math&amp;gt; n &amp;lt;/math&amp;gt;.&lt;br /&gt;
&lt;br /&gt;
Суммарная размерность входных данных: &amp;lt;math&amp;gt; 2(nnz + n) + 1 &amp;lt;/math&amp;gt;&lt;br /&gt;
&lt;br /&gt;
Выходными данными является&lt;br /&gt;
# вектор &amp;lt;math&amp;gt; y &amp;lt;/math&amp;gt; размерности &amp;lt;math&amp;gt; n &amp;lt;/math&amp;gt;.&lt;br /&gt;
&lt;br /&gt;
Объем выходных данных: &amp;lt;math&amp;gt; n &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;, число ненулевых элементов &amp;lt;math&amp;gt;nnz&amp;lt;/math&amp;gt;, для вычисления используется &amp;lt;math&amp;gt;k&amp;lt;/math&amp;gt; процессоров тогда: &lt;br /&gt;
&lt;br /&gt;
*Каждый процессор оперирует с &amp;lt;math&amp;gt;\frac{n}{k}&amp;lt;/math&amp;gt; строками, в каждой из которых примерно &amp;lt;math&amp;gt;\frac{nnz}{n}&amp;lt;/math&amp;gt; элементов. Параллельная сложность алгоритма - &amp;lt;math&amp;gt;O(\frac{nnz}{k})&amp;lt;/math&amp;gt;.&lt;br /&gt;
&lt;br /&gt;
*Вычислительная мощность алгоритма (отношение числа операций к суммарному объему входных и выходных данных) - &amp;lt;math&amp;gt;O(\frac{nnz}{2nnz + 3n}) = O(1)&amp;lt;/math&amp;gt; - для последовательного алгоритма; &amp;lt;math&amp;gt;O(\frac{nnz}{n} / (2\frac{nnz}{n} + n)) = O(1) &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;
Последовательная реализация имеется в пакете SPARSKIT [http://w3.pppl.gov/~hammett/work/2006/gmres/SPARSKIT2/BLASSM/matvec.f], Python.Scipy [https://docs.scipy.org/doc/scipy-0.14.0/reference/generated/scipy.sparse.csr_matrix.html]&lt;br /&gt;
&lt;br /&gt;
Параллельный алгоритм реализован в библиотеке Matlab [http://citeseerx.ist.psu.edu/viewdoc/download?doi=10.1.1.83.6692&amp;amp;rep=rep1&amp;amp;type=pdf], Intel MKL [https://software.intel.com/en-us/node/468536#D09FB46A-B404-44CC-94ED-1C434C41B6E1]&lt;br /&gt;
&lt;br /&gt;
== Литература ==&lt;br /&gt;
[1] С. Писсанецки. Технология разреженных матриц. Изд. Мир, 1988.&lt;br /&gt;
&lt;br /&gt;
[2] В. В. Воеводин, Вл.В. Воеводин. Параллельные вычисления. – СПб.: БХВ - Петербург, 2002.&lt;/div&gt;</summary>
		<author><name>Екатерина Буторина</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:%D0%A0%D1%83%D1%84%D0%B8%D0%BD%D0%B0_%D0%A2%D1%80%D0%B5%D1%82%D1%8C%D1%8F%D0%BA%D0%BE%D0%B2%D0%B0/%D0%A5%D1%80%D0%B0%D0%BD%D0%B5%D0%BD%D0%B8%D0%B5_%D0%BD%D0%B5%D0%BD%D1%83%D0%BB%D0%B5%D0%B2%D1%8B%D1%85_%D1%8D%D0%BB%D0%B5%D0%BC%D0%B5%D0%BD%D1%82%D0%BE%D0%B2_%D1%80%D0%B0%D0%B7%D1%80%D0%B5%D0%B6%D0%B5%D0%BD%D0%BD%D1%8B%D1%85_%D0%BC%D0%B0%D1%82%D1%80%D0%B8%D1%86._%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=14248</id>
		<title>Участник:Руфина Третьякова/Хранение ненулевых элементов разреженных матриц. Умножение разреженной матрицы на вектор</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:%D0%A0%D1%83%D1%84%D0%B8%D0%BD%D0%B0_%D0%A2%D1%80%D0%B5%D1%82%D1%8C%D1%8F%D0%BA%D0%BE%D0%B2%D0%B0/%D0%A5%D1%80%D0%B0%D0%BD%D0%B5%D0%BD%D0%B8%D0%B5_%D0%BD%D0%B5%D0%BD%D1%83%D0%BB%D0%B5%D0%B2%D1%8B%D1%85_%D1%8D%D0%BB%D0%B5%D0%BC%D0%B5%D0%BD%D1%82%D0%BE%D0%B2_%D1%80%D0%B0%D0%B7%D1%80%D0%B5%D0%B6%D0%B5%D0%BD%D0%BD%D1%8B%D1%85_%D0%BC%D0%B0%D1%82%D1%80%D0%B8%D1%86._%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=14248"/>
		<updated>2016-10-27T18:45:13Z</updated>

		<summary type="html">&lt;p&gt;Екатерина Буторина: /* ЧАСТЬ. Программная реализация алгоритма */&lt;/p&gt;
&lt;hr /&gt;
&lt;div&gt;{{algorithm&lt;br /&gt;
| name              = Умножение разреженной матрицы на вектор&lt;br /&gt;
| serial_complexity = &amp;lt;math&amp;gt;nnz&amp;lt;/math&amp;gt;&lt;br /&gt;
| pf_height         = &amp;lt;math&amp;gt;O(n)&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;2(nnz+n)+1&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;
Авторы статьи: [[Участница:Руфина_Третьякова|Третьякова Р. М.]] (группа 603), [[Участница:Екатерина_Буторина|Буторина Е. В.]] (группа 603)&lt;br /&gt;
&lt;br /&gt;
Руфина Третьякова отвечает за программную реализацию алгоритма, Екатерина Буторина - за написание статьи.&lt;br /&gt;
&lt;br /&gt;
&lt;br /&gt;
== Свойства и структура алгоритма ==&lt;br /&gt;
&lt;br /&gt;
=== Общее описание алгоритма ===&lt;br /&gt;
Разрежённая матрица — это матрица с преимущественно нулевыми элементами. В противном случае, если бо́льшая часть элементов матрицы ненулевые, матрица считается плотной.&lt;br /&gt;
Среди специалистов нет единства в определении того, какое именно количество ненулевых элементов делает матрицу разрежённой. Разные авторы предлагают различные варианты. &lt;br /&gt;
Огромные разрежённые матрицы часто возникают при решении таких задач, как дифференциальное уравнение в частных производных или операции с графами.&lt;br /&gt;
При хранении и преобразовании разрежённых матриц в компьютере бывает полезно, а часто и необходимо, использовать специальные алгоритмы и структуры данных, которые учитывают разрежённую структуру матрицы. Операции и алгоритмы, применяемые для работы с обычными, плотными матрицами, применительно к большим разрежённым матрицам работают относительно медленно и требуют значительных объёмов памяти. Однако разрежённые матрицы могут быть легко сжаты путём записи только своих ненулевых элементов, что снижает требования к компьютерной памяти.&lt;br /&gt;
Сложность операции с разреженными матрицами чаще всего определяется не их размером но числом ненулевых элементов. Далее будет показано, что умножение разреженной матрицы на плотный вектор можно произвести ровно за столько умножений сколько в матрице ненулевых элементов.&lt;br /&gt;
&lt;br /&gt;
=== Математическое описание алгоритма ===&lt;br /&gt;
Исходные данные:  разреженная матрица &amp;lt;math&amp;gt;M^{n*n}&amp;lt;/math&amp;gt;, вектор &amp;lt;math&amp;gt;x^n&amp;lt;/math&amp;gt; &lt;br /&gt;
&lt;br /&gt;
Наиболее удобным форматом для вычисления произведения матрицы на вектор является &amp;quot;Compressed Sparse Row&amp;quot; или сокращенно CSR-формат.&lt;br /&gt;
&lt;br /&gt;
Рассмотрим CSR-представление разреженной матрицы: пусть число ненулевых элементов матрицы равно &amp;lt;math&amp;gt;nnz&amp;lt;/math&amp;gt;&lt;br /&gt;
CSR-формат представляет матрицу &amp;lt;math&amp;gt;M&amp;lt;/math&amp;gt; в виде 3-х одномерных массивов:&lt;br /&gt;
&lt;br /&gt;
массив &amp;lt;math&amp;gt;A&amp;lt;/math&amp;gt; размера &amp;lt;math&amp;gt;nnz&amp;lt;/math&amp;gt; содержит ненулевые значения матрицы,&lt;br /&gt;
&amp;lt;math&amp;gt;JA&amp;lt;/math&amp;gt; размера &amp;lt;math&amp;gt;nnz&amp;lt;/math&amp;gt; - номера столбцов ненулевых элементов., &lt;br /&gt;
&amp;lt;math&amp;gt;IA&amp;lt;/math&amp;gt; размера &amp;lt;math&amp;gt;n&amp;lt;/math&amp;gt;- содержит номер с которого начинается описание элементов строки в массивах &amp;lt;math&amp;gt;A&amp;lt;/math&amp;gt; и &amp;lt;math&amp;gt;JA&amp;lt;/math&amp;gt;.&lt;br /&gt;
&lt;br /&gt;
Этот формат позволяет производить перемножение матрицы &amp;lt;math&amp;gt;M&amp;lt;/math&amp;gt; на вектор &amp;lt;math&amp;gt;x&amp;lt;/math&amp;gt; за &amp;lt;math&amp;gt;O(nnz)&amp;lt;/math&amp;gt; умножений и сложений. &lt;br /&gt;
Если при умножении плотной матрицы на вектор каждый элемент результата определяется по формуле &lt;br /&gt;
&amp;lt;math&amp;gt;y_i = \sum_{k = 1}^{n} A_{ik} x_k&amp;lt;/math&amp;gt;, &lt;br /&gt;
то в случае разреженной матрицы достаточно выполнять умножения только для ненулевых элементов &amp;lt;math&amp;gt;A_ik&amp;lt;/math&amp;gt;, которые хранятся в массиве &amp;lt;math&amp;gt;A&amp;lt;/math&amp;gt; в части соответствующей строке &amp;lt;math&amp;gt;i&amp;lt;/math&amp;gt; (элементы с индексами от &amp;lt;math&amp;gt;IA_i&amp;lt;/math&amp;gt; до &amp;lt;math&amp;gt;IA_{i+1}&amp;lt;/math&amp;gt;). Необходимо также знать на какой элемент вектора должен быть домножен данный ненулевой элемент массива, то есть нужен столбцовый индекс каждого элемента &amp;lt;math&amp;gt;A&amp;lt;/math&amp;gt;. Для этого используется массив &amp;lt;math&amp;gt;JA&amp;lt;/math&amp;gt;. Таким образом, каждый элемент итогового вектора определятся формулой&lt;br /&gt;
:&amp;lt;math&amp;gt;y_i = \sum_{k = IA_i}^{IA_{i+1}} A_k x_{JA_k}&amp;lt;/math&amp;gt;&lt;br /&gt;
Нетрудно заметить, что общее число операций умножения равно числу элементов &amp;lt;math&amp;gt;A&amp;lt;/math&amp;gt;, то есть числу ненулевых элементов разреженной матрицы.&lt;br /&gt;
&lt;br /&gt;
Например, это разреженная матрица с 4-мя ненулевыми элементами&lt;br /&gt;
:: &amp;lt;math&amp;gt;\begin{pmatrix}&lt;br /&gt;
0 &amp;amp; 0 &amp;amp; 0 &amp;amp; 0 \\&lt;br /&gt;
2 &amp;amp; 0 &amp;amp; 0 &amp;amp; 1 \\&lt;br /&gt;
0 &amp;amp; 0 &amp;amp; 3 &amp;amp; 0 \\&lt;br /&gt;
0 &amp;amp; 4 &amp;amp; 0 &amp;amp; 0 \\&lt;br /&gt;
\end{pmatrix}&amp;lt;/math&amp;gt;,&lt;br /&gt;
представляемая в формате CSR &lt;br /&gt;
    A  = [ 2 1 3 4 ]&lt;br /&gt;
    IA = [ 0 0 2 3 4 ]&lt;br /&gt;
    JA = [ 0 3 2 1 ]&lt;br /&gt;
домножим ее на вектор&lt;br /&gt;
    x  = [ 5 6 7 8 ]&lt;br /&gt;
получим&lt;br /&gt;
    y[0] = 0&lt;br /&gt;
    y[1] = a[0]*x[0] + a[1]*x[3] = 18&lt;br /&gt;
    y[2] = a[2]*x[2] = 21&lt;br /&gt;
    y[3] = a[3]*x[1] = 24 &lt;br /&gt;
&lt;br /&gt;
Алгоритм умножения матрицы на вектор полностью детерминирован и не зависит от порядка хранения элементов принадлежащих одной строке.&lt;br /&gt;
&lt;br /&gt;
=== Вычислительное ядро алгоритма ===&lt;br /&gt;
Вычислительным ядром алгоритма является формула умножения разреженной матрицы на плотный вектор:&lt;br /&gt;
:&amp;lt;math&amp;gt;y_i = \sum_{k = IA_i}^{IA_{i+1}} A_k x_{JA_k}&amp;lt;/math&amp;gt;&lt;br /&gt;
для всех &amp;lt;math&amp;gt;i = 1,n&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;
    число строк матрицы &#039;&#039;n&#039;&#039;; &lt;br /&gt;
    разреженная матрица в формате CSR:&lt;br /&gt;
      строчные указатели &#039;&#039;IA&#039;&#039;,&lt;br /&gt;
      столбцовые указатели&#039;&#039;JA&#039;&#039;, &lt;br /&gt;
      ненулевые элементы &#039;&#039;A&#039;&#039;;&lt;br /&gt;
    вектор &#039;&#039;x&#039;&#039;.&lt;br /&gt;
  &#039;&#039;&#039;Выходные данные&#039;&#039;&#039;: произведение матрицы на вектор &#039;&#039;y&#039;&#039;.&lt;br /&gt;
  &#039;&#039;&#039;read CSR&#039;&#039;&#039; &#039;&#039;n&#039;&#039;, &#039;&#039;IA&#039;&#039;, &#039;&#039;JA&#039;&#039;, &#039;&#039;A&#039;&#039;;&lt;br /&gt;
  &#039;&#039;&#039;read&#039;&#039;&#039; &#039;&#039;x&#039;&#039;&lt;br /&gt;
  &#039;&#039;&#039;for&#039;&#039;&#039; &#039;&#039;i&#039;&#039; = 1,n:&lt;br /&gt;
    &#039;&#039;&#039;for&#039;&#039;&#039; &#039;&#039;k&#039;&#039; = &#039;&#039;IA(i)&#039;&#039;, &#039;&#039;IA(i+1)-1&#039;&#039;:&lt;br /&gt;
            &#039;&#039;y(i)&#039;&#039; += &#039;&#039;A(k)&#039;&#039;*&#039;&#039;x(JA(k))&#039;&#039;;&lt;br /&gt;
  &#039;&#039;&#039;write&#039;&#039;&#039; &#039;&#039;y&#039;&#039;;&lt;br /&gt;
&lt;br /&gt;
=== Схема реализации последовательного алгоритма ===&lt;br /&gt;
Метод можно описать следующим образом:&lt;br /&gt;
# привести матрицу &amp;lt;math&amp;gt;M&amp;lt;/math&amp;gt; к формату CSR&lt;br /&gt;
# для &amp;lt;math&amp;gt;i&amp;lt;/math&amp;gt; от &amp;lt;math&amp;gt;0&amp;lt;/math&amp;gt; до &amp;lt;math&amp;gt;n-1&amp;lt;/math&amp;gt; вычислить &amp;lt;math&amp;gt;y_i&amp;lt;/math&amp;gt; по формуле &amp;lt;math&amp;gt;y_i = \sum_{k = IA_i}^{IA_{i+1}} A_k x_{JA_k}&amp;lt;/math&amp;gt;&lt;br /&gt;
&lt;br /&gt;
=== Последовательная сложность алгоритма ===&lt;br /&gt;
Для вычисления матрично-векторного произведения матрицы размера &amp;lt;math&amp;gt;n*n&amp;lt;/math&amp;gt; и вектора размера n в последовательном варианте требуется:&lt;br /&gt;
&lt;br /&gt;
* &amp;lt;math&amp;gt;nnz&amp;lt;/math&amp;gt; сложений,&lt;br /&gt;
* &amp;lt;math&amp;gt;nnz&amp;lt;/math&amp;gt; умножений.&lt;br /&gt;
&lt;br /&gt;
=== Информационный граф ===&lt;br /&gt;
&lt;br /&gt;
Для того чтобы построить информационный граф рассмотрим процесс вычисления значения одного элемента результирующего вектора &amp;lt;math&amp;gt;y_i&amp;lt;/math&amp;gt;. Число последовательных ярусов равно числу последовательных операций -- &amp;lt;math&amp;gt; AI_{i+1} - AI_i &amp;lt;/math&amp;gt; (в данном случае умножение и сложение будем считать за одну операцию).&lt;br /&gt;
Если же вычисления всех &amp;lt;math&amp;gt;y_i&amp;lt;/math&amp;gt; производить параллельно, на каждом ярусе будет производиться &amp;lt;math&amp;gt;n&amp;lt;/math&amp;gt; операций.&lt;br /&gt;
&lt;br /&gt;
&lt;br /&gt;
[[Файл:1111.jpg|800x800px|center|thumb|Информационный граф алгоритма умножения разреженной матрицы на плотный вектор &lt;br /&gt;
(Рисунок составлен самостоятельно)]]&lt;br /&gt;
&lt;br /&gt;
=== Ресурс параллелизма алгоритма ===&lt;br /&gt;
&lt;br /&gt;
Возможность параллельной реализации алгоритма появляется благодаря независимости вычисления каждого элемента результирующего вектора &amp;lt;math&amp;gt;y_i&amp;lt;/math&amp;gt;. Предположим, что имеется неограниченное число процессоров (теоретически, для максимальной эффективности требуется &amp;lt;math&amp;gt;n&amp;lt;/math&amp;gt; процессоров). Каждый процессор работает с одной строкой разреженной матрицы и хранит в памяти только те части массивов &lt;br /&gt;
&amp;lt;math&amp;gt; AJ &amp;lt;/math&amp;gt; и &amp;lt;math&amp;gt; A &amp;lt;/math&amp;gt;, которые соответствуют данной строке. Вектор &amp;lt;math&amp;gt; x &amp;lt;/math&amp;gt; хранится в памяти всех процессоров. Таким образом достигается экономия памяти (объем данных для i-ого процессора  &amp;lt;math&amp;gt; 2(AI_{i+1} - AI_i) + n &amp;lt;/math&amp;gt;). На данном процессоре выполняется &lt;br /&gt;
&amp;lt;math&amp;gt; AI_{i+1} - AI_i &amp;lt;/math&amp;gt; последовательных операций умножения и сложения. Число ярусов для i-ого процессора равно &amp;lt;math&amp;gt; AI_{i+1} - AI_i &amp;lt;/math&amp;gt;. Поскольку изначальная разреженная матрица имеет произвольную структуру, число ярусов на различных процессорах может быть различно. В худшем случае (если в строке все элементы ненулевые) число ярусов будет равно &amp;lt;math&amp;gt;n&amp;lt;/math&amp;gt;.  &lt;br /&gt;
&lt;br /&gt;
Таким образом, для алгоритма умножения разреженной матрицы на плотный вектор в параллельном варианте требуется последовательно выполнить:&lt;br /&gt;
&lt;br /&gt;
* не более чем &amp;lt;math&amp;gt;n&amp;lt;/math&amp;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;линейной&#039;&#039;.&lt;br /&gt;
&lt;br /&gt;
&#039;&#039;Замечание:&#039;&#039; если число процессоров &amp;lt;math&amp;gt;k&amp;lt;/math&amp;gt; меньше числа строк, но отношение &amp;lt;math&amp;gt;\frac{n}{k} = c&amp;lt;/math&amp;gt; является константой, то каждый процессор вычисляет &amp;lt;math&amp;gt;c&amp;lt;/math&amp;gt; элементов результирующего вектора, и число ярусов не более чем &amp;lt;math&amp;gt;cn&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; AI &amp;lt;/math&amp;gt; размерности &amp;lt;math&amp;gt; n+1 &amp;lt;/math&amp;gt;;&lt;br /&gt;
# вектор &amp;lt;math&amp;gt; AJ &amp;lt;/math&amp;gt; размерности &amp;lt;math&amp;gt; nnz &amp;lt;/math&amp;gt;;&lt;br /&gt;
# вектор &amp;lt;math&amp;gt; A &amp;lt;/math&amp;gt; размерности &amp;lt;math&amp;gt; nnz &amp;lt;/math&amp;gt;;&lt;br /&gt;
# вектор &amp;lt;math&amp;gt; x &amp;lt;/math&amp;gt; размерности &amp;lt;math&amp;gt; n &amp;lt;/math&amp;gt;.&lt;br /&gt;
&lt;br /&gt;
Суммарная размерность входных данных: &amp;lt;math&amp;gt; 2(nnz + n) + 1 &amp;lt;/math&amp;gt;&lt;br /&gt;
&lt;br /&gt;
Выходными данными является&lt;br /&gt;
# вектор &amp;lt;math&amp;gt; y &amp;lt;/math&amp;gt; размерности &amp;lt;math&amp;gt; n &amp;lt;/math&amp;gt;.&lt;br /&gt;
&lt;br /&gt;
Объем выходных данных: &amp;lt;math&amp;gt; n &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;, число ненулевых элементов &amp;lt;math&amp;gt;nnz&amp;lt;/math&amp;gt;, для вычисления используется &amp;lt;math&amp;gt;k&amp;lt;/math&amp;gt; процессоров тогда: &lt;br /&gt;
&lt;br /&gt;
*Каждый процессор оперирует с &amp;lt;math&amp;gt;\frac{n}{k}&amp;lt;/math&amp;gt; строками, в каждой из которых примерно &amp;lt;math&amp;gt;\frac{nnz}{n}&amp;lt;/math&amp;gt; элементов. Параллельная сложность алгоритма - &amp;lt;math&amp;gt;O(\frac{nnz}{k})&amp;lt;/math&amp;gt;.&lt;br /&gt;
&lt;br /&gt;
*Вычислительная мощность алгоритма (отношение числа операций к суммарному объему входных и выходных данных) - &amp;lt;math&amp;gt;O(\frac{nnz}{2nnz + 3n}) = O(1)&amp;lt;/math&amp;gt; - для последовательного алгоритма; &amp;lt;math&amp;gt;O(\frac{nnz}{n} / (2\frac{nnz}{n} + n)) = O(1) &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;
Последовательная реализация имеется в пакете SPARSKIT [http://w3.pppl.gov/~hammett/work/2006/gmres/SPARSKIT2/BLASSM/matvec.f], Python.Scipy [https://docs.scipy.org/doc/scipy-0.14.0/reference/generated/scipy.sparse.csr_matrix.html]&lt;br /&gt;
&lt;br /&gt;
Параллельный алгоритм реализован в библиотеке Matlab [http://citeseerx.ist.psu.edu/viewdoc/download?doi=10.1.1.83.6692&amp;amp;rep=rep1&amp;amp;type=pdf], Intel MKL [https://software.intel.com/en-us/node/468536#D09FB46A-B404-44CC-94ED-1C434C41B6E1]&lt;br /&gt;
&lt;br /&gt;
== Литература ==&lt;br /&gt;
[1] С. Писсанецки. Технология разреженных матриц. Изд. Мир, 1988.&lt;br /&gt;
&lt;br /&gt;
[2] В. В. Воеводин, Вл.В. Воеводин. Параллельные вычисления. – СПб.: БХВ - Петербург, 2002.&lt;/div&gt;</summary>
		<author><name>Екатерина Буторина</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:%D0%A0%D1%83%D1%84%D0%B8%D0%BD%D0%B0_%D0%A2%D1%80%D0%B5%D1%82%D1%8C%D1%8F%D0%BA%D0%BE%D0%B2%D0%B0/%D0%A5%D1%80%D0%B0%D0%BD%D0%B5%D0%BD%D0%B8%D0%B5_%D0%BD%D0%B5%D0%BD%D1%83%D0%BB%D0%B5%D0%B2%D1%8B%D1%85_%D1%8D%D0%BB%D0%B5%D0%BC%D0%B5%D0%BD%D1%82%D0%BE%D0%B2_%D1%80%D0%B0%D0%B7%D1%80%D0%B5%D0%B6%D0%B5%D0%BD%D0%BD%D1%8B%D1%85_%D0%BC%D0%B0%D1%82%D1%80%D0%B8%D1%86._%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=14247</id>
		<title>Участник:Руфина Третьякова/Хранение ненулевых элементов разреженных матриц. Умножение разреженной матрицы на вектор</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:%D0%A0%D1%83%D1%84%D0%B8%D0%BD%D0%B0_%D0%A2%D1%80%D0%B5%D1%82%D1%8C%D1%8F%D0%BA%D0%BE%D0%B2%D0%B0/%D0%A5%D1%80%D0%B0%D0%BD%D0%B5%D0%BD%D0%B8%D0%B5_%D0%BD%D0%B5%D0%BD%D1%83%D0%BB%D0%B5%D0%B2%D1%8B%D1%85_%D1%8D%D0%BB%D0%B5%D0%BC%D0%B5%D0%BD%D1%82%D0%BE%D0%B2_%D1%80%D0%B0%D0%B7%D1%80%D0%B5%D0%B6%D0%B5%D0%BD%D0%BD%D1%8B%D1%85_%D0%BC%D0%B0%D1%82%D1%80%D0%B8%D1%86._%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=14247"/>
		<updated>2016-10-27T18:45:00Z</updated>

		<summary type="html">&lt;p&gt;Екатерина Буторина: /* ЧАСТЬ. Свойства и структура алгоритма */&lt;/p&gt;
&lt;hr /&gt;
&lt;div&gt;{{algorithm&lt;br /&gt;
| name              = Умножение разреженной матрицы на вектор&lt;br /&gt;
| serial_complexity = &amp;lt;math&amp;gt;nnz&amp;lt;/math&amp;gt;&lt;br /&gt;
| pf_height         = &amp;lt;math&amp;gt;O(n)&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;2(nnz+n)+1&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;
Авторы статьи: [[Участница:Руфина_Третьякова|Третьякова Р. М.]] (группа 603), [[Участница:Екатерина_Буторина|Буторина Е. В.]] (группа 603)&lt;br /&gt;
&lt;br /&gt;
Руфина Третьякова отвечает за программную реализацию алгоритма, Екатерина Буторина - за написание статьи.&lt;br /&gt;
&lt;br /&gt;
&lt;br /&gt;
== Свойства и структура алгоритма ==&lt;br /&gt;
&lt;br /&gt;
=== Общее описание алгоритма ===&lt;br /&gt;
Разрежённая матрица — это матрица с преимущественно нулевыми элементами. В противном случае, если бо́льшая часть элементов матрицы ненулевые, матрица считается плотной.&lt;br /&gt;
Среди специалистов нет единства в определении того, какое именно количество ненулевых элементов делает матрицу разрежённой. Разные авторы предлагают различные варианты. &lt;br /&gt;
Огромные разрежённые матрицы часто возникают при решении таких задач, как дифференциальное уравнение в частных производных или операции с графами.&lt;br /&gt;
При хранении и преобразовании разрежённых матриц в компьютере бывает полезно, а часто и необходимо, использовать специальные алгоритмы и структуры данных, которые учитывают разрежённую структуру матрицы. Операции и алгоритмы, применяемые для работы с обычными, плотными матрицами, применительно к большим разрежённым матрицам работают относительно медленно и требуют значительных объёмов памяти. Однако разрежённые матрицы могут быть легко сжаты путём записи только своих ненулевых элементов, что снижает требования к компьютерной памяти.&lt;br /&gt;
Сложность операции с разреженными матрицами чаще всего определяется не их размером но числом ненулевых элементов. Далее будет показано, что умножение разреженной матрицы на плотный вектор можно произвести ровно за столько умножений сколько в матрице ненулевых элементов.&lt;br /&gt;
&lt;br /&gt;
=== Математическое описание алгоритма ===&lt;br /&gt;
Исходные данные:  разреженная матрица &amp;lt;math&amp;gt;M^{n*n}&amp;lt;/math&amp;gt;, вектор &amp;lt;math&amp;gt;x^n&amp;lt;/math&amp;gt; &lt;br /&gt;
&lt;br /&gt;
Наиболее удобным форматом для вычисления произведения матрицы на вектор является &amp;quot;Compressed Sparse Row&amp;quot; или сокращенно CSR-формат.&lt;br /&gt;
&lt;br /&gt;
Рассмотрим CSR-представление разреженной матрицы: пусть число ненулевых элементов матрицы равно &amp;lt;math&amp;gt;nnz&amp;lt;/math&amp;gt;&lt;br /&gt;
CSR-формат представляет матрицу &amp;lt;math&amp;gt;M&amp;lt;/math&amp;gt; в виде 3-х одномерных массивов:&lt;br /&gt;
&lt;br /&gt;
массив &amp;lt;math&amp;gt;A&amp;lt;/math&amp;gt; размера &amp;lt;math&amp;gt;nnz&amp;lt;/math&amp;gt; содержит ненулевые значения матрицы,&lt;br /&gt;
&amp;lt;math&amp;gt;JA&amp;lt;/math&amp;gt; размера &amp;lt;math&amp;gt;nnz&amp;lt;/math&amp;gt; - номера столбцов ненулевых элементов., &lt;br /&gt;
&amp;lt;math&amp;gt;IA&amp;lt;/math&amp;gt; размера &amp;lt;math&amp;gt;n&amp;lt;/math&amp;gt;- содержит номер с которого начинается описание элементов строки в массивах &amp;lt;math&amp;gt;A&amp;lt;/math&amp;gt; и &amp;lt;math&amp;gt;JA&amp;lt;/math&amp;gt;.&lt;br /&gt;
&lt;br /&gt;
Этот формат позволяет производить перемножение матрицы &amp;lt;math&amp;gt;M&amp;lt;/math&amp;gt; на вектор &amp;lt;math&amp;gt;x&amp;lt;/math&amp;gt; за &amp;lt;math&amp;gt;O(nnz)&amp;lt;/math&amp;gt; умножений и сложений. &lt;br /&gt;
Если при умножении плотной матрицы на вектор каждый элемент результата определяется по формуле &lt;br /&gt;
&amp;lt;math&amp;gt;y_i = \sum_{k = 1}^{n} A_{ik} x_k&amp;lt;/math&amp;gt;, &lt;br /&gt;
то в случае разреженной матрицы достаточно выполнять умножения только для ненулевых элементов &amp;lt;math&amp;gt;A_ik&amp;lt;/math&amp;gt;, которые хранятся в массиве &amp;lt;math&amp;gt;A&amp;lt;/math&amp;gt; в части соответствующей строке &amp;lt;math&amp;gt;i&amp;lt;/math&amp;gt; (элементы с индексами от &amp;lt;math&amp;gt;IA_i&amp;lt;/math&amp;gt; до &amp;lt;math&amp;gt;IA_{i+1}&amp;lt;/math&amp;gt;). Необходимо также знать на какой элемент вектора должен быть домножен данный ненулевой элемент массива, то есть нужен столбцовый индекс каждого элемента &amp;lt;math&amp;gt;A&amp;lt;/math&amp;gt;. Для этого используется массив &amp;lt;math&amp;gt;JA&amp;lt;/math&amp;gt;. Таким образом, каждый элемент итогового вектора определятся формулой&lt;br /&gt;
:&amp;lt;math&amp;gt;y_i = \sum_{k = IA_i}^{IA_{i+1}} A_k x_{JA_k}&amp;lt;/math&amp;gt;&lt;br /&gt;
Нетрудно заметить, что общее число операций умножения равно числу элементов &amp;lt;math&amp;gt;A&amp;lt;/math&amp;gt;, то есть числу ненулевых элементов разреженной матрицы.&lt;br /&gt;
&lt;br /&gt;
Например, это разреженная матрица с 4-мя ненулевыми элементами&lt;br /&gt;
:: &amp;lt;math&amp;gt;\begin{pmatrix}&lt;br /&gt;
0 &amp;amp; 0 &amp;amp; 0 &amp;amp; 0 \\&lt;br /&gt;
2 &amp;amp; 0 &amp;amp; 0 &amp;amp; 1 \\&lt;br /&gt;
0 &amp;amp; 0 &amp;amp; 3 &amp;amp; 0 \\&lt;br /&gt;
0 &amp;amp; 4 &amp;amp; 0 &amp;amp; 0 \\&lt;br /&gt;
\end{pmatrix}&amp;lt;/math&amp;gt;,&lt;br /&gt;
представляемая в формате CSR &lt;br /&gt;
    A  = [ 2 1 3 4 ]&lt;br /&gt;
    IA = [ 0 0 2 3 4 ]&lt;br /&gt;
    JA = [ 0 3 2 1 ]&lt;br /&gt;
домножим ее на вектор&lt;br /&gt;
    x  = [ 5 6 7 8 ]&lt;br /&gt;
получим&lt;br /&gt;
    y[0] = 0&lt;br /&gt;
    y[1] = a[0]*x[0] + a[1]*x[3] = 18&lt;br /&gt;
    y[2] = a[2]*x[2] = 21&lt;br /&gt;
    y[3] = a[3]*x[1] = 24 &lt;br /&gt;
&lt;br /&gt;
Алгоритм умножения матрицы на вектор полностью детерминирован и не зависит от порядка хранения элементов принадлежащих одной строке.&lt;br /&gt;
&lt;br /&gt;
=== Вычислительное ядро алгоритма ===&lt;br /&gt;
Вычислительным ядром алгоритма является формула умножения разреженной матрицы на плотный вектор:&lt;br /&gt;
:&amp;lt;math&amp;gt;y_i = \sum_{k = IA_i}^{IA_{i+1}} A_k x_{JA_k}&amp;lt;/math&amp;gt;&lt;br /&gt;
для всех &amp;lt;math&amp;gt;i = 1,n&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;
    число строк матрицы &#039;&#039;n&#039;&#039;; &lt;br /&gt;
    разреженная матрица в формате CSR:&lt;br /&gt;
      строчные указатели &#039;&#039;IA&#039;&#039;,&lt;br /&gt;
      столбцовые указатели&#039;&#039;JA&#039;&#039;, &lt;br /&gt;
      ненулевые элементы &#039;&#039;A&#039;&#039;;&lt;br /&gt;
    вектор &#039;&#039;x&#039;&#039;.&lt;br /&gt;
  &#039;&#039;&#039;Выходные данные&#039;&#039;&#039;: произведение матрицы на вектор &#039;&#039;y&#039;&#039;.&lt;br /&gt;
  &#039;&#039;&#039;read CSR&#039;&#039;&#039; &#039;&#039;n&#039;&#039;, &#039;&#039;IA&#039;&#039;, &#039;&#039;JA&#039;&#039;, &#039;&#039;A&#039;&#039;;&lt;br /&gt;
  &#039;&#039;&#039;read&#039;&#039;&#039; &#039;&#039;x&#039;&#039;&lt;br /&gt;
  &#039;&#039;&#039;for&#039;&#039;&#039; &#039;&#039;i&#039;&#039; = 1,n:&lt;br /&gt;
    &#039;&#039;&#039;for&#039;&#039;&#039; &#039;&#039;k&#039;&#039; = &#039;&#039;IA(i)&#039;&#039;, &#039;&#039;IA(i+1)-1&#039;&#039;:&lt;br /&gt;
            &#039;&#039;y(i)&#039;&#039; += &#039;&#039;A(k)&#039;&#039;*&#039;&#039;x(JA(k))&#039;&#039;;&lt;br /&gt;
  &#039;&#039;&#039;write&#039;&#039;&#039; &#039;&#039;y&#039;&#039;;&lt;br /&gt;
&lt;br /&gt;
=== Схема реализации последовательного алгоритма ===&lt;br /&gt;
Метод можно описать следующим образом:&lt;br /&gt;
# привести матрицу &amp;lt;math&amp;gt;M&amp;lt;/math&amp;gt; к формату CSR&lt;br /&gt;
# для &amp;lt;math&amp;gt;i&amp;lt;/math&amp;gt; от &amp;lt;math&amp;gt;0&amp;lt;/math&amp;gt; до &amp;lt;math&amp;gt;n-1&amp;lt;/math&amp;gt; вычислить &amp;lt;math&amp;gt;y_i&amp;lt;/math&amp;gt; по формуле &amp;lt;math&amp;gt;y_i = \sum_{k = IA_i}^{IA_{i+1}} A_k x_{JA_k}&amp;lt;/math&amp;gt;&lt;br /&gt;
&lt;br /&gt;
=== Последовательная сложность алгоритма ===&lt;br /&gt;
Для вычисления матрично-векторного произведения матрицы размера &amp;lt;math&amp;gt;n*n&amp;lt;/math&amp;gt; и вектора размера n в последовательном варианте требуется:&lt;br /&gt;
&lt;br /&gt;
* &amp;lt;math&amp;gt;nnz&amp;lt;/math&amp;gt; сложений,&lt;br /&gt;
* &amp;lt;math&amp;gt;nnz&amp;lt;/math&amp;gt; умножений.&lt;br /&gt;
&lt;br /&gt;
=== Информационный граф ===&lt;br /&gt;
&lt;br /&gt;
Для того чтобы построить информационный граф рассмотрим процесс вычисления значения одного элемента результирующего вектора &amp;lt;math&amp;gt;y_i&amp;lt;/math&amp;gt;. Число последовательных ярусов равно числу последовательных операций -- &amp;lt;math&amp;gt; AI_{i+1} - AI_i &amp;lt;/math&amp;gt; (в данном случае умножение и сложение будем считать за одну операцию).&lt;br /&gt;
Если же вычисления всех &amp;lt;math&amp;gt;y_i&amp;lt;/math&amp;gt; производить параллельно, на каждом ярусе будет производиться &amp;lt;math&amp;gt;n&amp;lt;/math&amp;gt; операций.&lt;br /&gt;
&lt;br /&gt;
&lt;br /&gt;
[[Файл:1111.jpg|800x800px|center|thumb|Информационный граф алгоритма умножения разреженной матрицы на плотный вектор &lt;br /&gt;
(Рисунок составлен самостоятельно)]]&lt;br /&gt;
&lt;br /&gt;
=== Ресурс параллелизма алгоритма ===&lt;br /&gt;
&lt;br /&gt;
Возможность параллельной реализации алгоритма появляется благодаря независимости вычисления каждого элемента результирующего вектора &amp;lt;math&amp;gt;y_i&amp;lt;/math&amp;gt;. Предположим, что имеется неограниченное число процессоров (теоретически, для максимальной эффективности требуется &amp;lt;math&amp;gt;n&amp;lt;/math&amp;gt; процессоров). Каждый процессор работает с одной строкой разреженной матрицы и хранит в памяти только те части массивов &lt;br /&gt;
&amp;lt;math&amp;gt; AJ &amp;lt;/math&amp;gt; и &amp;lt;math&amp;gt; A &amp;lt;/math&amp;gt;, которые соответствуют данной строке. Вектор &amp;lt;math&amp;gt; x &amp;lt;/math&amp;gt; хранится в памяти всех процессоров. Таким образом достигается экономия памяти (объем данных для i-ого процессора  &amp;lt;math&amp;gt; 2(AI_{i+1} - AI_i) + n &amp;lt;/math&amp;gt;). На данном процессоре выполняется &lt;br /&gt;
&amp;lt;math&amp;gt; AI_{i+1} - AI_i &amp;lt;/math&amp;gt; последовательных операций умножения и сложения. Число ярусов для i-ого процессора равно &amp;lt;math&amp;gt; AI_{i+1} - AI_i &amp;lt;/math&amp;gt;. Поскольку изначальная разреженная матрица имеет произвольную структуру, число ярусов на различных процессорах может быть различно. В худшем случае (если в строке все элементы ненулевые) число ярусов будет равно &amp;lt;math&amp;gt;n&amp;lt;/math&amp;gt;.  &lt;br /&gt;
&lt;br /&gt;
Таким образом, для алгоритма умножения разреженной матрицы на плотный вектор в параллельном варианте требуется последовательно выполнить:&lt;br /&gt;
&lt;br /&gt;
* не более чем &amp;lt;math&amp;gt;n&amp;lt;/math&amp;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;линейной&#039;&#039;.&lt;br /&gt;
&lt;br /&gt;
&#039;&#039;Замечание:&#039;&#039; если число процессоров &amp;lt;math&amp;gt;k&amp;lt;/math&amp;gt; меньше числа строк, но отношение &amp;lt;math&amp;gt;\frac{n}{k} = c&amp;lt;/math&amp;gt; является константой, то каждый процессор вычисляет &amp;lt;math&amp;gt;c&amp;lt;/math&amp;gt; элементов результирующего вектора, и число ярусов не более чем &amp;lt;math&amp;gt;cn&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; AI &amp;lt;/math&amp;gt; размерности &amp;lt;math&amp;gt; n+1 &amp;lt;/math&amp;gt;;&lt;br /&gt;
# вектор &amp;lt;math&amp;gt; AJ &amp;lt;/math&amp;gt; размерности &amp;lt;math&amp;gt; nnz &amp;lt;/math&amp;gt;;&lt;br /&gt;
# вектор &amp;lt;math&amp;gt; A &amp;lt;/math&amp;gt; размерности &amp;lt;math&amp;gt; nnz &amp;lt;/math&amp;gt;;&lt;br /&gt;
# вектор &amp;lt;math&amp;gt; x &amp;lt;/math&amp;gt; размерности &amp;lt;math&amp;gt; n &amp;lt;/math&amp;gt;.&lt;br /&gt;
&lt;br /&gt;
Суммарная размерность входных данных: &amp;lt;math&amp;gt; 2(nnz + n) + 1 &amp;lt;/math&amp;gt;&lt;br /&gt;
&lt;br /&gt;
Выходными данными является&lt;br /&gt;
# вектор &amp;lt;math&amp;gt; y &amp;lt;/math&amp;gt; размерности &amp;lt;math&amp;gt; n &amp;lt;/math&amp;gt;.&lt;br /&gt;
&lt;br /&gt;
Объем выходных данных: &amp;lt;math&amp;gt; n &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;, число ненулевых элементов &amp;lt;math&amp;gt;nnz&amp;lt;/math&amp;gt;, для вычисления используется &amp;lt;math&amp;gt;k&amp;lt;/math&amp;gt; процессоров тогда: &lt;br /&gt;
&lt;br /&gt;
*Каждый процессор оперирует с &amp;lt;math&amp;gt;\frac{n}{k}&amp;lt;/math&amp;gt; строками, в каждой из которых примерно &amp;lt;math&amp;gt;\frac{nnz}{n}&amp;lt;/math&amp;gt; элементов. Параллельная сложность алгоритма - &amp;lt;math&amp;gt;O(\frac{nnz}{k})&amp;lt;/math&amp;gt;.&lt;br /&gt;
&lt;br /&gt;
*Вычислительная мощность алгоритма (отношение числа операций к суммарному объему входных и выходных данных) - &amp;lt;math&amp;gt;O(\frac{nnz}{2nnz + 3n}) = O(1)&amp;lt;/math&amp;gt; - для последовательного алгоритма; &amp;lt;math&amp;gt;O(\frac{nnz}{n} / (2\frac{nnz}{n} + n)) = O(1) &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;
Последовательная реализация имеется в пакете SPARSKIT [http://w3.pppl.gov/~hammett/work/2006/gmres/SPARSKIT2/BLASSM/matvec.f], Python.Scipy [https://docs.scipy.org/doc/scipy-0.14.0/reference/generated/scipy.sparse.csr_matrix.html]&lt;br /&gt;
&lt;br /&gt;
Параллельный алгоритм реализован в библиотеке Matlab [http://citeseerx.ist.psu.edu/viewdoc/download?doi=10.1.1.83.6692&amp;amp;rep=rep1&amp;amp;type=pdf], Intel MKL [https://software.intel.com/en-us/node/468536#D09FB46A-B404-44CC-94ED-1C434C41B6E1]&lt;br /&gt;
&lt;br /&gt;
== Литература ==&lt;br /&gt;
[1] С. Писсанецки. Технология разреженных матриц. Изд. Мир, 1988.&lt;br /&gt;
&lt;br /&gt;
[2] В. В. Воеводин, Вл.В. Воеводин. Параллельные вычисления. – СПб.: БХВ - Петербург, 2002.&lt;/div&gt;</summary>
		<author><name>Екатерина Буторина</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:%D0%A0%D1%83%D1%84%D0%B8%D0%BD%D0%B0_%D0%A2%D1%80%D0%B5%D1%82%D1%8C%D1%8F%D0%BA%D0%BE%D0%B2%D0%B0/%D0%A5%D1%80%D0%B0%D0%BD%D0%B5%D0%BD%D0%B8%D0%B5_%D0%BD%D0%B5%D0%BD%D1%83%D0%BB%D0%B5%D0%B2%D1%8B%D1%85_%D1%8D%D0%BB%D0%B5%D0%BC%D0%B5%D0%BD%D1%82%D0%BE%D0%B2_%D1%80%D0%B0%D0%B7%D1%80%D0%B5%D0%B6%D0%B5%D0%BD%D0%BD%D1%8B%D1%85_%D0%BC%D0%B0%D1%82%D1%80%D0%B8%D1%86._%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=14246</id>
		<title>Участник:Руфина Третьякова/Хранение ненулевых элементов разреженных матриц. Умножение разреженной матрицы на вектор</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:%D0%A0%D1%83%D1%84%D0%B8%D0%BD%D0%B0_%D0%A2%D1%80%D0%B5%D1%82%D1%8C%D1%8F%D0%BA%D0%BE%D0%B2%D0%B0/%D0%A5%D1%80%D0%B0%D0%BD%D0%B5%D0%BD%D0%B8%D0%B5_%D0%BD%D0%B5%D0%BD%D1%83%D0%BB%D0%B5%D0%B2%D1%8B%D1%85_%D1%8D%D0%BB%D0%B5%D0%BC%D0%B5%D0%BD%D1%82%D0%BE%D0%B2_%D1%80%D0%B0%D0%B7%D1%80%D0%B5%D0%B6%D0%B5%D0%BD%D0%BD%D1%8B%D1%85_%D0%BC%D0%B0%D1%82%D1%80%D0%B8%D1%86._%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=14246"/>
		<updated>2016-10-27T18:43:38Z</updated>

		<summary type="html">&lt;p&gt;Екатерина Буторина: &lt;/p&gt;
&lt;hr /&gt;
&lt;div&gt;{{algorithm&lt;br /&gt;
| name              = Умножение разреженной матрицы на вектор&lt;br /&gt;
| serial_complexity = &amp;lt;math&amp;gt;nnz&amp;lt;/math&amp;gt;&lt;br /&gt;
| pf_height         = &amp;lt;math&amp;gt;O(n)&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;2(nnz+n)+1&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;
Авторы статьи: [[Участница:Руфина_Третьякова|Третьякова Р. М.]] (группа 603), [[Участница:Екатерина_Буторина|Буторина Е. В.]] (группа 603)&lt;br /&gt;
&lt;br /&gt;
Руфина Третьякова отвечает за программную реализацию алгоритма, Екатерина Буторина - за написание статьи.&lt;br /&gt;
&lt;br /&gt;
&lt;br /&gt;
== ЧАСТЬ. Свойства и структура алгоритма ==&lt;br /&gt;
&lt;br /&gt;
=== Общее описание алгоритма ===&lt;br /&gt;
Разрежённая матрица — это матрица с преимущественно нулевыми элементами. В противном случае, если бо́льшая часть элементов матрицы ненулевые, матрица считается плотной.&lt;br /&gt;
Среди специалистов нет единства в определении того, какое именно количество ненулевых элементов делает матрицу разрежённой. Разные авторы предлагают различные варианты. &lt;br /&gt;
Огромные разрежённые матрицы часто возникают при решении таких задач, как дифференциальное уравнение в частных производных или операции с графами.&lt;br /&gt;
При хранении и преобразовании разрежённых матриц в компьютере бывает полезно, а часто и необходимо, использовать специальные алгоритмы и структуры данных, которые учитывают разрежённую структуру матрицы. Операции и алгоритмы, применяемые для работы с обычными, плотными матрицами, применительно к большим разрежённым матрицам работают относительно медленно и требуют значительных объёмов памяти. Однако разрежённые матрицы могут быть легко сжаты путём записи только своих ненулевых элементов, что снижает требования к компьютерной памяти.&lt;br /&gt;
Сложность операции с разреженными матрицами чаще всего определяется не их размером но числом ненулевых элементов. Далее будет показано, что умножение разреженной матрицы на плотный вектор можно произвести ровно за столько умножений сколько в матрице ненулевых элементов.&lt;br /&gt;
&lt;br /&gt;
=== Математическое описание алгоритма ===&lt;br /&gt;
Исходные данные:  разреженная матрица &amp;lt;math&amp;gt;M^{n*n}&amp;lt;/math&amp;gt;, вектор &amp;lt;math&amp;gt;x^n&amp;lt;/math&amp;gt; &lt;br /&gt;
&lt;br /&gt;
Наиболее удобным форматом для вычисления произведения матрицы на вектор является &amp;quot;Compressed Sparse Row&amp;quot; или сокращенно CSR-формат.&lt;br /&gt;
&lt;br /&gt;
Рассмотрим CSR-представление разреженной матрицы: пусть число ненулевых элементов матрицы равно &amp;lt;math&amp;gt;nnz&amp;lt;/math&amp;gt;&lt;br /&gt;
CSR-формат представляет матрицу &amp;lt;math&amp;gt;M&amp;lt;/math&amp;gt; в виде 3-х одномерных массивов:&lt;br /&gt;
&lt;br /&gt;
массив &amp;lt;math&amp;gt;A&amp;lt;/math&amp;gt; размера &amp;lt;math&amp;gt;nnz&amp;lt;/math&amp;gt; содержит ненулевые значения матрицы,&lt;br /&gt;
&amp;lt;math&amp;gt;JA&amp;lt;/math&amp;gt; размера &amp;lt;math&amp;gt;nnz&amp;lt;/math&amp;gt; - номера столбцов ненулевых элементов., &lt;br /&gt;
&amp;lt;math&amp;gt;IA&amp;lt;/math&amp;gt; размера &amp;lt;math&amp;gt;n&amp;lt;/math&amp;gt;- содержит номер с которого начинается описание элементов строки в массивах &amp;lt;math&amp;gt;A&amp;lt;/math&amp;gt; и &amp;lt;math&amp;gt;JA&amp;lt;/math&amp;gt;.&lt;br /&gt;
&lt;br /&gt;
Этот формат позволяет производить перемножение матрицы &amp;lt;math&amp;gt;M&amp;lt;/math&amp;gt; на вектор &amp;lt;math&amp;gt;x&amp;lt;/math&amp;gt; за &amp;lt;math&amp;gt;O(nnz)&amp;lt;/math&amp;gt; умножений и сложений. &lt;br /&gt;
Если при умножении плотной матрицы на вектор каждый элемент результата определяется по формуле &lt;br /&gt;
&amp;lt;math&amp;gt;y_i = \sum_{k = 1}^{n} A_{ik} x_k&amp;lt;/math&amp;gt;, &lt;br /&gt;
то в случае разреженной матрицы достаточно выполнять умножения только для ненулевых элементов &amp;lt;math&amp;gt;A_ik&amp;lt;/math&amp;gt;, которые хранятся в массиве &amp;lt;math&amp;gt;A&amp;lt;/math&amp;gt; в части соответствующей строке &amp;lt;math&amp;gt;i&amp;lt;/math&amp;gt; (элементы с индексами от &amp;lt;math&amp;gt;IA_i&amp;lt;/math&amp;gt; до &amp;lt;math&amp;gt;IA_{i+1}&amp;lt;/math&amp;gt;). Необходимо также знать на какой элемент вектора должен быть домножен данный ненулевой элемент массива, то есть нужен столбцовый индекс каждого элемента &amp;lt;math&amp;gt;A&amp;lt;/math&amp;gt;. Для этого используется массив &amp;lt;math&amp;gt;JA&amp;lt;/math&amp;gt;. Таким образом, каждый элемент итогового вектора определятся формулой&lt;br /&gt;
:&amp;lt;math&amp;gt;y_i = \sum_{k = IA_i}^{IA_{i+1}} A_k x_{JA_k}&amp;lt;/math&amp;gt;&lt;br /&gt;
Нетрудно заметить, что общее число операций умножения равно числу элементов &amp;lt;math&amp;gt;A&amp;lt;/math&amp;gt;, то есть числу ненулевых элементов разреженной матрицы.&lt;br /&gt;
&lt;br /&gt;
Например, это разреженная матрица с 4-мя ненулевыми элементами&lt;br /&gt;
:: &amp;lt;math&amp;gt;\begin{pmatrix}&lt;br /&gt;
0 &amp;amp; 0 &amp;amp; 0 &amp;amp; 0 \\&lt;br /&gt;
2 &amp;amp; 0 &amp;amp; 0 &amp;amp; 1 \\&lt;br /&gt;
0 &amp;amp; 0 &amp;amp; 3 &amp;amp; 0 \\&lt;br /&gt;
0 &amp;amp; 4 &amp;amp; 0 &amp;amp; 0 \\&lt;br /&gt;
\end{pmatrix}&amp;lt;/math&amp;gt;,&lt;br /&gt;
представляемая в формате CSR &lt;br /&gt;
    A  = [ 2 1 3 4 ]&lt;br /&gt;
    IA = [ 0 0 2 3 4 ]&lt;br /&gt;
    JA = [ 0 3 2 1 ]&lt;br /&gt;
домножим ее на вектор&lt;br /&gt;
    x  = [ 5 6 7 8 ]&lt;br /&gt;
получим&lt;br /&gt;
    y[0] = 0&lt;br /&gt;
    y[1] = a[0]*x[0] + a[1]*x[3] = 18&lt;br /&gt;
    y[2] = a[2]*x[2] = 21&lt;br /&gt;
    y[3] = a[3]*x[1] = 24 &lt;br /&gt;
&lt;br /&gt;
Алгоритм умножения матрицы на вектор полностью детерминирован и не зависит от порядка хранения элементов принадлежащих одной строке.&lt;br /&gt;
&lt;br /&gt;
=== Вычислительное ядро алгоритма ===&lt;br /&gt;
Вычислительным ядром алгоритма является формула умножения разреженной матрицы на плотный вектор:&lt;br /&gt;
:&amp;lt;math&amp;gt;y_i = \sum_{k = IA_i}^{IA_{i+1}} A_k x_{JA_k}&amp;lt;/math&amp;gt;&lt;br /&gt;
для всех &amp;lt;math&amp;gt;i = 1,n&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;
    число строк матрицы &#039;&#039;n&#039;&#039;; &lt;br /&gt;
    разреженная матрица в формате CSR:&lt;br /&gt;
      строчные указатели &#039;&#039;IA&#039;&#039;,&lt;br /&gt;
      столбцовые указатели&#039;&#039;JA&#039;&#039;, &lt;br /&gt;
      ненулевые элементы &#039;&#039;A&#039;&#039;;&lt;br /&gt;
    вектор &#039;&#039;x&#039;&#039;.&lt;br /&gt;
  &#039;&#039;&#039;Выходные данные&#039;&#039;&#039;: произведение матрицы на вектор &#039;&#039;y&#039;&#039;.&lt;br /&gt;
  &#039;&#039;&#039;read CSR&#039;&#039;&#039; &#039;&#039;n&#039;&#039;, &#039;&#039;IA&#039;&#039;, &#039;&#039;JA&#039;&#039;, &#039;&#039;A&#039;&#039;;&lt;br /&gt;
  &#039;&#039;&#039;read&#039;&#039;&#039; &#039;&#039;x&#039;&#039;&lt;br /&gt;
  &#039;&#039;&#039;for&#039;&#039;&#039; &#039;&#039;i&#039;&#039; = 1,n:&lt;br /&gt;
    &#039;&#039;&#039;for&#039;&#039;&#039; &#039;&#039;k&#039;&#039; = &#039;&#039;IA(i)&#039;&#039;, &#039;&#039;IA(i+1)-1&#039;&#039;:&lt;br /&gt;
            &#039;&#039;y(i)&#039;&#039; += &#039;&#039;A(k)&#039;&#039;*&#039;&#039;x(JA(k))&#039;&#039;;&lt;br /&gt;
  &#039;&#039;&#039;write&#039;&#039;&#039; &#039;&#039;y&#039;&#039;;&lt;br /&gt;
&lt;br /&gt;
=== Схема реализации последовательного алгоритма ===&lt;br /&gt;
Метод можно описать следующим образом:&lt;br /&gt;
# привести матрицу &amp;lt;math&amp;gt;M&amp;lt;/math&amp;gt; к формату CSR&lt;br /&gt;
# для &amp;lt;math&amp;gt;i&amp;lt;/math&amp;gt; от &amp;lt;math&amp;gt;0&amp;lt;/math&amp;gt; до &amp;lt;math&amp;gt;n-1&amp;lt;/math&amp;gt; вычислить &amp;lt;math&amp;gt;y_i&amp;lt;/math&amp;gt; по формуле &amp;lt;math&amp;gt;y_i = \sum_{k = IA_i}^{IA_{i+1}} A_k x_{JA_k}&amp;lt;/math&amp;gt;&lt;br /&gt;
&lt;br /&gt;
=== Последовательная сложность алгоритма ===&lt;br /&gt;
Для вычисления матрично-векторного произведения матрицы размера &amp;lt;math&amp;gt;n*n&amp;lt;/math&amp;gt; и вектора размера n в последовательном варианте требуется:&lt;br /&gt;
&lt;br /&gt;
* &amp;lt;math&amp;gt;nnz&amp;lt;/math&amp;gt; сложений,&lt;br /&gt;
* &amp;lt;math&amp;gt;nnz&amp;lt;/math&amp;gt; умножений.&lt;br /&gt;
&lt;br /&gt;
=== Информационный граф ===&lt;br /&gt;
&lt;br /&gt;
Для того чтобы построить информационный граф рассмотрим процесс вычисления значения одного элемента результирующего вектора &amp;lt;math&amp;gt;y_i&amp;lt;/math&amp;gt;. Число последовательных ярусов равно числу последовательных операций -- &amp;lt;math&amp;gt; AI_{i+1} - AI_i &amp;lt;/math&amp;gt; (в данном случае умножение и сложение будем считать за одну операцию).&lt;br /&gt;
Если же вычисления всех &amp;lt;math&amp;gt;y_i&amp;lt;/math&amp;gt; производить параллельно, на каждом ярусе будет производиться &amp;lt;math&amp;gt;n&amp;lt;/math&amp;gt; операций.&lt;br /&gt;
&lt;br /&gt;
&lt;br /&gt;
[[Файл:1111.jpg|800x800px|center|thumb|Информационный граф алгоритма умножения разреженной матрицы на плотный вектор &lt;br /&gt;
(Рисунок составлен самостоятельно)]]&lt;br /&gt;
&lt;br /&gt;
=== Ресурс параллелизма алгоритма ===&lt;br /&gt;
&lt;br /&gt;
Возможность параллельной реализации алгоритма появляется благодаря независимости вычисления каждого элемента результирующего вектора &amp;lt;math&amp;gt;y_i&amp;lt;/math&amp;gt;. Предположим, что имеется неограниченное число процессоров (теоретически, для максимальной эффективности требуется &amp;lt;math&amp;gt;n&amp;lt;/math&amp;gt; процессоров). Каждый процессор работает с одной строкой разреженной матрицы и хранит в памяти только те части массивов &lt;br /&gt;
&amp;lt;math&amp;gt; AJ &amp;lt;/math&amp;gt; и &amp;lt;math&amp;gt; A &amp;lt;/math&amp;gt;, которые соответствуют данной строке. Вектор &amp;lt;math&amp;gt; x &amp;lt;/math&amp;gt; хранится в памяти всех процессоров. Таким образом достигается экономия памяти (объем данных для i-ого процессора  &amp;lt;math&amp;gt; 2(AI_{i+1} - AI_i) + n &amp;lt;/math&amp;gt;). На данном процессоре выполняется &lt;br /&gt;
&amp;lt;math&amp;gt; AI_{i+1} - AI_i &amp;lt;/math&amp;gt; последовательных операций умножения и сложения. Число ярусов для i-ого процессора равно &amp;lt;math&amp;gt; AI_{i+1} - AI_i &amp;lt;/math&amp;gt;. Поскольку изначальная разреженная матрица имеет произвольную структуру, число ярусов на различных процессорах может быть различно. В худшем случае (если в строке все элементы ненулевые) число ярусов будет равно &amp;lt;math&amp;gt;n&amp;lt;/math&amp;gt;.  &lt;br /&gt;
&lt;br /&gt;
Таким образом, для алгоритма умножения разреженной матрицы на плотный вектор в параллельном варианте требуется последовательно выполнить:&lt;br /&gt;
&lt;br /&gt;
* не более чем &amp;lt;math&amp;gt;n&amp;lt;/math&amp;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;линейной&#039;&#039;.&lt;br /&gt;
&lt;br /&gt;
&#039;&#039;Замечание:&#039;&#039; если число процессоров &amp;lt;math&amp;gt;k&amp;lt;/math&amp;gt; меньше числа строк, но отношение &amp;lt;math&amp;gt;\frac{n}{k} = c&amp;lt;/math&amp;gt; является константой, то каждый процессор вычисляет &amp;lt;math&amp;gt;c&amp;lt;/math&amp;gt; элементов результирующего вектора, и число ярусов не более чем &amp;lt;math&amp;gt;cn&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; AI &amp;lt;/math&amp;gt; размерности &amp;lt;math&amp;gt; n+1 &amp;lt;/math&amp;gt;;&lt;br /&gt;
# вектор &amp;lt;math&amp;gt; AJ &amp;lt;/math&amp;gt; размерности &amp;lt;math&amp;gt; nnz &amp;lt;/math&amp;gt;;&lt;br /&gt;
# вектор &amp;lt;math&amp;gt; A &amp;lt;/math&amp;gt; размерности &amp;lt;math&amp;gt; nnz &amp;lt;/math&amp;gt;;&lt;br /&gt;
# вектор &amp;lt;math&amp;gt; x &amp;lt;/math&amp;gt; размерности &amp;lt;math&amp;gt; n &amp;lt;/math&amp;gt;.&lt;br /&gt;
&lt;br /&gt;
Суммарная размерность входных данных: &amp;lt;math&amp;gt; 2(nnz + n) + 1 &amp;lt;/math&amp;gt;&lt;br /&gt;
&lt;br /&gt;
Выходными данными является&lt;br /&gt;
# вектор &amp;lt;math&amp;gt; y &amp;lt;/math&amp;gt; размерности &amp;lt;math&amp;gt; n &amp;lt;/math&amp;gt;.&lt;br /&gt;
&lt;br /&gt;
Объем выходных данных: &amp;lt;math&amp;gt; n &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;, число ненулевых элементов &amp;lt;math&amp;gt;nnz&amp;lt;/math&amp;gt;, для вычисления используется &amp;lt;math&amp;gt;k&amp;lt;/math&amp;gt; процессоров тогда: &lt;br /&gt;
&lt;br /&gt;
*Каждый процессор оперирует с &amp;lt;math&amp;gt;\frac{n}{k}&amp;lt;/math&amp;gt; строками, в каждой из которых примерно &amp;lt;math&amp;gt;\frac{nnz}{n}&amp;lt;/math&amp;gt; элементов. Параллельная сложность алгоритма - &amp;lt;math&amp;gt;O(\frac{nnz}{k})&amp;lt;/math&amp;gt;.&lt;br /&gt;
&lt;br /&gt;
*Вычислительная мощность алгоритма (отношение числа операций к суммарному объему входных и выходных данных) - &amp;lt;math&amp;gt;O(\frac{nnz}{2nnz + 3n}) = O(1)&amp;lt;/math&amp;gt; - для последовательного алгоритма; &amp;lt;math&amp;gt;O(\frac{nnz}{n} / (2\frac{nnz}{n} + n)) = O(1) &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;
Последовательная реализация имеется в пакете SPARSKIT [http://w3.pppl.gov/~hammett/work/2006/gmres/SPARSKIT2/BLASSM/matvec.f], Python.Scipy [https://docs.scipy.org/doc/scipy-0.14.0/reference/generated/scipy.sparse.csr_matrix.html]&lt;br /&gt;
&lt;br /&gt;
Параллельный алгоритм реализован в библиотеке Matlab [http://citeseerx.ist.psu.edu/viewdoc/download?doi=10.1.1.83.6692&amp;amp;rep=rep1&amp;amp;type=pdf], Intel MKL [https://software.intel.com/en-us/node/468536#D09FB46A-B404-44CC-94ED-1C434C41B6E1]&lt;br /&gt;
&lt;br /&gt;
== Литература ==&lt;br /&gt;
[1] С. Писсанецки. Технология разреженных матриц. Изд. Мир, 1988.&lt;br /&gt;
&lt;br /&gt;
[2] В. В. Воеводин, Вл.В. Воеводин. Параллельные вычисления. – СПб.: БХВ - Петербург, 2002.&lt;/div&gt;</summary>
		<author><name>Екатерина Буторина</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:%D0%A0%D1%83%D1%84%D0%B8%D0%BD%D0%B0_%D0%A2%D1%80%D0%B5%D1%82%D1%8C%D1%8F%D0%BA%D0%BE%D0%B2%D0%B0/%D0%A5%D1%80%D0%B0%D0%BD%D0%B5%D0%BD%D0%B8%D0%B5_%D0%BD%D0%B5%D0%BD%D1%83%D0%BB%D0%B5%D0%B2%D1%8B%D1%85_%D1%8D%D0%BB%D0%B5%D0%BC%D0%B5%D0%BD%D1%82%D0%BE%D0%B2_%D1%80%D0%B0%D0%B7%D1%80%D0%B5%D0%B6%D0%B5%D0%BD%D0%BD%D1%8B%D1%85_%D0%BC%D0%B0%D1%82%D1%80%D0%B8%D1%86._%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=8085</id>
		<title>Участник:Руфина Третьякова/Хранение ненулевых элементов разреженных матриц. Умножение разреженной матрицы на вектор</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:%D0%A0%D1%83%D1%84%D0%B8%D0%BD%D0%B0_%D0%A2%D1%80%D0%B5%D1%82%D1%8C%D1%8F%D0%BA%D0%BE%D0%B2%D0%B0/%D0%A5%D1%80%D0%B0%D0%BD%D0%B5%D0%BD%D0%B8%D0%B5_%D0%BD%D0%B5%D0%BD%D1%83%D0%BB%D0%B5%D0%B2%D1%8B%D1%85_%D1%8D%D0%BB%D0%B5%D0%BC%D0%B5%D0%BD%D1%82%D0%BE%D0%B2_%D1%80%D0%B0%D0%B7%D1%80%D0%B5%D0%B6%D0%B5%D0%BD%D0%BD%D1%8B%D1%85_%D0%BC%D0%B0%D1%82%D1%80%D0%B8%D1%86._%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=8085"/>
		<updated>2016-10-14T20:06:22Z</updated>

		<summary type="html">&lt;p&gt;Екатерина Буторина: &lt;/p&gt;
&lt;hr /&gt;
&lt;div&gt;{{Assignment}}&lt;br /&gt;
{{algorithm&lt;br /&gt;
| name              = Умножение разреженной матрицы на вектор&lt;br /&gt;
| serial_complexity = &amp;lt;math&amp;gt;nnz&amp;lt;/math&amp;gt;&lt;br /&gt;
| pf_height         = &amp;lt;math&amp;gt;O(n)&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;2(nnz+n)+1&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;
Авторы статьи: [[Участница:Руфина_Третьякова|Третьякова Р. М.]] (группа 603), [[Участница:Екатерина_Буторина|Буторина Е. В.]] (группа 603)&lt;br /&gt;
&lt;br /&gt;
&lt;br /&gt;
&lt;br /&gt;
== Свойства и структура алгоритма ==&lt;br /&gt;
&lt;br /&gt;
=== Общее описание алгоритма ===&lt;br /&gt;
Разрежённая матрица — это матрица с преимущественно нулевыми элементами. В противном случае, если бо́льшая часть элементов матрицы ненулевые, матрица считается плотной.&lt;br /&gt;
Среди специалистов нет единства в определении того, какое именно количество ненулевых элементов делает матрицу разрежённой. Разные авторы предлагают различные варианты. &lt;br /&gt;
Огромные разрежённые матрицы часто возникают при решении таких задач, как дифференциальное уравнение в частных производных или операции с графами.&lt;br /&gt;
При хранении и преобразовании разрежённых матриц в компьютере бывает полезно, а часто и необходимо, использовать специальные алгоритмы и структуры данных, которые учитывают разрежённую структуру матрицы. Операции и алгоритмы, применяемые для работы с обычными, плотными матрицами, применительно к большим разрежённым матрицам работают относительно медленно и требуют значительных объёмов памяти. Однако разрежённые матрицы могут быть легко сжаты путём записи только своих ненулевых элементов, что снижает требования к компьютерной памяти.&lt;br /&gt;
Сложность операции с разреженными матрицами чаще всего определяется не их размером но числом ненулевых элементов. Далее будет показано, что умножение разреженной матрицы на плотный вектор можно произвести ровно за столько умножений сколько в матрице ненулевых элементов.&lt;br /&gt;
&lt;br /&gt;
=== Математическое описание алгоритма ===&lt;br /&gt;
Исходные данные:  разреженная матрица &amp;lt;math&amp;gt;M^{n*n}&amp;lt;/math&amp;gt;, вектор &amp;lt;math&amp;gt;x^n&amp;lt;/math&amp;gt; &lt;br /&gt;
&lt;br /&gt;
Наиболее удобным форматом для вычисления произведения матрицы на вектор является &amp;quot;Compressed Sparse Row&amp;quot; или сокращенно CSR-формат.&lt;br /&gt;
&lt;br /&gt;
Рассмотрим CSR-представление разреженной матрицы: пусть число ненулевых элементов матрицы равно &amp;lt;math&amp;gt;nnz&amp;lt;/math&amp;gt;&lt;br /&gt;
CSR-формат представляет матрицу &amp;lt;math&amp;gt;M&amp;lt;/math&amp;gt; в виде 3-х одномерных массивов:&lt;br /&gt;
&lt;br /&gt;
массив &amp;lt;math&amp;gt;A&amp;lt;/math&amp;gt; размера &amp;lt;math&amp;gt;nnz&amp;lt;/math&amp;gt; содержит ненулевые значения матрицы,&lt;br /&gt;
&amp;lt;math&amp;gt;JA&amp;lt;/math&amp;gt; размера &amp;lt;math&amp;gt;nnz&amp;lt;/math&amp;gt; - номера столбцов ненулевых элементов., &lt;br /&gt;
&amp;lt;math&amp;gt;IA&amp;lt;/math&amp;gt; размера &amp;lt;math&amp;gt;n&amp;lt;/math&amp;gt;- содержит номер с которого начинается описание элементов строки в массивах &amp;lt;math&amp;gt;A&amp;lt;/math&amp;gt; и &amp;lt;math&amp;gt;JA&amp;lt;/math&amp;gt;.&lt;br /&gt;
&lt;br /&gt;
Этот формат позволяет производить перемножение матрицы &amp;lt;math&amp;gt;M&amp;lt;/math&amp;gt; на вектор &amp;lt;math&amp;gt;x&amp;lt;/math&amp;gt; за &amp;lt;math&amp;gt;O(nnz)&amp;lt;/math&amp;gt; умножений и сложений. &lt;br /&gt;
Если при умножении плотной матрицы на вектор каждый элемент результата определяется по формуле &lt;br /&gt;
&amp;lt;math&amp;gt;y_i = \sum_{k = 1}^{n} A_{ik} x_k&amp;lt;/math&amp;gt;, &lt;br /&gt;
то в случае разреженной матрицы достаточно выполнять умножения только для ненулевых элементов &amp;lt;math&amp;gt;A_ik&amp;lt;/math&amp;gt;, которые хранятся в массиве &amp;lt;math&amp;gt;A&amp;lt;/math&amp;gt; в части соответствующей строке &amp;lt;math&amp;gt;i&amp;lt;/math&amp;gt; (элементы с индексами от &amp;lt;math&amp;gt;IA_i&amp;lt;/math&amp;gt; до &amp;lt;math&amp;gt;IA_{i+1}&amp;lt;/math&amp;gt;). Необходимо также знать на какой элемент вектора должен быть домножен данный ненулевой элемент массива, то есть нужен столбцовый индекс каждого элемента &amp;lt;math&amp;gt;A&amp;lt;/math&amp;gt;. Для этого используется массив &amp;lt;math&amp;gt;JA&amp;lt;/math&amp;gt;. Таким образом, каждый элемент итогового вектора определятся формулой&lt;br /&gt;
:&amp;lt;math&amp;gt;y_i = \sum_{k = IA_i}^{IA_{i+1}} A_k x_{JA_k}&amp;lt;/math&amp;gt;&lt;br /&gt;
Нетрудно заметить, что общее число операций умножения равно числу элементов &amp;lt;math&amp;gt;A&amp;lt;/math&amp;gt;, то есть числу ненулевых элементов разреженной матрицы.&lt;br /&gt;
&lt;br /&gt;
Например, это разреженная матрица с 4-мя ненулевыми элементами&lt;br /&gt;
:: &amp;lt;math&amp;gt;\begin{pmatrix}&lt;br /&gt;
0 &amp;amp; 0 &amp;amp; 0 &amp;amp; 0 \\&lt;br /&gt;
2 &amp;amp; 0 &amp;amp; 0 &amp;amp; 1 \\&lt;br /&gt;
0 &amp;amp; 0 &amp;amp; 3 &amp;amp; 0 \\&lt;br /&gt;
0 &amp;amp; 4 &amp;amp; 0 &amp;amp; 0 \\&lt;br /&gt;
\end{pmatrix}&amp;lt;/math&amp;gt;,&lt;br /&gt;
представляемая в формате CSR &lt;br /&gt;
    A  = [ 2 1 3 4 ]&lt;br /&gt;
    IA = [ 0 0 2 3 4 ]&lt;br /&gt;
    JA = [ 0 3 2 1 ]&lt;br /&gt;
домножим ее на вектор&lt;br /&gt;
    x  = [ 5 6 7 8 ]&lt;br /&gt;
получим&lt;br /&gt;
    y[0] = 0&lt;br /&gt;
    y[1] = a[0]*x[0] + a[1]*x[3] = 18&lt;br /&gt;
    y[2] = a[2]*x[2] = 21&lt;br /&gt;
    y[3] = a[3]*x[1] = 24 &lt;br /&gt;
&lt;br /&gt;
Алгоритм умножения матрицы на вектор полностью детерминирован и не зависит от порядка хранения элементов принадлежащих одной строке.&lt;br /&gt;
&lt;br /&gt;
=== Вычислительное ядро алгоритма ===&lt;br /&gt;
Вычислительным ядром алгоритма является формула умножения разреженной матрицы на плотный вектор:&lt;br /&gt;
:&amp;lt;math&amp;gt;y_i = \sum_{k = IA_i}^{IA_{i+1}} A_k x_{JA_k}&amp;lt;/math&amp;gt;&lt;br /&gt;
для всех &amp;lt;math&amp;gt;i = 1,n&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;
    число строк матрицы &#039;&#039;n&#039;&#039;; &lt;br /&gt;
    разреженная матрица в формате CSR:&lt;br /&gt;
      строчные указатели &#039;&#039;IA&#039;&#039;,&lt;br /&gt;
      столбцовые указатели&#039;&#039;JA&#039;&#039;, &lt;br /&gt;
      ненулевые элементы &#039;&#039;A&#039;&#039;;&lt;br /&gt;
    вектор &#039;&#039;x&#039;&#039;.&lt;br /&gt;
  &#039;&#039;&#039;Выходные данные&#039;&#039;&#039;: произведение матрицы на вектор &#039;&#039;y&#039;&#039;.&lt;br /&gt;
  &#039;&#039;&#039;read CSR&#039;&#039;&#039; &#039;&#039;n&#039;&#039;, &#039;&#039;IA&#039;&#039;, &#039;&#039;JA&#039;&#039;, &#039;&#039;A&#039;&#039;;&lt;br /&gt;
  &#039;&#039;&#039;read&#039;&#039;&#039; &#039;&#039;x&#039;&#039;&lt;br /&gt;
  &#039;&#039;&#039;for&#039;&#039;&#039; &#039;&#039;i&#039;&#039; = 1,n:&lt;br /&gt;
    &#039;&#039;&#039;for&#039;&#039;&#039; &#039;&#039;k&#039;&#039; = &#039;&#039;IA(i)&#039;&#039;, &#039;&#039;IA(i+1)-1&#039;&#039;:&lt;br /&gt;
            &#039;&#039;y(i)&#039;&#039; += &#039;&#039;A(k)&#039;&#039;*&#039;&#039;x(JA(k))&#039;&#039;;&lt;br /&gt;
  &#039;&#039;&#039;write&#039;&#039;&#039; &#039;&#039;y&#039;&#039;;&lt;br /&gt;
&lt;br /&gt;
=== Схема реализации последовательного алгоритма ===&lt;br /&gt;
Метод можно описать следующим образом:&lt;br /&gt;
# привести матрицу &amp;lt;math&amp;gt;M&amp;lt;/math&amp;gt; к формату CSR&lt;br /&gt;
# для &amp;lt;math&amp;gt;i&amp;lt;/math&amp;gt; от &amp;lt;math&amp;gt;0&amp;lt;/math&amp;gt; до &amp;lt;math&amp;gt;n-1&amp;lt;/math&amp;gt; вычислить &amp;lt;math&amp;gt;y_i&amp;lt;/math&amp;gt; по формуле &amp;lt;math&amp;gt;y_i = \sum_{k = IA_i}^{IA_{i+1}} A_k x_{JA_k}&amp;lt;/math&amp;gt;&lt;br /&gt;
&lt;br /&gt;
=== Последовательная сложность алгоритма ===&lt;br /&gt;
Для вычисления матрично-векторного произведения матрицы размера &amp;lt;math&amp;gt;n*n&amp;lt;/math&amp;gt; и вектора размера n в последовательном варианте требуется:&lt;br /&gt;
&lt;br /&gt;
* &amp;lt;math&amp;gt;nnz&amp;lt;/math&amp;gt; сложений,&lt;br /&gt;
* &amp;lt;math&amp;gt;nnz&amp;lt;/math&amp;gt; умножений.&lt;br /&gt;
&lt;br /&gt;
=== Информационный граф ===&lt;br /&gt;
&lt;br /&gt;
Для того чтобы построить информационный граф рассмотрим процесс вычисления значения одного элемента результирующего вектора &amp;lt;math&amp;gt;y_i&amp;lt;/math&amp;gt;. Число последовательных ярусов равно числу последовательных операций -- &amp;lt;math&amp;gt; AI_{i+1} - AI_i &amp;lt;/math&amp;gt; (в данном случае умножение и сложение будем считать за одну операцию).&lt;br /&gt;
Если же вычисления всех &amp;lt;math&amp;gt;y_i&amp;lt;/math&amp;gt; производить параллельно, на каждом ярусе будет производиться &amp;lt;math&amp;gt;n&amp;lt;/math&amp;gt; операций.&lt;br /&gt;
&lt;br /&gt;
&lt;br /&gt;
[[Файл:1111.jpg|800x800px|center|thumb|Информационный граф алгоритма умножения разреженной матрицы на плотный вектор]]&lt;br /&gt;
&lt;br /&gt;
=== Ресурс параллелизма алгоритма ===&lt;br /&gt;
&lt;br /&gt;
Возможность параллельной реализации алгоритма появляется благодаря независимости вычисления каждого элемента результирующего вектора &amp;lt;math&amp;gt;y_i&amp;lt;/math&amp;gt;. Предположим, что имеется неограниченное число процессоров (теоретически, для максимальной эффективности требуется &amp;lt;math&amp;gt;n&amp;lt;/math&amp;gt; процессоров). Каждый процессор работает с одной строкой разреженной матрицы и хранит в памяти только те части массивов &lt;br /&gt;
&amp;lt;math&amp;gt; AJ &amp;lt;/math&amp;gt; и &amp;lt;math&amp;gt; A &amp;lt;/math&amp;gt;, которые соответствуют данной строке. Вектор &amp;lt;math&amp;gt; x &amp;lt;/math&amp;gt; хранится в памяти всех процессоров. Таким образом достигается экономия памяти (объем данных для i-ого процессора  &amp;lt;math&amp;gt; 2(AI_{i+1} - AI_i) + n &amp;lt;/math&amp;gt;). На данном процессоре выполняется &lt;br /&gt;
&amp;lt;math&amp;gt; AI_{i+1} - AI_i &amp;lt;/math&amp;gt; последовательных операций умножения и сложения. Число ярусов для i-ого процессора равно &amp;lt;math&amp;gt; AI_{i+1} - AI_i &amp;lt;/math&amp;gt;. Поскольку изначальная разреженная матрица имеет произвольную структуру, число ярусов на различных процессорах может быть различно. В худшем случае (если в строке все элементы ненулевые) число ярусов будет равно &amp;lt;math&amp;gt;n&amp;lt;/math&amp;gt;.  &lt;br /&gt;
&lt;br /&gt;
Таким образом, для алгоритма умножения разреженной матрицы на плотный вектор в параллельном варианте требуется последовательно выполнить:&lt;br /&gt;
&lt;br /&gt;
* не более чем &amp;lt;math&amp;gt;n&amp;lt;/math&amp;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;линейной&#039;&#039;.&lt;br /&gt;
&lt;br /&gt;
&#039;&#039;Замечание:&#039;&#039; если число процессоров &amp;lt;math&amp;gt;k&amp;lt;/math&amp;gt; меньше числа строк, но отношение &amp;lt;math&amp;gt;\frac{n}{k} = c&amp;lt;/math&amp;gt; является константой, то каждый процессор вычисляет &amp;lt;math&amp;gt;c&amp;lt;/math&amp;gt; элементов результирующего вектора, и число ярусов не более чем &amp;lt;math&amp;gt;cn&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; AI &amp;lt;/math&amp;gt; размерности &amp;lt;math&amp;gt; n+1 &amp;lt;/math&amp;gt;;&lt;br /&gt;
# вектор &amp;lt;math&amp;gt; AJ &amp;lt;/math&amp;gt; размерности &amp;lt;math&amp;gt; nnz &amp;lt;/math&amp;gt;;&lt;br /&gt;
# вектор &amp;lt;math&amp;gt; A &amp;lt;/math&amp;gt; размерности &amp;lt;math&amp;gt; nnz &amp;lt;/math&amp;gt;;&lt;br /&gt;
# вектор &amp;lt;math&amp;gt; x &amp;lt;/math&amp;gt; размерности &amp;lt;math&amp;gt; n &amp;lt;/math&amp;gt;.&lt;br /&gt;
&lt;br /&gt;
Суммарная размерность входных данных: &amp;lt;math&amp;gt; 2(nnz + n) + 1 &amp;lt;/math&amp;gt;&lt;br /&gt;
&lt;br /&gt;
Выходными данными является&lt;br /&gt;
# вектор &amp;lt;math&amp;gt; y &amp;lt;/math&amp;gt; размерности &amp;lt;math&amp;gt; n &amp;lt;/math&amp;gt;.&lt;br /&gt;
&lt;br /&gt;
Объем выходных данных: &amp;lt;math&amp;gt; n &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;, число ненулевых элементов &amp;lt;math&amp;gt;nnz&amp;lt;/math&amp;gt;, для вычисления используется &amp;lt;math&amp;gt;k&amp;lt;/math&amp;gt; процессоров тогда: &lt;br /&gt;
&lt;br /&gt;
*Каждый процессор оперирует с &amp;lt;math&amp;gt;\frac{n}{k}&amp;lt;/math&amp;gt; строками, в каждой из которых примерно &amp;lt;math&amp;gt;\frac{nnz}{n}&amp;lt;/math&amp;gt; элементов. Параллельная сложность алгоритма - &amp;lt;math&amp;gt;O(\frac{nnz}{k})&amp;lt;/math&amp;gt;.&lt;br /&gt;
&lt;br /&gt;
*Вычислительная мощность алгоритма (отношение числа операций к суммарному объему входных и выходных данных) - &amp;lt;math&amp;gt;O(\frac{nnz}{2nnz + 3n}) = O(1)&amp;lt;/math&amp;gt; - для последовательного алгоритма; &amp;lt;math&amp;gt;O(\frac{nnz}{n} / (2\frac{nnz}{n} + n)) = O(1) &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;
Последовательная реализация имеется в пакете SPARSKIT [http://w3.pppl.gov/~hammett/work/2006/gmres/SPARSKIT2/BLASSM/matvec.f], Python.Scipy [https://docs.scipy.org/doc/scipy-0.14.0/reference/generated/scipy.sparse.csr_matrix.html]&lt;br /&gt;
&lt;br /&gt;
Параллельный алгоритм реализован в библиотеке Matlab [http://citeseerx.ist.psu.edu/viewdoc/download?doi=10.1.1.83.6692&amp;amp;rep=rep1&amp;amp;type=pdf], Intel MKL [https://software.intel.com/en-us/node/468536#D09FB46A-B404-44CC-94ED-1C434C41B6E1]&lt;br /&gt;
&lt;br /&gt;
== Литература ==&lt;br /&gt;
[1] С. Писсанецки. Технология разреженных матриц. Изд. Мир, 1988.&lt;br /&gt;
&lt;br /&gt;
[2] В. В. Воеводин, Вл.В. Воеводин. Параллельные вычисления. – СПб.: БХВ - Петербург, 2002.&lt;/div&gt;</summary>
		<author><name>Екатерина Буторина</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:%D0%A0%D1%83%D1%84%D0%B8%D0%BD%D0%B0_%D0%A2%D1%80%D0%B5%D1%82%D1%8C%D1%8F%D0%BA%D0%BE%D0%B2%D0%B0/%D0%A5%D1%80%D0%B0%D0%BD%D0%B5%D0%BD%D0%B8%D0%B5_%D0%BD%D0%B5%D0%BD%D1%83%D0%BB%D0%B5%D0%B2%D1%8B%D1%85_%D1%8D%D0%BB%D0%B5%D0%BC%D0%B5%D0%BD%D1%82%D0%BE%D0%B2_%D1%80%D0%B0%D0%B7%D1%80%D0%B5%D0%B6%D0%B5%D0%BD%D0%BD%D1%8B%D1%85_%D0%BC%D0%B0%D1%82%D1%80%D0%B8%D1%86._%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=6909</id>
		<title>Участник:Руфина Третьякова/Хранение ненулевых элементов разреженных матриц. Умножение разреженной матрицы на вектор</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:%D0%A0%D1%83%D1%84%D0%B8%D0%BD%D0%B0_%D0%A2%D1%80%D0%B5%D1%82%D1%8C%D1%8F%D0%BA%D0%BE%D0%B2%D0%B0/%D0%A5%D1%80%D0%B0%D0%BD%D0%B5%D0%BD%D0%B8%D0%B5_%D0%BD%D0%B5%D0%BD%D1%83%D0%BB%D0%B5%D0%B2%D1%8B%D1%85_%D1%8D%D0%BB%D0%B5%D0%BC%D0%B5%D0%BD%D1%82%D0%BE%D0%B2_%D1%80%D0%B0%D0%B7%D1%80%D0%B5%D0%B6%D0%B5%D0%BD%D0%BD%D1%8B%D1%85_%D0%BC%D0%B0%D1%82%D1%80%D0%B8%D1%86._%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=6909"/>
		<updated>2016-10-13T20:43:34Z</updated>

		<summary type="html">&lt;p&gt;Екатерина Буторина: /* Информационный граф */&lt;/p&gt;
&lt;hr /&gt;
&lt;div&gt;{{algorithm&lt;br /&gt;
| name              = Умножение разреженной матрицы на вектор&lt;br /&gt;
| serial_complexity = &amp;lt;math&amp;gt;nnz&amp;lt;/math&amp;gt;&lt;br /&gt;
| pf_height         = &amp;lt;math&amp;gt;O(n)&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;2(nnz+n)+1&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;
Авторы статьи: [[Участница:Руфина_Третьякова|Третьякова Р. М.]] (группа 603), [[Участница:Екатерина_Буторина|Буторина Е. В.]] (группа 603)&lt;br /&gt;
&lt;br /&gt;
&lt;br /&gt;
&lt;br /&gt;
== Свойства и структура алгоритма ==&lt;br /&gt;
&lt;br /&gt;
=== Общее описание алгоритма ===&lt;br /&gt;
Разрежённая матрица — это матрица с преимущественно нулевыми элементами. В противном случае, если бо́льшая часть элементов матрицы ненулевые, матрица считается плотной.&lt;br /&gt;
Среди специалистов нет единства в определении того, какое именно количество ненулевых элементов делает матрицу разрежённой. Разные авторы предлагают различные варианты. &lt;br /&gt;
Огромные разрежённые матрицы часто возникают при решении таких задач, как дифференциальное уравнение в частных производных или операции с графами.&lt;br /&gt;
При хранении и преобразовании разрежённых матриц в компьютере бывает полезно, а часто и необходимо, использовать специальные алгоритмы и структуры данных, которые учитывают разрежённую структуру матрицы. Операции и алгоритмы, применяемые для работы с обычными, плотными матрицами, применительно к большим разрежённым матрицам работают относительно медленно и требуют значительных объёмов памяти. Однако разрежённые матрицы могут быть легко сжаты путём записи только своих ненулевых элементов, что снижает требования к компьютерной памяти.&lt;br /&gt;
Сложность операции с разреженными матрицами чаще всего определяется не их размером но числом ненулевых элементов. Далее будет показано, что умножение разреженной матрицы на плотный вектор можно произвести ровно за столько умножений сколько в матрице ненулевых элементов.&lt;br /&gt;
&lt;br /&gt;
=== Математическое описание алгоритма ===&lt;br /&gt;
Исходные данные:  разреженная матрица &amp;lt;math&amp;gt;M^{n*n}&amp;lt;/math&amp;gt;, вектор &amp;lt;math&amp;gt;x^n&amp;lt;/math&amp;gt; &lt;br /&gt;
&lt;br /&gt;
Наиболее удобным форматом для вычисления произведения матрицы на вектор является &amp;quot;Compressed Sparse Row&amp;quot; или сокращенно CSR-формат.&lt;br /&gt;
&lt;br /&gt;
Рассмотрим CSR-представление разреженной матрицы: пусть число ненулевых элементов матрицы равно &amp;lt;math&amp;gt;nnz&amp;lt;/math&amp;gt;&lt;br /&gt;
CSR-формат представляет матрицу &amp;lt;math&amp;gt;M&amp;lt;/math&amp;gt; в виде 3-х одномерных массивов:&lt;br /&gt;
&lt;br /&gt;
массив &amp;lt;math&amp;gt;A&amp;lt;/math&amp;gt; размера &amp;lt;math&amp;gt;nnz&amp;lt;/math&amp;gt; содержит ненулевые значения матрицы,&lt;br /&gt;
&amp;lt;math&amp;gt;JA&amp;lt;/math&amp;gt; размера &amp;lt;math&amp;gt;nnz&amp;lt;/math&amp;gt; - номера столбцов ненулевых элементов., &lt;br /&gt;
&amp;lt;math&amp;gt;IA&amp;lt;/math&amp;gt; размера &amp;lt;math&amp;gt;n&amp;lt;/math&amp;gt;- содержит номер с которого начинается описание элементов строки в массивах &amp;lt;math&amp;gt;A&amp;lt;/math&amp;gt; и &amp;lt;math&amp;gt;JA&amp;lt;/math&amp;gt;.&lt;br /&gt;
&lt;br /&gt;
Этот формат позволяет производить перемножение матрицы &amp;lt;math&amp;gt;M&amp;lt;/math&amp;gt; на вектор &amp;lt;math&amp;gt;x&amp;lt;/math&amp;gt; за &amp;lt;math&amp;gt;O(nnz)&amp;lt;/math&amp;gt; умножений и сложений. &lt;br /&gt;
Если при умножении плотной матрицы на вектор каждый элемент результата определяется по формуле &lt;br /&gt;
&amp;lt;math&amp;gt;y_i = \sum_{k = 1}^{n} A_{ik} x_k&amp;lt;/math&amp;gt;, &lt;br /&gt;
то в случае разреженной матрицы достаточно выполнять умножения только для ненулевых элементов &amp;lt;math&amp;gt;A_ik&amp;lt;/math&amp;gt;, которые хранятся в массиве &amp;lt;math&amp;gt;A&amp;lt;/math&amp;gt; в части соответствующей строке &amp;lt;math&amp;gt;i&amp;lt;/math&amp;gt; (элементы с индексами от &amp;lt;math&amp;gt;IA_i&amp;lt;/math&amp;gt; до &amp;lt;math&amp;gt;IA_{i+1}&amp;lt;/math&amp;gt;). Необходимо также знать на какой элемент вектора должен быть домножен данный ненулевой элемент массива, то есть нужен столбцовый индекс каждого элемента &amp;lt;math&amp;gt;A&amp;lt;/math&amp;gt;. Для этого используется массив &amp;lt;math&amp;gt;JA&amp;lt;/math&amp;gt;. Таким образом, каждый элемент итогового вектора определятся формулой&lt;br /&gt;
:&amp;lt;math&amp;gt;y_i = \sum_{k = IA_i}^{IA_{i+1}} A_k x_{JA_k}&amp;lt;/math&amp;gt;&lt;br /&gt;
Нетрудно заметить, что общее число операций умножения равно числу элементов &amp;lt;math&amp;gt;A&amp;lt;/math&amp;gt;, то есть числу ненулевых элементов разреженной матрицы.&lt;br /&gt;
&lt;br /&gt;
Например, это разреженная матрица с 4-мя ненулевыми элементами&lt;br /&gt;
:: &amp;lt;math&amp;gt;\begin{pmatrix}&lt;br /&gt;
0 &amp;amp; 0 &amp;amp; 0 &amp;amp; 0 \\&lt;br /&gt;
2 &amp;amp; 0 &amp;amp; 0 &amp;amp; 1 \\&lt;br /&gt;
0 &amp;amp; 0 &amp;amp; 3 &amp;amp; 0 \\&lt;br /&gt;
0 &amp;amp; 4 &amp;amp; 0 &amp;amp; 0 \\&lt;br /&gt;
\end{pmatrix}&amp;lt;/math&amp;gt;,&lt;br /&gt;
представляемая в формате CSR &lt;br /&gt;
    A  = [ 2 1 3 4 ]&lt;br /&gt;
    IA = [ 0 0 2 3 4 ]&lt;br /&gt;
    JA = [ 0 3 2 1 ]&lt;br /&gt;
домножим ее на вектор&lt;br /&gt;
    x  = [ 5 6 7 8 ]&lt;br /&gt;
получим&lt;br /&gt;
    y[0] = 0&lt;br /&gt;
    y[1] = a[0]*x[0] + a[1]*x[3] = 18&lt;br /&gt;
    y[2] = a[2]*x[2] = 21&lt;br /&gt;
    y[3] = a[3]*x[1] = 24 &lt;br /&gt;
&lt;br /&gt;
Алгоритм умножения матрицы на вектор полностью детерминирован и не зависит от порядка хранения элементов принадлежащих одной строке.&lt;br /&gt;
&lt;br /&gt;
=== Вычислительное ядро алгоритма ===&lt;br /&gt;
Вычислительным ядром алгоритма является формула умножения разреженной матрицы на плотный вектор:&lt;br /&gt;
:&amp;lt;math&amp;gt;y_i = \sum_{k = IA_i}^{IA_{i+1}} A_k x_{JA_k}&amp;lt;/math&amp;gt;&lt;br /&gt;
для всех &amp;lt;math&amp;gt;i = 1,n&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;
    число строк матрицы &#039;&#039;n&#039;&#039;; &lt;br /&gt;
    разреженная матрица в формате CSR:&lt;br /&gt;
      строчные указатели &#039;&#039;IA&#039;&#039;,&lt;br /&gt;
      столбцовые указатели&#039;&#039;JA&#039;&#039;, &lt;br /&gt;
      ненулевые элементы &#039;&#039;A&#039;&#039;;&lt;br /&gt;
    вектор &#039;&#039;x&#039;&#039;.&lt;br /&gt;
  &#039;&#039;&#039;Выходные данные&#039;&#039;&#039;: произведение матрицы на вектор &#039;&#039;y&#039;&#039;.&lt;br /&gt;
  &#039;&#039;&#039;read CSR&#039;&#039;&#039; &#039;&#039;n&#039;&#039;, &#039;&#039;IA&#039;&#039;, &#039;&#039;JA&#039;&#039;, &#039;&#039;A&#039;&#039;;&lt;br /&gt;
  &#039;&#039;&#039;read&#039;&#039;&#039; &#039;&#039;x&#039;&#039;&lt;br /&gt;
  &#039;&#039;&#039;for&#039;&#039;&#039; &#039;&#039;i&#039;&#039; = 1,n:&lt;br /&gt;
    &#039;&#039;&#039;for&#039;&#039;&#039; &#039;&#039;k&#039;&#039; = &#039;&#039;IA(i)&#039;&#039;, &#039;&#039;IA(i+1)-1&#039;&#039;:&lt;br /&gt;
            &#039;&#039;y(i)&#039;&#039; += &#039;&#039;A(k)&#039;&#039;*&#039;&#039;x(JA(k))&#039;&#039;;&lt;br /&gt;
  &#039;&#039;&#039;write&#039;&#039;&#039; &#039;&#039;y&#039;&#039;;&lt;br /&gt;
&lt;br /&gt;
=== Схема реализации последовательного алгоритма ===&lt;br /&gt;
Метод можно описать следующим образом:&lt;br /&gt;
# привести матрицу &amp;lt;math&amp;gt;M&amp;lt;/math&amp;gt; к формату CSR&lt;br /&gt;
# для &amp;lt;math&amp;gt;i&amp;lt;/math&amp;gt; от &amp;lt;math&amp;gt;0&amp;lt;/math&amp;gt; до &amp;lt;math&amp;gt;n-1&amp;lt;/math&amp;gt; вычислить &amp;lt;math&amp;gt;y_i&amp;lt;/math&amp;gt; по формуле &amp;lt;math&amp;gt;y_i = \sum_{k = IA_i}^{IA_{i+1}} A_k x_{JA_k}&amp;lt;/math&amp;gt;&lt;br /&gt;
&lt;br /&gt;
=== Последовательная сложность алгоритма ===&lt;br /&gt;
Для вычисления матрично-векторного произведения матрицы размера &amp;lt;math&amp;gt;n*n&amp;lt;/math&amp;gt; и вектора размера n в последовательном варианте требуется:&lt;br /&gt;
&lt;br /&gt;
* &amp;lt;math&amp;gt;nnz&amp;lt;/math&amp;gt; сложений,&lt;br /&gt;
* &amp;lt;math&amp;gt;nnz&amp;lt;/math&amp;gt; умножений.&lt;br /&gt;
&lt;br /&gt;
=== Информационный граф ===&lt;br /&gt;
&lt;br /&gt;
Для того чтобы построить информационный граф рассмотрим процесс вычисления значения одного элемента результирующего вектора &amp;lt;math&amp;gt;y_i&amp;lt;/math&amp;gt;. Число последовательных ярусов равно числу последовательных операций -- &amp;lt;math&amp;gt; AI_{i+1} - AI_i &amp;lt;/math&amp;gt; (в данном случае умножение и сложение будем считать за одну операцию).&lt;br /&gt;
Если же вычисления всех &amp;lt;math&amp;gt;y_i&amp;lt;/math&amp;gt; производить параллельно, на каждом ярусе будет производиться &amp;lt;math&amp;gt;n&amp;lt;/math&amp;gt; операций.&lt;br /&gt;
&lt;br /&gt;
&lt;br /&gt;
[[Файл:1111.jpg]]&lt;br /&gt;
&lt;br /&gt;
=== Ресурс параллелизма алгоритма ===&lt;br /&gt;
&lt;br /&gt;
Возможность параллельной реализации алгоритма появляется благодаря независимости вычисления каждого элемента результирующего вектора &amp;lt;math&amp;gt;y_i&amp;lt;/math&amp;gt;. Предположим, что имеется неограниченное число процессоров (теоретически, для максимальной эффективности требуется &amp;lt;math&amp;gt;n&amp;lt;/math&amp;gt; процессоров). Каждый процессор работает с одной строкой разреженной матрицы и хранит в памяти только те части массивов &lt;br /&gt;
&amp;lt;math&amp;gt; AJ &amp;lt;/math&amp;gt; и &amp;lt;math&amp;gt; A &amp;lt;/math&amp;gt;, которые соответствуют данной строке. Вектор &amp;lt;math&amp;gt; x &amp;lt;/math&amp;gt; хранится в памяти всех процессоров. Таким образом достигается экономия памяти (объем данных для i-ого процессора  &amp;lt;math&amp;gt; 2(AI_{i+1} - AI_i) + n &amp;lt;/math&amp;gt;). На данном процессоре выполняется &lt;br /&gt;
&amp;lt;math&amp;gt; AI_{i+1} - AI_i &amp;lt;/math&amp;gt; последовательных операций умножения и сложения. Число ярусов для i-ого процессора равно &amp;lt;math&amp;gt; AI_{i+1} - AI_i &amp;lt;/math&amp;gt;. Поскольку изначальная разреженная матрица имеет произвольную структуру, число ярусов на различных процессорах может быть различно. В худшем случае (если в строке все элементы ненулевые) число ярусов будет равно &amp;lt;math&amp;gt;n&amp;lt;/math&amp;gt;.  &lt;br /&gt;
&lt;br /&gt;
Таким образом, для алгоритма умножения разреженной матрицы на плотный вектор в параллельном варианте требуется последовательно выполнить:&lt;br /&gt;
&lt;br /&gt;
* не более чем &amp;lt;math&amp;gt;n&amp;lt;/math&amp;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;линейной&#039;&#039;.&lt;br /&gt;
&lt;br /&gt;
&#039;&#039;Замечание:&#039;&#039; если число процессоров &amp;lt;math&amp;gt;k&amp;lt;/math&amp;gt; меньше числа строк, но отношение &amp;lt;math&amp;gt;\frac{n}{k} = c&amp;lt;/math&amp;gt; является константой, то каждый процессор вычисляет &amp;lt;math&amp;gt;c&amp;lt;/math&amp;gt; элементов результирующего вектора, и число ярусов не более чем &amp;lt;math&amp;gt;cn&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; AI &amp;lt;/math&amp;gt; размерности &amp;lt;math&amp;gt; n+1 &amp;lt;/math&amp;gt;;&lt;br /&gt;
# вектор &amp;lt;math&amp;gt; AJ &amp;lt;/math&amp;gt; размерности &amp;lt;math&amp;gt; nnz &amp;lt;/math&amp;gt;;&lt;br /&gt;
# вектор &amp;lt;math&amp;gt; A &amp;lt;/math&amp;gt; размерности &amp;lt;math&amp;gt; nnz &amp;lt;/math&amp;gt;;&lt;br /&gt;
# вектор &amp;lt;math&amp;gt; x &amp;lt;/math&amp;gt; размерности &amp;lt;math&amp;gt; n &amp;lt;/math&amp;gt;.&lt;br /&gt;
&lt;br /&gt;
Суммарная размерность входных данных: &amp;lt;math&amp;gt; 2(nnz + n) + 1 &amp;lt;/math&amp;gt;&lt;br /&gt;
&lt;br /&gt;
Выходными данными является&lt;br /&gt;
# вектор &amp;lt;math&amp;gt; y &amp;lt;/math&amp;gt; размерности &amp;lt;math&amp;gt; n &amp;lt;/math&amp;gt;.&lt;br /&gt;
&lt;br /&gt;
Объем выходных данных: &amp;lt;math&amp;gt; n &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;, число ненулевых элементов &amp;lt;math&amp;gt;nnz&amp;lt;/math&amp;gt;, для вычисления используется &amp;lt;math&amp;gt;k&amp;lt;/math&amp;gt; процессоров тогда: &lt;br /&gt;
&lt;br /&gt;
*Каждый процессор оперирует с &amp;lt;math&amp;gt;\frac{n}{k}&amp;lt;/math&amp;gt; строками, в каждой из которых примерно &amp;lt;math&amp;gt;\frac{nnz}{n}&amp;lt;/math&amp;gt; элементов. Параллельная сложность алгоритма - &amp;lt;math&amp;gt;O(\frac{nnz}{k})&amp;lt;/math&amp;gt;.&lt;br /&gt;
&lt;br /&gt;
*Вычислительная мощность алгоритма (отношение числа операций к суммарному объему входных и выходных данных) - &amp;lt;math&amp;gt;O(\frac{nnz}{2nnz + 3n}) = O(1)&amp;lt;/math&amp;gt; - для последовательного алгоритма; &amp;lt;math&amp;gt;O(\frac{nnz}{n} / (2\frac{nnz}{n} + n)) = O(1) &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;
Последовательная реализация имеется в пакете SPARSKIT [http://w3.pppl.gov/~hammett/work/2006/gmres/SPARSKIT2/BLASSM/matvec.f], Python.Scipy [https://docs.scipy.org/doc/scipy-0.14.0/reference/generated/scipy.sparse.csr_matrix.html]&lt;br /&gt;
&lt;br /&gt;
Параллельный алгоритм реализован в библиотеке Matlab [http://citeseerx.ist.psu.edu/viewdoc/download?doi=10.1.1.83.6692&amp;amp;rep=rep1&amp;amp;type=pdf], Intel MKL [https://software.intel.com/en-us/node/468536#D09FB46A-B404-44CC-94ED-1C434C41B6E1]&lt;br /&gt;
&lt;br /&gt;
== Литература ==&lt;br /&gt;
[1] С. Писсанецки. Технология разреженных матриц. Изд. Мир, 1988.&lt;br /&gt;
&lt;br /&gt;
[2] В. В. Воеводин, Вл.В. Воеводин. Параллельные вычисления. – СПб.: БХВ - Петербург, 2002.&lt;/div&gt;</summary>
		<author><name>Екатерина Буторина</name></author>
	</entry>
	<entry>
		<id>https://xn--80aecvaldz.xn--80ahdrnmvk.xn--p1ai/w/ru/index.php?title=%D0%A4%D0%B0%D0%B9%D0%BB:1111.jpg&amp;diff=6907</id>
		<title>Файл:1111.jpg</title>
		<link rel="alternate" type="text/html" href="https://xn--80aecvaldz.xn--80ahdrnmvk.xn--p1ai/w/ru/index.php?title=%D0%A4%D0%B0%D0%B9%D0%BB:1111.jpg&amp;diff=6907"/>
		<updated>2016-10-13T20:42:36Z</updated>

		<summary type="html">&lt;p&gt;Екатерина Буторина: &lt;/p&gt;
&lt;hr /&gt;
&lt;div&gt;&lt;/div&gt;</summary>
		<author><name>Екатерина Буторина</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:%D0%A0%D1%83%D1%84%D0%B8%D0%BD%D0%B0_%D0%A2%D1%80%D0%B5%D1%82%D1%8C%D1%8F%D0%BA%D0%BE%D0%B2%D0%B0/%D0%A5%D1%80%D0%B0%D0%BD%D0%B5%D0%BD%D0%B8%D0%B5_%D0%BD%D0%B5%D0%BD%D1%83%D0%BB%D0%B5%D0%B2%D1%8B%D1%85_%D1%8D%D0%BB%D0%B5%D0%BC%D0%B5%D0%BD%D1%82%D0%BE%D0%B2_%D1%80%D0%B0%D0%B7%D1%80%D0%B5%D0%B6%D0%B5%D0%BD%D0%BD%D1%8B%D1%85_%D0%BC%D0%B0%D1%82%D1%80%D0%B8%D1%86._%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=6740</id>
		<title>Участник:Руфина Третьякова/Хранение ненулевых элементов разреженных матриц. Умножение разреженной матрицы на вектор</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:%D0%A0%D1%83%D1%84%D0%B8%D0%BD%D0%B0_%D0%A2%D1%80%D0%B5%D1%82%D1%8C%D1%8F%D0%BA%D0%BE%D0%B2%D0%B0/%D0%A5%D1%80%D0%B0%D0%BD%D0%B5%D0%BD%D0%B8%D0%B5_%D0%BD%D0%B5%D0%BD%D1%83%D0%BB%D0%B5%D0%B2%D1%8B%D1%85_%D1%8D%D0%BB%D0%B5%D0%BC%D0%B5%D0%BD%D1%82%D0%BE%D0%B2_%D1%80%D0%B0%D0%B7%D1%80%D0%B5%D0%B6%D0%B5%D0%BD%D0%BD%D1%8B%D1%85_%D0%BC%D0%B0%D1%82%D1%80%D0%B8%D1%86._%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=6740"/>
		<updated>2016-10-13T18:41:11Z</updated>

		<summary type="html">&lt;p&gt;Екатерина Буторина: &lt;/p&gt;
&lt;hr /&gt;
&lt;div&gt;{{algorithm&lt;br /&gt;
| name              = Умножение разреженной матрицы на вектор&lt;br /&gt;
| serial_complexity = &amp;lt;math&amp;gt;nnz&amp;lt;/math&amp;gt;&lt;br /&gt;
| pf_height         = &amp;lt;math&amp;gt;O(n)&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;2(nnz+n)+1&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;
Авторы статьи: [[Участница:Руфина_Третьякова|Третьякова Р. М.]] (группа 603), [[Участница:Екатерина_Буторина|Буторина Е. В.]] (группа 603)&lt;br /&gt;
&lt;br /&gt;
&lt;br /&gt;
&lt;br /&gt;
== Свойства и структура алгоритма ==&lt;br /&gt;
&lt;br /&gt;
=== Общее описание алгоритма ===&lt;br /&gt;
Разрежённая матрица — это матрица с преимущественно нулевыми элементами. В противном случае, если бо́льшая часть элементов матрицы ненулевые, матрица считается плотной.&lt;br /&gt;
Среди специалистов нет единства в определении того, какое именно количество ненулевых элементов делает матрицу разрежённой. Разные авторы предлагают различные варианты. &lt;br /&gt;
Огромные разрежённые матрицы часто возникают при решении таких задач, как дифференциальное уравнение в частных производных или операции с графами.&lt;br /&gt;
При хранении и преобразовании разрежённых матриц в компьютере бывает полезно, а часто и необходимо, использовать специальные алгоритмы и структуры данных, которые учитывают разрежённую структуру матрицы. Операции и алгоритмы, применяемые для работы с обычными, плотными матрицами, применительно к большим разрежённым матрицам работают относительно медленно и требуют значительных объёмов памяти. Однако разрежённые матрицы могут быть легко сжаты путём записи только своих ненулевых элементов, что снижает требования к компьютерной памяти.&lt;br /&gt;
Сложность операции с разреженными матрицами чаще всего определяется не их размером но числом ненулевых элементов. Далее будет показано, что умножение разреженной матрицы на плотный вектор можно произвести ровно за столько умножений сколько в матрице ненулевых элементов.&lt;br /&gt;
&lt;br /&gt;
=== Математическое описание алгоритма ===&lt;br /&gt;
Исходные данные:  разреженная матрица &amp;lt;math&amp;gt;M^{n*n}&amp;lt;/math&amp;gt;, вектор &amp;lt;math&amp;gt;x^n&amp;lt;/math&amp;gt; &lt;br /&gt;
&lt;br /&gt;
Наиболее удобным форматом для вычисления произведения матрицы на вектор является &amp;quot;Compressed Sparse Row&amp;quot; или сокращенно CSR-формат.&lt;br /&gt;
&lt;br /&gt;
Рассмотрим CSR-представление разреженной матрицы: пусть число ненулевых элементов матрицы равно &amp;lt;math&amp;gt;nnz&amp;lt;/math&amp;gt;&lt;br /&gt;
CSR-формат представляет матрицу &amp;lt;math&amp;gt;M&amp;lt;/math&amp;gt; в виде 3-х одномерных массивов:&lt;br /&gt;
&lt;br /&gt;
массив &amp;lt;math&amp;gt;A&amp;lt;/math&amp;gt; размера &amp;lt;math&amp;gt;nnz&amp;lt;/math&amp;gt; содержит ненулевые значения матрицы,&lt;br /&gt;
&amp;lt;math&amp;gt;JA&amp;lt;/math&amp;gt; размера &amp;lt;math&amp;gt;nnz&amp;lt;/math&amp;gt; - номера столбцов ненулевых элементов., &lt;br /&gt;
&amp;lt;math&amp;gt;IA&amp;lt;/math&amp;gt; размера &amp;lt;math&amp;gt;n&amp;lt;/math&amp;gt;- содержит номер с которого начинается описание элементов строки в массивах &amp;lt;math&amp;gt;A&amp;lt;/math&amp;gt; и &amp;lt;math&amp;gt;JA&amp;lt;/math&amp;gt;.&lt;br /&gt;
&lt;br /&gt;
Этот формат позволяет производить перемножение матрицы &amp;lt;math&amp;gt;M&amp;lt;/math&amp;gt; на вектор &amp;lt;math&amp;gt;x&amp;lt;/math&amp;gt; за &amp;lt;math&amp;gt;O(nnz)&amp;lt;/math&amp;gt; умножений и сложений. &lt;br /&gt;
Если при умножении плотной матрицы на вектор каждый элемент результата определяется по формуле &lt;br /&gt;
&amp;lt;math&amp;gt;y_i = \sum_{k = 1}^{n} A_{ik} x_k&amp;lt;/math&amp;gt;, &lt;br /&gt;
то в случае разреженной матрицы достаточно выполнять умножения только для ненулевых элементов &amp;lt;math&amp;gt;A_ik&amp;lt;/math&amp;gt;, которые хранятся в массиве &amp;lt;math&amp;gt;A&amp;lt;/math&amp;gt; в части соответствующей строке &amp;lt;math&amp;gt;i&amp;lt;/math&amp;gt; (элементы с индексами от &amp;lt;math&amp;gt;IA_i&amp;lt;/math&amp;gt; до &amp;lt;math&amp;gt;IA_{i+1}&amp;lt;/math&amp;gt;). Необходимо также знать на какой элемент вектора должен быть домножен данный ненулевой элемент массива, то есть нужен столбцовый индекс каждого элемента &amp;lt;math&amp;gt;A&amp;lt;/math&amp;gt;. Для этого используется массив &amp;lt;math&amp;gt;JA&amp;lt;/math&amp;gt;. Таким образом, каждый элемент итогового вектора определятся формулой&lt;br /&gt;
:&amp;lt;math&amp;gt;y_i = \sum_{k = IA_i}^{IA_{i+1}} A_k x_{JA_k}&amp;lt;/math&amp;gt;&lt;br /&gt;
Нетрудно заметить, что общее число операций умножения равно числу элементов &amp;lt;math&amp;gt;A&amp;lt;/math&amp;gt;, то есть числу ненулевых элементов разреженной матрицы.&lt;br /&gt;
&lt;br /&gt;
Например, это разреженная матрица с 4-мя ненулевыми элементами&lt;br /&gt;
:: &amp;lt;math&amp;gt;\begin{pmatrix}&lt;br /&gt;
0 &amp;amp; 0 &amp;amp; 0 &amp;amp; 0 \\&lt;br /&gt;
2 &amp;amp; 0 &amp;amp; 0 &amp;amp; 1 \\&lt;br /&gt;
0 &amp;amp; 0 &amp;amp; 3 &amp;amp; 0 \\&lt;br /&gt;
0 &amp;amp; 4 &amp;amp; 0 &amp;amp; 0 \\&lt;br /&gt;
\end{pmatrix}&amp;lt;/math&amp;gt;,&lt;br /&gt;
представляемая в формате CSR &lt;br /&gt;
    A  = [ 2 1 3 4 ]&lt;br /&gt;
    IA = [ 0 0 2 3 4 ]&lt;br /&gt;
    JA = [ 0 3 2 1 ]&lt;br /&gt;
домножим ее на вектор&lt;br /&gt;
    x  = [ 5 6 7 8 ]&lt;br /&gt;
получим&lt;br /&gt;
    y[0] = 0&lt;br /&gt;
    y[1] = a[0]*x[0] + a[1]*x[3] = 18&lt;br /&gt;
    y[2] = a[2]*x[2] = 21&lt;br /&gt;
    y[3] = a[3]*x[1] = 24 &lt;br /&gt;
&lt;br /&gt;
Алгоритм умножения матрицы на вектор полностью детерминирован и не зависит от порядка хранения элементов принадлежащих одной строке.&lt;br /&gt;
&lt;br /&gt;
=== Вычислительное ядро алгоритма ===&lt;br /&gt;
Вычислительным ядром алгоритма является формула умножения разреженной матрицы на плотный вектор:&lt;br /&gt;
:&amp;lt;math&amp;gt;y_i = \sum_{k = IA_i}^{IA_{i+1}} A_k x_{JA_k}&amp;lt;/math&amp;gt;&lt;br /&gt;
для всех &amp;lt;math&amp;gt;i = 1,n&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;
    число строк матрицы &#039;&#039;n&#039;&#039;; &lt;br /&gt;
    разреженная матрица в формате CSR:&lt;br /&gt;
      строчные указатели &#039;&#039;IA&#039;&#039;,&lt;br /&gt;
      столбцовые указатели&#039;&#039;JA&#039;&#039;, &lt;br /&gt;
      ненулевые элементы &#039;&#039;A&#039;&#039;;&lt;br /&gt;
    вектор &#039;&#039;x&#039;&#039;.&lt;br /&gt;
  &#039;&#039;&#039;Выходные данные&#039;&#039;&#039;: произведение матрицы на вектор &#039;&#039;y&#039;&#039;.&lt;br /&gt;
  &#039;&#039;&#039;read CSR&#039;&#039;&#039; &#039;&#039;n&#039;&#039;, &#039;&#039;IA&#039;&#039;, &#039;&#039;JA&#039;&#039;, &#039;&#039;A&#039;&#039;;&lt;br /&gt;
  &#039;&#039;&#039;read&#039;&#039;&#039; &#039;&#039;x&#039;&#039;&lt;br /&gt;
  &#039;&#039;&#039;for&#039;&#039;&#039; &#039;&#039;i&#039;&#039; = 1,n:&lt;br /&gt;
    &#039;&#039;&#039;for&#039;&#039;&#039; &#039;&#039;k&#039;&#039; = &#039;&#039;IA(i)&#039;&#039;, &#039;&#039;IA(i+1)-1&#039;&#039;:&lt;br /&gt;
            &#039;&#039;y(i)&#039;&#039; += &#039;&#039;A(k)&#039;&#039;*&#039;&#039;x(JA(k))&#039;&#039;;&lt;br /&gt;
  &#039;&#039;&#039;write&#039;&#039;&#039; &#039;&#039;y&#039;&#039;;&lt;br /&gt;
&lt;br /&gt;
=== Схема реализации последовательного алгоритма ===&lt;br /&gt;
Метод можно описать следующим образом:&lt;br /&gt;
# привести матрицу &amp;lt;math&amp;gt;M&amp;lt;/math&amp;gt; к формату CSR&lt;br /&gt;
# для &amp;lt;math&amp;gt;i&amp;lt;/math&amp;gt; от &amp;lt;math&amp;gt;0&amp;lt;/math&amp;gt; до &amp;lt;math&amp;gt;n-1&amp;lt;/math&amp;gt; вычислить &amp;lt;math&amp;gt;y_i&amp;lt;/math&amp;gt; по формуле &amp;lt;math&amp;gt;y_i = \sum_{k = IA_i}^{IA_{i+1}} A_k x_{JA_k}&amp;lt;/math&amp;gt;&lt;br /&gt;
&lt;br /&gt;
=== Последовательная сложность алгоритма ===&lt;br /&gt;
Для вычисления матрично-векторного произведения матрицы размера &amp;lt;math&amp;gt;n*n&amp;lt;/math&amp;gt; и вектора размера n в последовательном варианте требуется:&lt;br /&gt;
&lt;br /&gt;
* &amp;lt;math&amp;gt;nnz&amp;lt;/math&amp;gt; сложений,&lt;br /&gt;
* &amp;lt;math&amp;gt;nnz&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;n&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; AI &amp;lt;/math&amp;gt; размерности &amp;lt;math&amp;gt; n+1 &amp;lt;/math&amp;gt;;&lt;br /&gt;
# вектор &amp;lt;math&amp;gt; AJ &amp;lt;/math&amp;gt; размерности &amp;lt;math&amp;gt; nnz &amp;lt;/math&amp;gt;;&lt;br /&gt;
# вектор &amp;lt;math&amp;gt; A &amp;lt;/math&amp;gt; размерности &amp;lt;math&amp;gt; nnz &amp;lt;/math&amp;gt;;&lt;br /&gt;
# вектор &amp;lt;math&amp;gt; x &amp;lt;/math&amp;gt; размерности &amp;lt;math&amp;gt; n &amp;lt;/math&amp;gt;.&lt;br /&gt;
&lt;br /&gt;
Суммарная размерность входных данных: &amp;lt;math&amp;gt; 2(nnz + n) + 1 &amp;lt;/math&amp;gt;&lt;br /&gt;
&lt;br /&gt;
Выходными данными является&lt;br /&gt;
# вектор &amp;lt;math&amp;gt; y &amp;lt;/math&amp;gt; размерности &amp;lt;math&amp;gt; n &amp;lt;/math&amp;gt;.&lt;br /&gt;
&lt;br /&gt;
Объем выходных данных: &amp;lt;math&amp;gt; n &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;, число ненулевых элементов &amp;lt;math&amp;gt;nnz&amp;lt;/math&amp;gt;, для вычисления используется &amp;lt;math&amp;gt;k&amp;lt;/math&amp;gt; процессоров тогда: &lt;br /&gt;
&lt;br /&gt;
*Каждый процессор оперирует с &amp;lt;math&amp;gt;\frac{n}{k}&amp;lt;/math&amp;gt; строками, в каждой из которых примерно &amp;lt;math&amp;gt;\frac{nnz}{n}&amp;lt;/math&amp;gt; элементов. Параллельная сложность алгоритма - &amp;lt;math&amp;gt;O(\frac{nnz}{k})&amp;lt;/math&amp;gt;.&lt;br /&gt;
&lt;br /&gt;
*Вычислительная мощность алгоритма (отношение числа операций к суммарному объему входных и выходных данных) - &amp;lt;math&amp;gt;O(\frac{nnz}{2nnz + 3n}) = O(1)&amp;lt;/math&amp;gt; - для последовательного алгоритма; &amp;lt;math&amp;gt;O(\frac{nnz}{n} / (2\frac{nnz}{n} + n)) = O(1) &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;
Последовательная реализация имеется в пакете SPARSKIT [http://w3.pppl.gov/~hammett/work/2006/gmres/SPARSKIT2/BLASSM/matvec.f], Python.Scipy [https://docs.scipy.org/doc/scipy-0.14.0/reference/generated/scipy.sparse.csr_matrix.html]&lt;br /&gt;
&lt;br /&gt;
Параллельный алгоритм реализован в библиотеке Matlab [http://citeseerx.ist.psu.edu/viewdoc/download?doi=10.1.1.83.6692&amp;amp;rep=rep1&amp;amp;type=pdf], Intel MKL [https://software.intel.com/en-us/node/468536#D09FB46A-B404-44CC-94ED-1C434C41B6E1]&lt;br /&gt;
&lt;br /&gt;
== Литература ==&lt;br /&gt;
[1] С. Писсанецки. Технология разреженных матриц. Изд. Мир, 1988.&lt;br /&gt;
&lt;br /&gt;
[2] В. В. Воеводин, Вл.В. Воеводин. Параллельные вычисления. – СПб.: БХВ - Петербург, 2002.&lt;/div&gt;</summary>
		<author><name>Екатерина Буторина</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:%D0%A0%D1%83%D1%84%D0%B8%D0%BD%D0%B0_%D0%A2%D1%80%D0%B5%D1%82%D1%8C%D1%8F%D0%BA%D0%BE%D0%B2%D0%B0/%D0%A5%D1%80%D0%B0%D0%BD%D0%B5%D0%BD%D0%B8%D0%B5_%D0%BD%D0%B5%D0%BD%D1%83%D0%BB%D0%B5%D0%B2%D1%8B%D1%85_%D1%8D%D0%BB%D0%B5%D0%BC%D0%B5%D0%BD%D1%82%D0%BE%D0%B2_%D1%80%D0%B0%D0%B7%D1%80%D0%B5%D0%B6%D0%B5%D0%BD%D0%BD%D1%8B%D1%85_%D0%BC%D0%B0%D1%82%D1%80%D0%B8%D1%86._%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=6624</id>
		<title>Участник:Руфина Третьякова/Хранение ненулевых элементов разреженных матриц. Умножение разреженной матрицы на вектор</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:%D0%A0%D1%83%D1%84%D0%B8%D0%BD%D0%B0_%D0%A2%D1%80%D0%B5%D1%82%D1%8C%D1%8F%D0%BA%D0%BE%D0%B2%D0%B0/%D0%A5%D1%80%D0%B0%D0%BD%D0%B5%D0%BD%D0%B8%D0%B5_%D0%BD%D0%B5%D0%BD%D1%83%D0%BB%D0%B5%D0%B2%D1%8B%D1%85_%D1%8D%D0%BB%D0%B5%D0%BC%D0%B5%D0%BD%D1%82%D0%BE%D0%B2_%D1%80%D0%B0%D0%B7%D1%80%D0%B5%D0%B6%D0%B5%D0%BD%D0%BD%D1%8B%D1%85_%D0%BC%D0%B0%D1%82%D1%80%D0%B8%D1%86._%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=6624"/>
		<updated>2016-10-13T17:00:41Z</updated>

		<summary type="html">&lt;p&gt;Екатерина Буторина: /* Свойства алгоритма */&lt;/p&gt;
&lt;hr /&gt;
&lt;div&gt;{{algorithm&lt;br /&gt;
| name              = Умножение разреженной матрицы на вектор&lt;br /&gt;
| serial_complexity = &amp;lt;math&amp;gt;nnz&amp;lt;/math&amp;gt;&lt;br /&gt;
| pf_height         = &amp;lt;math&amp;gt;&amp;lt;/math&amp;gt;&lt;br /&gt;
| pf_width          = &amp;lt;math&amp;gt;&amp;lt;/math&amp;gt;&lt;br /&gt;
| input_data        = &amp;lt;math&amp;gt;2(nnz+n)+1&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;
Авторы статьи: [[Участница:Руфина_Третьякова|Третьякова Р. М.]] (группа 603), [[Участница:Екатерина_Буторина|Буторина Е. В.]] (группа 603)&lt;br /&gt;
&lt;br /&gt;
&lt;br /&gt;
&lt;br /&gt;
== Свойства и структура алгоритма ==&lt;br /&gt;
&lt;br /&gt;
=== Общее описание алгоритма ===&lt;br /&gt;
Разрежённая матрица — это матрица с преимущественно нулевыми элементами. В противном случае, если бо́льшая часть элементов матрицы ненулевые, матрица считается плотной.&lt;br /&gt;
Среди специалистов нет единства в определении того, какое именно количество ненулевых элементов делает матрицу разрежённой. Разные авторы предлагают различные варианты. &lt;br /&gt;
Огромные разрежённые матрицы часто возникают при решении таких задач, как дифференциальное уравнение в частных производных или операции с графами.&lt;br /&gt;
При хранении и преобразовании разрежённых матриц в компьютере бывает полезно, а часто и необходимо, использовать специальные алгоритмы и структуры данных, которые учитывают разрежённую структуру матрицы. Операции и алгоритмы, применяемые для работы с обычными, плотными матрицами, применительно к большим разрежённым матрицам работают относительно медленно и требуют значительных объёмов памяти. Однако разрежённые матрицы могут быть легко сжаты путём записи только своих ненулевых элементов, что снижает требования к компьютерной памяти.&lt;br /&gt;
Сложность операции с разреженными матрицами чаще всего определяется не их размером но числом ненулевых элементов. Далее будет показано, что умножение разреженной матрицы на плотный вектор можно произвести ровно за столько умножений сколько в матрице ненулевых элементов.&lt;br /&gt;
&lt;br /&gt;
=== Математическое описание алгоритма ===&lt;br /&gt;
Исходные данные:  разреженная матрица &amp;lt;math&amp;gt;M^{n*n}&amp;lt;/math&amp;gt;, вектор &amp;lt;math&amp;gt;x^{n*1}&amp;lt;/math&amp;gt; &lt;br /&gt;
&lt;br /&gt;
Наиболее удобным форматом для вычисления произведения матрицы на вектор является &amp;quot;Compressed Sparse Row&amp;quot; или сокращенно CSR-формат.&lt;br /&gt;
&lt;br /&gt;
Рассмотрим CSR-представление разреженной матрицы: пусть число ненулевых элементов матрицы равно &amp;lt;math&amp;gt;nnz&amp;lt;/math&amp;gt;&lt;br /&gt;
CSR-формат представляет матрицу &amp;lt;math&amp;gt;M&amp;lt;/math&amp;gt; в виде 3-х одномерных массивов:&lt;br /&gt;
&lt;br /&gt;
массив &amp;lt;math&amp;gt;A&amp;lt;/math&amp;gt; размера &amp;lt;math&amp;gt;nnz&amp;lt;/math&amp;gt; содержит ненулевые значения матрицы,&lt;br /&gt;
&amp;lt;math&amp;gt;JA&amp;lt;/math&amp;gt; размера &amp;lt;math&amp;gt;nnz&amp;lt;/math&amp;gt; - номера столбцов ненулевых элементов., &lt;br /&gt;
&amp;lt;math&amp;gt;IA&amp;lt;/math&amp;gt; размера &amp;lt;math&amp;gt;n&amp;lt;/math&amp;gt;- содержит номер с которого начинается описание элементов строки в массивах &amp;lt;math&amp;gt;A&amp;lt;/math&amp;gt; и &amp;lt;math&amp;gt;JA&amp;lt;/math&amp;gt;.&lt;br /&gt;
Этот формат позволяет производить перемножение матрицы &amp;lt;math&amp;gt;M&amp;lt;/math&amp;gt; на вектор &amp;lt;math&amp;gt;x&amp;lt;/math&amp;gt; за &amp;lt;math&amp;gt;O(nnz)&amp;lt;/math&amp;gt; умножений и сложений. &lt;br /&gt;
&lt;br /&gt;
Например, это разреженная матрица с 4-мя ненулевыми элементами&lt;br /&gt;
:: &amp;lt;math&amp;gt;\begin{pmatrix}&lt;br /&gt;
0 &amp;amp; 0 &amp;amp; 0 &amp;amp; 1 \\&lt;br /&gt;
2 &amp;amp; 0 &amp;amp; 0 &amp;amp; 0 \\&lt;br /&gt;
0 &amp;amp; 0 &amp;amp; 3 &amp;amp; 0 \\&lt;br /&gt;
0 &amp;amp; 4 &amp;amp; 0 &amp;amp; 0 \\&lt;br /&gt;
\end{pmatrix}&amp;lt;/math&amp;gt;,&lt;br /&gt;
 представляемая в формате CSR &lt;br /&gt;
    A  = [ 1 2 3 4 ]&lt;br /&gt;
    IA = [ 0 1 2 3 4 ]&lt;br /&gt;
    JA = [ 3 0 2 1 ]&lt;br /&gt;
&lt;br /&gt;
&lt;br /&gt;
Вычисляемые данные: вектор  &amp;lt;math&amp;gt;M*x=y&amp;lt;/math&amp;gt;&lt;br /&gt;
&lt;br /&gt;
=== Вычислительное ядро алгоритма ===&lt;br /&gt;
&lt;br /&gt;
:&amp;lt;math&amp;gt;y_i = \sum_{k = IA_i}^{IA_{i+1}} A_k x_{JA_k}&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;
    число строк матрицы &#039;&#039;n&#039;&#039;; &lt;br /&gt;
    разреженная матрица в формате CSR:&lt;br /&gt;
      строчные указатели &#039;&#039;IA&#039;&#039;,&lt;br /&gt;
      столбцовые указатели&#039;&#039;JA&#039;&#039;, &lt;br /&gt;
      ненулевые элементы &#039;&#039;A&#039;&#039;;&lt;br /&gt;
    вектор &#039;&#039;x&#039;&#039;.&lt;br /&gt;
  &#039;&#039;&#039;Выходные данные&#039;&#039;&#039;: произведение матрицы на вектор &#039;&#039;y&#039;&#039;.&lt;br /&gt;
  &#039;&#039;&#039;read CSR&#039;&#039;&#039; &#039;&#039;n&#039;&#039;, &#039;&#039;IA&#039;&#039;, &#039;&#039;JA&#039;&#039;, &#039;&#039;A&#039;&#039;;&lt;br /&gt;
  &#039;&#039;&#039;read&#039;&#039;&#039; &#039;&#039;x&#039;&#039;&lt;br /&gt;
  &#039;&#039;&#039;for&#039;&#039;&#039; &#039;&#039;i&#039;&#039; = 1,n:&lt;br /&gt;
    &#039;&#039;&#039;for&#039;&#039;&#039; &#039;&#039;k&#039;&#039; = &#039;&#039;IA(i)&#039;&#039;, &#039;&#039;IA(i+1)-1&#039;&#039;:&lt;br /&gt;
            &#039;&#039;y(i)&#039;&#039; += &#039;&#039;A(k)&#039;&#039;*&#039;&#039;x(JA(k))&#039;&#039;;&lt;br /&gt;
  &#039;&#039;&#039;write&#039;&#039;&#039; &#039;&#039;y&#039;&#039;;&lt;br /&gt;
&lt;br /&gt;
=== Схема реализации последовательного алгоритма ===&lt;br /&gt;
Метод можно описать следующим образом:&lt;br /&gt;
# привести матрицу &amp;lt;math&amp;gt;M&amp;lt;/math&amp;gt; к формату CSR&lt;br /&gt;
# для &amp;lt;math&amp;gt;i&amp;lt;/math&amp;gt; от &amp;lt;math&amp;gt;0&amp;lt;/math&amp;gt; до &amp;lt;math&amp;gt;n-1&amp;lt;/math&amp;gt; вычислить &amp;lt;math&amp;gt;y_i&amp;lt;/math&amp;gt; по формуле &amp;lt;math&amp;gt;y_i = \sum_{k = IA_i}^{IA_{i+1}} A_k x_{JA_k}&amp;lt;/math&amp;gt;&lt;br /&gt;
&lt;br /&gt;
=== Последовательная сложность алгоритма ===&lt;br /&gt;
Для вычисления матрично-векторного произведения матрицы размера &amp;lt;math&amp;gt;n*n&amp;lt;/math&amp;gt; и вектора размера n в последовательном варианте требуется:&lt;br /&gt;
&lt;br /&gt;
* &amp;lt;math&amp;gt;nnz&amp;lt;/math&amp;gt; сложений,&lt;br /&gt;
* &amp;lt;math&amp;gt;nnz&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;n&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; AI &amp;lt;/math&amp;gt; размерности &amp;lt;math&amp;gt; n+1 &amp;lt;/math&amp;gt;;&lt;br /&gt;
# вектор &amp;lt;math&amp;gt; AJ &amp;lt;/math&amp;gt; размерности &amp;lt;math&amp;gt; nnz &amp;lt;/math&amp;gt;;&lt;br /&gt;
# вектор &amp;lt;math&amp;gt; A &amp;lt;/math&amp;gt; размерности &amp;lt;math&amp;gt; nnz &amp;lt;/math&amp;gt;;&lt;br /&gt;
# вектор &amp;lt;math&amp;gt; x &amp;lt;/math&amp;gt; размерности &amp;lt;math&amp;gt; n &amp;lt;/math&amp;gt;.&lt;br /&gt;
&lt;br /&gt;
Суммарная размерность входных данных: &amp;lt;math&amp;gt; 2(nnz + n) + 1 &amp;lt;/math&amp;gt;&lt;br /&gt;
&lt;br /&gt;
Выходными данными является&lt;br /&gt;
# вектор &amp;lt;math&amp;gt; y &amp;lt;/math&amp;gt; размерности &amp;lt;math&amp;gt; n &amp;lt;/math&amp;gt;.&lt;br /&gt;
&lt;br /&gt;
Объем выходных данных: &amp;lt;math&amp;gt; n &amp;lt;/math&amp;gt;.&lt;br /&gt;
&lt;br /&gt;
=== Свойства алгоритма ===&lt;br /&gt;
&lt;br /&gt;
Пусть используется &amp;lt;math&amp;gt;k&amp;lt;/math&amp;gt; процессоров, матрица размера &amp;lt;math&amp;gt;n*n&amp;lt;/math&amp;gt;, в которой &amp;lt;math&amp;gt;nnz&amp;lt;/math&amp;gt; ненулевых элементов, тогда: &lt;br /&gt;
&lt;br /&gt;
*Параллельная сложность алгоритма - &amp;lt;math&amp;gt;O(nnz*\frac{k}{n})&amp;lt;/math&amp;gt;&lt;br /&gt;
&lt;br /&gt;
*Последовательная сложность алгоритма - &amp;lt;math&amp;gt;nnz&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;
Последовательная реализация имеется в пакете SPARSKIT [http://w3.pppl.gov/~hammett/work/2006/gmres/SPARSKIT2/BLASSM/matvec.f], Python.Scipy [https://docs.scipy.org/doc/scipy-0.14.0/reference/generated/scipy.sparse.csr_matrix.html]&lt;br /&gt;
&lt;br /&gt;
Параллельный алгоритм реализован в библиотеке Matlab [http://citeseerx.ist.psu.edu/viewdoc/download?doi=10.1.1.83.6692&amp;amp;rep=rep1&amp;amp;type=pdf], Intel MKL [https://software.intel.com/en-us/node/468536#D09FB46A-B404-44CC-94ED-1C434C41B6E1]&lt;br /&gt;
&lt;br /&gt;
== Литература ==&lt;br /&gt;
[1] С. Писсанецки. Технология разреженных матриц. Изд. Мир, 1988.&lt;br /&gt;
&lt;br /&gt;
[2] В. В. Воеводин, Вл.В. Воеводин. Параллельные вычисления. – СПб.: БХВ - Петербург, 2002.&lt;/div&gt;</summary>
		<author><name>Екатерина Буторина</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:%D0%A0%D1%83%D1%84%D0%B8%D0%BD%D0%B0_%D0%A2%D1%80%D0%B5%D1%82%D1%8C%D1%8F%D0%BA%D0%BE%D0%B2%D0%B0/%D0%A5%D1%80%D0%B0%D0%BD%D0%B5%D0%BD%D0%B8%D0%B5_%D0%BD%D0%B5%D0%BD%D1%83%D0%BB%D0%B5%D0%B2%D1%8B%D1%85_%D1%8D%D0%BB%D0%B5%D0%BC%D0%B5%D0%BD%D1%82%D0%BE%D0%B2_%D1%80%D0%B0%D0%B7%D1%80%D0%B5%D0%B6%D0%B5%D0%BD%D0%BD%D1%8B%D1%85_%D0%BC%D0%B0%D1%82%D1%80%D0%B8%D1%86._%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=6620</id>
		<title>Участник:Руфина Третьякова/Хранение ненулевых элементов разреженных матриц. Умножение разреженной матрицы на вектор</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:%D0%A0%D1%83%D1%84%D0%B8%D0%BD%D0%B0_%D0%A2%D1%80%D0%B5%D1%82%D1%8C%D1%8F%D0%BA%D0%BE%D0%B2%D0%B0/%D0%A5%D1%80%D0%B0%D0%BD%D0%B5%D0%BD%D0%B8%D0%B5_%D0%BD%D0%B5%D0%BD%D1%83%D0%BB%D0%B5%D0%B2%D1%8B%D1%85_%D1%8D%D0%BB%D0%B5%D0%BC%D0%B5%D0%BD%D1%82%D0%BE%D0%B2_%D1%80%D0%B0%D0%B7%D1%80%D0%B5%D0%B6%D0%B5%D0%BD%D0%BD%D1%8B%D1%85_%D0%BC%D0%B0%D1%82%D1%80%D0%B8%D1%86._%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=6620"/>
		<updated>2016-10-13T16:58:48Z</updated>

		<summary type="html">&lt;p&gt;Екатерина Буторина: /* Свойства алгоритма */&lt;/p&gt;
&lt;hr /&gt;
&lt;div&gt;{{algorithm&lt;br /&gt;
| name              = Умножение разреженной матрицы на вектор&lt;br /&gt;
| serial_complexity = &amp;lt;math&amp;gt;nnz&amp;lt;/math&amp;gt;&lt;br /&gt;
| pf_height         = &amp;lt;math&amp;gt;&amp;lt;/math&amp;gt;&lt;br /&gt;
| pf_width          = &amp;lt;math&amp;gt;&amp;lt;/math&amp;gt;&lt;br /&gt;
| input_data        = &amp;lt;math&amp;gt;2(nnz+n)+1&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;
Авторы статьи: [[Участница:Руфина_Третьякова|Третьякова Р. М.]] (группа 603), [[Участница:Екатерина_Буторина|Буторина Е. В.]] (группа 603)&lt;br /&gt;
&lt;br /&gt;
&lt;br /&gt;
&lt;br /&gt;
== Свойства и структура алгоритма ==&lt;br /&gt;
&lt;br /&gt;
=== Общее описание алгоритма ===&lt;br /&gt;
Разрежённая матрица — это матрица с преимущественно нулевыми элементами. В противном случае, если бо́льшая часть элементов матрицы ненулевые, матрица считается плотной.&lt;br /&gt;
Среди специалистов нет единства в определении того, какое именно количество ненулевых элементов делает матрицу разрежённой. Разные авторы предлагают различные варианты. &lt;br /&gt;
Огромные разрежённые матрицы часто возникают при решении таких задач, как дифференциальное уравнение в частных производных или операции с графами.&lt;br /&gt;
При хранении и преобразовании разрежённых матриц в компьютере бывает полезно, а часто и необходимо, использовать специальные алгоритмы и структуры данных, которые учитывают разрежённую структуру матрицы. Операции и алгоритмы, применяемые для работы с обычными, плотными матрицами, применительно к большим разрежённым матрицам работают относительно медленно и требуют значительных объёмов памяти. Однако разрежённые матрицы могут быть легко сжаты путём записи только своих ненулевых элементов, что снижает требования к компьютерной памяти.&lt;br /&gt;
Сложность операции с разреженными матрицами чаще всего определяется не их размером но числом ненулевых элементов. Далее будет показано, что умножение разреженной матрицы на плотный вектор можно произвести ровно за столько умножений сколько в матрице ненулевых элементов.&lt;br /&gt;
&lt;br /&gt;
=== Математическое описание алгоритма ===&lt;br /&gt;
Исходные данные:  разреженная матрица &amp;lt;math&amp;gt;M^{n*n}&amp;lt;/math&amp;gt;, вектор &amp;lt;math&amp;gt;x^{n*1}&amp;lt;/math&amp;gt; &lt;br /&gt;
&lt;br /&gt;
Наиболее удобным форматом для вычисления произведения матрицы на вектор является &amp;quot;Compressed Sparse Row&amp;quot; или сокращенно CSR-формат.&lt;br /&gt;
&lt;br /&gt;
Рассмотрим CSR-представление разреженной матрицы: пусть число ненулевых элементов матрицы равно &amp;lt;math&amp;gt;nnz&amp;lt;/math&amp;gt;&lt;br /&gt;
CSR-формат представляет матрицу &amp;lt;math&amp;gt;M&amp;lt;/math&amp;gt; в виде 3-х одномерных массивов:&lt;br /&gt;
&lt;br /&gt;
массив &amp;lt;math&amp;gt;A&amp;lt;/math&amp;gt; размера &amp;lt;math&amp;gt;nnz&amp;lt;/math&amp;gt; содержит ненулевые значения матрицы,&lt;br /&gt;
&amp;lt;math&amp;gt;JA&amp;lt;/math&amp;gt; размера &amp;lt;math&amp;gt;nnz&amp;lt;/math&amp;gt; - номера столбцов ненулевых элементов., &lt;br /&gt;
&amp;lt;math&amp;gt;IA&amp;lt;/math&amp;gt; размера &amp;lt;math&amp;gt;n&amp;lt;/math&amp;gt;- содержит номер с которого начинается описание элементов строки в массивах &amp;lt;math&amp;gt;A&amp;lt;/math&amp;gt; и &amp;lt;math&amp;gt;JA&amp;lt;/math&amp;gt;.&lt;br /&gt;
Этот формат позволяет производить перемножение матрицы &amp;lt;math&amp;gt;M&amp;lt;/math&amp;gt; на вектор &amp;lt;math&amp;gt;x&amp;lt;/math&amp;gt; за &amp;lt;math&amp;gt;O(nnz)&amp;lt;/math&amp;gt; умножений и сложений. &lt;br /&gt;
&lt;br /&gt;
Например, это разреженная матрица с 4-мя ненулевыми элементами&lt;br /&gt;
:: &amp;lt;math&amp;gt;\begin{pmatrix}&lt;br /&gt;
0 &amp;amp; 0 &amp;amp; 0 &amp;amp; 1 \\&lt;br /&gt;
2 &amp;amp; 0 &amp;amp; 0 &amp;amp; 0 \\&lt;br /&gt;
0 &amp;amp; 0 &amp;amp; 3 &amp;amp; 0 \\&lt;br /&gt;
0 &amp;amp; 4 &amp;amp; 0 &amp;amp; 0 \\&lt;br /&gt;
\end{pmatrix}&amp;lt;/math&amp;gt;,&lt;br /&gt;
 представляемая в формате CSR &lt;br /&gt;
    A  = [ 1 2 3 4 ]&lt;br /&gt;
    IA = [ 0 1 2 3 4 ]&lt;br /&gt;
    JA = [ 3 0 2 1 ]&lt;br /&gt;
&lt;br /&gt;
&lt;br /&gt;
Вычисляемые данные: вектор  &amp;lt;math&amp;gt;M*x=y&amp;lt;/math&amp;gt;&lt;br /&gt;
&lt;br /&gt;
=== Вычислительное ядро алгоритма ===&lt;br /&gt;
&lt;br /&gt;
:&amp;lt;math&amp;gt;y_i = \sum_{k = IA_i}^{IA_{i+1}} A_k x_{JA_k}&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;
    число строк матрицы &#039;&#039;n&#039;&#039;; &lt;br /&gt;
    разреженная матрица в формате CSR:&lt;br /&gt;
      строчные указатели &#039;&#039;IA&#039;&#039;,&lt;br /&gt;
      столбцовые указатели&#039;&#039;JA&#039;&#039;, &lt;br /&gt;
      ненулевые элементы &#039;&#039;A&#039;&#039;;&lt;br /&gt;
    вектор &#039;&#039;x&#039;&#039;.&lt;br /&gt;
  &#039;&#039;&#039;Выходные данные&#039;&#039;&#039;: произведение матрицы на вектор &#039;&#039;y&#039;&#039;.&lt;br /&gt;
  &#039;&#039;&#039;read CSR&#039;&#039;&#039; &#039;&#039;n&#039;&#039;, &#039;&#039;IA&#039;&#039;, &#039;&#039;JA&#039;&#039;, &#039;&#039;A&#039;&#039;;&lt;br /&gt;
  &#039;&#039;&#039;read&#039;&#039;&#039; &#039;&#039;x&#039;&#039;&lt;br /&gt;
  &#039;&#039;&#039;for&#039;&#039;&#039; &#039;&#039;i&#039;&#039; = 1,n:&lt;br /&gt;
    &#039;&#039;&#039;for&#039;&#039;&#039; &#039;&#039;k&#039;&#039; = &#039;&#039;IA(i)&#039;&#039;, &#039;&#039;IA(i+1)-1&#039;&#039;:&lt;br /&gt;
            &#039;&#039;y(i)&#039;&#039; += &#039;&#039;A(k)&#039;&#039;*&#039;&#039;x(JA(k))&#039;&#039;;&lt;br /&gt;
  &#039;&#039;&#039;write&#039;&#039;&#039; &#039;&#039;y&#039;&#039;;&lt;br /&gt;
&lt;br /&gt;
=== Схема реализации последовательного алгоритма ===&lt;br /&gt;
Метод можно описать следующим образом:&lt;br /&gt;
# привести матрицу &amp;lt;math&amp;gt;M&amp;lt;/math&amp;gt; к формату CSR&lt;br /&gt;
# для &amp;lt;math&amp;gt;i&amp;lt;/math&amp;gt; от &amp;lt;math&amp;gt;0&amp;lt;/math&amp;gt; до &amp;lt;math&amp;gt;n-1&amp;lt;/math&amp;gt; вычислить &amp;lt;math&amp;gt;y_i&amp;lt;/math&amp;gt; по формуле &amp;lt;math&amp;gt;y_i = \sum_{k = IA_i}^{IA_{i+1}} A_k x_{JA_k}&amp;lt;/math&amp;gt;&lt;br /&gt;
&lt;br /&gt;
=== Последовательная сложность алгоритма ===&lt;br /&gt;
Для вычисления матрично-векторного произведения матрицы размера &amp;lt;math&amp;gt;n*n&amp;lt;/math&amp;gt; и вектора размера n в последовательном варианте требуется:&lt;br /&gt;
&lt;br /&gt;
* &amp;lt;math&amp;gt;nnz&amp;lt;/math&amp;gt; сложений,&lt;br /&gt;
* &amp;lt;math&amp;gt;nnz&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;n&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; AI &amp;lt;/math&amp;gt; размерности &amp;lt;math&amp;gt; n+1 &amp;lt;/math&amp;gt;;&lt;br /&gt;
# вектор &amp;lt;math&amp;gt; AJ &amp;lt;/math&amp;gt; размерности &amp;lt;math&amp;gt; nnz &amp;lt;/math&amp;gt;;&lt;br /&gt;
# вектор &amp;lt;math&amp;gt; A &amp;lt;/math&amp;gt; размерности &amp;lt;math&amp;gt; nnz &amp;lt;/math&amp;gt;;&lt;br /&gt;
# вектор &amp;lt;math&amp;gt; x &amp;lt;/math&amp;gt; размерности &amp;lt;math&amp;gt; n &amp;lt;/math&amp;gt;.&lt;br /&gt;
&lt;br /&gt;
Суммарная размерность входных данных: &amp;lt;math&amp;gt; 2(nnz + n) + 1 &amp;lt;/math&amp;gt;&lt;br /&gt;
&lt;br /&gt;
Выходными данными является&lt;br /&gt;
# вектор &amp;lt;math&amp;gt; y &amp;lt;/math&amp;gt; размерности &amp;lt;math&amp;gt; n &amp;lt;/math&amp;gt;.&lt;br /&gt;
&lt;br /&gt;
Объем выходных данных: &amp;lt;math&amp;gt; n &amp;lt;/math&amp;gt;.&lt;br /&gt;
&lt;br /&gt;
=== Свойства алгоритма ===&lt;br /&gt;
&lt;br /&gt;
Пусть используется &amp;lt;math&amp;gt;k&amp;lt;/math&amp;gt; процессоров, матрица размера &amp;lt;math&amp;gt;n*n&amp;lt;/math&amp;gt;, в которой &amp;lt;math&amp;gt;nnz&amp;lt;/math&amp;gt; ненулевых элементов, тогда: &lt;br /&gt;
&lt;br /&gt;
*Параллельная сложность алгоритма - &amp;lt;math&amp;gt;O(nnz*k/n)&amp;lt;/math&amp;gt;&lt;br /&gt;
&lt;br /&gt;
*Последовательная сложность алгоритма - &amp;lt;math&amp;gt;nnz&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;
Последовательная реализация имеется в пакете SPARSKIT [http://w3.pppl.gov/~hammett/work/2006/gmres/SPARSKIT2/BLASSM/matvec.f], Python.Scipy [https://docs.scipy.org/doc/scipy-0.14.0/reference/generated/scipy.sparse.csr_matrix.html]&lt;br /&gt;
&lt;br /&gt;
Параллельный алгоритм реализован в библиотеке Matlab [http://citeseerx.ist.psu.edu/viewdoc/download?doi=10.1.1.83.6692&amp;amp;rep=rep1&amp;amp;type=pdf], Intel MKL [https://software.intel.com/en-us/node/468536#D09FB46A-B404-44CC-94ED-1C434C41B6E1]&lt;br /&gt;
&lt;br /&gt;
== Литература ==&lt;br /&gt;
[1] С. Писсанецки. Технология разреженных матриц. Изд. Мир, 1988.&lt;br /&gt;
&lt;br /&gt;
[2] В. В. Воеводин, Вл.В. Воеводин. Параллельные вычисления. – СПб.: БХВ - Петербург, 2002.&lt;/div&gt;</summary>
		<author><name>Екатерина Буторина</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:%D0%A0%D1%83%D1%84%D0%B8%D0%BD%D0%B0_%D0%A2%D1%80%D0%B5%D1%82%D1%8C%D1%8F%D0%BA%D0%BE%D0%B2%D0%B0/%D0%A5%D1%80%D0%B0%D0%BD%D0%B5%D0%BD%D0%B8%D0%B5_%D0%BD%D0%B5%D0%BD%D1%83%D0%BB%D0%B5%D0%B2%D1%8B%D1%85_%D1%8D%D0%BB%D0%B5%D0%BC%D0%B5%D0%BD%D1%82%D0%BE%D0%B2_%D1%80%D0%B0%D0%B7%D1%80%D0%B5%D0%B6%D0%B5%D0%BD%D0%BD%D1%8B%D1%85_%D0%BC%D0%B0%D1%82%D1%80%D0%B8%D1%86._%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=6619</id>
		<title>Участник:Руфина Третьякова/Хранение ненулевых элементов разреженных матриц. Умножение разреженной матрицы на вектор</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:%D0%A0%D1%83%D1%84%D0%B8%D0%BD%D0%B0_%D0%A2%D1%80%D0%B5%D1%82%D1%8C%D1%8F%D0%BA%D0%BE%D0%B2%D0%B0/%D0%A5%D1%80%D0%B0%D0%BD%D0%B5%D0%BD%D0%B8%D0%B5_%D0%BD%D0%B5%D0%BD%D1%83%D0%BB%D0%B5%D0%B2%D1%8B%D1%85_%D1%8D%D0%BB%D0%B5%D0%BC%D0%B5%D0%BD%D1%82%D0%BE%D0%B2_%D1%80%D0%B0%D0%B7%D1%80%D0%B5%D0%B6%D0%B5%D0%BD%D0%BD%D1%8B%D1%85_%D0%BC%D0%B0%D1%82%D1%80%D0%B8%D1%86._%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=6619"/>
		<updated>2016-10-13T16:57:32Z</updated>

		<summary type="html">&lt;p&gt;Екатерина Буторина: /* Свойства алгоритма */&lt;/p&gt;
&lt;hr /&gt;
&lt;div&gt;{{algorithm&lt;br /&gt;
| name              = Умножение разреженной матрицы на вектор&lt;br /&gt;
| serial_complexity = &amp;lt;math&amp;gt;nnz&amp;lt;/math&amp;gt;&lt;br /&gt;
| pf_height         = &amp;lt;math&amp;gt;&amp;lt;/math&amp;gt;&lt;br /&gt;
| pf_width          = &amp;lt;math&amp;gt;&amp;lt;/math&amp;gt;&lt;br /&gt;
| input_data        = &amp;lt;math&amp;gt;2(nnz+n)+1&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;
Авторы статьи: [[Участница:Руфина_Третьякова|Третьякова Р. М.]] (группа 603), [[Участница:Екатерина_Буторина|Буторина Е. В.]] (группа 603)&lt;br /&gt;
&lt;br /&gt;
&lt;br /&gt;
&lt;br /&gt;
== Свойства и структура алгоритма ==&lt;br /&gt;
&lt;br /&gt;
=== Общее описание алгоритма ===&lt;br /&gt;
Разрежённая матрица — это матрица с преимущественно нулевыми элементами. В противном случае, если бо́льшая часть элементов матрицы ненулевые, матрица считается плотной.&lt;br /&gt;
Среди специалистов нет единства в определении того, какое именно количество ненулевых элементов делает матрицу разрежённой. Разные авторы предлагают различные варианты. &lt;br /&gt;
Огромные разрежённые матрицы часто возникают при решении таких задач, как дифференциальное уравнение в частных производных или операции с графами.&lt;br /&gt;
При хранении и преобразовании разрежённых матриц в компьютере бывает полезно, а часто и необходимо, использовать специальные алгоритмы и структуры данных, которые учитывают разрежённую структуру матрицы. Операции и алгоритмы, применяемые для работы с обычными, плотными матрицами, применительно к большим разрежённым матрицам работают относительно медленно и требуют значительных объёмов памяти. Однако разрежённые матрицы могут быть легко сжаты путём записи только своих ненулевых элементов, что снижает требования к компьютерной памяти.&lt;br /&gt;
Сложность операции с разреженными матрицами чаще всего определяется не их размером но числом ненулевых элементов. Далее будет показано, что умножение разреженной матрицы на плотный вектор можно произвести ровно за столько умножений сколько в матрице ненулевых элементов.&lt;br /&gt;
&lt;br /&gt;
=== Математическое описание алгоритма ===&lt;br /&gt;
Исходные данные:  разреженная матрица &amp;lt;math&amp;gt;M^{n*n}&amp;lt;/math&amp;gt;, вектор &amp;lt;math&amp;gt;x^{n*1}&amp;lt;/math&amp;gt; &lt;br /&gt;
&lt;br /&gt;
Наиболее удобным форматом для вычисления произведения матрицы на вектор является &amp;quot;Compressed Sparse Row&amp;quot; или сокращенно CSR-формат.&lt;br /&gt;
&lt;br /&gt;
Рассмотрим CSR-представление разреженной матрицы: пусть число ненулевых элементов матрицы равно &amp;lt;math&amp;gt;nnz&amp;lt;/math&amp;gt;&lt;br /&gt;
CSR-формат представляет матрицу &amp;lt;math&amp;gt;M&amp;lt;/math&amp;gt; в виде 3-х одномерных массивов:&lt;br /&gt;
&lt;br /&gt;
массив &amp;lt;math&amp;gt;A&amp;lt;/math&amp;gt; размера &amp;lt;math&amp;gt;nnz&amp;lt;/math&amp;gt; содержит ненулевые значения матрицы,&lt;br /&gt;
&amp;lt;math&amp;gt;JA&amp;lt;/math&amp;gt; размера &amp;lt;math&amp;gt;nnz&amp;lt;/math&amp;gt; - номера столбцов ненулевых элементов., &lt;br /&gt;
&amp;lt;math&amp;gt;IA&amp;lt;/math&amp;gt; размера &amp;lt;math&amp;gt;n&amp;lt;/math&amp;gt;- содержит номер с которого начинается описание элементов строки в массивах &amp;lt;math&amp;gt;A&amp;lt;/math&amp;gt; и &amp;lt;math&amp;gt;JA&amp;lt;/math&amp;gt;.&lt;br /&gt;
Этот формат позволяет производить перемножение матрицы &amp;lt;math&amp;gt;M&amp;lt;/math&amp;gt; на вектор &amp;lt;math&amp;gt;x&amp;lt;/math&amp;gt; за &amp;lt;math&amp;gt;O(nnz)&amp;lt;/math&amp;gt; умножений и сложений. &lt;br /&gt;
&lt;br /&gt;
Например, это разреженная матрица с 4-мя ненулевыми элементами&lt;br /&gt;
:: &amp;lt;math&amp;gt;\begin{pmatrix}&lt;br /&gt;
0 &amp;amp; 0 &amp;amp; 0 &amp;amp; 1 \\&lt;br /&gt;
2 &amp;amp; 0 &amp;amp; 0 &amp;amp; 0 \\&lt;br /&gt;
0 &amp;amp; 0 &amp;amp; 3 &amp;amp; 0 \\&lt;br /&gt;
0 &amp;amp; 4 &amp;amp; 0 &amp;amp; 0 \\&lt;br /&gt;
\end{pmatrix}&amp;lt;/math&amp;gt;,&lt;br /&gt;
 представляемая в формате CSR &lt;br /&gt;
    A  = [ 1 2 3 4 ]&lt;br /&gt;
    IA = [ 0 1 2 3 4 ]&lt;br /&gt;
    JA = [ 3 0 2 1 ]&lt;br /&gt;
&lt;br /&gt;
&lt;br /&gt;
Вычисляемые данные: вектор  &amp;lt;math&amp;gt;M*x=y&amp;lt;/math&amp;gt;&lt;br /&gt;
&lt;br /&gt;
=== Вычислительное ядро алгоритма ===&lt;br /&gt;
&lt;br /&gt;
:&amp;lt;math&amp;gt;y_i = \sum_{k = IA_i}^{IA_{i+1}} A_k x_{JA_k}&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;
    число строк матрицы &#039;&#039;n&#039;&#039;; &lt;br /&gt;
    разреженная матрица в формате CSR:&lt;br /&gt;
      строчные указатели &#039;&#039;IA&#039;&#039;,&lt;br /&gt;
      столбцовые указатели&#039;&#039;JA&#039;&#039;, &lt;br /&gt;
      ненулевые элементы &#039;&#039;A&#039;&#039;;&lt;br /&gt;
    вектор &#039;&#039;x&#039;&#039;.&lt;br /&gt;
  &#039;&#039;&#039;Выходные данные&#039;&#039;&#039;: произведение матрицы на вектор &#039;&#039;y&#039;&#039;.&lt;br /&gt;
  &#039;&#039;&#039;read CSR&#039;&#039;&#039; &#039;&#039;n&#039;&#039;, &#039;&#039;IA&#039;&#039;, &#039;&#039;JA&#039;&#039;, &#039;&#039;A&#039;&#039;;&lt;br /&gt;
  &#039;&#039;&#039;read&#039;&#039;&#039; &#039;&#039;x&#039;&#039;&lt;br /&gt;
  &#039;&#039;&#039;for&#039;&#039;&#039; &#039;&#039;i&#039;&#039; = 1,n:&lt;br /&gt;
    &#039;&#039;&#039;for&#039;&#039;&#039; &#039;&#039;k&#039;&#039; = &#039;&#039;IA(i)&#039;&#039;, &#039;&#039;IA(i+1)-1&#039;&#039;:&lt;br /&gt;
            &#039;&#039;y(i)&#039;&#039; += &#039;&#039;A(k)&#039;&#039;*&#039;&#039;x(JA(k))&#039;&#039;;&lt;br /&gt;
  &#039;&#039;&#039;write&#039;&#039;&#039; &#039;&#039;y&#039;&#039;;&lt;br /&gt;
&lt;br /&gt;
=== Схема реализации последовательного алгоритма ===&lt;br /&gt;
Метод можно описать следующим образом:&lt;br /&gt;
# привести матрицу &amp;lt;math&amp;gt;M&amp;lt;/math&amp;gt; к формату CSR&lt;br /&gt;
# для &amp;lt;math&amp;gt;i&amp;lt;/math&amp;gt; от &amp;lt;math&amp;gt;0&amp;lt;/math&amp;gt; до &amp;lt;math&amp;gt;n-1&amp;lt;/math&amp;gt; вычислить &amp;lt;math&amp;gt;y_i&amp;lt;/math&amp;gt; по формуле &amp;lt;math&amp;gt;y_i = \sum_{k = IA_i}^{IA_{i+1}} A_k x_{JA_k}&amp;lt;/math&amp;gt;&lt;br /&gt;
&lt;br /&gt;
=== Последовательная сложность алгоритма ===&lt;br /&gt;
Для вычисления матрично-векторного произведения матрицы размера &amp;lt;math&amp;gt;n*n&amp;lt;/math&amp;gt; и вектора размера n в последовательном варианте требуется:&lt;br /&gt;
&lt;br /&gt;
* &amp;lt;math&amp;gt;nnz&amp;lt;/math&amp;gt; сложений,&lt;br /&gt;
* &amp;lt;math&amp;gt;nnz&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;n&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; AI &amp;lt;/math&amp;gt; размерности &amp;lt;math&amp;gt; n+1 &amp;lt;/math&amp;gt;;&lt;br /&gt;
# вектор &amp;lt;math&amp;gt; AJ &amp;lt;/math&amp;gt; размерности &amp;lt;math&amp;gt; nnz &amp;lt;/math&amp;gt;;&lt;br /&gt;
# вектор &amp;lt;math&amp;gt; A &amp;lt;/math&amp;gt; размерности &amp;lt;math&amp;gt; nnz &amp;lt;/math&amp;gt;;&lt;br /&gt;
# вектор &amp;lt;math&amp;gt; x &amp;lt;/math&amp;gt; размерности &amp;lt;math&amp;gt; n &amp;lt;/math&amp;gt;.&lt;br /&gt;
&lt;br /&gt;
Суммарная размерность входных данных: &amp;lt;math&amp;gt; 2(nnz + n) + 1 &amp;lt;/math&amp;gt;&lt;br /&gt;
&lt;br /&gt;
Выходными данными является&lt;br /&gt;
# вектор &amp;lt;math&amp;gt; y &amp;lt;/math&amp;gt; размерности &amp;lt;math&amp;gt; n &amp;lt;/math&amp;gt;.&lt;br /&gt;
&lt;br /&gt;
Объем выходных данных: &amp;lt;math&amp;gt; n &amp;lt;/math&amp;gt;.&lt;br /&gt;
&lt;br /&gt;
=== Свойства алгоритма ===&lt;br /&gt;
&lt;br /&gt;
Пусть используется &amp;lt;math&amp;gt;k&amp;lt;/math&amp;gt; процессоров, матрица размера &amp;lt;math&amp;gt;n*n&amp;lt;/math&amp;gt;, в которой &amp;lt;math&amp;gt;nnz&amp;lt;/math&amp;gt; ненулевых элементов, тогда: &lt;br /&gt;
&lt;br /&gt;
*Параллельная сложность &amp;lt;math&amp;gt;O(nnz*k/n)&amp;lt;/math&amp;gt;&lt;br /&gt;
&lt;br /&gt;
*Последовательная &amp;lt;math&amp;gt;nnz&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;
Последовательная реализация имеется в пакете SPARSKIT [http://w3.pppl.gov/~hammett/work/2006/gmres/SPARSKIT2/BLASSM/matvec.f], Python.Scipy [https://docs.scipy.org/doc/scipy-0.14.0/reference/generated/scipy.sparse.csr_matrix.html]&lt;br /&gt;
&lt;br /&gt;
Параллельный алгоритм реализован в библиотеке Matlab [http://citeseerx.ist.psu.edu/viewdoc/download?doi=10.1.1.83.6692&amp;amp;rep=rep1&amp;amp;type=pdf], Intel MKL [https://software.intel.com/en-us/node/468536#D09FB46A-B404-44CC-94ED-1C434C41B6E1]&lt;br /&gt;
&lt;br /&gt;
== Литература ==&lt;br /&gt;
[1] С. Писсанецки. Технология разреженных матриц. Изд. Мир, 1988.&lt;br /&gt;
&lt;br /&gt;
[2] В. В. Воеводин, Вл.В. Воеводин. Параллельные вычисления. – СПб.: БХВ - Петербург, 2002.&lt;/div&gt;</summary>
		<author><name>Екатерина Буторина</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:%D0%A0%D1%83%D1%84%D0%B8%D0%BD%D0%B0_%D0%A2%D1%80%D0%B5%D1%82%D1%8C%D1%8F%D0%BA%D0%BE%D0%B2%D0%B0/%D0%A5%D1%80%D0%B0%D0%BD%D0%B5%D0%BD%D0%B8%D0%B5_%D0%BD%D0%B5%D0%BD%D1%83%D0%BB%D0%B5%D0%B2%D1%8B%D1%85_%D1%8D%D0%BB%D0%B5%D0%BC%D0%B5%D0%BD%D1%82%D0%BE%D0%B2_%D1%80%D0%B0%D0%B7%D1%80%D0%B5%D0%B6%D0%B5%D0%BD%D0%BD%D1%8B%D1%85_%D0%BC%D0%B0%D1%82%D1%80%D0%B8%D1%86._%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=6612</id>
		<title>Участник:Руфина Третьякова/Хранение ненулевых элементов разреженных матриц. Умножение разреженной матрицы на вектор</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:%D0%A0%D1%83%D1%84%D0%B8%D0%BD%D0%B0_%D0%A2%D1%80%D0%B5%D1%82%D1%8C%D1%8F%D0%BA%D0%BE%D0%B2%D0%B0/%D0%A5%D1%80%D0%B0%D0%BD%D0%B5%D0%BD%D0%B8%D0%B5_%D0%BD%D0%B5%D0%BD%D1%83%D0%BB%D0%B5%D0%B2%D1%8B%D1%85_%D1%8D%D0%BB%D0%B5%D0%BC%D0%B5%D0%BD%D1%82%D0%BE%D0%B2_%D1%80%D0%B0%D0%B7%D1%80%D0%B5%D0%B6%D0%B5%D0%BD%D0%BD%D1%8B%D1%85_%D0%BC%D0%B0%D1%82%D1%80%D0%B8%D1%86._%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=6612"/>
		<updated>2016-10-13T16:46:50Z</updated>

		<summary type="html">&lt;p&gt;Екатерина Буторина: /* Литература */&lt;/p&gt;
&lt;hr /&gt;
&lt;div&gt;{{algorithm&lt;br /&gt;
| name              = Умножение разреженной матрицы на вектор&lt;br /&gt;
| serial_complexity = &amp;lt;math&amp;gt;nnz&amp;lt;/math&amp;gt;&lt;br /&gt;
| pf_height         = &amp;lt;math&amp;gt;&amp;lt;/math&amp;gt;&lt;br /&gt;
| pf_width          = &amp;lt;math&amp;gt;&amp;lt;/math&amp;gt;&lt;br /&gt;
| input_data        = &amp;lt;math&amp;gt;2(nnz+n)+1&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;
Авторы статьи: [[Участница:Руфина_Третьякова|Третьякова Р. М.]] (группа 603), [[Участница:Екатерина_Буторина|Буторина Е. В.]] (группа 603)&lt;br /&gt;
&lt;br /&gt;
&lt;br /&gt;
&lt;br /&gt;
== Свойства и структура алгоритма ==&lt;br /&gt;
&lt;br /&gt;
=== Общее описание алгоритма ===&lt;br /&gt;
Разрежённая матрица — это матрица с преимущественно нулевыми элементами. В противном случае, если бо́льшая часть элементов матрицы ненулевые, матрица считается плотной.&lt;br /&gt;
Среди специалистов нет единства в определении того, какое именно количество ненулевых элементов делает матрицу разрежённой. Разные авторы предлагают различные варианты. &lt;br /&gt;
Огромные разрежённые матрицы часто возникают при решении таких задач, как дифференциальное уравнение в частных производных.&lt;br /&gt;
При хранении и преобразовании разрежённых матриц в компьютере бывает полезно, а часто и необходимо, использовать специальные алгоритмы и структуры данных, которые учитывают разрежённую структуру матрицы. Операции и алгоритмы, применяемые для работы с обычными, плотными матрицами, применительно к большим разрежённым матрицам работают относительно медленно и требуют значительных объёмов памяти. Однако разрежённые матрицы могут быть легко сжаты путём записи только своих ненулевых элементов, что снижает требования к компьютерной памяти.&lt;br /&gt;
&lt;br /&gt;
=== Математическое описание алгоритма ===&lt;br /&gt;
Исходные данные:  разреженная матрица &amp;lt;math&amp;gt;M^{n*n}&amp;lt;/math&amp;gt;, вектор &amp;lt;math&amp;gt;x^{n*1}&amp;lt;/math&amp;gt; &lt;br /&gt;
&lt;br /&gt;
Наиболее удобным форматом для вычисления произведения матрицы на вектор является &amp;quot;Compressed Sparse Row&amp;quot; или сокращенно CSR-формат.&lt;br /&gt;
&lt;br /&gt;
Рассмотрим CSR-представление разреженной матрицы: пусть число ненулевых элементов матрицы равно &amp;lt;math&amp;gt;nnz&amp;lt;/math&amp;gt;&lt;br /&gt;
CSR-формат представляет матрицу &amp;lt;math&amp;gt;M&amp;lt;/math&amp;gt; в виде 3-х одномерных массивов:&lt;br /&gt;
&lt;br /&gt;
массив &amp;lt;math&amp;gt;A&amp;lt;/math&amp;gt; размера &amp;lt;math&amp;gt;nnz&amp;lt;/math&amp;gt; содержит ненулевые значения матрицы,&lt;br /&gt;
&amp;lt;math&amp;gt;JA&amp;lt;/math&amp;gt; размера &amp;lt;math&amp;gt;nnz&amp;lt;/math&amp;gt; - номера столбцов ненулевых элементов., &lt;br /&gt;
&amp;lt;math&amp;gt;IA&amp;lt;/math&amp;gt; размера &amp;lt;math&amp;gt;n&amp;lt;/math&amp;gt;- содержит номер с которого начинается описание элементов строки в массивах &amp;lt;math&amp;gt;A&amp;lt;/math&amp;gt; и &amp;lt;math&amp;gt;JA&amp;lt;/math&amp;gt;.&lt;br /&gt;
Этот формат позволяет производить перемножение матрицы &amp;lt;math&amp;gt;M&amp;lt;/math&amp;gt; на вектор &amp;lt;math&amp;gt;x&amp;lt;/math&amp;gt; за &amp;lt;math&amp;gt;O(nnz)&amp;lt;/math&amp;gt; умножений и сложений. &lt;br /&gt;
&lt;br /&gt;
Например, это разреженная матрица с 4-мя ненулевыми элементами&lt;br /&gt;
:: &amp;lt;math&amp;gt;\begin{pmatrix}&lt;br /&gt;
0 &amp;amp; 0 &amp;amp; 0 &amp;amp; 1 \\&lt;br /&gt;
2 &amp;amp; 0 &amp;amp; 0 &amp;amp; 0 \\&lt;br /&gt;
0 &amp;amp; 0 &amp;amp; 3 &amp;amp; 0 \\&lt;br /&gt;
0 &amp;amp; 4 &amp;amp; 0 &amp;amp; 0 \\&lt;br /&gt;
\end{pmatrix}&amp;lt;/math&amp;gt;,&lt;br /&gt;
 представляемая в формате CSR &lt;br /&gt;
    A  = [ 1 2 3 4 ]&lt;br /&gt;
    IA = [ 0 1 2 3 4 ]&lt;br /&gt;
    JA = [ 3 0 2 1 ]&lt;br /&gt;
&lt;br /&gt;
&lt;br /&gt;
Вычисляемые данные: вектор  &amp;lt;math&amp;gt;M*x=y&amp;lt;/math&amp;gt;&lt;br /&gt;
&lt;br /&gt;
=== Вычислительное ядро алгоритма ===&lt;br /&gt;
&lt;br /&gt;
:&amp;lt;math&amp;gt;y_i = \sum_{k = IA_i}^{IA_{i+1}} A_k x_{JA_k}&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;
    число строк матрицы &#039;&#039;n&#039;&#039;; &lt;br /&gt;
    разреженная матрица в формате CSR:&lt;br /&gt;
      строчные указатели &#039;&#039;IA&#039;&#039;,&lt;br /&gt;
      столбцовые указатели&#039;&#039;JA&#039;&#039;, &lt;br /&gt;
      ненулевые элементы &#039;&#039;A&#039;&#039;;&lt;br /&gt;
    вектор &#039;&#039;x&#039;&#039;.&lt;br /&gt;
  &#039;&#039;&#039;Выходные данные&#039;&#039;&#039;: произведение матрицы на вектор &#039;&#039;y&#039;&#039;.&lt;br /&gt;
  &#039;&#039;&#039;read CSR&#039;&#039;&#039; &#039;&#039;n&#039;&#039;, &#039;&#039;IA&#039;&#039;, &#039;&#039;JA&#039;&#039;, &#039;&#039;A&#039;&#039;;&lt;br /&gt;
  &#039;&#039;&#039;read&#039;&#039;&#039; &#039;&#039;x&#039;&#039;&lt;br /&gt;
  &#039;&#039;&#039;for&#039;&#039;&#039; &#039;&#039;i&#039;&#039; = 1,n:&lt;br /&gt;
    &#039;&#039;&#039;for&#039;&#039;&#039; &#039;&#039;k&#039;&#039; = &#039;&#039;IA(i)&#039;&#039;, &#039;&#039;IA(i+1)-1&#039;&#039;:&lt;br /&gt;
            &#039;&#039;y(i)&#039;&#039; += &#039;&#039;A(k)&#039;&#039;*&#039;&#039;x(JA(k))&#039;&#039;;&lt;br /&gt;
  &#039;&#039;&#039;write&#039;&#039;&#039; &#039;&#039;y&#039;&#039;;&lt;br /&gt;
&lt;br /&gt;
=== Схема реализации последовательного алгоритма ===&lt;br /&gt;
Метод можно описать следующим образом:&lt;br /&gt;
# привести матрицу &amp;lt;math&amp;gt;M&amp;lt;/math&amp;gt; к формату CSR&lt;br /&gt;
# для &amp;lt;math&amp;gt;i&amp;lt;/math&amp;gt; от &amp;lt;math&amp;gt;0&amp;lt;/math&amp;gt; до &amp;lt;math&amp;gt;n-1&amp;lt;/math&amp;gt; вычислить &amp;lt;math&amp;gt;y_i&amp;lt;/math&amp;gt; по формуле &amp;lt;math&amp;gt;y_i = \sum_{k = IA_i}^{IA_{i+1}} A_k x_{JA_k}&amp;lt;/math&amp;gt;&lt;br /&gt;
&lt;br /&gt;
=== Последовательная сложность алгоритма ===&lt;br /&gt;
Для вычисления матрично-векторного произведения матрицы размера &amp;lt;math&amp;gt;n*n&amp;lt;/math&amp;gt; и вектора размера n в последовательном варианте требуется:&lt;br /&gt;
&lt;br /&gt;
* &amp;lt;math&amp;gt;nnz&amp;lt;/math&amp;gt; сложений,&lt;br /&gt;
* &amp;lt;math&amp;gt;nnz&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;n&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; AI &amp;lt;/math&amp;gt; размерности &amp;lt;math&amp;gt; n+1 &amp;lt;/math&amp;gt;;&lt;br /&gt;
# вектор &amp;lt;math&amp;gt; AJ &amp;lt;/math&amp;gt; размерности &amp;lt;math&amp;gt; nnz &amp;lt;/math&amp;gt;;&lt;br /&gt;
# вектор &amp;lt;math&amp;gt; A &amp;lt;/math&amp;gt; размерности &amp;lt;math&amp;gt; nnz &amp;lt;/math&amp;gt;;&lt;br /&gt;
# вектор &amp;lt;math&amp;gt; x &amp;lt;/math&amp;gt; размерности &amp;lt;math&amp;gt; n &amp;lt;/math&amp;gt;.&lt;br /&gt;
&lt;br /&gt;
Суммарная размерность входных данных: &amp;lt;math&amp;gt; 2(nnz + n) + 1 &amp;lt;/math&amp;gt;&lt;br /&gt;
&lt;br /&gt;
Выходными данными является&lt;br /&gt;
# вектор &amp;lt;math&amp;gt; y &amp;lt;/math&amp;gt; размерности &amp;lt;math&amp;gt; n &amp;lt;/math&amp;gt;.&lt;br /&gt;
&lt;br /&gt;
Объем выходных данных: &amp;lt;math&amp;gt; n &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;
Последовательная реализация имеется в пакете SPARSKIT [http://w3.pppl.gov/~hammett/work/2006/gmres/SPARSKIT2/BLASSM/matvec.f], Python.Scipy [https://docs.scipy.org/doc/scipy-0.14.0/reference/generated/scipy.sparse.csr_matrix.html]&lt;br /&gt;
&lt;br /&gt;
Параллельный алгоритм реализован в библиотеке Matlab [http://citeseerx.ist.psu.edu/viewdoc/download?doi=10.1.1.83.6692&amp;amp;rep=rep1&amp;amp;type=pdf], Intel MKL [https://software.intel.com/en-us/node/468536#D09FB46A-B404-44CC-94ED-1C434C41B6E1]&lt;br /&gt;
&lt;br /&gt;
== Литература ==&lt;br /&gt;
[1] С. Писсанецки. Технология разреженных матриц. Изд. Мир, 1988.&lt;br /&gt;
&lt;br /&gt;
[2] В. В. Воеводин, Вл.В. Воеводин. Параллельные вычисления. – СПб.: БХВ - Петербург, 2002.&lt;/div&gt;</summary>
		<author><name>Екатерина Буторина</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:%D0%A0%D1%83%D1%84%D0%B8%D0%BD%D0%B0_%D0%A2%D1%80%D0%B5%D1%82%D1%8C%D1%8F%D0%BA%D0%BE%D0%B2%D0%B0/%D0%A5%D1%80%D0%B0%D0%BD%D0%B5%D0%BD%D0%B8%D0%B5_%D0%BD%D0%B5%D0%BD%D1%83%D0%BB%D0%B5%D0%B2%D1%8B%D1%85_%D1%8D%D0%BB%D0%B5%D0%BC%D0%B5%D0%BD%D1%82%D0%BE%D0%B2_%D1%80%D0%B0%D0%B7%D1%80%D0%B5%D0%B6%D0%B5%D0%BD%D0%BD%D1%8B%D1%85_%D0%BC%D0%B0%D1%82%D1%80%D0%B8%D1%86._%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=6609</id>
		<title>Участник:Руфина Третьякова/Хранение ненулевых элементов разреженных матриц. Умножение разреженной матрицы на вектор</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:%D0%A0%D1%83%D1%84%D0%B8%D0%BD%D0%B0_%D0%A2%D1%80%D0%B5%D1%82%D1%8C%D1%8F%D0%BA%D0%BE%D0%B2%D0%B0/%D0%A5%D1%80%D0%B0%D0%BD%D0%B5%D0%BD%D0%B8%D0%B5_%D0%BD%D0%B5%D0%BD%D1%83%D0%BB%D0%B5%D0%B2%D1%8B%D1%85_%D1%8D%D0%BB%D0%B5%D0%BC%D0%B5%D0%BD%D1%82%D0%BE%D0%B2_%D1%80%D0%B0%D0%B7%D1%80%D0%B5%D0%B6%D0%B5%D0%BD%D0%BD%D1%8B%D1%85_%D0%BC%D0%B0%D1%82%D1%80%D0%B8%D1%86._%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=6609"/>
		<updated>2016-10-13T16:44:32Z</updated>

		<summary type="html">&lt;p&gt;Екатерина Буторина: /* Входные и выходные данные алгоритма */&lt;/p&gt;
&lt;hr /&gt;
&lt;div&gt;{{algorithm&lt;br /&gt;
| name              = Умножение разреженной матрицы на вектор&lt;br /&gt;
| serial_complexity = &amp;lt;math&amp;gt;nnz&amp;lt;/math&amp;gt;&lt;br /&gt;
| pf_height         = &amp;lt;math&amp;gt;&amp;lt;/math&amp;gt;&lt;br /&gt;
| pf_width          = &amp;lt;math&amp;gt;&amp;lt;/math&amp;gt;&lt;br /&gt;
| input_data        = &amp;lt;math&amp;gt;2(nnz+n)+1&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;
Авторы статьи: [[Участница:Руфина_Третьякова|Третьякова Р. М.]] (группа 603), [[Участница:Екатерина_Буторина|Буторина Е. В.]] (группа 603)&lt;br /&gt;
&lt;br /&gt;
&lt;br /&gt;
&lt;br /&gt;
== Свойства и структура алгоритма ==&lt;br /&gt;
&lt;br /&gt;
=== Общее описание алгоритма ===&lt;br /&gt;
Разрежённая матрица — это матрица с преимущественно нулевыми элементами. В противном случае, если бо́льшая часть элементов матрицы ненулевые, матрица считается плотной.&lt;br /&gt;
Среди специалистов нет единства в определении того, какое именно количество ненулевых элементов делает матрицу разрежённой. Разные авторы предлагают различные варианты. &lt;br /&gt;
Огромные разрежённые матрицы часто возникают при решении таких задач, как дифференциальное уравнение в частных производных.&lt;br /&gt;
При хранении и преобразовании разрежённых матриц в компьютере бывает полезно, а часто и необходимо, использовать специальные алгоритмы и структуры данных, которые учитывают разрежённую структуру матрицы. Операции и алгоритмы, применяемые для работы с обычными, плотными матрицами, применительно к большим разрежённым матрицам работают относительно медленно и требуют значительных объёмов памяти. Однако разрежённые матрицы могут быть легко сжаты путём записи только своих ненулевых элементов, что снижает требования к компьютерной памяти.&lt;br /&gt;
&lt;br /&gt;
=== Математическое описание алгоритма ===&lt;br /&gt;
Исходные данные:  разреженная матрица &amp;lt;math&amp;gt;M^{n*n}&amp;lt;/math&amp;gt;, вектор &amp;lt;math&amp;gt;x^{n*1}&amp;lt;/math&amp;gt; &lt;br /&gt;
&lt;br /&gt;
Наиболее удобным форматом для вычисления произведения матрицы на вектор является &amp;quot;Compressed Sparse Row&amp;quot; или сокращенно CSR-формат.&lt;br /&gt;
&lt;br /&gt;
Рассмотрим CSR-представление разреженной матрицы: пусть число ненулевых элементов матрицы равно &amp;lt;math&amp;gt;nnz&amp;lt;/math&amp;gt;&lt;br /&gt;
CSR-формат представляет матрицу &amp;lt;math&amp;gt;M&amp;lt;/math&amp;gt; в виде 3-х одномерных массивов:&lt;br /&gt;
&lt;br /&gt;
массив &amp;lt;math&amp;gt;A&amp;lt;/math&amp;gt; размера &amp;lt;math&amp;gt;nnz&amp;lt;/math&amp;gt; содержит ненулевые значения матрицы,&lt;br /&gt;
&amp;lt;math&amp;gt;JA&amp;lt;/math&amp;gt; размера &amp;lt;math&amp;gt;nnz&amp;lt;/math&amp;gt; - номера столбцов ненулевых элементов., &lt;br /&gt;
&amp;lt;math&amp;gt;IA&amp;lt;/math&amp;gt; размера &amp;lt;math&amp;gt;n&amp;lt;/math&amp;gt;- содержит номер с которого начинается описание элементов строки в массивах &amp;lt;math&amp;gt;A&amp;lt;/math&amp;gt; и &amp;lt;math&amp;gt;JA&amp;lt;/math&amp;gt;.&lt;br /&gt;
Этот формат позволяет производить перемножение матрицы &amp;lt;math&amp;gt;M&amp;lt;/math&amp;gt; на вектор &amp;lt;math&amp;gt;x&amp;lt;/math&amp;gt; за &amp;lt;math&amp;gt;O(nnz)&amp;lt;/math&amp;gt; умножений и сложений. &lt;br /&gt;
&lt;br /&gt;
Например, это разреженная матрица с 4-мя ненулевыми элементами&lt;br /&gt;
:: &amp;lt;math&amp;gt;\begin{pmatrix}&lt;br /&gt;
0 &amp;amp; 0 &amp;amp; 0 &amp;amp; 1 \\&lt;br /&gt;
2 &amp;amp; 0 &amp;amp; 0 &amp;amp; 0 \\&lt;br /&gt;
0 &amp;amp; 0 &amp;amp; 3 &amp;amp; 0 \\&lt;br /&gt;
0 &amp;amp; 4 &amp;amp; 0 &amp;amp; 0 \\&lt;br /&gt;
\end{pmatrix}&amp;lt;/math&amp;gt;,&lt;br /&gt;
 представляемая в формате CSR &lt;br /&gt;
    A  = [ 1 2 3 4 ]&lt;br /&gt;
    IA = [ 0 1 2 3 4 ]&lt;br /&gt;
    JA = [ 3 0 2 1 ]&lt;br /&gt;
&lt;br /&gt;
&lt;br /&gt;
Вычисляемые данные: вектор  &amp;lt;math&amp;gt;M*x=y&amp;lt;/math&amp;gt;&lt;br /&gt;
&lt;br /&gt;
=== Вычислительное ядро алгоритма ===&lt;br /&gt;
&lt;br /&gt;
:&amp;lt;math&amp;gt;y_i = \sum_{k = IA_i}^{IA_{i+1}} A_k x_{JA_k}&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;
    число строк матрицы &#039;&#039;n&#039;&#039;; &lt;br /&gt;
    разреженная матрица в формате CSR:&lt;br /&gt;
      строчные указатели &#039;&#039;IA&#039;&#039;,&lt;br /&gt;
      столбцовые указатели&#039;&#039;JA&#039;&#039;, &lt;br /&gt;
      ненулевые элементы &#039;&#039;A&#039;&#039;;&lt;br /&gt;
    вектор &#039;&#039;x&#039;&#039;.&lt;br /&gt;
  &#039;&#039;&#039;Выходные данные&#039;&#039;&#039;: произведение матрицы на вектор &#039;&#039;y&#039;&#039;.&lt;br /&gt;
  &#039;&#039;&#039;read CSR&#039;&#039;&#039; &#039;&#039;n&#039;&#039;, &#039;&#039;IA&#039;&#039;, &#039;&#039;JA&#039;&#039;, &#039;&#039;A&#039;&#039;;&lt;br /&gt;
  &#039;&#039;&#039;read&#039;&#039;&#039; &#039;&#039;x&#039;&#039;&lt;br /&gt;
  &#039;&#039;&#039;for&#039;&#039;&#039; &#039;&#039;i&#039;&#039; = 1,n:&lt;br /&gt;
    &#039;&#039;&#039;for&#039;&#039;&#039; &#039;&#039;k&#039;&#039; = &#039;&#039;IA(i)&#039;&#039;, &#039;&#039;IA(i+1)-1&#039;&#039;:&lt;br /&gt;
            &#039;&#039;y(i)&#039;&#039; += &#039;&#039;A(k)&#039;&#039;*&#039;&#039;x(JA(k))&#039;&#039;;&lt;br /&gt;
  &#039;&#039;&#039;write&#039;&#039;&#039; &#039;&#039;y&#039;&#039;;&lt;br /&gt;
&lt;br /&gt;
=== Схема реализации последовательного алгоритма ===&lt;br /&gt;
Метод можно описать следующим образом:&lt;br /&gt;
# привести матрицу &amp;lt;math&amp;gt;M&amp;lt;/math&amp;gt; к формату CSR&lt;br /&gt;
# для &amp;lt;math&amp;gt;i&amp;lt;/math&amp;gt; от &amp;lt;math&amp;gt;0&amp;lt;/math&amp;gt; до &amp;lt;math&amp;gt;n-1&amp;lt;/math&amp;gt; вычислить &amp;lt;math&amp;gt;y_i&amp;lt;/math&amp;gt; по формуле &amp;lt;math&amp;gt;y_i = \sum_{k = IA_i}^{IA_{i+1}} A_k x_{JA_k}&amp;lt;/math&amp;gt;&lt;br /&gt;
&lt;br /&gt;
=== Последовательная сложность алгоритма ===&lt;br /&gt;
Для вычисления матрично-векторного произведения матрицы размера &amp;lt;math&amp;gt;n*n&amp;lt;/math&amp;gt; и вектора размера n в последовательном варианте требуется:&lt;br /&gt;
&lt;br /&gt;
* &amp;lt;math&amp;gt;nnz&amp;lt;/math&amp;gt; сложений,&lt;br /&gt;
* &amp;lt;math&amp;gt;nnz&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;n&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; AI &amp;lt;/math&amp;gt; размерности &amp;lt;math&amp;gt; n+1 &amp;lt;/math&amp;gt;;&lt;br /&gt;
# вектор &amp;lt;math&amp;gt; AJ &amp;lt;/math&amp;gt; размерности &amp;lt;math&amp;gt; nnz &amp;lt;/math&amp;gt;;&lt;br /&gt;
# вектор &amp;lt;math&amp;gt; A &amp;lt;/math&amp;gt; размерности &amp;lt;math&amp;gt; nnz &amp;lt;/math&amp;gt;;&lt;br /&gt;
# вектор &amp;lt;math&amp;gt; x &amp;lt;/math&amp;gt; размерности &amp;lt;math&amp;gt; n &amp;lt;/math&amp;gt;.&lt;br /&gt;
&lt;br /&gt;
Суммарная размерность входных данных: &amp;lt;math&amp;gt; 2(nnz + n) + 1 &amp;lt;/math&amp;gt;&lt;br /&gt;
&lt;br /&gt;
Выходными данными является&lt;br /&gt;
# вектор &amp;lt;math&amp;gt; y &amp;lt;/math&amp;gt; размерности &amp;lt;math&amp;gt; n &amp;lt;/math&amp;gt;.&lt;br /&gt;
&lt;br /&gt;
Объем выходных данных: &amp;lt;math&amp;gt; n &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;
Последовательная реализация имеется в пакете SPARSKIT [http://w3.pppl.gov/~hammett/work/2006/gmres/SPARSKIT2/BLASSM/matvec.f], Python.Scipy [https://docs.scipy.org/doc/scipy-0.14.0/reference/generated/scipy.sparse.csr_matrix.html]&lt;br /&gt;
&lt;br /&gt;
Параллельный алгоритм реализован в библиотеке Matlab [http://citeseerx.ist.psu.edu/viewdoc/download?doi=10.1.1.83.6692&amp;amp;rep=rep1&amp;amp;type=pdf], Intel MKL [https://software.intel.com/en-us/node/468536#D09FB46A-B404-44CC-94ED-1C434C41B6E1]&lt;br /&gt;
&lt;br /&gt;
== Литература ==&lt;br /&gt;
[1] С. Писсанецки. Технология разреженных матриц. Изд. Мир, 1988.&lt;/div&gt;</summary>
		<author><name>Екатерина Буторина</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:%D0%A0%D1%83%D1%84%D0%B8%D0%BD%D0%B0_%D0%A2%D1%80%D0%B5%D1%82%D1%8C%D1%8F%D0%BA%D0%BE%D0%B2%D0%B0/%D0%A5%D1%80%D0%B0%D0%BD%D0%B5%D0%BD%D0%B8%D0%B5_%D0%BD%D0%B5%D0%BD%D1%83%D0%BB%D0%B5%D0%B2%D1%8B%D1%85_%D1%8D%D0%BB%D0%B5%D0%BC%D0%B5%D0%BD%D1%82%D0%BE%D0%B2_%D1%80%D0%B0%D0%B7%D1%80%D0%B5%D0%B6%D0%B5%D0%BD%D0%BD%D1%8B%D1%85_%D0%BC%D0%B0%D1%82%D1%80%D0%B8%D1%86._%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=6412</id>
		<title>Участник:Руфина Третьякова/Хранение ненулевых элементов разреженных матриц. Умножение разреженной матрицы на вектор</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:%D0%A0%D1%83%D1%84%D0%B8%D0%BD%D0%B0_%D0%A2%D1%80%D0%B5%D1%82%D1%8C%D1%8F%D0%BA%D0%BE%D0%B2%D0%B0/%D0%A5%D1%80%D0%B0%D0%BD%D0%B5%D0%BD%D0%B8%D0%B5_%D0%BD%D0%B5%D0%BD%D1%83%D0%BB%D0%B5%D0%B2%D1%8B%D1%85_%D1%8D%D0%BB%D0%B5%D0%BC%D0%B5%D0%BD%D1%82%D0%BE%D0%B2_%D1%80%D0%B0%D0%B7%D1%80%D0%B5%D0%B6%D0%B5%D0%BD%D0%BD%D1%8B%D1%85_%D0%BC%D0%B0%D1%82%D1%80%D0%B8%D1%86._%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=6412"/>
		<updated>2016-10-13T11:59:59Z</updated>

		<summary type="html">&lt;p&gt;Екатерина Буторина: &lt;/p&gt;
&lt;hr /&gt;
&lt;div&gt;{{algorithm&lt;br /&gt;
| name              = Умножение разреженной матрицы на вектор&lt;br /&gt;
| serial_complexity = &amp;lt;math&amp;gt;nnz&amp;lt;/math&amp;gt;&lt;br /&gt;
| pf_height         = &amp;lt;math&amp;gt;&amp;lt;/math&amp;gt;&lt;br /&gt;
| pf_width          = &amp;lt;math&amp;gt;&amp;lt;/math&amp;gt;&lt;br /&gt;
| input_data        = &amp;lt;math&amp;gt;2(nnz+n)+1&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;
Авторы статьи: [[Участница:Руфина_Третьякова|Третьякова Р. М.]] (группа 603), [[Участница:Екатерина_Буторина|Буторина Е. В.]] (группа 603)&lt;br /&gt;
&lt;br /&gt;
&lt;br /&gt;
&lt;br /&gt;
== Свойства и структура алгоритма ==&lt;br /&gt;
&lt;br /&gt;
=== Общее описание алгоритма ===&lt;br /&gt;
Разрежённая матрица — это матрица с преимущественно нулевыми элементами. В противном случае, если бо́льшая часть элементов матрицы ненулевые, матрица считается плотной.&lt;br /&gt;
Среди специалистов нет единства в определении того, какое именно количество ненулевых элементов делает матрицу разрежённой. Разные авторы предлагают различные варианты. &lt;br /&gt;
Огромные разрежённые матрицы часто возникают при решении таких задач, как дифференциальное уравнение в частных производных.&lt;br /&gt;
При хранении и преобразовании разрежённых матриц в компьютере бывает полезно, а часто и необходимо, использовать специальные алгоритмы и структуры данных, которые учитывают разрежённую структуру матрицы. Операции и алгоритмы, применяемые для работы с обычными, плотными матрицами, применительно к большим разрежённым матрицам работают относительно медленно и требуют значительных объёмов памяти. Однако разрежённые матрицы могут быть легко сжаты путём записи только своих ненулевых элементов, что снижает требования к компьютерной памяти.&lt;br /&gt;
&lt;br /&gt;
=== Математическое описание алгоритма ===&lt;br /&gt;
Исходные данные:  разреженная матрица &amp;lt;math&amp;gt;M^{n*n}&amp;lt;/math&amp;gt;, вектор &amp;lt;math&amp;gt;x^{n*1}&amp;lt;/math&amp;gt; &lt;br /&gt;
&lt;br /&gt;
Наиболее удобным форматом для вычисления произведения матрицы на вектор является &amp;quot;Compressed Sparse Row&amp;quot; или сокращенно CSR-формат.&lt;br /&gt;
&lt;br /&gt;
Рассмотрим CSR-представление разреженной матрицы: пусть число ненулевых элементов матрицы равно &amp;lt;math&amp;gt;nnz&amp;lt;/math&amp;gt;&lt;br /&gt;
CSR-формат представляет матрицу &amp;lt;math&amp;gt;M&amp;lt;/math&amp;gt; в виде 3-х одномерных массивов:&lt;br /&gt;
&lt;br /&gt;
массив &amp;lt;math&amp;gt;A&amp;lt;/math&amp;gt; размера &amp;lt;math&amp;gt;nnz&amp;lt;/math&amp;gt; содержит ненулевые значения матрицы,&lt;br /&gt;
&amp;lt;math&amp;gt;JA&amp;lt;/math&amp;gt; размера &amp;lt;math&amp;gt;nnz&amp;lt;/math&amp;gt; - номера столбцов ненулевых элементов., &lt;br /&gt;
&amp;lt;math&amp;gt;IA&amp;lt;/math&amp;gt; размера &amp;lt;math&amp;gt;n&amp;lt;/math&amp;gt;- содержит номер с которого начинается описание элементов строки в массивах &amp;lt;math&amp;gt;A&amp;lt;/math&amp;gt; и &amp;lt;math&amp;gt;JA&amp;lt;/math&amp;gt;.&lt;br /&gt;
Этот формат позволяет производить перемножение матрицы &amp;lt;math&amp;gt;M&amp;lt;/math&amp;gt; на вектор &amp;lt;math&amp;gt;x&amp;lt;/math&amp;gt; за &amp;lt;math&amp;gt;O(nnz)&amp;lt;/math&amp;gt; умножений и сложений. &lt;br /&gt;
&lt;br /&gt;
Например, это разреженная матрица с 4-мя ненулевыми элементами&lt;br /&gt;
:: &amp;lt;math&amp;gt;\begin{pmatrix}&lt;br /&gt;
0 &amp;amp; 0 &amp;amp; 0 &amp;amp; 1 \\&lt;br /&gt;
2 &amp;amp; 0 &amp;amp; 0 &amp;amp; 0 \\&lt;br /&gt;
0 &amp;amp; 0 &amp;amp; 3 &amp;amp; 0 \\&lt;br /&gt;
0 &amp;amp; 4 &amp;amp; 0 &amp;amp; 0 \\&lt;br /&gt;
\end{pmatrix}&amp;lt;/math&amp;gt;,&lt;br /&gt;
 представляемая в формате CSR &lt;br /&gt;
    A  = [ 1 2 3 4 ]&lt;br /&gt;
    IA = [ 0 1 2 3 4 ]&lt;br /&gt;
    JA = [ 3 0 2 1 ]&lt;br /&gt;
&lt;br /&gt;
&lt;br /&gt;
Вычисляемые данные: вектор  &amp;lt;math&amp;gt;M*x=y&amp;lt;/math&amp;gt;&lt;br /&gt;
&lt;br /&gt;
=== Вычислительное ядро алгоритма ===&lt;br /&gt;
&lt;br /&gt;
:&amp;lt;math&amp;gt;y_i = \sum_{k = IA_i}^{IA_{i+1}} A_k x_{JA_k}&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;
    число строк матрицы &#039;&#039;n&#039;&#039;; &lt;br /&gt;
    разреженная матрица в формате CSR:&lt;br /&gt;
      строчные указатели &#039;&#039;IA&#039;&#039;,&lt;br /&gt;
      столбцовые указатели&#039;&#039;JA&#039;&#039;, &lt;br /&gt;
      ненулевые элементы &#039;&#039;A&#039;&#039;;&lt;br /&gt;
    вектор &#039;&#039;x&#039;&#039;.&lt;br /&gt;
  &#039;&#039;&#039;Выходные данные&#039;&#039;&#039;: произведение матрицы на вектор &#039;&#039;y&#039;&#039;.&lt;br /&gt;
  &#039;&#039;&#039;read CSR&#039;&#039;&#039; &#039;&#039;n&#039;&#039;, &#039;&#039;IA&#039;&#039;, &#039;&#039;JA&#039;&#039;, &#039;&#039;A&#039;&#039;;&lt;br /&gt;
  &#039;&#039;&#039;read&#039;&#039;&#039; &#039;&#039;x&#039;&#039;&lt;br /&gt;
  &#039;&#039;&#039;for&#039;&#039;&#039; &#039;&#039;i&#039;&#039; = 1,n:&lt;br /&gt;
    &#039;&#039;&#039;for&#039;&#039;&#039; &#039;&#039;k&#039;&#039; = &#039;&#039;IA(i)&#039;&#039;, &#039;&#039;IA(i+1)-1&#039;&#039;:&lt;br /&gt;
            &#039;&#039;y(i)&#039;&#039; += &#039;&#039;A(k)&#039;&#039;*&#039;&#039;x(JA(k))&#039;&#039;;&lt;br /&gt;
  &#039;&#039;&#039;write&#039;&#039;&#039; &#039;&#039;y&#039;&#039;;&lt;br /&gt;
&lt;br /&gt;
=== Схема реализации последовательного алгоритма ===&lt;br /&gt;
Метод можно описать следующим образом:&lt;br /&gt;
# привести матрицу &amp;lt;math&amp;gt;M&amp;lt;/math&amp;gt; к формату CSR&lt;br /&gt;
# для &amp;lt;math&amp;gt;i&amp;lt;/math&amp;gt; от &amp;lt;math&amp;gt;0&amp;lt;/math&amp;gt; до &amp;lt;math&amp;gt;n-1&amp;lt;/math&amp;gt; вычислить &amp;lt;math&amp;gt;y_i&amp;lt;/math&amp;gt; по формуле &amp;lt;math&amp;gt;y_i = \sum_{k = IA_i}^{IA_{i+1}} A_k x_{JA_k}&amp;lt;/math&amp;gt;&lt;br /&gt;
&lt;br /&gt;
=== Последовательная сложность алгоритма ===&lt;br /&gt;
Для вычисления матрично-векторного произведения матрицы размера &amp;lt;math&amp;gt;n*n&amp;lt;/math&amp;gt; и вектора размера n в последовательном варианте требуется:&lt;br /&gt;
&lt;br /&gt;
* &amp;lt;math&amp;gt;nnz&amp;lt;/math&amp;gt; сложений,&lt;br /&gt;
* &amp;lt;math&amp;gt;nnz&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;n&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; AI &amp;lt;/math&amp;gt; размерности &amp;lt;math&amp;gt; n+1 &amp;lt;/math&amp;gt;;&lt;br /&gt;
# вектор &amp;lt;math&amp;gt; AJ &amp;lt;/math&amp;gt; размерности &amp;lt;math&amp;gt; nnz &amp;lt;/math&amp;gt;;&lt;br /&gt;
# вектор &amp;lt;math&amp;gt; A &amp;lt;/math&amp;gt; размерности &amp;lt;math&amp;gt; nnz &amp;lt;/math&amp;gt;;&lt;br /&gt;
# вектор &amp;lt;math&amp;gt; x &amp;lt;/math&amp;gt; размерности &amp;lt;math&amp;gt; n &amp;lt;/math&amp;gt;.&lt;br /&gt;
&lt;br /&gt;
Суммарная размерность входных данных: &amp;lt;math&amp;gt; 2(nnz + n) + 1 &amp;lt;/math&amp;gt;&lt;br /&gt;
&lt;br /&gt;
Выходными данными является&lt;br /&gt;
# вектор &amp;lt;math&amp;gt; y &amp;lt;/math&amp;gt; размерности &amp;lt;math&amp;gt; n &amp;lt;/math&amp;gt;.&lt;br /&gt;
&lt;br /&gt;
=== Свойства алгоритма ===&lt;br /&gt;
&lt;br /&gt;
== Программная реализация алгоритма ==&lt;br /&gt;
&lt;br /&gt;
=== Особенности реализации последовательного алгоритма ===&lt;br /&gt;
&lt;br /&gt;
=== Локальность данных и вычислений ===&lt;br /&gt;
&lt;br /&gt;
=== Возможные способы и особенности параллельной реализации алгоритма ===&lt;br /&gt;
&lt;br /&gt;
=== Масштабируемость алгоритма и его реализации ===&lt;br /&gt;
&lt;br /&gt;
=== Динамические характеристики и эффективность реализации алгоритма ===&lt;br /&gt;
&lt;br /&gt;
=== Выводы для классов архитектур ===&lt;br /&gt;
&lt;br /&gt;
=== Существующие реализации алгоритма ===&lt;br /&gt;
&lt;br /&gt;
Последовательная реализация имеется в пакете SPARSKIT [http://w3.pppl.gov/~hammett/work/2006/gmres/SPARSKIT2/BLASSM/matvec.f], Python.Scipy [https://docs.scipy.org/doc/scipy-0.14.0/reference/generated/scipy.sparse.csr_matrix.html]&lt;br /&gt;
&lt;br /&gt;
Параллельный алгоритм реализован в библиотеке Matlab [http://citeseerx.ist.psu.edu/viewdoc/download?doi=10.1.1.83.6692&amp;amp;rep=rep1&amp;amp;type=pdf], Intel MKL [https://software.intel.com/en-us/node/468536#D09FB46A-B404-44CC-94ED-1C434C41B6E1]&lt;br /&gt;
&lt;br /&gt;
== Литература ==&lt;br /&gt;
[1] С. Писсанецки. Технология разреженных матриц. Изд. Мир, 1988.&lt;/div&gt;</summary>
		<author><name>Екатерина Буторина</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:%D0%A0%D1%83%D1%84%D0%B8%D0%BD%D0%B0_%D0%A2%D1%80%D0%B5%D1%82%D1%8C%D1%8F%D0%BA%D0%BE%D0%B2%D0%B0/%D0%A5%D1%80%D0%B0%D0%BD%D0%B5%D0%BD%D0%B8%D0%B5_%D0%BD%D0%B5%D0%BD%D1%83%D0%BB%D0%B5%D0%B2%D1%8B%D1%85_%D1%8D%D0%BB%D0%B5%D0%BC%D0%B5%D0%BD%D1%82%D0%BE%D0%B2_%D1%80%D0%B0%D0%B7%D1%80%D0%B5%D0%B6%D0%B5%D0%BD%D0%BD%D1%8B%D1%85_%D0%BC%D0%B0%D1%82%D1%80%D0%B8%D1%86._%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=6409</id>
		<title>Участник:Руфина Третьякова/Хранение ненулевых элементов разреженных матриц. Умножение разреженной матрицы на вектор</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:%D0%A0%D1%83%D1%84%D0%B8%D0%BD%D0%B0_%D0%A2%D1%80%D0%B5%D1%82%D1%8C%D1%8F%D0%BA%D0%BE%D0%B2%D0%B0/%D0%A5%D1%80%D0%B0%D0%BD%D0%B5%D0%BD%D0%B8%D0%B5_%D0%BD%D0%B5%D0%BD%D1%83%D0%BB%D0%B5%D0%B2%D1%8B%D1%85_%D1%8D%D0%BB%D0%B5%D0%BC%D0%B5%D0%BD%D1%82%D0%BE%D0%B2_%D1%80%D0%B0%D0%B7%D1%80%D0%B5%D0%B6%D0%B5%D0%BD%D0%BD%D1%8B%D1%85_%D0%BC%D0%B0%D1%82%D1%80%D0%B8%D1%86._%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=6409"/>
		<updated>2016-10-13T11:57:27Z</updated>

		<summary type="html">&lt;p&gt;Екатерина Буторина: /* Ресурс параллелизма алгоритма */&lt;/p&gt;
&lt;hr /&gt;
&lt;div&gt;{{algorithm&lt;br /&gt;
| name              = Умножение разреженной матрицы на вектор&lt;br /&gt;
| serial_complexity = &amp;lt;math&amp;gt;nnz&amp;lt;/math&amp;gt;&lt;br /&gt;
| pf_height         = &amp;lt;math&amp;gt;&amp;lt;/math&amp;gt;&lt;br /&gt;
| pf_width          = &amp;lt;math&amp;gt;&amp;lt;/math&amp;gt;&lt;br /&gt;
| input_data        = &amp;lt;math&amp;gt;2nnz+2n+1&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;
Авторы статьи: [[Участница:Руфина_Третьякова|Третьякова Р. М.]] (группа 603), [[Участница:Екатерина_Буторина|Буторина Е. В.]] (группа 603)&lt;br /&gt;
&lt;br /&gt;
&lt;br /&gt;
&lt;br /&gt;
== Свойства и структура алгоритма ==&lt;br /&gt;
&lt;br /&gt;
=== Общее описание алгоритма ===&lt;br /&gt;
Разрежённая матрица — это матрица с преимущественно нулевыми элементами. В противном случае, если бо́льшая часть элементов матрицы ненулевые, матрица считается плотной.&lt;br /&gt;
Среди специалистов нет единства в определении того, какое именно количество ненулевых элементов делает матрицу разрежённой. Разные авторы предлагают различные варианты. &lt;br /&gt;
Огромные разрежённые матрицы часто возникают при решении таких задач, как дифференциальное уравнение в частных производных.&lt;br /&gt;
При хранении и преобразовании разрежённых матриц в компьютере бывает полезно, а часто и необходимо, использовать специальные алгоритмы и структуры данных, которые учитывают разрежённую структуру матрицы. Операции и алгоритмы, применяемые для работы с обычными, плотными матрицами, применительно к большим разрежённым матрицам работают относительно медленно и требуют значительных объёмов памяти. Однако разрежённые матрицы могут быть легко сжаты путём записи только своих ненулевых элементов, что снижает требования к компьютерной памяти.&lt;br /&gt;
&lt;br /&gt;
=== Математическое описание алгоритма ===&lt;br /&gt;
Исходные данные:  разреженная матрица &amp;lt;math&amp;gt;M^{n*n}&amp;lt;/math&amp;gt;, вектор &amp;lt;math&amp;gt;x^{n*1}&amp;lt;/math&amp;gt; &lt;br /&gt;
&lt;br /&gt;
Наиболее удобным форматом для вычисления произведения матрицы на вектор является &amp;quot;Compressed Sparse Row&amp;quot; или сокращенно CSR-формат.&lt;br /&gt;
&lt;br /&gt;
Рассмотрим CSR-представление разреженной матрицы: пусть число ненулевых элементов матрицы равно &amp;lt;math&amp;gt;nnz&amp;lt;/math&amp;gt;&lt;br /&gt;
CSR-формат представляет матрицу &amp;lt;math&amp;gt;M&amp;lt;/math&amp;gt; в виде 3-х одномерных массивов:&lt;br /&gt;
&lt;br /&gt;
массив &amp;lt;math&amp;gt;A&amp;lt;/math&amp;gt; размера &amp;lt;math&amp;gt;nnz&amp;lt;/math&amp;gt; содержит ненулевые значения матрицы,&lt;br /&gt;
&amp;lt;math&amp;gt;JA&amp;lt;/math&amp;gt; размера &amp;lt;math&amp;gt;nnz&amp;lt;/math&amp;gt; - номера столбцов ненулевых элементов., &lt;br /&gt;
&amp;lt;math&amp;gt;IA&amp;lt;/math&amp;gt; размера &amp;lt;math&amp;gt;n&amp;lt;/math&amp;gt;- содержит номер с которого начинается описание элементов строки в массивах &amp;lt;math&amp;gt;A&amp;lt;/math&amp;gt; и &amp;lt;math&amp;gt;JA&amp;lt;/math&amp;gt;.&lt;br /&gt;
Этот формат позволяет производить перемножение матрицы &amp;lt;math&amp;gt;M&amp;lt;/math&amp;gt; на вектор &amp;lt;math&amp;gt;x&amp;lt;/math&amp;gt; за &amp;lt;math&amp;gt;O(nnz)&amp;lt;/math&amp;gt; умножений и сложений. &lt;br /&gt;
&lt;br /&gt;
Например, это разреженная матрица с 4-мя ненулевыми элементами&lt;br /&gt;
:: &amp;lt;math&amp;gt;\begin{pmatrix}&lt;br /&gt;
0 &amp;amp; 0 &amp;amp; 0 &amp;amp; 1 \\&lt;br /&gt;
2 &amp;amp; 0 &amp;amp; 0 &amp;amp; 0 \\&lt;br /&gt;
0 &amp;amp; 0 &amp;amp; 3 &amp;amp; 0 \\&lt;br /&gt;
0 &amp;amp; 4 &amp;amp; 0 &amp;amp; 0 \\&lt;br /&gt;
\end{pmatrix}&amp;lt;/math&amp;gt;,&lt;br /&gt;
 представляемая в формате CSR &lt;br /&gt;
    A  = [ 1 2 3 4 ]&lt;br /&gt;
    IA = [ 0 1 2 3 4 ]&lt;br /&gt;
    JA = [ 3 0 2 1 ]&lt;br /&gt;
&lt;br /&gt;
&lt;br /&gt;
Вычисляемые данные: вектор  &amp;lt;math&amp;gt;M*x=y&amp;lt;/math&amp;gt;&lt;br /&gt;
&lt;br /&gt;
=== Вычислительное ядро алгоритма ===&lt;br /&gt;
&lt;br /&gt;
:&amp;lt;math&amp;gt;y_i = \sum_{k = IA_i}^{IA_{i+1}} A_k x_{JA_k}&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;
    число строк матрицы &#039;&#039;n&#039;&#039;; &lt;br /&gt;
    разреженная матрица в формате CSR:&lt;br /&gt;
      строчные указатели &#039;&#039;IA&#039;&#039;,&lt;br /&gt;
      столбцовые указатели&#039;&#039;JA&#039;&#039;, &lt;br /&gt;
      ненулевые элементы &#039;&#039;A&#039;&#039;;&lt;br /&gt;
    вектор &#039;&#039;x&#039;&#039;.&lt;br /&gt;
  &#039;&#039;&#039;Выходные данные&#039;&#039;&#039;: произведение матрицы на вектор &#039;&#039;y&#039;&#039;.&lt;br /&gt;
  &#039;&#039;&#039;read CSR&#039;&#039;&#039; &#039;&#039;n&#039;&#039;, &#039;&#039;IA&#039;&#039;, &#039;&#039;JA&#039;&#039;, &#039;&#039;A&#039;&#039;;&lt;br /&gt;
  &#039;&#039;&#039;read&#039;&#039;&#039; &#039;&#039;x&#039;&#039;&lt;br /&gt;
  &#039;&#039;&#039;for&#039;&#039;&#039; &#039;&#039;i&#039;&#039; = 1,n:&lt;br /&gt;
    &#039;&#039;&#039;for&#039;&#039;&#039; &#039;&#039;k&#039;&#039; = &#039;&#039;IA(i)&#039;&#039;, &#039;&#039;IA(i+1)-1&#039;&#039;:&lt;br /&gt;
            &#039;&#039;y(i)&#039;&#039; += &#039;&#039;A(k)&#039;&#039;*&#039;&#039;x(JA(k))&#039;&#039;;&lt;br /&gt;
  &#039;&#039;&#039;write&#039;&#039;&#039; &#039;&#039;y&#039;&#039;;&lt;br /&gt;
&lt;br /&gt;
=== Схема реализации последовательного алгоритма ===&lt;br /&gt;
Метод можно описать следующим образом:&lt;br /&gt;
# привести матрицу &amp;lt;math&amp;gt;M&amp;lt;/math&amp;gt; к формату CSR&lt;br /&gt;
# для &amp;lt;math&amp;gt;i&amp;lt;/math&amp;gt; от &amp;lt;math&amp;gt;0&amp;lt;/math&amp;gt; до &amp;lt;math&amp;gt;n-1&amp;lt;/math&amp;gt; вычислить &amp;lt;math&amp;gt;y_i&amp;lt;/math&amp;gt; по формуле &amp;lt;math&amp;gt;y_i = \sum_{k = IA_i}^{IA_{i+1}} A_k x_{JA_k}&amp;lt;/math&amp;gt;&lt;br /&gt;
&lt;br /&gt;
=== Последовательная сложность алгоритма ===&lt;br /&gt;
Для вычисления матрично-векторного произведения матрицы размера &amp;lt;math&amp;gt;n*n&amp;lt;/math&amp;gt; и вектора размера n в последовательном варианте требуется:&lt;br /&gt;
&lt;br /&gt;
* &amp;lt;math&amp;gt;nnz&amp;lt;/math&amp;gt; сложений,&lt;br /&gt;
* &amp;lt;math&amp;gt;nnz&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;n&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; AI &amp;lt;/math&amp;gt; размерности &amp;lt;math&amp;gt; n+1 &amp;lt;/math&amp;gt;;&lt;br /&gt;
# вектор &amp;lt;math&amp;gt; AJ &amp;lt;/math&amp;gt; размерности &amp;lt;math&amp;gt; nnz &amp;lt;/math&amp;gt;;&lt;br /&gt;
# вектор &amp;lt;math&amp;gt; A &amp;lt;/math&amp;gt; размерности &amp;lt;math&amp;gt; nnz &amp;lt;/math&amp;gt;;&lt;br /&gt;
# вектор &amp;lt;math&amp;gt; x &amp;lt;/math&amp;gt; размерности &amp;lt;math&amp;gt; n &amp;lt;/math&amp;gt;.&lt;br /&gt;
&lt;br /&gt;
Суммарная размерность входных данных: &amp;lt;math&amp;gt; 2(nnz + n) + 1 &amp;lt;/math&amp;gt;&lt;br /&gt;
&lt;br /&gt;
Выходными данными является&lt;br /&gt;
# вектор &amp;lt;math&amp;gt; y &amp;lt;/math&amp;gt; размерности &amp;lt;math&amp;gt; n &amp;lt;/math&amp;gt;.&lt;br /&gt;
&lt;br /&gt;
=== Свойства алгоритма ===&lt;br /&gt;
&lt;br /&gt;
== Программная реализация алгоритма ==&lt;br /&gt;
&lt;br /&gt;
=== Особенности реализации последовательного алгоритма ===&lt;br /&gt;
&lt;br /&gt;
=== Локальность данных и вычислений ===&lt;br /&gt;
&lt;br /&gt;
=== Возможные способы и особенности параллельной реализации алгоритма ===&lt;br /&gt;
&lt;br /&gt;
=== Масштабируемость алгоритма и его реализации ===&lt;br /&gt;
&lt;br /&gt;
=== Динамические характеристики и эффективность реализации алгоритма ===&lt;br /&gt;
&lt;br /&gt;
=== Выводы для классов архитектур ===&lt;br /&gt;
&lt;br /&gt;
=== Существующие реализации алгоритма ===&lt;br /&gt;
&lt;br /&gt;
Последовательная реализация имеется в пакете SPARSKIT [http://w3.pppl.gov/~hammett/work/2006/gmres/SPARSKIT2/BLASSM/matvec.f], Python.Scipy [https://docs.scipy.org/doc/scipy-0.14.0/reference/generated/scipy.sparse.csr_matrix.html]&lt;br /&gt;
&lt;br /&gt;
Параллельный алгоритм реализован в библиотеке Matlab [http://citeseerx.ist.psu.edu/viewdoc/download?doi=10.1.1.83.6692&amp;amp;rep=rep1&amp;amp;type=pdf], Intel MKL [https://software.intel.com/en-us/node/468536#D09FB46A-B404-44CC-94ED-1C434C41B6E1]&lt;br /&gt;
&lt;br /&gt;
== Литература ==&lt;br /&gt;
[1] С. Писсанецки. Технология разреженных матриц. Изд. Мир, 1988.&lt;/div&gt;</summary>
		<author><name>Екатерина Буторина</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:%D0%A0%D1%83%D1%84%D0%B8%D0%BD%D0%B0_%D0%A2%D1%80%D0%B5%D1%82%D1%8C%D1%8F%D0%BA%D0%BE%D0%B2%D0%B0/%D0%A5%D1%80%D0%B0%D0%BD%D0%B5%D0%BD%D0%B8%D0%B5_%D0%BD%D0%B5%D0%BD%D1%83%D0%BB%D0%B5%D0%B2%D1%8B%D1%85_%D1%8D%D0%BB%D0%B5%D0%BC%D0%B5%D0%BD%D1%82%D0%BE%D0%B2_%D1%80%D0%B0%D0%B7%D1%80%D0%B5%D0%B6%D0%B5%D0%BD%D0%BD%D1%8B%D1%85_%D0%BC%D0%B0%D1%82%D1%80%D0%B8%D1%86._%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=6405</id>
		<title>Участник:Руфина Третьякова/Хранение ненулевых элементов разреженных матриц. Умножение разреженной матрицы на вектор</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:%D0%A0%D1%83%D1%84%D0%B8%D0%BD%D0%B0_%D0%A2%D1%80%D0%B5%D1%82%D1%8C%D1%8F%D0%BA%D0%BE%D0%B2%D0%B0/%D0%A5%D1%80%D0%B0%D0%BD%D0%B5%D0%BD%D0%B8%D0%B5_%D0%BD%D0%B5%D0%BD%D1%83%D0%BB%D0%B5%D0%B2%D1%8B%D1%85_%D1%8D%D0%BB%D0%B5%D0%BC%D0%B5%D0%BD%D1%82%D0%BE%D0%B2_%D1%80%D0%B0%D0%B7%D1%80%D0%B5%D0%B6%D0%B5%D0%BD%D0%BD%D1%8B%D1%85_%D0%BC%D0%B0%D1%82%D1%80%D0%B8%D1%86._%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=6405"/>
		<updated>2016-10-13T11:54:54Z</updated>

		<summary type="html">&lt;p&gt;Екатерина Буторина: /* Входные и выходные данные алгоритма */&lt;/p&gt;
&lt;hr /&gt;
&lt;div&gt;{{algorithm&lt;br /&gt;
| name              = Умножение разреженной матрицы на вектор&lt;br /&gt;
| serial_complexity = &amp;lt;math&amp;gt;nnz&amp;lt;/math&amp;gt;&lt;br /&gt;
| pf_height         = &amp;lt;math&amp;gt;&amp;lt;/math&amp;gt;&lt;br /&gt;
| pf_width          = &amp;lt;math&amp;gt;&amp;lt;/math&amp;gt;&lt;br /&gt;
| input_data        = &amp;lt;math&amp;gt;2nnz+2n+1&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;
Авторы статьи: [[Участница:Руфина_Третьякова|Третьякова Р. М.]] (группа 603), [[Участница:Екатерина_Буторина|Буторина Е. В.]] (группа 603)&lt;br /&gt;
&lt;br /&gt;
&lt;br /&gt;
&lt;br /&gt;
== Свойства и структура алгоритма ==&lt;br /&gt;
&lt;br /&gt;
=== Общее описание алгоритма ===&lt;br /&gt;
Разрежённая матрица — это матрица с преимущественно нулевыми элементами. В противном случае, если бо́льшая часть элементов матрицы ненулевые, матрица считается плотной.&lt;br /&gt;
Среди специалистов нет единства в определении того, какое именно количество ненулевых элементов делает матрицу разрежённой. Разные авторы предлагают различные варианты. &lt;br /&gt;
Огромные разрежённые матрицы часто возникают при решении таких задач, как дифференциальное уравнение в частных производных.&lt;br /&gt;
При хранении и преобразовании разрежённых матриц в компьютере бывает полезно, а часто и необходимо, использовать специальные алгоритмы и структуры данных, которые учитывают разрежённую структуру матрицы. Операции и алгоритмы, применяемые для работы с обычными, плотными матрицами, применительно к большим разрежённым матрицам работают относительно медленно и требуют значительных объёмов памяти. Однако разрежённые матрицы могут быть легко сжаты путём записи только своих ненулевых элементов, что снижает требования к компьютерной памяти.&lt;br /&gt;
&lt;br /&gt;
=== Математическое описание алгоритма ===&lt;br /&gt;
Исходные данные:  разреженная матрица &amp;lt;math&amp;gt;M^{n*n}&amp;lt;/math&amp;gt;, вектор &amp;lt;math&amp;gt;x^{n*1}&amp;lt;/math&amp;gt; &lt;br /&gt;
&lt;br /&gt;
Наиболее удобным форматом для вычисления произведения матрицы на вектор является &amp;quot;Compressed Sparse Row&amp;quot; или сокращенно CSR-формат.&lt;br /&gt;
&lt;br /&gt;
Рассмотрим CSR-представление разреженной матрицы: пусть число ненулевых элементов матрицы равно &amp;lt;math&amp;gt;nnz&amp;lt;/math&amp;gt;&lt;br /&gt;
CSR-формат представляет матрицу &amp;lt;math&amp;gt;M&amp;lt;/math&amp;gt; в виде 3-х одномерных массивов:&lt;br /&gt;
&lt;br /&gt;
массив &amp;lt;math&amp;gt;A&amp;lt;/math&amp;gt; размера &amp;lt;math&amp;gt;nnz&amp;lt;/math&amp;gt; содержит ненулевые значения матрицы,&lt;br /&gt;
&amp;lt;math&amp;gt;JA&amp;lt;/math&amp;gt; размера &amp;lt;math&amp;gt;nnz&amp;lt;/math&amp;gt; - номера столбцов ненулевых элементов., &lt;br /&gt;
&amp;lt;math&amp;gt;IA&amp;lt;/math&amp;gt; размера &amp;lt;math&amp;gt;n&amp;lt;/math&amp;gt;- содержит номер с которого начинается описание элементов строки в массивах &amp;lt;math&amp;gt;A&amp;lt;/math&amp;gt; и &amp;lt;math&amp;gt;JA&amp;lt;/math&amp;gt;.&lt;br /&gt;
Этот формат позволяет производить перемножение матрицы &amp;lt;math&amp;gt;M&amp;lt;/math&amp;gt; на вектор &amp;lt;math&amp;gt;x&amp;lt;/math&amp;gt; за &amp;lt;math&amp;gt;O(nnz)&amp;lt;/math&amp;gt; умножений и сложений. &lt;br /&gt;
&lt;br /&gt;
Например, это разреженная матрица с 4-мя ненулевыми элементами&lt;br /&gt;
:: &amp;lt;math&amp;gt;\begin{pmatrix}&lt;br /&gt;
0 &amp;amp; 0 &amp;amp; 0 &amp;amp; 1 \\&lt;br /&gt;
2 &amp;amp; 0 &amp;amp; 0 &amp;amp; 0 \\&lt;br /&gt;
0 &amp;amp; 0 &amp;amp; 3 &amp;amp; 0 \\&lt;br /&gt;
0 &amp;amp; 4 &amp;amp; 0 &amp;amp; 0 \\&lt;br /&gt;
\end{pmatrix}&amp;lt;/math&amp;gt;,&lt;br /&gt;
 представляемая в формате CSR &lt;br /&gt;
    A  = [ 1 2 3 4 ]&lt;br /&gt;
    IA = [ 0 1 2 3 4 ]&lt;br /&gt;
    JA = [ 3 0 2 1 ]&lt;br /&gt;
&lt;br /&gt;
&lt;br /&gt;
Вычисляемые данные: вектор  &amp;lt;math&amp;gt;M*x=y&amp;lt;/math&amp;gt;&lt;br /&gt;
&lt;br /&gt;
=== Вычислительное ядро алгоритма ===&lt;br /&gt;
&lt;br /&gt;
:&amp;lt;math&amp;gt;y_i = \sum_{k = IA_i}^{IA_{i+1}} A_k x_{JA_k}&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;
    число строк матрицы &#039;&#039;n&#039;&#039;; &lt;br /&gt;
    разреженная матрица в формате CSR:&lt;br /&gt;
      строчные указатели &#039;&#039;IA&#039;&#039;,&lt;br /&gt;
      столбцовые указатели&#039;&#039;JA&#039;&#039;, &lt;br /&gt;
      ненулевые элементы &#039;&#039;A&#039;&#039;;&lt;br /&gt;
    вектор &#039;&#039;x&#039;&#039;.&lt;br /&gt;
  &#039;&#039;&#039;Выходные данные&#039;&#039;&#039;: произведение матрицы на вектор &#039;&#039;y&#039;&#039;.&lt;br /&gt;
  &#039;&#039;&#039;read CSR&#039;&#039;&#039; &#039;&#039;n&#039;&#039;, &#039;&#039;IA&#039;&#039;, &#039;&#039;JA&#039;&#039;, &#039;&#039;A&#039;&#039;;&lt;br /&gt;
  &#039;&#039;&#039;read&#039;&#039;&#039; &#039;&#039;x&#039;&#039;&lt;br /&gt;
  &#039;&#039;&#039;for&#039;&#039;&#039; &#039;&#039;i&#039;&#039; = 1,n:&lt;br /&gt;
    &#039;&#039;&#039;for&#039;&#039;&#039; &#039;&#039;k&#039;&#039; = &#039;&#039;IA(i)&#039;&#039;, &#039;&#039;IA(i+1)-1&#039;&#039;:&lt;br /&gt;
            &#039;&#039;y(i)&#039;&#039; += &#039;&#039;A(k)&#039;&#039;*&#039;&#039;x(JA(k))&#039;&#039;;&lt;br /&gt;
  &#039;&#039;&#039;write&#039;&#039;&#039; &#039;&#039;y&#039;&#039;;&lt;br /&gt;
&lt;br /&gt;
=== Схема реализации последовательного алгоритма ===&lt;br /&gt;
Метод можно описать следующим образом:&lt;br /&gt;
# привести матрицу &amp;lt;math&amp;gt;M&amp;lt;/math&amp;gt; к формату CSR&lt;br /&gt;
# для &amp;lt;math&amp;gt;i&amp;lt;/math&amp;gt; от &amp;lt;math&amp;gt;0&amp;lt;/math&amp;gt; до &amp;lt;math&amp;gt;n-1&amp;lt;/math&amp;gt; вычислить &amp;lt;math&amp;gt;y_i&amp;lt;/math&amp;gt; по формуле &amp;lt;math&amp;gt;y_i = \sum_{k = IA_i}^{IA_{i+1}} A_k x_{JA_k}&amp;lt;/math&amp;gt;&lt;br /&gt;
&lt;br /&gt;
=== Последовательная сложность алгоритма ===&lt;br /&gt;
Для вычисления матрично-векторного произведения матрицы размера &amp;lt;math&amp;gt;n*n&amp;lt;/math&amp;gt; и вектора размера n в последовательном варианте требуется:&lt;br /&gt;
&lt;br /&gt;
* &amp;lt;math&amp;gt;nnz&amp;lt;/math&amp;gt; сложений,&lt;br /&gt;
* &amp;lt;math&amp;gt;nnz&amp;lt;/math&amp;gt; умножений.&lt;br /&gt;
&lt;br /&gt;
=== Информационный граф ===&lt;br /&gt;
&lt;br /&gt;
=== Ресурс параллелизма алгоритма ===&lt;br /&gt;
&lt;br /&gt;
=== Входные и выходные данные алгоритма ===&lt;br /&gt;
Входными данными алгоритма являются:&lt;br /&gt;
# размер разреженной матрицы &amp;lt;math&amp;gt; n &amp;lt;/math&amp;gt;;&lt;br /&gt;
# вектор &amp;lt;math&amp;gt; AI &amp;lt;/math&amp;gt; размерности &amp;lt;math&amp;gt; n+1 &amp;lt;/math&amp;gt;;&lt;br /&gt;
# вектор &amp;lt;math&amp;gt; AJ &amp;lt;/math&amp;gt; размерности &amp;lt;math&amp;gt; nnz &amp;lt;/math&amp;gt;;&lt;br /&gt;
# вектор &amp;lt;math&amp;gt; A &amp;lt;/math&amp;gt; размерности &amp;lt;math&amp;gt; nnz &amp;lt;/math&amp;gt;;&lt;br /&gt;
# вектор &amp;lt;math&amp;gt; x &amp;lt;/math&amp;gt; размерности &amp;lt;math&amp;gt; n &amp;lt;/math&amp;gt;.&lt;br /&gt;
&lt;br /&gt;
Суммарная размер входных данных: &amp;lt;math&amp;gt; 2(nnz + n) + 1 &amp;lt;/math&amp;gt;&lt;br /&gt;
&lt;br /&gt;
Выходными данными является&lt;br /&gt;
# вектор &amp;lt;math&amp;gt; y &amp;lt;/math&amp;gt; размерности &amp;lt;math&amp;gt; n &amp;lt;/math&amp;gt;.&lt;br /&gt;
&lt;br /&gt;
=== Свойства алгоритма ===&lt;br /&gt;
&lt;br /&gt;
== Программная реализация алгоритма ==&lt;br /&gt;
&lt;br /&gt;
=== Особенности реализации последовательного алгоритма ===&lt;br /&gt;
&lt;br /&gt;
=== Локальность данных и вычислений ===&lt;br /&gt;
&lt;br /&gt;
=== Возможные способы и особенности параллельной реализации алгоритма ===&lt;br /&gt;
&lt;br /&gt;
=== Масштабируемость алгоритма и его реализации ===&lt;br /&gt;
&lt;br /&gt;
=== Динамические характеристики и эффективность реализации алгоритма ===&lt;br /&gt;
&lt;br /&gt;
=== Выводы для классов архитектур ===&lt;br /&gt;
&lt;br /&gt;
=== Существующие реализации алгоритма ===&lt;br /&gt;
&lt;br /&gt;
Последовательная реализация имеется в пакете SPARSKIT [http://w3.pppl.gov/~hammett/work/2006/gmres/SPARSKIT2/BLASSM/matvec.f], Python.Scipy [https://docs.scipy.org/doc/scipy-0.14.0/reference/generated/scipy.sparse.csr_matrix.html]&lt;br /&gt;
&lt;br /&gt;
Параллельный алгоритм реализован в библиотеке Matlab [http://citeseerx.ist.psu.edu/viewdoc/download?doi=10.1.1.83.6692&amp;amp;rep=rep1&amp;amp;type=pdf], Intel MKL [https://software.intel.com/en-us/node/468536#D09FB46A-B404-44CC-94ED-1C434C41B6E1]&lt;br /&gt;
&lt;br /&gt;
== Литература ==&lt;br /&gt;
[1] С. Писсанецки. Технология разреженных матриц. Изд. Мир, 1988.&lt;/div&gt;</summary>
		<author><name>Екатерина Буторина</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:%D0%A0%D1%83%D1%84%D0%B8%D0%BD%D0%B0_%D0%A2%D1%80%D0%B5%D1%82%D1%8C%D1%8F%D0%BA%D0%BE%D0%B2%D0%B0/%D0%A5%D1%80%D0%B0%D0%BD%D0%B5%D0%BD%D0%B8%D0%B5_%D0%BD%D0%B5%D0%BD%D1%83%D0%BB%D0%B5%D0%B2%D1%8B%D1%85_%D1%8D%D0%BB%D0%B5%D0%BC%D0%B5%D0%BD%D1%82%D0%BE%D0%B2_%D1%80%D0%B0%D0%B7%D1%80%D0%B5%D0%B6%D0%B5%D0%BD%D0%BD%D1%8B%D1%85_%D0%BC%D0%B0%D1%82%D1%80%D0%B8%D1%86._%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=6402</id>
		<title>Участник:Руфина Третьякова/Хранение ненулевых элементов разреженных матриц. Умножение разреженной матрицы на вектор</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:%D0%A0%D1%83%D1%84%D0%B8%D0%BD%D0%B0_%D0%A2%D1%80%D0%B5%D1%82%D1%8C%D1%8F%D0%BA%D0%BE%D0%B2%D0%B0/%D0%A5%D1%80%D0%B0%D0%BD%D0%B5%D0%BD%D0%B8%D0%B5_%D0%BD%D0%B5%D0%BD%D1%83%D0%BB%D0%B5%D0%B2%D1%8B%D1%85_%D1%8D%D0%BB%D0%B5%D0%BC%D0%B5%D0%BD%D1%82%D0%BE%D0%B2_%D1%80%D0%B0%D0%B7%D1%80%D0%B5%D0%B6%D0%B5%D0%BD%D0%BD%D1%8B%D1%85_%D0%BC%D0%B0%D1%82%D1%80%D0%B8%D1%86._%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=6402"/>
		<updated>2016-10-13T11:42:48Z</updated>

		<summary type="html">&lt;p&gt;Екатерина Буторина: /* Существующие реализации алгоритма */&lt;/p&gt;
&lt;hr /&gt;
&lt;div&gt;{{algorithm&lt;br /&gt;
| name              = Умножение разреженной матрицы на вектор&lt;br /&gt;
| serial_complexity = &amp;lt;math&amp;gt;nnz&amp;lt;/math&amp;gt;&lt;br /&gt;
| pf_height         = &amp;lt;math&amp;gt;&amp;lt;/math&amp;gt;&lt;br /&gt;
| pf_width          = &amp;lt;math&amp;gt;&amp;lt;/math&amp;gt;&lt;br /&gt;
| input_data        = &amp;lt;math&amp;gt;2nnz+2n+1&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;
Авторы статьи: [[Участница:Руфина_Третьякова|Третьякова Р. М.]] (группа 603), [[Участница:Екатерина_Буторина|Буторина Е. В.]] (группа 603)&lt;br /&gt;
&lt;br /&gt;
&lt;br /&gt;
&lt;br /&gt;
== Свойства и структура алгоритма ==&lt;br /&gt;
&lt;br /&gt;
=== Общее описание алгоритма ===&lt;br /&gt;
Разрежённая матрица — это матрица с преимущественно нулевыми элементами. В противном случае, если бо́льшая часть элементов матрицы ненулевые, матрица считается плотной.&lt;br /&gt;
Среди специалистов нет единства в определении того, какое именно количество ненулевых элементов делает матрицу разрежённой. Разные авторы предлагают различные варианты. &lt;br /&gt;
Огромные разрежённые матрицы часто возникают при решении таких задач, как дифференциальное уравнение в частных производных.&lt;br /&gt;
При хранении и преобразовании разрежённых матриц в компьютере бывает полезно, а часто и необходимо, использовать специальные алгоритмы и структуры данных, которые учитывают разрежённую структуру матрицы. Операции и алгоритмы, применяемые для работы с обычными, плотными матрицами, применительно к большим разрежённым матрицам работают относительно медленно и требуют значительных объёмов памяти. Однако разрежённые матрицы могут быть легко сжаты путём записи только своих ненулевых элементов, что снижает требования к компьютерной памяти.&lt;br /&gt;
&lt;br /&gt;
=== Математическое описание алгоритма ===&lt;br /&gt;
Исходные данные:  разреженная матрица &amp;lt;math&amp;gt;M^{n*n}&amp;lt;/math&amp;gt;, вектор &amp;lt;math&amp;gt;x^{n*1}&amp;lt;/math&amp;gt; &lt;br /&gt;
&lt;br /&gt;
Наиболее удобным форматом для вычисления произведения матрицы на вектор является &amp;quot;Compressed Sparse Row&amp;quot; или сокращенно CSR-формат.&lt;br /&gt;
&lt;br /&gt;
Рассмотрим CSR-представление разреженной матрицы: пусть число ненулевых элементов матрицы равно &amp;lt;math&amp;gt;nnz&amp;lt;/math&amp;gt;&lt;br /&gt;
CSR-формат представляет матрицу &amp;lt;math&amp;gt;M&amp;lt;/math&amp;gt; в виде 3-х одномерных массивов:&lt;br /&gt;
&lt;br /&gt;
массив &amp;lt;math&amp;gt;A&amp;lt;/math&amp;gt; размера &amp;lt;math&amp;gt;nnz&amp;lt;/math&amp;gt; содержит ненулевые значения матрицы,&lt;br /&gt;
&amp;lt;math&amp;gt;JA&amp;lt;/math&amp;gt; размера &amp;lt;math&amp;gt;nnz&amp;lt;/math&amp;gt; - номера столбцов ненулевых элементов., &lt;br /&gt;
&amp;lt;math&amp;gt;IA&amp;lt;/math&amp;gt; размера &amp;lt;math&amp;gt;n&amp;lt;/math&amp;gt;- содержит номер с которого начинается описание элементов строки в массивах &amp;lt;math&amp;gt;A&amp;lt;/math&amp;gt; и &amp;lt;math&amp;gt;JA&amp;lt;/math&amp;gt;.&lt;br /&gt;
Этот формат позволяет производить перемножение матрицы &amp;lt;math&amp;gt;M&amp;lt;/math&amp;gt; на вектор &amp;lt;math&amp;gt;x&amp;lt;/math&amp;gt; за &amp;lt;math&amp;gt;O(nnz)&amp;lt;/math&amp;gt; умножений и сложений. &lt;br /&gt;
&lt;br /&gt;
Например, это разреженная матрица с 4-мя ненулевыми элементами&lt;br /&gt;
:: &amp;lt;math&amp;gt;\begin{pmatrix}&lt;br /&gt;
0 &amp;amp; 0 &amp;amp; 0 &amp;amp; 1 \\&lt;br /&gt;
2 &amp;amp; 0 &amp;amp; 0 &amp;amp; 0 \\&lt;br /&gt;
0 &amp;amp; 0 &amp;amp; 3 &amp;amp; 0 \\&lt;br /&gt;
0 &amp;amp; 4 &amp;amp; 0 &amp;amp; 0 \\&lt;br /&gt;
\end{pmatrix}&amp;lt;/math&amp;gt;,&lt;br /&gt;
 представляемая в формате CSR &lt;br /&gt;
    A  = [ 1 2 3 4 ]&lt;br /&gt;
    IA = [ 0 1 2 3 4 ]&lt;br /&gt;
    JA = [ 3 0 2 1 ]&lt;br /&gt;
&lt;br /&gt;
&lt;br /&gt;
Вычисляемые данные: вектор  &amp;lt;math&amp;gt;M*x=y&amp;lt;/math&amp;gt;&lt;br /&gt;
&lt;br /&gt;
=== Вычислительное ядро алгоритма ===&lt;br /&gt;
&lt;br /&gt;
:&amp;lt;math&amp;gt;y_i = \sum_{k = IA_i}^{IA_{i+1}} A_k x_{JA_k}&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;
    число строк матрицы &#039;&#039;n&#039;&#039;; &lt;br /&gt;
    разреженная матрица в формате CSR:&lt;br /&gt;
      строчные указатели &#039;&#039;IA&#039;&#039;,&lt;br /&gt;
      столбцовые указатели&#039;&#039;JA&#039;&#039;, &lt;br /&gt;
      ненулевые элементы &#039;&#039;A&#039;&#039;;&lt;br /&gt;
    вектор &#039;&#039;x&#039;&#039;.&lt;br /&gt;
  &#039;&#039;&#039;Выходные данные&#039;&#039;&#039;: произведение матрицы на вектор &#039;&#039;y&#039;&#039;.&lt;br /&gt;
  &#039;&#039;&#039;read CSR&#039;&#039;&#039; &#039;&#039;n&#039;&#039;, &#039;&#039;IA&#039;&#039;, &#039;&#039;JA&#039;&#039;, &#039;&#039;A&#039;&#039;;&lt;br /&gt;
  &#039;&#039;&#039;read&#039;&#039;&#039; &#039;&#039;x&#039;&#039;&lt;br /&gt;
  &#039;&#039;&#039;for&#039;&#039;&#039; &#039;&#039;i&#039;&#039; = 1,n:&lt;br /&gt;
    &#039;&#039;&#039;for&#039;&#039;&#039; &#039;&#039;k&#039;&#039; = &#039;&#039;IA(i)&#039;&#039;, &#039;&#039;IA(i+1)-1&#039;&#039;:&lt;br /&gt;
            &#039;&#039;y(i)&#039;&#039; += &#039;&#039;A(k)&#039;&#039;*&#039;&#039;x(JA(k))&#039;&#039;;&lt;br /&gt;
  &#039;&#039;&#039;write&#039;&#039;&#039; &#039;&#039;y&#039;&#039;;&lt;br /&gt;
&lt;br /&gt;
=== Схема реализации последовательного алгоритма ===&lt;br /&gt;
Метод можно описать следующим образом:&lt;br /&gt;
# привести матрицу &amp;lt;math&amp;gt;M&amp;lt;/math&amp;gt; к формату CSR&lt;br /&gt;
# для &amp;lt;math&amp;gt;i&amp;lt;/math&amp;gt; от &amp;lt;math&amp;gt;0&amp;lt;/math&amp;gt; до &amp;lt;math&amp;gt;n-1&amp;lt;/math&amp;gt; вычислить &amp;lt;math&amp;gt;y_i&amp;lt;/math&amp;gt; по формуле &amp;lt;math&amp;gt;y_i = \sum_{k = IA_i}^{IA_{i+1}} A_k x_{JA_k}&amp;lt;/math&amp;gt;&lt;br /&gt;
&lt;br /&gt;
=== Последовательная сложность алгоритма ===&lt;br /&gt;
Для вычисления матрично-векторного произведения матрицы размера &amp;lt;math&amp;gt;n*n&amp;lt;/math&amp;gt; и вектора размера n в последовательном варианте требуется:&lt;br /&gt;
&lt;br /&gt;
* &amp;lt;math&amp;gt;nnz&amp;lt;/math&amp;gt; сложений,&lt;br /&gt;
* &amp;lt;math&amp;gt;nnz&amp;lt;/math&amp;gt; умножений.&lt;br /&gt;
&lt;br /&gt;
=== Информационный граф ===&lt;br /&gt;
&lt;br /&gt;
=== Ресурс параллелизма алгоритма ===&lt;br /&gt;
&lt;br /&gt;
=== Входные и выходные данные алгоритма ===&lt;br /&gt;
 &#039;&#039;&#039;Входные данные&#039;&#039;&#039;:&lt;br /&gt;
    число строк матрицы &#039;&#039;n&#039;&#039;; &lt;br /&gt;
    разреженная матрица в формате CSR:&lt;br /&gt;
      строчные указатели &#039;&#039;IA&#039;&#039;,&lt;br /&gt;
      столбцовые указатели&#039;&#039;JA&#039;&#039;, &lt;br /&gt;
      ненулевые элементы &#039;&#039;A&#039;&#039;;&lt;br /&gt;
    вектор &#039;&#039;x&#039;&#039;.&lt;br /&gt;
  &#039;&#039;&#039;Выходные данные&#039;&#039;&#039;: произведение матрицы на вектор &#039;&#039;y&#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;
=== Локальность данных и вычислений ===&lt;br /&gt;
&lt;br /&gt;
=== Возможные способы и особенности параллельной реализации алгоритма ===&lt;br /&gt;
&lt;br /&gt;
=== Масштабируемость алгоритма и его реализации ===&lt;br /&gt;
&lt;br /&gt;
=== Динамические характеристики и эффективность реализации алгоритма ===&lt;br /&gt;
&lt;br /&gt;
=== Выводы для классов архитектур ===&lt;br /&gt;
&lt;br /&gt;
=== Существующие реализации алгоритма ===&lt;br /&gt;
&lt;br /&gt;
Последовательная реализация имеется в пакете SPARSKIT [http://w3.pppl.gov/~hammett/work/2006/gmres/SPARSKIT2/BLASSM/matvec.f], Python.Scipy [https://docs.scipy.org/doc/scipy-0.14.0/reference/generated/scipy.sparse.csr_matrix.html]&lt;br /&gt;
&lt;br /&gt;
Параллельный алгоритм реализован в библиотеке Matlab [http://citeseerx.ist.psu.edu/viewdoc/download?doi=10.1.1.83.6692&amp;amp;rep=rep1&amp;amp;type=pdf], Intel MKL [https://software.intel.com/en-us/node/468536#D09FB46A-B404-44CC-94ED-1C434C41B6E1]&lt;br /&gt;
&lt;br /&gt;
== Литература ==&lt;br /&gt;
[1] С. Писсанецки. Технология разреженных матриц. Изд. Мир, 1988.&lt;/div&gt;</summary>
		<author><name>Екатерина Буторина</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:%D0%A0%D1%83%D1%84%D0%B8%D0%BD%D0%B0_%D0%A2%D1%80%D0%B5%D1%82%D1%8C%D1%8F%D0%BA%D0%BE%D0%B2%D0%B0/%D0%A5%D1%80%D0%B0%D0%BD%D0%B5%D0%BD%D0%B8%D0%B5_%D0%BD%D0%B5%D0%BD%D1%83%D0%BB%D0%B5%D0%B2%D1%8B%D1%85_%D1%8D%D0%BB%D0%B5%D0%BC%D0%B5%D0%BD%D1%82%D0%BE%D0%B2_%D1%80%D0%B0%D0%B7%D1%80%D0%B5%D0%B6%D0%B5%D0%BD%D0%BD%D1%8B%D1%85_%D0%BC%D0%B0%D1%82%D1%80%D0%B8%D1%86._%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=6401</id>
		<title>Участник:Руфина Третьякова/Хранение ненулевых элементов разреженных матриц. Умножение разреженной матрицы на вектор</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:%D0%A0%D1%83%D1%84%D0%B8%D0%BD%D0%B0_%D0%A2%D1%80%D0%B5%D1%82%D1%8C%D1%8F%D0%BA%D0%BE%D0%B2%D0%B0/%D0%A5%D1%80%D0%B0%D0%BD%D0%B5%D0%BD%D0%B8%D0%B5_%D0%BD%D0%B5%D0%BD%D1%83%D0%BB%D0%B5%D0%B2%D1%8B%D1%85_%D1%8D%D0%BB%D0%B5%D0%BC%D0%B5%D0%BD%D1%82%D0%BE%D0%B2_%D1%80%D0%B0%D0%B7%D1%80%D0%B5%D0%B6%D0%B5%D0%BD%D0%BD%D1%8B%D1%85_%D0%BC%D0%B0%D1%82%D1%80%D0%B8%D1%86._%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=6401"/>
		<updated>2016-10-13T11:41:52Z</updated>

		<summary type="html">&lt;p&gt;Екатерина Буторина: /* Существующие реализации алгоритма */&lt;/p&gt;
&lt;hr /&gt;
&lt;div&gt;{{algorithm&lt;br /&gt;
| name              = Умножение разреженной матрицы на вектор&lt;br /&gt;
| serial_complexity = &amp;lt;math&amp;gt;nnz&amp;lt;/math&amp;gt;&lt;br /&gt;
| pf_height         = &amp;lt;math&amp;gt;&amp;lt;/math&amp;gt;&lt;br /&gt;
| pf_width          = &amp;lt;math&amp;gt;&amp;lt;/math&amp;gt;&lt;br /&gt;
| input_data        = &amp;lt;math&amp;gt;2nnz+2n+1&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;
Авторы статьи: [[Участница:Руфина_Третьякова|Третьякова Р. М.]] (группа 603), [[Участница:Екатерина_Буторина|Буторина Е. В.]] (группа 603)&lt;br /&gt;
&lt;br /&gt;
&lt;br /&gt;
&lt;br /&gt;
== Свойства и структура алгоритма ==&lt;br /&gt;
&lt;br /&gt;
=== Общее описание алгоритма ===&lt;br /&gt;
Разрежённая матрица — это матрица с преимущественно нулевыми элементами. В противном случае, если бо́льшая часть элементов матрицы ненулевые, матрица считается плотной.&lt;br /&gt;
Среди специалистов нет единства в определении того, какое именно количество ненулевых элементов делает матрицу разрежённой. Разные авторы предлагают различные варианты. &lt;br /&gt;
Огромные разрежённые матрицы часто возникают при решении таких задач, как дифференциальное уравнение в частных производных.&lt;br /&gt;
При хранении и преобразовании разрежённых матриц в компьютере бывает полезно, а часто и необходимо, использовать специальные алгоритмы и структуры данных, которые учитывают разрежённую структуру матрицы. Операции и алгоритмы, применяемые для работы с обычными, плотными матрицами, применительно к большим разрежённым матрицам работают относительно медленно и требуют значительных объёмов памяти. Однако разрежённые матрицы могут быть легко сжаты путём записи только своих ненулевых элементов, что снижает требования к компьютерной памяти.&lt;br /&gt;
&lt;br /&gt;
=== Математическое описание алгоритма ===&lt;br /&gt;
Исходные данные:  разреженная матрица &amp;lt;math&amp;gt;M^{n*n}&amp;lt;/math&amp;gt;, вектор &amp;lt;math&amp;gt;x^{n*1}&amp;lt;/math&amp;gt; &lt;br /&gt;
&lt;br /&gt;
Наиболее удобным форматом для вычисления произведения матрицы на вектор является &amp;quot;Compressed Sparse Row&amp;quot; или сокращенно CSR-формат.&lt;br /&gt;
&lt;br /&gt;
Рассмотрим CSR-представление разреженной матрицы: пусть число ненулевых элементов матрицы равно &amp;lt;math&amp;gt;nnz&amp;lt;/math&amp;gt;&lt;br /&gt;
CSR-формат представляет матрицу &amp;lt;math&amp;gt;M&amp;lt;/math&amp;gt; в виде 3-х одномерных массивов:&lt;br /&gt;
&lt;br /&gt;
массив &amp;lt;math&amp;gt;A&amp;lt;/math&amp;gt; размера &amp;lt;math&amp;gt;nnz&amp;lt;/math&amp;gt; содержит ненулевые значения матрицы,&lt;br /&gt;
&amp;lt;math&amp;gt;JA&amp;lt;/math&amp;gt; размера &amp;lt;math&amp;gt;nnz&amp;lt;/math&amp;gt; - номера столбцов ненулевых элементов., &lt;br /&gt;
&amp;lt;math&amp;gt;IA&amp;lt;/math&amp;gt; размера &amp;lt;math&amp;gt;n&amp;lt;/math&amp;gt;- содержит номер с которого начинается описание элементов строки в массивах &amp;lt;math&amp;gt;A&amp;lt;/math&amp;gt; и &amp;lt;math&amp;gt;JA&amp;lt;/math&amp;gt;.&lt;br /&gt;
Этот формат позволяет производить перемножение матрицы &amp;lt;math&amp;gt;M&amp;lt;/math&amp;gt; на вектор &amp;lt;math&amp;gt;x&amp;lt;/math&amp;gt; за &amp;lt;math&amp;gt;O(nnz)&amp;lt;/math&amp;gt; умножений и сложений. &lt;br /&gt;
&lt;br /&gt;
Например, это разреженная матрица с 4-мя ненулевыми элементами&lt;br /&gt;
:: &amp;lt;math&amp;gt;\begin{pmatrix}&lt;br /&gt;
0 &amp;amp; 0 &amp;amp; 0 &amp;amp; 1 \\&lt;br /&gt;
2 &amp;amp; 0 &amp;amp; 0 &amp;amp; 0 \\&lt;br /&gt;
0 &amp;amp; 0 &amp;amp; 3 &amp;amp; 0 \\&lt;br /&gt;
0 &amp;amp; 4 &amp;amp; 0 &amp;amp; 0 \\&lt;br /&gt;
\end{pmatrix}&amp;lt;/math&amp;gt;,&lt;br /&gt;
 представляемая в формате CSR &lt;br /&gt;
    A  = [ 1 2 3 4 ]&lt;br /&gt;
    IA = [ 0 1 2 3 4 ]&lt;br /&gt;
    JA = [ 3 0 2 1 ]&lt;br /&gt;
&lt;br /&gt;
&lt;br /&gt;
Вычисляемые данные: вектор  &amp;lt;math&amp;gt;M*x=y&amp;lt;/math&amp;gt;&lt;br /&gt;
&lt;br /&gt;
=== Вычислительное ядро алгоритма ===&lt;br /&gt;
&lt;br /&gt;
:&amp;lt;math&amp;gt;y_i = \sum_{k = IA_i}^{IA_{i+1}} A_k x_{JA_k}&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;
    число строк матрицы &#039;&#039;n&#039;&#039;; &lt;br /&gt;
    разреженная матрица в формате CSR:&lt;br /&gt;
      строчные указатели &#039;&#039;IA&#039;&#039;,&lt;br /&gt;
      столбцовые указатели&#039;&#039;JA&#039;&#039;, &lt;br /&gt;
      ненулевые элементы &#039;&#039;A&#039;&#039;;&lt;br /&gt;
    вектор &#039;&#039;x&#039;&#039;.&lt;br /&gt;
  &#039;&#039;&#039;Выходные данные&#039;&#039;&#039;: произведение матрицы на вектор &#039;&#039;y&#039;&#039;.&lt;br /&gt;
  &#039;&#039;&#039;read CSR&#039;&#039;&#039; &#039;&#039;n&#039;&#039;, &#039;&#039;IA&#039;&#039;, &#039;&#039;JA&#039;&#039;, &#039;&#039;A&#039;&#039;;&lt;br /&gt;
  &#039;&#039;&#039;read&#039;&#039;&#039; &#039;&#039;x&#039;&#039;&lt;br /&gt;
  &#039;&#039;&#039;for&#039;&#039;&#039; &#039;&#039;i&#039;&#039; = 1,n:&lt;br /&gt;
    &#039;&#039;&#039;for&#039;&#039;&#039; &#039;&#039;k&#039;&#039; = &#039;&#039;IA(i)&#039;&#039;, &#039;&#039;IA(i+1)-1&#039;&#039;:&lt;br /&gt;
            &#039;&#039;y(i)&#039;&#039; += &#039;&#039;A(k)&#039;&#039;*&#039;&#039;x(JA(k))&#039;&#039;;&lt;br /&gt;
  &#039;&#039;&#039;write&#039;&#039;&#039; &#039;&#039;y&#039;&#039;;&lt;br /&gt;
&lt;br /&gt;
=== Схема реализации последовательного алгоритма ===&lt;br /&gt;
Метод можно описать следующим образом:&lt;br /&gt;
# привести матрицу &amp;lt;math&amp;gt;M&amp;lt;/math&amp;gt; к формату CSR&lt;br /&gt;
# для &amp;lt;math&amp;gt;i&amp;lt;/math&amp;gt; от &amp;lt;math&amp;gt;0&amp;lt;/math&amp;gt; до &amp;lt;math&amp;gt;n-1&amp;lt;/math&amp;gt; вычислить &amp;lt;math&amp;gt;y_i&amp;lt;/math&amp;gt; по формуле &amp;lt;math&amp;gt;y_i = \sum_{k = IA_i}^{IA_{i+1}} A_k x_{JA_k}&amp;lt;/math&amp;gt;&lt;br /&gt;
&lt;br /&gt;
=== Последовательная сложность алгоритма ===&lt;br /&gt;
Для вычисления матрично-векторного произведения матрицы размера &amp;lt;math&amp;gt;n*n&amp;lt;/math&amp;gt; и вектора размера n в последовательном варианте требуется:&lt;br /&gt;
&lt;br /&gt;
* &amp;lt;math&amp;gt;nnz&amp;lt;/math&amp;gt; сложений,&lt;br /&gt;
* &amp;lt;math&amp;gt;nnz&amp;lt;/math&amp;gt; умножений.&lt;br /&gt;
&lt;br /&gt;
=== Информационный граф ===&lt;br /&gt;
&lt;br /&gt;
=== Ресурс параллелизма алгоритма ===&lt;br /&gt;
&lt;br /&gt;
=== Входные и выходные данные алгоритма ===&lt;br /&gt;
 &#039;&#039;&#039;Входные данные&#039;&#039;&#039;:&lt;br /&gt;
    число строк матрицы &#039;&#039;n&#039;&#039;; &lt;br /&gt;
    разреженная матрица в формате CSR:&lt;br /&gt;
      строчные указатели &#039;&#039;IA&#039;&#039;,&lt;br /&gt;
      столбцовые указатели&#039;&#039;JA&#039;&#039;, &lt;br /&gt;
      ненулевые элементы &#039;&#039;A&#039;&#039;;&lt;br /&gt;
    вектор &#039;&#039;x&#039;&#039;.&lt;br /&gt;
  &#039;&#039;&#039;Выходные данные&#039;&#039;&#039;: произведение матрицы на вектор &#039;&#039;y&#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;
=== Локальность данных и вычислений ===&lt;br /&gt;
&lt;br /&gt;
=== Возможные способы и особенности параллельной реализации алгоритма ===&lt;br /&gt;
&lt;br /&gt;
=== Масштабируемость алгоритма и его реализации ===&lt;br /&gt;
&lt;br /&gt;
=== Динамические характеристики и эффективность реализации алгоритма ===&lt;br /&gt;
&lt;br /&gt;
=== Выводы для классов архитектур ===&lt;br /&gt;
&lt;br /&gt;
=== Существующие реализации алгоритма ===&lt;br /&gt;
&lt;br /&gt;
Последовательная реализация имеется в пакете SPARSKIT [http://w3.pppl.gov/~hammett/work/2006/gmres/SPARSKIT2/BLASSM/matvec.f], Python.Scipy&lt;br /&gt;
&lt;br /&gt;
Параллельный алгоритм реализован в библиотеке Matlab [http://citeseerx.ist.psu.edu/viewdoc/download?doi=10.1.1.83.6692&amp;amp;rep=rep1&amp;amp;type=pdf], Intel MKL [https://software.intel.com/en-us/node/468536#D09FB46A-B404-44CC-94ED-1C434C41B6E1]&lt;br /&gt;
&lt;br /&gt;
== Литература ==&lt;br /&gt;
[1] С. Писсанецки. Технология разреженных матриц. Изд. Мир, 1988.&lt;/div&gt;</summary>
		<author><name>Екатерина Буторина</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:%D0%A0%D1%83%D1%84%D0%B8%D0%BD%D0%B0_%D0%A2%D1%80%D0%B5%D1%82%D1%8C%D1%8F%D0%BA%D0%BE%D0%B2%D0%B0/%D0%A5%D1%80%D0%B0%D0%BD%D0%B5%D0%BD%D0%B8%D0%B5_%D0%BD%D0%B5%D0%BD%D1%83%D0%BB%D0%B5%D0%B2%D1%8B%D1%85_%D1%8D%D0%BB%D0%B5%D0%BC%D0%B5%D0%BD%D1%82%D0%BE%D0%B2_%D1%80%D0%B0%D0%B7%D1%80%D0%B5%D0%B6%D0%B5%D0%BD%D0%BD%D1%8B%D1%85_%D0%BC%D0%B0%D1%82%D1%80%D0%B8%D1%86._%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=6400</id>
		<title>Участник:Руфина Третьякова/Хранение ненулевых элементов разреженных матриц. Умножение разреженной матрицы на вектор</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:%D0%A0%D1%83%D1%84%D0%B8%D0%BD%D0%B0_%D0%A2%D1%80%D0%B5%D1%82%D1%8C%D1%8F%D0%BA%D0%BE%D0%B2%D0%B0/%D0%A5%D1%80%D0%B0%D0%BD%D0%B5%D0%BD%D0%B8%D0%B5_%D0%BD%D0%B5%D0%BD%D1%83%D0%BB%D0%B5%D0%B2%D1%8B%D1%85_%D1%8D%D0%BB%D0%B5%D0%BC%D0%B5%D0%BD%D1%82%D0%BE%D0%B2_%D1%80%D0%B0%D0%B7%D1%80%D0%B5%D0%B6%D0%B5%D0%BD%D0%BD%D1%8B%D1%85_%D0%BC%D0%B0%D1%82%D1%80%D0%B8%D1%86._%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=6400"/>
		<updated>2016-10-13T11:40:42Z</updated>

		<summary type="html">&lt;p&gt;Екатерина Буторина: /* Существующие реализации алгоритма */&lt;/p&gt;
&lt;hr /&gt;
&lt;div&gt;{{algorithm&lt;br /&gt;
| name              = Умножение разреженной матрицы на вектор&lt;br /&gt;
| serial_complexity = &amp;lt;math&amp;gt;nnz&amp;lt;/math&amp;gt;&lt;br /&gt;
| pf_height         = &amp;lt;math&amp;gt;&amp;lt;/math&amp;gt;&lt;br /&gt;
| pf_width          = &amp;lt;math&amp;gt;&amp;lt;/math&amp;gt;&lt;br /&gt;
| input_data        = &amp;lt;math&amp;gt;2nnz+2n+1&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;
Авторы статьи: [[Участница:Руфина_Третьякова|Третьякова Р. М.]] (группа 603), [[Участница:Екатерина_Буторина|Буторина Е. В.]] (группа 603)&lt;br /&gt;
&lt;br /&gt;
&lt;br /&gt;
&lt;br /&gt;
== Свойства и структура алгоритма ==&lt;br /&gt;
&lt;br /&gt;
=== Общее описание алгоритма ===&lt;br /&gt;
Разрежённая матрица — это матрица с преимущественно нулевыми элементами. В противном случае, если бо́льшая часть элементов матрицы ненулевые, матрица считается плотной.&lt;br /&gt;
Среди специалистов нет единства в определении того, какое именно количество ненулевых элементов делает матрицу разрежённой. Разные авторы предлагают различные варианты. &lt;br /&gt;
Огромные разрежённые матрицы часто возникают при решении таких задач, как дифференциальное уравнение в частных производных.&lt;br /&gt;
При хранении и преобразовании разрежённых матриц в компьютере бывает полезно, а часто и необходимо, использовать специальные алгоритмы и структуры данных, которые учитывают разрежённую структуру матрицы. Операции и алгоритмы, применяемые для работы с обычными, плотными матрицами, применительно к большим разрежённым матрицам работают относительно медленно и требуют значительных объёмов памяти. Однако разрежённые матрицы могут быть легко сжаты путём записи только своих ненулевых элементов, что снижает требования к компьютерной памяти.&lt;br /&gt;
&lt;br /&gt;
=== Математическое описание алгоритма ===&lt;br /&gt;
Исходные данные:  разреженная матрица &amp;lt;math&amp;gt;M^{n*n}&amp;lt;/math&amp;gt;, вектор &amp;lt;math&amp;gt;x^{n*1}&amp;lt;/math&amp;gt; &lt;br /&gt;
&lt;br /&gt;
Наиболее удобным форматом для вычисления произведения матрицы на вектор является &amp;quot;Compressed Sparse Row&amp;quot; или сокращенно CSR-формат.&lt;br /&gt;
&lt;br /&gt;
Рассмотрим CSR-представление разреженной матрицы: пусть число ненулевых элементов матрицы равно &amp;lt;math&amp;gt;nnz&amp;lt;/math&amp;gt;&lt;br /&gt;
CSR-формат представляет матрицу &amp;lt;math&amp;gt;M&amp;lt;/math&amp;gt; в виде 3-х одномерных массивов:&lt;br /&gt;
&lt;br /&gt;
массив &amp;lt;math&amp;gt;A&amp;lt;/math&amp;gt; размера &amp;lt;math&amp;gt;nnz&amp;lt;/math&amp;gt; содержит ненулевые значения матрицы,&lt;br /&gt;
&amp;lt;math&amp;gt;JA&amp;lt;/math&amp;gt; размера &amp;lt;math&amp;gt;nnz&amp;lt;/math&amp;gt; - номера столбцов ненулевых элементов., &lt;br /&gt;
&amp;lt;math&amp;gt;IA&amp;lt;/math&amp;gt; размера &amp;lt;math&amp;gt;n&amp;lt;/math&amp;gt;- содержит номер с которого начинается описание элементов строки в массивах &amp;lt;math&amp;gt;A&amp;lt;/math&amp;gt; и &amp;lt;math&amp;gt;JA&amp;lt;/math&amp;gt;.&lt;br /&gt;
Этот формат позволяет производить перемножение матрицы &amp;lt;math&amp;gt;M&amp;lt;/math&amp;gt; на вектор &amp;lt;math&amp;gt;x&amp;lt;/math&amp;gt; за &amp;lt;math&amp;gt;O(nnz)&amp;lt;/math&amp;gt; умножений и сложений. &lt;br /&gt;
&lt;br /&gt;
Например, это разреженная матрица с 4-мя ненулевыми элементами&lt;br /&gt;
:: &amp;lt;math&amp;gt;\begin{pmatrix}&lt;br /&gt;
0 &amp;amp; 0 &amp;amp; 0 &amp;amp; 1 \\&lt;br /&gt;
2 &amp;amp; 0 &amp;amp; 0 &amp;amp; 0 \\&lt;br /&gt;
0 &amp;amp; 0 &amp;amp; 3 &amp;amp; 0 \\&lt;br /&gt;
0 &amp;amp; 4 &amp;amp; 0 &amp;amp; 0 \\&lt;br /&gt;
\end{pmatrix}&amp;lt;/math&amp;gt;,&lt;br /&gt;
 представляемая в формате CSR &lt;br /&gt;
    A  = [ 1 2 3 4 ]&lt;br /&gt;
    IA = [ 0 1 2 3 4 ]&lt;br /&gt;
    JA = [ 3 0 2 1 ]&lt;br /&gt;
&lt;br /&gt;
&lt;br /&gt;
Вычисляемые данные: вектор  &amp;lt;math&amp;gt;M*x=y&amp;lt;/math&amp;gt;&lt;br /&gt;
&lt;br /&gt;
=== Вычислительное ядро алгоритма ===&lt;br /&gt;
&lt;br /&gt;
:&amp;lt;math&amp;gt;y_i = \sum_{k = IA_i}^{IA_{i+1}} A_k x_{JA_k}&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;
    число строк матрицы &#039;&#039;n&#039;&#039;; &lt;br /&gt;
    разреженная матрица в формате CSR:&lt;br /&gt;
      строчные указатели &#039;&#039;IA&#039;&#039;,&lt;br /&gt;
      столбцовые указатели&#039;&#039;JA&#039;&#039;, &lt;br /&gt;
      ненулевые элементы &#039;&#039;A&#039;&#039;;&lt;br /&gt;
    вектор &#039;&#039;x&#039;&#039;.&lt;br /&gt;
  &#039;&#039;&#039;Выходные данные&#039;&#039;&#039;: произведение матрицы на вектор &#039;&#039;y&#039;&#039;.&lt;br /&gt;
  &#039;&#039;&#039;read CSR&#039;&#039;&#039; &#039;&#039;n&#039;&#039;, &#039;&#039;IA&#039;&#039;, &#039;&#039;JA&#039;&#039;, &#039;&#039;A&#039;&#039;;&lt;br /&gt;
  &#039;&#039;&#039;read&#039;&#039;&#039; &#039;&#039;x&#039;&#039;&lt;br /&gt;
  &#039;&#039;&#039;for&#039;&#039;&#039; &#039;&#039;i&#039;&#039; = 1,n:&lt;br /&gt;
    &#039;&#039;&#039;for&#039;&#039;&#039; &#039;&#039;k&#039;&#039; = &#039;&#039;IA(i)&#039;&#039;, &#039;&#039;IA(i+1)-1&#039;&#039;:&lt;br /&gt;
            &#039;&#039;y(i)&#039;&#039; += &#039;&#039;A(k)&#039;&#039;*&#039;&#039;x(JA(k))&#039;&#039;;&lt;br /&gt;
  &#039;&#039;&#039;write&#039;&#039;&#039; &#039;&#039;y&#039;&#039;;&lt;br /&gt;
&lt;br /&gt;
=== Схема реализации последовательного алгоритма ===&lt;br /&gt;
Метод можно описать следующим образом:&lt;br /&gt;
# привести матрицу &amp;lt;math&amp;gt;M&amp;lt;/math&amp;gt; к формату CSR&lt;br /&gt;
# для &amp;lt;math&amp;gt;i&amp;lt;/math&amp;gt; от &amp;lt;math&amp;gt;0&amp;lt;/math&amp;gt; до &amp;lt;math&amp;gt;n-1&amp;lt;/math&amp;gt; вычислить &amp;lt;math&amp;gt;y_i&amp;lt;/math&amp;gt; по формуле &amp;lt;math&amp;gt;y_i = \sum_{k = IA_i}^{IA_{i+1}} A_k x_{JA_k}&amp;lt;/math&amp;gt;&lt;br /&gt;
&lt;br /&gt;
=== Последовательная сложность алгоритма ===&lt;br /&gt;
Для вычисления матрично-векторного произведения матрицы размера &amp;lt;math&amp;gt;n*n&amp;lt;/math&amp;gt; и вектора размера n в последовательном варианте требуется:&lt;br /&gt;
&lt;br /&gt;
* &amp;lt;math&amp;gt;nnz&amp;lt;/math&amp;gt; сложений,&lt;br /&gt;
* &amp;lt;math&amp;gt;nnz&amp;lt;/math&amp;gt; умножений.&lt;br /&gt;
&lt;br /&gt;
=== Информационный граф ===&lt;br /&gt;
&lt;br /&gt;
=== Ресурс параллелизма алгоритма ===&lt;br /&gt;
&lt;br /&gt;
=== Входные и выходные данные алгоритма ===&lt;br /&gt;
 &#039;&#039;&#039;Входные данные&#039;&#039;&#039;:&lt;br /&gt;
    число строк матрицы &#039;&#039;n&#039;&#039;; &lt;br /&gt;
    разреженная матрица в формате CSR:&lt;br /&gt;
      строчные указатели &#039;&#039;IA&#039;&#039;,&lt;br /&gt;
      столбцовые указатели&#039;&#039;JA&#039;&#039;, &lt;br /&gt;
      ненулевые элементы &#039;&#039;A&#039;&#039;;&lt;br /&gt;
    вектор &#039;&#039;x&#039;&#039;.&lt;br /&gt;
  &#039;&#039;&#039;Выходные данные&#039;&#039;&#039;: произведение матрицы на вектор &#039;&#039;y&#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;
=== Локальность данных и вычислений ===&lt;br /&gt;
&lt;br /&gt;
=== Возможные способы и особенности параллельной реализации алгоритма ===&lt;br /&gt;
&lt;br /&gt;
=== Масштабируемость алгоритма и его реализации ===&lt;br /&gt;
&lt;br /&gt;
=== Динамические характеристики и эффективность реализации алгоритма ===&lt;br /&gt;
&lt;br /&gt;
=== Выводы для классов архитектур ===&lt;br /&gt;
&lt;br /&gt;
=== Существующие реализации алгоритма ===&lt;br /&gt;
&lt;br /&gt;
Последовательная реализация имеется в пакете SPARSKIT, Python.Scipy&lt;br /&gt;
&lt;br /&gt;
Параллельный алгоритм реализован в библиотеке Matlab [http://citeseerx.ist.psu.edu/viewdoc/download?doi=10.1.1.83.6692&amp;amp;rep=rep1&amp;amp;type=pdf], Intel MKL [https://software.intel.com/en-us/node/468536#D09FB46A-B404-44CC-94ED-1C434C41B6E1]&lt;br /&gt;
&lt;br /&gt;
== Литература ==&lt;br /&gt;
[1] С. Писсанецки. Технология разреженных матриц. Изд. Мир, 1988.&lt;/div&gt;</summary>
		<author><name>Екатерина Буторина</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:%D0%A0%D1%83%D1%84%D0%B8%D0%BD%D0%B0_%D0%A2%D1%80%D0%B5%D1%82%D1%8C%D1%8F%D0%BA%D0%BE%D0%B2%D0%B0/%D0%A5%D1%80%D0%B0%D0%BD%D0%B5%D0%BD%D0%B8%D0%B5_%D0%BD%D0%B5%D0%BD%D1%83%D0%BB%D0%B5%D0%B2%D1%8B%D1%85_%D1%8D%D0%BB%D0%B5%D0%BC%D0%B5%D0%BD%D1%82%D0%BE%D0%B2_%D1%80%D0%B0%D0%B7%D1%80%D0%B5%D0%B6%D0%B5%D0%BD%D0%BD%D1%8B%D1%85_%D0%BC%D0%B0%D1%82%D1%80%D0%B8%D1%86._%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=6399</id>
		<title>Участник:Руфина Третьякова/Хранение ненулевых элементов разреженных матриц. Умножение разреженной матрицы на вектор</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:%D0%A0%D1%83%D1%84%D0%B8%D0%BD%D0%B0_%D0%A2%D1%80%D0%B5%D1%82%D1%8C%D1%8F%D0%BA%D0%BE%D0%B2%D0%B0/%D0%A5%D1%80%D0%B0%D0%BD%D0%B5%D0%BD%D0%B8%D0%B5_%D0%BD%D0%B5%D0%BD%D1%83%D0%BB%D0%B5%D0%B2%D1%8B%D1%85_%D1%8D%D0%BB%D0%B5%D0%BC%D0%B5%D0%BD%D1%82%D0%BE%D0%B2_%D1%80%D0%B0%D0%B7%D1%80%D0%B5%D0%B6%D0%B5%D0%BD%D0%BD%D1%8B%D1%85_%D0%BC%D0%B0%D1%82%D1%80%D0%B8%D1%86._%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=6399"/>
		<updated>2016-10-13T11:40:05Z</updated>

		<summary type="html">&lt;p&gt;Екатерина Буторина: /* Существующие реализации алгоритма */&lt;/p&gt;
&lt;hr /&gt;
&lt;div&gt;{{algorithm&lt;br /&gt;
| name              = Умножение разреженной матрицы на вектор&lt;br /&gt;
| serial_complexity = &amp;lt;math&amp;gt;nnz&amp;lt;/math&amp;gt;&lt;br /&gt;
| pf_height         = &amp;lt;math&amp;gt;&amp;lt;/math&amp;gt;&lt;br /&gt;
| pf_width          = &amp;lt;math&amp;gt;&amp;lt;/math&amp;gt;&lt;br /&gt;
| input_data        = &amp;lt;math&amp;gt;2nnz+2n+1&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;
Авторы статьи: [[Участница:Руфина_Третьякова|Третьякова Р. М.]] (группа 603), [[Участница:Екатерина_Буторина|Буторина Е. В.]] (группа 603)&lt;br /&gt;
&lt;br /&gt;
&lt;br /&gt;
&lt;br /&gt;
== Свойства и структура алгоритма ==&lt;br /&gt;
&lt;br /&gt;
=== Общее описание алгоритма ===&lt;br /&gt;
Разрежённая матрица — это матрица с преимущественно нулевыми элементами. В противном случае, если бо́льшая часть элементов матрицы ненулевые, матрица считается плотной.&lt;br /&gt;
Среди специалистов нет единства в определении того, какое именно количество ненулевых элементов делает матрицу разрежённой. Разные авторы предлагают различные варианты. &lt;br /&gt;
Огромные разрежённые матрицы часто возникают при решении таких задач, как дифференциальное уравнение в частных производных.&lt;br /&gt;
При хранении и преобразовании разрежённых матриц в компьютере бывает полезно, а часто и необходимо, использовать специальные алгоритмы и структуры данных, которые учитывают разрежённую структуру матрицы. Операции и алгоритмы, применяемые для работы с обычными, плотными матрицами, применительно к большим разрежённым матрицам работают относительно медленно и требуют значительных объёмов памяти. Однако разрежённые матрицы могут быть легко сжаты путём записи только своих ненулевых элементов, что снижает требования к компьютерной памяти.&lt;br /&gt;
&lt;br /&gt;
=== Математическое описание алгоритма ===&lt;br /&gt;
Исходные данные:  разреженная матрица &amp;lt;math&amp;gt;M^{n*n}&amp;lt;/math&amp;gt;, вектор &amp;lt;math&amp;gt;x^{n*1}&amp;lt;/math&amp;gt; &lt;br /&gt;
&lt;br /&gt;
Наиболее удобным форматом для вычисления произведения матрицы на вектор является &amp;quot;Compressed Sparse Row&amp;quot; или сокращенно CSR-формат.&lt;br /&gt;
&lt;br /&gt;
Рассмотрим CSR-представление разреженной матрицы: пусть число ненулевых элементов матрицы равно &amp;lt;math&amp;gt;nnz&amp;lt;/math&amp;gt;&lt;br /&gt;
CSR-формат представляет матрицу &amp;lt;math&amp;gt;M&amp;lt;/math&amp;gt; в виде 3-х одномерных массивов:&lt;br /&gt;
&lt;br /&gt;
массив &amp;lt;math&amp;gt;A&amp;lt;/math&amp;gt; размера &amp;lt;math&amp;gt;nnz&amp;lt;/math&amp;gt; содержит ненулевые значения матрицы,&lt;br /&gt;
&amp;lt;math&amp;gt;JA&amp;lt;/math&amp;gt; размера &amp;lt;math&amp;gt;nnz&amp;lt;/math&amp;gt; - номера столбцов ненулевых элементов., &lt;br /&gt;
&amp;lt;math&amp;gt;IA&amp;lt;/math&amp;gt; размера &amp;lt;math&amp;gt;n&amp;lt;/math&amp;gt;- содержит номер с которого начинается описание элементов строки в массивах &amp;lt;math&amp;gt;A&amp;lt;/math&amp;gt; и &amp;lt;math&amp;gt;JA&amp;lt;/math&amp;gt;.&lt;br /&gt;
Этот формат позволяет производить перемножение матрицы &amp;lt;math&amp;gt;M&amp;lt;/math&amp;gt; на вектор &amp;lt;math&amp;gt;x&amp;lt;/math&amp;gt; за &amp;lt;math&amp;gt;O(nnz)&amp;lt;/math&amp;gt; умножений и сложений. &lt;br /&gt;
&lt;br /&gt;
Например, это разреженная матрица с 4-мя ненулевыми элементами&lt;br /&gt;
:: &amp;lt;math&amp;gt;\begin{pmatrix}&lt;br /&gt;
0 &amp;amp; 0 &amp;amp; 0 &amp;amp; 1 \\&lt;br /&gt;
2 &amp;amp; 0 &amp;amp; 0 &amp;amp; 0 \\&lt;br /&gt;
0 &amp;amp; 0 &amp;amp; 3 &amp;amp; 0 \\&lt;br /&gt;
0 &amp;amp; 4 &amp;amp; 0 &amp;amp; 0 \\&lt;br /&gt;
\end{pmatrix}&amp;lt;/math&amp;gt;,&lt;br /&gt;
 представляемая в формате CSR &lt;br /&gt;
    A  = [ 1 2 3 4 ]&lt;br /&gt;
    IA = [ 0 1 2 3 4 ]&lt;br /&gt;
    JA = [ 3 0 2 1 ]&lt;br /&gt;
&lt;br /&gt;
&lt;br /&gt;
Вычисляемые данные: вектор  &amp;lt;math&amp;gt;M*x=y&amp;lt;/math&amp;gt;&lt;br /&gt;
&lt;br /&gt;
=== Вычислительное ядро алгоритма ===&lt;br /&gt;
&lt;br /&gt;
:&amp;lt;math&amp;gt;y_i = \sum_{k = IA_i}^{IA_{i+1}} A_k x_{JA_k}&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;
    число строк матрицы &#039;&#039;n&#039;&#039;; &lt;br /&gt;
    разреженная матрица в формате CSR:&lt;br /&gt;
      строчные указатели &#039;&#039;IA&#039;&#039;,&lt;br /&gt;
      столбцовые указатели&#039;&#039;JA&#039;&#039;, &lt;br /&gt;
      ненулевые элементы &#039;&#039;A&#039;&#039;;&lt;br /&gt;
    вектор &#039;&#039;x&#039;&#039;.&lt;br /&gt;
  &#039;&#039;&#039;Выходные данные&#039;&#039;&#039;: произведение матрицы на вектор &#039;&#039;y&#039;&#039;.&lt;br /&gt;
  &#039;&#039;&#039;read CSR&#039;&#039;&#039; &#039;&#039;n&#039;&#039;, &#039;&#039;IA&#039;&#039;, &#039;&#039;JA&#039;&#039;, &#039;&#039;A&#039;&#039;;&lt;br /&gt;
  &#039;&#039;&#039;read&#039;&#039;&#039; &#039;&#039;x&#039;&#039;&lt;br /&gt;
  &#039;&#039;&#039;for&#039;&#039;&#039; &#039;&#039;i&#039;&#039; = 1,n:&lt;br /&gt;
    &#039;&#039;&#039;for&#039;&#039;&#039; &#039;&#039;k&#039;&#039; = &#039;&#039;IA(i)&#039;&#039;, &#039;&#039;IA(i+1)-1&#039;&#039;:&lt;br /&gt;
            &#039;&#039;y(i)&#039;&#039; += &#039;&#039;A(k)&#039;&#039;*&#039;&#039;x(JA(k))&#039;&#039;;&lt;br /&gt;
  &#039;&#039;&#039;write&#039;&#039;&#039; &#039;&#039;y&#039;&#039;;&lt;br /&gt;
&lt;br /&gt;
=== Схема реализации последовательного алгоритма ===&lt;br /&gt;
Метод можно описать следующим образом:&lt;br /&gt;
# привести матрицу &amp;lt;math&amp;gt;M&amp;lt;/math&amp;gt; к формату CSR&lt;br /&gt;
# для &amp;lt;math&amp;gt;i&amp;lt;/math&amp;gt; от &amp;lt;math&amp;gt;0&amp;lt;/math&amp;gt; до &amp;lt;math&amp;gt;n-1&amp;lt;/math&amp;gt; вычислить &amp;lt;math&amp;gt;y_i&amp;lt;/math&amp;gt; по формуле &amp;lt;math&amp;gt;y_i = \sum_{k = IA_i}^{IA_{i+1}} A_k x_{JA_k}&amp;lt;/math&amp;gt;&lt;br /&gt;
&lt;br /&gt;
=== Последовательная сложность алгоритма ===&lt;br /&gt;
Для вычисления матрично-векторного произведения матрицы размера &amp;lt;math&amp;gt;n*n&amp;lt;/math&amp;gt; и вектора размера n в последовательном варианте требуется:&lt;br /&gt;
&lt;br /&gt;
* &amp;lt;math&amp;gt;nnz&amp;lt;/math&amp;gt; сложений,&lt;br /&gt;
* &amp;lt;math&amp;gt;nnz&amp;lt;/math&amp;gt; умножений.&lt;br /&gt;
&lt;br /&gt;
=== Информационный граф ===&lt;br /&gt;
&lt;br /&gt;
=== Ресурс параллелизма алгоритма ===&lt;br /&gt;
&lt;br /&gt;
=== Входные и выходные данные алгоритма ===&lt;br /&gt;
 &#039;&#039;&#039;Входные данные&#039;&#039;&#039;:&lt;br /&gt;
    число строк матрицы &#039;&#039;n&#039;&#039;; &lt;br /&gt;
    разреженная матрица в формате CSR:&lt;br /&gt;
      строчные указатели &#039;&#039;IA&#039;&#039;,&lt;br /&gt;
      столбцовые указатели&#039;&#039;JA&#039;&#039;, &lt;br /&gt;
      ненулевые элементы &#039;&#039;A&#039;&#039;;&lt;br /&gt;
    вектор &#039;&#039;x&#039;&#039;.&lt;br /&gt;
  &#039;&#039;&#039;Выходные данные&#039;&#039;&#039;: произведение матрицы на вектор &#039;&#039;y&#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;
=== Локальность данных и вычислений ===&lt;br /&gt;
&lt;br /&gt;
=== Возможные способы и особенности параллельной реализации алгоритма ===&lt;br /&gt;
&lt;br /&gt;
=== Масштабируемость алгоритма и его реализации ===&lt;br /&gt;
&lt;br /&gt;
=== Динамические характеристики и эффективность реализации алгоритма ===&lt;br /&gt;
&lt;br /&gt;
=== Выводы для классов архитектур ===&lt;br /&gt;
&lt;br /&gt;
=== Существующие реализации алгоритма ===&lt;br /&gt;
&lt;br /&gt;
Последовательная реализация имеется в пакете SPARSKIT, Python.Scipy&lt;br /&gt;
&lt;br /&gt;
Параллельный алгоритм реализован в библиотеке Matlab, Intel MKL [https://software.intel.com/en-us/node/468536#D09FB46A-B404-44CC-94ED-1C434C41B6E1]&lt;br /&gt;
&lt;br /&gt;
== Литература ==&lt;br /&gt;
[1] С. Писсанецки. Технология разреженных матриц. Изд. Мир, 1988.&lt;/div&gt;</summary>
		<author><name>Екатерина Буторина</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:%D0%A0%D1%83%D1%84%D0%B8%D0%BD%D0%B0_%D0%A2%D1%80%D0%B5%D1%82%D1%8C%D1%8F%D0%BA%D0%BE%D0%B2%D0%B0/%D0%A5%D1%80%D0%B0%D0%BD%D0%B5%D0%BD%D0%B8%D0%B5_%D0%BD%D0%B5%D0%BD%D1%83%D0%BB%D0%B5%D0%B2%D1%8B%D1%85_%D1%8D%D0%BB%D0%B5%D0%BC%D0%B5%D0%BD%D1%82%D0%BE%D0%B2_%D1%80%D0%B0%D0%B7%D1%80%D0%B5%D0%B6%D0%B5%D0%BD%D0%BD%D1%8B%D1%85_%D0%BC%D0%B0%D1%82%D1%80%D0%B8%D1%86._%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=6397</id>
		<title>Участник:Руфина Третьякова/Хранение ненулевых элементов разреженных матриц. Умножение разреженной матрицы на вектор</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:%D0%A0%D1%83%D1%84%D0%B8%D0%BD%D0%B0_%D0%A2%D1%80%D0%B5%D1%82%D1%8C%D1%8F%D0%BA%D0%BE%D0%B2%D0%B0/%D0%A5%D1%80%D0%B0%D0%BD%D0%B5%D0%BD%D0%B8%D0%B5_%D0%BD%D0%B5%D0%BD%D1%83%D0%BB%D0%B5%D0%B2%D1%8B%D1%85_%D1%8D%D0%BB%D0%B5%D0%BC%D0%B5%D0%BD%D1%82%D0%BE%D0%B2_%D1%80%D0%B0%D0%B7%D1%80%D0%B5%D0%B6%D0%B5%D0%BD%D0%BD%D1%8B%D1%85_%D0%BC%D0%B0%D1%82%D1%80%D0%B8%D1%86._%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=6397"/>
		<updated>2016-10-13T11:37:12Z</updated>

		<summary type="html">&lt;p&gt;Екатерина Буторина: /* Существующие реализации алгоритма */&lt;/p&gt;
&lt;hr /&gt;
&lt;div&gt;{{algorithm&lt;br /&gt;
| name              = Умножение разреженной матрицы на вектор&lt;br /&gt;
| serial_complexity = &amp;lt;math&amp;gt;nnz&amp;lt;/math&amp;gt;&lt;br /&gt;
| pf_height         = &amp;lt;math&amp;gt;&amp;lt;/math&amp;gt;&lt;br /&gt;
| pf_width          = &amp;lt;math&amp;gt;&amp;lt;/math&amp;gt;&lt;br /&gt;
| input_data        = &amp;lt;math&amp;gt;2nnz+2n+1&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;
Авторы статьи: [[Участница:Руфина_Третьякова|Третьякова Р. М.]] (группа 603), [[Участница:Екатерина_Буторина|Буторина Е. В.]] (группа 603)&lt;br /&gt;
&lt;br /&gt;
&lt;br /&gt;
&lt;br /&gt;
== Свойства и структура алгоритма ==&lt;br /&gt;
&lt;br /&gt;
=== Общее описание алгоритма ===&lt;br /&gt;
Разрежённая матрица — это матрица с преимущественно нулевыми элементами. В противном случае, если бо́льшая часть элементов матрицы ненулевые, матрица считается плотной.&lt;br /&gt;
Среди специалистов нет единства в определении того, какое именно количество ненулевых элементов делает матрицу разрежённой. Разные авторы предлагают различные варианты. &lt;br /&gt;
Огромные разрежённые матрицы часто возникают при решении таких задач, как дифференциальное уравнение в частных производных.&lt;br /&gt;
При хранении и преобразовании разрежённых матриц в компьютере бывает полезно, а часто и необходимо, использовать специальные алгоритмы и структуры данных, которые учитывают разрежённую структуру матрицы. Операции и алгоритмы, применяемые для работы с обычными, плотными матрицами, применительно к большим разрежённым матрицам работают относительно медленно и требуют значительных объёмов памяти. Однако разрежённые матрицы могут быть легко сжаты путём записи только своих ненулевых элементов, что снижает требования к компьютерной памяти.&lt;br /&gt;
&lt;br /&gt;
=== Математическое описание алгоритма ===&lt;br /&gt;
Исходные данные:  разреженная матрица &amp;lt;math&amp;gt;M^{n*n}&amp;lt;/math&amp;gt;, вектор &amp;lt;math&amp;gt;x^{n*1}&amp;lt;/math&amp;gt; &lt;br /&gt;
&lt;br /&gt;
Наиболее удобным форматом для вычисления произведения матрицы на вектор является &amp;quot;Compressed Sparse Row&amp;quot; или сокращенно CSR-формат.&lt;br /&gt;
&lt;br /&gt;
Рассмотрим CSR-представление разреженной матрицы: пусть число ненулевых элементов матрицы равно &amp;lt;math&amp;gt;nnz&amp;lt;/math&amp;gt;&lt;br /&gt;
CSR-формат представляет матрицу &amp;lt;math&amp;gt;M&amp;lt;/math&amp;gt; в виде 3-х одномерных массивов:&lt;br /&gt;
&lt;br /&gt;
массив &amp;lt;math&amp;gt;A&amp;lt;/math&amp;gt; размера &amp;lt;math&amp;gt;nnz&amp;lt;/math&amp;gt; содержит ненулевые значения матрицы,&lt;br /&gt;
&amp;lt;math&amp;gt;JA&amp;lt;/math&amp;gt; размера &amp;lt;math&amp;gt;nnz&amp;lt;/math&amp;gt; - номера столбцов ненулевых элементов., &lt;br /&gt;
&amp;lt;math&amp;gt;IA&amp;lt;/math&amp;gt; размера &amp;lt;math&amp;gt;n&amp;lt;/math&amp;gt;- содержит номер с которого начинается описание элементов строки в массивах &amp;lt;math&amp;gt;A&amp;lt;/math&amp;gt; и &amp;lt;math&amp;gt;JA&amp;lt;/math&amp;gt;.&lt;br /&gt;
Этот формат позволяет производить перемножение матрицы &amp;lt;math&amp;gt;M&amp;lt;/math&amp;gt; на вектор &amp;lt;math&amp;gt;x&amp;lt;/math&amp;gt; за &amp;lt;math&amp;gt;O(nnz)&amp;lt;/math&amp;gt; умножений и сложений. &lt;br /&gt;
&lt;br /&gt;
Например, это разреженная матрица с 4-мя ненулевыми элементами&lt;br /&gt;
:: &amp;lt;math&amp;gt;\begin{pmatrix}&lt;br /&gt;
0 &amp;amp; 0 &amp;amp; 0 &amp;amp; 1 \\&lt;br /&gt;
2 &amp;amp; 0 &amp;amp; 0 &amp;amp; 0 \\&lt;br /&gt;
0 &amp;amp; 0 &amp;amp; 3 &amp;amp; 0 \\&lt;br /&gt;
0 &amp;amp; 4 &amp;amp; 0 &amp;amp; 0 \\&lt;br /&gt;
\end{pmatrix}&amp;lt;/math&amp;gt;,&lt;br /&gt;
 представляемая в формате CSR &lt;br /&gt;
    A  = [ 1 2 3 4 ]&lt;br /&gt;
    IA = [ 0 1 2 3 4 ]&lt;br /&gt;
    JA = [ 3 0 2 1 ]&lt;br /&gt;
&lt;br /&gt;
&lt;br /&gt;
Вычисляемые данные: вектор  &amp;lt;math&amp;gt;M*x=y&amp;lt;/math&amp;gt;&lt;br /&gt;
&lt;br /&gt;
=== Вычислительное ядро алгоритма ===&lt;br /&gt;
&lt;br /&gt;
:&amp;lt;math&amp;gt;y_i = \sum_{k = IA_i}^{IA_{i+1}} A_k x_{JA_k}&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;
    число строк матрицы &#039;&#039;n&#039;&#039;; &lt;br /&gt;
    разреженная матрица в формате CSR:&lt;br /&gt;
      строчные указатели &#039;&#039;IA&#039;&#039;,&lt;br /&gt;
      столбцовые указатели&#039;&#039;JA&#039;&#039;, &lt;br /&gt;
      ненулевые элементы &#039;&#039;A&#039;&#039;;&lt;br /&gt;
    вектор &#039;&#039;x&#039;&#039;.&lt;br /&gt;
  &#039;&#039;&#039;Выходные данные&#039;&#039;&#039;: произведение матрицы на вектор &#039;&#039;y&#039;&#039;.&lt;br /&gt;
  &#039;&#039;&#039;read CSR&#039;&#039;&#039; &#039;&#039;n&#039;&#039;, &#039;&#039;IA&#039;&#039;, &#039;&#039;JA&#039;&#039;, &#039;&#039;A&#039;&#039;;&lt;br /&gt;
  &#039;&#039;&#039;read&#039;&#039;&#039; &#039;&#039;x&#039;&#039;&lt;br /&gt;
  &#039;&#039;&#039;for&#039;&#039;&#039; &#039;&#039;i&#039;&#039; = 1,n:&lt;br /&gt;
    &#039;&#039;&#039;for&#039;&#039;&#039; &#039;&#039;k&#039;&#039; = &#039;&#039;IA(i)&#039;&#039;, &#039;&#039;IA(i+1)-1&#039;&#039;:&lt;br /&gt;
            &#039;&#039;y(i)&#039;&#039; += &#039;&#039;A(k)&#039;&#039;*&#039;&#039;x(JA(k))&#039;&#039;;&lt;br /&gt;
  &#039;&#039;&#039;write&#039;&#039;&#039; &#039;&#039;y&#039;&#039;;&lt;br /&gt;
&lt;br /&gt;
=== Схема реализации последовательного алгоритма ===&lt;br /&gt;
Метод можно описать следующим образом:&lt;br /&gt;
# привести матрицу &amp;lt;math&amp;gt;M&amp;lt;/math&amp;gt; к формату CSR&lt;br /&gt;
# для &amp;lt;math&amp;gt;i&amp;lt;/math&amp;gt; от &amp;lt;math&amp;gt;0&amp;lt;/math&amp;gt; до &amp;lt;math&amp;gt;n-1&amp;lt;/math&amp;gt; вычислить &amp;lt;math&amp;gt;y_i&amp;lt;/math&amp;gt; по формуле &amp;lt;math&amp;gt;y_i = \sum_{k = IA_i}^{IA_{i+1}} A_k x_{JA_k}&amp;lt;/math&amp;gt;&lt;br /&gt;
&lt;br /&gt;
=== Последовательная сложность алгоритма ===&lt;br /&gt;
Для вычисления матрично-векторного произведения матрицы размера &amp;lt;math&amp;gt;n*n&amp;lt;/math&amp;gt; и вектора размера n в последовательном варианте требуется:&lt;br /&gt;
&lt;br /&gt;
* &amp;lt;math&amp;gt;nnz&amp;lt;/math&amp;gt; сложений,&lt;br /&gt;
* &amp;lt;math&amp;gt;nnz&amp;lt;/math&amp;gt; умножений.&lt;br /&gt;
&lt;br /&gt;
=== Информационный граф ===&lt;br /&gt;
&lt;br /&gt;
=== Ресурс параллелизма алгоритма ===&lt;br /&gt;
&lt;br /&gt;
=== Входные и выходные данные алгоритма ===&lt;br /&gt;
 &#039;&#039;&#039;Входные данные&#039;&#039;&#039;:&lt;br /&gt;
    число строк матрицы &#039;&#039;n&#039;&#039;; &lt;br /&gt;
    разреженная матрица в формате CSR:&lt;br /&gt;
      строчные указатели &#039;&#039;IA&#039;&#039;,&lt;br /&gt;
      столбцовые указатели&#039;&#039;JA&#039;&#039;, &lt;br /&gt;
      ненулевые элементы &#039;&#039;A&#039;&#039;;&lt;br /&gt;
    вектор &#039;&#039;x&#039;&#039;.&lt;br /&gt;
  &#039;&#039;&#039;Выходные данные&#039;&#039;&#039;: произведение матрицы на вектор &#039;&#039;y&#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;
=== Локальность данных и вычислений ===&lt;br /&gt;
&lt;br /&gt;
=== Возможные способы и особенности параллельной реализации алгоритма ===&lt;br /&gt;
&lt;br /&gt;
=== Масштабируемость алгоритма и его реализации ===&lt;br /&gt;
&lt;br /&gt;
=== Динамические характеристики и эффективность реализации алгоритма ===&lt;br /&gt;
&lt;br /&gt;
=== Выводы для классов архитектур ===&lt;br /&gt;
&lt;br /&gt;
=== Существующие реализации алгоритма ===&lt;br /&gt;
&lt;br /&gt;
Последовательная реализация имеется в пакете SPARSKIT, Python.Scipy, Intel MKL&lt;br /&gt;
&lt;br /&gt;
Параллельный алгоритм реализован в библиотеке Matlab, ScaLapack&lt;br /&gt;
&lt;br /&gt;
== Литература ==&lt;br /&gt;
[1] С. Писсанецки. Технология разреженных матриц. Изд. Мир, 1988.&lt;/div&gt;</summary>
		<author><name>Екатерина Буторина</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:%D0%A0%D1%83%D1%84%D0%B8%D0%BD%D0%B0_%D0%A2%D1%80%D0%B5%D1%82%D1%8C%D1%8F%D0%BA%D0%BE%D0%B2%D0%B0/%D0%A5%D1%80%D0%B0%D0%BD%D0%B5%D0%BD%D0%B8%D0%B5_%D0%BD%D0%B5%D0%BD%D1%83%D0%BB%D0%B5%D0%B2%D1%8B%D1%85_%D1%8D%D0%BB%D0%B5%D0%BC%D0%B5%D0%BD%D1%82%D0%BE%D0%B2_%D1%80%D0%B0%D0%B7%D1%80%D0%B5%D0%B6%D0%B5%D0%BD%D0%BD%D1%8B%D1%85_%D0%BC%D0%B0%D1%82%D1%80%D0%B8%D1%86._%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=6394</id>
		<title>Участник:Руфина Третьякова/Хранение ненулевых элементов разреженных матриц. Умножение разреженной матрицы на вектор</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:%D0%A0%D1%83%D1%84%D0%B8%D0%BD%D0%B0_%D0%A2%D1%80%D0%B5%D1%82%D1%8C%D1%8F%D0%BA%D0%BE%D0%B2%D0%B0/%D0%A5%D1%80%D0%B0%D0%BD%D0%B5%D0%BD%D0%B8%D0%B5_%D0%BD%D0%B5%D0%BD%D1%83%D0%BB%D0%B5%D0%B2%D1%8B%D1%85_%D1%8D%D0%BB%D0%B5%D0%BC%D0%B5%D0%BD%D1%82%D0%BE%D0%B2_%D1%80%D0%B0%D0%B7%D1%80%D0%B5%D0%B6%D0%B5%D0%BD%D0%BD%D1%8B%D1%85_%D0%BC%D0%B0%D1%82%D1%80%D0%B8%D1%86._%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=6394"/>
		<updated>2016-10-13T11:33:46Z</updated>

		<summary type="html">&lt;p&gt;Екатерина Буторина: /* Существующие реализации алгоритма */&lt;/p&gt;
&lt;hr /&gt;
&lt;div&gt;{{algorithm&lt;br /&gt;
| name              = Умножение разреженной матрицы на вектор&lt;br /&gt;
| serial_complexity = &amp;lt;math&amp;gt;nnz&amp;lt;/math&amp;gt;&lt;br /&gt;
| pf_height         = &amp;lt;math&amp;gt;&amp;lt;/math&amp;gt;&lt;br /&gt;
| pf_width          = &amp;lt;math&amp;gt;&amp;lt;/math&amp;gt;&lt;br /&gt;
| input_data        = &amp;lt;math&amp;gt;2nnz+2n+1&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;
Авторы статьи: [[Участница:Руфина_Третьякова|Третьякова Р. М.]] (группа 603), [[Участница:Екатерина_Буторина|Буторина Е. В.]] (группа 603)&lt;br /&gt;
&lt;br /&gt;
&lt;br /&gt;
&lt;br /&gt;
== Свойства и структура алгоритма ==&lt;br /&gt;
&lt;br /&gt;
=== Общее описание алгоритма ===&lt;br /&gt;
Разрежённая матрица — это матрица с преимущественно нулевыми элементами. В противном случае, если бо́льшая часть элементов матрицы ненулевые, матрица считается плотной.&lt;br /&gt;
Среди специалистов нет единства в определении того, какое именно количество ненулевых элементов делает матрицу разрежённой. Разные авторы предлагают различные варианты. &lt;br /&gt;
Огромные разрежённые матрицы часто возникают при решении таких задач, как дифференциальное уравнение в частных производных.&lt;br /&gt;
При хранении и преобразовании разрежённых матриц в компьютере бывает полезно, а часто и необходимо, использовать специальные алгоритмы и структуры данных, которые учитывают разрежённую структуру матрицы. Операции и алгоритмы, применяемые для работы с обычными, плотными матрицами, применительно к большим разрежённым матрицам работают относительно медленно и требуют значительных объёмов памяти. Однако разрежённые матрицы могут быть легко сжаты путём записи только своих ненулевых элементов, что снижает требования к компьютерной памяти.&lt;br /&gt;
&lt;br /&gt;
=== Математическое описание алгоритма ===&lt;br /&gt;
Исходные данные:  разреженная матрица &amp;lt;math&amp;gt;M^{n*n}&amp;lt;/math&amp;gt;, вектор &amp;lt;math&amp;gt;x^{n*1}&amp;lt;/math&amp;gt; &lt;br /&gt;
&lt;br /&gt;
Наиболее удобным форматом для вычисления произведения матрицы на вектор является &amp;quot;Compressed Sparse Row&amp;quot; или сокращенно CSR-формат.&lt;br /&gt;
&lt;br /&gt;
Рассмотрим CSR-представление разреженной матрицы: пусть число ненулевых элементов матрицы равно &amp;lt;math&amp;gt;nnz&amp;lt;/math&amp;gt;&lt;br /&gt;
CSR-формат представляет матрицу &amp;lt;math&amp;gt;M&amp;lt;/math&amp;gt; в виде 3-х одномерных массивов:&lt;br /&gt;
&lt;br /&gt;
массив &amp;lt;math&amp;gt;A&amp;lt;/math&amp;gt; размера &amp;lt;math&amp;gt;nnz&amp;lt;/math&amp;gt; содержит ненулевые значения матрицы,&lt;br /&gt;
&amp;lt;math&amp;gt;JA&amp;lt;/math&amp;gt; размера &amp;lt;math&amp;gt;nnz&amp;lt;/math&amp;gt; - номера столбцов ненулевых элементов., &lt;br /&gt;
&amp;lt;math&amp;gt;IA&amp;lt;/math&amp;gt; размера &amp;lt;math&amp;gt;n&amp;lt;/math&amp;gt;- содержит номер с которого начинается описание элементов строки в массивах &amp;lt;math&amp;gt;A&amp;lt;/math&amp;gt; и &amp;lt;math&amp;gt;JA&amp;lt;/math&amp;gt;.&lt;br /&gt;
Этот формат позволяет производить перемножение матрицы &amp;lt;math&amp;gt;M&amp;lt;/math&amp;gt; на вектор &amp;lt;math&amp;gt;x&amp;lt;/math&amp;gt; за &amp;lt;math&amp;gt;O(nnz)&amp;lt;/math&amp;gt; умножений и сложений. &lt;br /&gt;
&lt;br /&gt;
Например, это разреженная матрица с 4-мя ненулевыми элементами&lt;br /&gt;
:: &amp;lt;math&amp;gt;\begin{pmatrix}&lt;br /&gt;
0 &amp;amp; 0 &amp;amp; 0 &amp;amp; 1 \\&lt;br /&gt;
2 &amp;amp; 0 &amp;amp; 0 &amp;amp; 0 \\&lt;br /&gt;
0 &amp;amp; 0 &amp;amp; 3 &amp;amp; 0 \\&lt;br /&gt;
0 &amp;amp; 4 &amp;amp; 0 &amp;amp; 0 \\&lt;br /&gt;
\end{pmatrix}&amp;lt;/math&amp;gt;,&lt;br /&gt;
 представляемая в формате CSR &lt;br /&gt;
    A  = [ 1 2 3 4 ]&lt;br /&gt;
    IA = [ 0 1 2 3 4 ]&lt;br /&gt;
    JA = [ 3 0 2 1 ]&lt;br /&gt;
&lt;br /&gt;
&lt;br /&gt;
Вычисляемые данные: вектор  &amp;lt;math&amp;gt;M*x=y&amp;lt;/math&amp;gt;&lt;br /&gt;
&lt;br /&gt;
=== Вычислительное ядро алгоритма ===&lt;br /&gt;
&lt;br /&gt;
:&amp;lt;math&amp;gt;y_i = \sum_{k = IA_i}^{IA_{i+1}} A_k x_{JA_k}&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;
    число строк матрицы &#039;&#039;n&#039;&#039;; &lt;br /&gt;
    разреженная матрица в формате CSR:&lt;br /&gt;
      строчные указатели &#039;&#039;IA&#039;&#039;,&lt;br /&gt;
      столбцовые указатели&#039;&#039;JA&#039;&#039;, &lt;br /&gt;
      ненулевые элементы &#039;&#039;A&#039;&#039;;&lt;br /&gt;
    вектор &#039;&#039;x&#039;&#039;.&lt;br /&gt;
  &#039;&#039;&#039;Выходные данные&#039;&#039;&#039;: произведение матрицы на вектор &#039;&#039;y&#039;&#039;.&lt;br /&gt;
  &#039;&#039;&#039;read CSR&#039;&#039;&#039; &#039;&#039;n&#039;&#039;, &#039;&#039;IA&#039;&#039;, &#039;&#039;JA&#039;&#039;, &#039;&#039;A&#039;&#039;;&lt;br /&gt;
  &#039;&#039;&#039;read&#039;&#039;&#039; &#039;&#039;x&#039;&#039;&lt;br /&gt;
  &#039;&#039;&#039;for&#039;&#039;&#039; &#039;&#039;i&#039;&#039; = 1,n:&lt;br /&gt;
    &#039;&#039;&#039;for&#039;&#039;&#039; &#039;&#039;k&#039;&#039; = &#039;&#039;IA(i)&#039;&#039;, &#039;&#039;IA(i+1)-1&#039;&#039;:&lt;br /&gt;
            &#039;&#039;y(i)&#039;&#039; += &#039;&#039;A(k)&#039;&#039;*&#039;&#039;x(JA(k))&#039;&#039;;&lt;br /&gt;
  &#039;&#039;&#039;write&#039;&#039;&#039; &#039;&#039;y&#039;&#039;;&lt;br /&gt;
&lt;br /&gt;
=== Схема реализации последовательного алгоритма ===&lt;br /&gt;
Метод можно описать следующим образом:&lt;br /&gt;
# привести матрицу &amp;lt;math&amp;gt;M&amp;lt;/math&amp;gt; к формату CSR&lt;br /&gt;
# для &amp;lt;math&amp;gt;i&amp;lt;/math&amp;gt; от &amp;lt;math&amp;gt;0&amp;lt;/math&amp;gt; до &amp;lt;math&amp;gt;n-1&amp;lt;/math&amp;gt; вычислить &amp;lt;math&amp;gt;y_i&amp;lt;/math&amp;gt; по формуле &amp;lt;math&amp;gt;y_i = \sum_{k = IA_i}^{IA_{i+1}} A_k x_{JA_k}&amp;lt;/math&amp;gt;&lt;br /&gt;
&lt;br /&gt;
=== Последовательная сложность алгоритма ===&lt;br /&gt;
Для вычисления матрично-векторного произведения матрицы размера &amp;lt;math&amp;gt;n*n&amp;lt;/math&amp;gt; и вектора размера n в последовательном варианте требуется:&lt;br /&gt;
&lt;br /&gt;
* &amp;lt;math&amp;gt;nnz&amp;lt;/math&amp;gt; сложений,&lt;br /&gt;
* &amp;lt;math&amp;gt;nnz&amp;lt;/math&amp;gt; умножений.&lt;br /&gt;
&lt;br /&gt;
=== Информационный граф ===&lt;br /&gt;
&lt;br /&gt;
=== Ресурс параллелизма алгоритма ===&lt;br /&gt;
&lt;br /&gt;
=== Входные и выходные данные алгоритма ===&lt;br /&gt;
 &#039;&#039;&#039;Входные данные&#039;&#039;&#039;:&lt;br /&gt;
    число строк матрицы &#039;&#039;n&#039;&#039;; &lt;br /&gt;
    разреженная матрица в формате CSR:&lt;br /&gt;
      строчные указатели &#039;&#039;IA&#039;&#039;,&lt;br /&gt;
      столбцовые указатели&#039;&#039;JA&#039;&#039;, &lt;br /&gt;
      ненулевые элементы &#039;&#039;A&#039;&#039;;&lt;br /&gt;
    вектор &#039;&#039;x&#039;&#039;.&lt;br /&gt;
  &#039;&#039;&#039;Выходные данные&#039;&#039;&#039;: произведение матрицы на вектор &#039;&#039;y&#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;
=== Локальность данных и вычислений ===&lt;br /&gt;
&lt;br /&gt;
=== Возможные способы и особенности параллельной реализации алгоритма ===&lt;br /&gt;
&lt;br /&gt;
=== Масштабируемость алгоритма и его реализации ===&lt;br /&gt;
&lt;br /&gt;
=== Динамические характеристики и эффективность реализации алгоритма ===&lt;br /&gt;
&lt;br /&gt;
=== Выводы для классов архитектур ===&lt;br /&gt;
&lt;br /&gt;
=== Существующие реализации алгоритма ===&lt;br /&gt;
&lt;br /&gt;
Последовательная реализация имеется в пакете SPARSKIT, Python.Scipy&lt;br /&gt;
&lt;br /&gt;
Параллельный алгоритм реализован в библиотеке Matlab, ScaLapack&lt;br /&gt;
&lt;br /&gt;
== Литература ==&lt;br /&gt;
[1] С. Писсанецки. Технология разреженных матриц. Изд. Мир, 1988.&lt;/div&gt;</summary>
		<author><name>Екатерина Буторина</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:%D0%A0%D1%83%D1%84%D0%B8%D0%BD%D0%B0_%D0%A2%D1%80%D0%B5%D1%82%D1%8C%D1%8F%D0%BA%D0%BE%D0%B2%D0%B0/%D0%A5%D1%80%D0%B0%D0%BD%D0%B5%D0%BD%D0%B8%D0%B5_%D0%BD%D0%B5%D0%BD%D1%83%D0%BB%D0%B5%D0%B2%D1%8B%D1%85_%D1%8D%D0%BB%D0%B5%D0%BC%D0%B5%D0%BD%D1%82%D0%BE%D0%B2_%D1%80%D0%B0%D0%B7%D1%80%D0%B5%D0%B6%D0%B5%D0%BD%D0%BD%D1%8B%D1%85_%D0%BC%D0%B0%D1%82%D1%80%D0%B8%D1%86._%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=6392</id>
		<title>Участник:Руфина Третьякова/Хранение ненулевых элементов разреженных матриц. Умножение разреженной матрицы на вектор</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:%D0%A0%D1%83%D1%84%D0%B8%D0%BD%D0%B0_%D0%A2%D1%80%D0%B5%D1%82%D1%8C%D1%8F%D0%BA%D0%BE%D0%B2%D0%B0/%D0%A5%D1%80%D0%B0%D0%BD%D0%B5%D0%BD%D0%B8%D0%B5_%D0%BD%D0%B5%D0%BD%D1%83%D0%BB%D0%B5%D0%B2%D1%8B%D1%85_%D1%8D%D0%BB%D0%B5%D0%BC%D0%B5%D0%BD%D1%82%D0%BE%D0%B2_%D1%80%D0%B0%D0%B7%D1%80%D0%B5%D0%B6%D0%B5%D0%BD%D0%BD%D1%8B%D1%85_%D0%BC%D0%B0%D1%82%D1%80%D0%B8%D1%86._%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=6392"/>
		<updated>2016-10-13T11:33:11Z</updated>

		<summary type="html">&lt;p&gt;Екатерина Буторина: /* Существующие реализации алгоритма */&lt;/p&gt;
&lt;hr /&gt;
&lt;div&gt;{{algorithm&lt;br /&gt;
| name              = Умножение разреженной матрицы на вектор&lt;br /&gt;
| serial_complexity = &amp;lt;math&amp;gt;nnz&amp;lt;/math&amp;gt;&lt;br /&gt;
| pf_height         = &amp;lt;math&amp;gt;&amp;lt;/math&amp;gt;&lt;br /&gt;
| pf_width          = &amp;lt;math&amp;gt;&amp;lt;/math&amp;gt;&lt;br /&gt;
| input_data        = &amp;lt;math&amp;gt;2nnz+2n+1&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;
Авторы статьи: [[Участница:Руфина_Третьякова|Третьякова Р. М.]] (группа 603), [[Участница:Екатерина_Буторина|Буторина Е. В.]] (группа 603)&lt;br /&gt;
&lt;br /&gt;
&lt;br /&gt;
&lt;br /&gt;
== Свойства и структура алгоритма ==&lt;br /&gt;
&lt;br /&gt;
=== Общее описание алгоритма ===&lt;br /&gt;
Разрежённая матрица — это матрица с преимущественно нулевыми элементами. В противном случае, если бо́льшая часть элементов матрицы ненулевые, матрица считается плотной.&lt;br /&gt;
Среди специалистов нет единства в определении того, какое именно количество ненулевых элементов делает матрицу разрежённой. Разные авторы предлагают различные варианты. &lt;br /&gt;
Огромные разрежённые матрицы часто возникают при решении таких задач, как дифференциальное уравнение в частных производных.&lt;br /&gt;
При хранении и преобразовании разрежённых матриц в компьютере бывает полезно, а часто и необходимо, использовать специальные алгоритмы и структуры данных, которые учитывают разрежённую структуру матрицы. Операции и алгоритмы, применяемые для работы с обычными, плотными матрицами, применительно к большим разрежённым матрицам работают относительно медленно и требуют значительных объёмов памяти. Однако разрежённые матрицы могут быть легко сжаты путём записи только своих ненулевых элементов, что снижает требования к компьютерной памяти.&lt;br /&gt;
&lt;br /&gt;
=== Математическое описание алгоритма ===&lt;br /&gt;
Исходные данные:  разреженная матрица &amp;lt;math&amp;gt;M^{n*n}&amp;lt;/math&amp;gt;, вектор &amp;lt;math&amp;gt;x^{n*1}&amp;lt;/math&amp;gt; &lt;br /&gt;
&lt;br /&gt;
Наиболее удобным форматом для вычисления произведения матрицы на вектор является &amp;quot;Compressed Sparse Row&amp;quot; или сокращенно CSR-формат.&lt;br /&gt;
&lt;br /&gt;
Рассмотрим CSR-представление разреженной матрицы: пусть число ненулевых элементов матрицы равно &amp;lt;math&amp;gt;nnz&amp;lt;/math&amp;gt;&lt;br /&gt;
CSR-формат представляет матрицу &amp;lt;math&amp;gt;M&amp;lt;/math&amp;gt; в виде 3-х одномерных массивов:&lt;br /&gt;
&lt;br /&gt;
массив &amp;lt;math&amp;gt;A&amp;lt;/math&amp;gt; размера &amp;lt;math&amp;gt;nnz&amp;lt;/math&amp;gt; содержит ненулевые значения матрицы,&lt;br /&gt;
&amp;lt;math&amp;gt;JA&amp;lt;/math&amp;gt; размера &amp;lt;math&amp;gt;nnz&amp;lt;/math&amp;gt; - номера столбцов ненулевых элементов., &lt;br /&gt;
&amp;lt;math&amp;gt;IA&amp;lt;/math&amp;gt; размера &amp;lt;math&amp;gt;n&amp;lt;/math&amp;gt;- содержит номер с которого начинается описание элементов строки в массивах &amp;lt;math&amp;gt;A&amp;lt;/math&amp;gt; и &amp;lt;math&amp;gt;JA&amp;lt;/math&amp;gt;.&lt;br /&gt;
Этот формат позволяет производить перемножение матрицы &amp;lt;math&amp;gt;M&amp;lt;/math&amp;gt; на вектор &amp;lt;math&amp;gt;x&amp;lt;/math&amp;gt; за &amp;lt;math&amp;gt;O(nnz)&amp;lt;/math&amp;gt; умножений и сложений. &lt;br /&gt;
&lt;br /&gt;
Например, это разреженная матрица с 4-мя ненулевыми элементами&lt;br /&gt;
:: &amp;lt;math&amp;gt;\begin{pmatrix}&lt;br /&gt;
0 &amp;amp; 0 &amp;amp; 0 &amp;amp; 1 \\&lt;br /&gt;
2 &amp;amp; 0 &amp;amp; 0 &amp;amp; 0 \\&lt;br /&gt;
0 &amp;amp; 0 &amp;amp; 3 &amp;amp; 0 \\&lt;br /&gt;
0 &amp;amp; 4 &amp;amp; 0 &amp;amp; 0 \\&lt;br /&gt;
\end{pmatrix}&amp;lt;/math&amp;gt;,&lt;br /&gt;
 представляемая в формате CSR &lt;br /&gt;
    A  = [ 1 2 3 4 ]&lt;br /&gt;
    IA = [ 0 1 2 3 4 ]&lt;br /&gt;
    JA = [ 3 0 2 1 ]&lt;br /&gt;
&lt;br /&gt;
&lt;br /&gt;
Вычисляемые данные: вектор  &amp;lt;math&amp;gt;M*x=y&amp;lt;/math&amp;gt;&lt;br /&gt;
&lt;br /&gt;
=== Вычислительное ядро алгоритма ===&lt;br /&gt;
&lt;br /&gt;
:&amp;lt;math&amp;gt;y_i = \sum_{k = IA_i}^{IA_{i+1}} A_k x_{JA_k}&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;
    число строк матрицы &#039;&#039;n&#039;&#039;; &lt;br /&gt;
    разреженная матрица в формате CSR:&lt;br /&gt;
      строчные указатели &#039;&#039;IA&#039;&#039;,&lt;br /&gt;
      столбцовые указатели&#039;&#039;JA&#039;&#039;, &lt;br /&gt;
      ненулевые элементы &#039;&#039;A&#039;&#039;;&lt;br /&gt;
    вектор &#039;&#039;x&#039;&#039;.&lt;br /&gt;
  &#039;&#039;&#039;Выходные данные&#039;&#039;&#039;: произведение матрицы на вектор &#039;&#039;y&#039;&#039;.&lt;br /&gt;
  &#039;&#039;&#039;read CSR&#039;&#039;&#039; &#039;&#039;n&#039;&#039;, &#039;&#039;IA&#039;&#039;, &#039;&#039;JA&#039;&#039;, &#039;&#039;A&#039;&#039;;&lt;br /&gt;
  &#039;&#039;&#039;read&#039;&#039;&#039; &#039;&#039;x&#039;&#039;&lt;br /&gt;
  &#039;&#039;&#039;for&#039;&#039;&#039; &#039;&#039;i&#039;&#039; = 1,n:&lt;br /&gt;
    &#039;&#039;&#039;for&#039;&#039;&#039; &#039;&#039;k&#039;&#039; = &#039;&#039;IA(i)&#039;&#039;, &#039;&#039;IA(i+1)-1&#039;&#039;:&lt;br /&gt;
            &#039;&#039;y(i)&#039;&#039; += &#039;&#039;A(k)&#039;&#039;*&#039;&#039;x(JA(k))&#039;&#039;;&lt;br /&gt;
  &#039;&#039;&#039;write&#039;&#039;&#039; &#039;&#039;y&#039;&#039;;&lt;br /&gt;
&lt;br /&gt;
=== Схема реализации последовательного алгоритма ===&lt;br /&gt;
Метод можно описать следующим образом:&lt;br /&gt;
# привести матрицу &amp;lt;math&amp;gt;M&amp;lt;/math&amp;gt; к формату CSR&lt;br /&gt;
# для &amp;lt;math&amp;gt;i&amp;lt;/math&amp;gt; от &amp;lt;math&amp;gt;0&amp;lt;/math&amp;gt; до &amp;lt;math&amp;gt;n-1&amp;lt;/math&amp;gt; вычислить &amp;lt;math&amp;gt;y_i&amp;lt;/math&amp;gt; по формуле &amp;lt;math&amp;gt;y_i = \sum_{k = IA_i}^{IA_{i+1}} A_k x_{JA_k}&amp;lt;/math&amp;gt;&lt;br /&gt;
&lt;br /&gt;
=== Последовательная сложность алгоритма ===&lt;br /&gt;
Для вычисления матрично-векторного произведения матрицы размера &amp;lt;math&amp;gt;n*n&amp;lt;/math&amp;gt; и вектора размера n в последовательном варианте требуется:&lt;br /&gt;
&lt;br /&gt;
* &amp;lt;math&amp;gt;nnz&amp;lt;/math&amp;gt; сложений,&lt;br /&gt;
* &amp;lt;math&amp;gt;nnz&amp;lt;/math&amp;gt; умножений.&lt;br /&gt;
&lt;br /&gt;
=== Информационный граф ===&lt;br /&gt;
&lt;br /&gt;
=== Ресурс параллелизма алгоритма ===&lt;br /&gt;
&lt;br /&gt;
=== Входные и выходные данные алгоритма ===&lt;br /&gt;
 &#039;&#039;&#039;Входные данные&#039;&#039;&#039;:&lt;br /&gt;
    число строк матрицы &#039;&#039;n&#039;&#039;; &lt;br /&gt;
    разреженная матрица в формате CSR:&lt;br /&gt;
      строчные указатели &#039;&#039;IA&#039;&#039;,&lt;br /&gt;
      столбцовые указатели&#039;&#039;JA&#039;&#039;, &lt;br /&gt;
      ненулевые элементы &#039;&#039;A&#039;&#039;;&lt;br /&gt;
    вектор &#039;&#039;x&#039;&#039;.&lt;br /&gt;
  &#039;&#039;&#039;Выходные данные&#039;&#039;&#039;: произведение матрицы на вектор &#039;&#039;y&#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;
=== Локальность данных и вычислений ===&lt;br /&gt;
&lt;br /&gt;
=== Возможные способы и особенности параллельной реализации алгоритма ===&lt;br /&gt;
&lt;br /&gt;
=== Масштабируемость алгоритма и его реализации ===&lt;br /&gt;
&lt;br /&gt;
=== Динамические характеристики и эффективность реализации алгоритма ===&lt;br /&gt;
&lt;br /&gt;
=== Выводы для классов архитектур ===&lt;br /&gt;
&lt;br /&gt;
=== Существующие реализации алгоритма ===&lt;br /&gt;
&lt;br /&gt;
Последовательная реализация имеется в пакете SPARSKIT, Python.Scipy&lt;br /&gt;
&lt;br /&gt;
Параллельный алгоритм реализован в библиотеке Matlab&lt;br /&gt;
&lt;br /&gt;
== Литература ==&lt;br /&gt;
[1] С. Писсанецки. Технология разреженных матриц. Изд. Мир, 1988.&lt;/div&gt;</summary>
		<author><name>Екатерина Буторина</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:%D0%A0%D1%83%D1%84%D0%B8%D0%BD%D0%B0_%D0%A2%D1%80%D0%B5%D1%82%D1%8C%D1%8F%D0%BA%D0%BE%D0%B2%D0%B0/%D0%A5%D1%80%D0%B0%D0%BD%D0%B5%D0%BD%D0%B8%D0%B5_%D0%BD%D0%B5%D0%BD%D1%83%D0%BB%D0%B5%D0%B2%D1%8B%D1%85_%D1%8D%D0%BB%D0%B5%D0%BC%D0%B5%D0%BD%D1%82%D0%BE%D0%B2_%D1%80%D0%B0%D0%B7%D1%80%D0%B5%D0%B6%D0%B5%D0%BD%D0%BD%D1%8B%D1%85_%D0%BC%D0%B0%D1%82%D1%80%D0%B8%D1%86._%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=6391</id>
		<title>Участник:Руфина Третьякова/Хранение ненулевых элементов разреженных матриц. Умножение разреженной матрицы на вектор</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:%D0%A0%D1%83%D1%84%D0%B8%D0%BD%D0%B0_%D0%A2%D1%80%D0%B5%D1%82%D1%8C%D1%8F%D0%BA%D0%BE%D0%B2%D0%B0/%D0%A5%D1%80%D0%B0%D0%BD%D0%B5%D0%BD%D0%B8%D0%B5_%D0%BD%D0%B5%D0%BD%D1%83%D0%BB%D0%B5%D0%B2%D1%8B%D1%85_%D1%8D%D0%BB%D0%B5%D0%BC%D0%B5%D0%BD%D1%82%D0%BE%D0%B2_%D1%80%D0%B0%D0%B7%D1%80%D0%B5%D0%B6%D0%B5%D0%BD%D0%BD%D1%8B%D1%85_%D0%BC%D0%B0%D1%82%D1%80%D0%B8%D1%86._%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=6391"/>
		<updated>2016-10-13T11:33:03Z</updated>

		<summary type="html">&lt;p&gt;Екатерина Буторина: /* Существующие реализации алгоритма */&lt;/p&gt;
&lt;hr /&gt;
&lt;div&gt;{{algorithm&lt;br /&gt;
| name              = Умножение разреженной матрицы на вектор&lt;br /&gt;
| serial_complexity = &amp;lt;math&amp;gt;nnz&amp;lt;/math&amp;gt;&lt;br /&gt;
| pf_height         = &amp;lt;math&amp;gt;&amp;lt;/math&amp;gt;&lt;br /&gt;
| pf_width          = &amp;lt;math&amp;gt;&amp;lt;/math&amp;gt;&lt;br /&gt;
| input_data        = &amp;lt;math&amp;gt;2nnz+2n+1&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;
Авторы статьи: [[Участница:Руфина_Третьякова|Третьякова Р. М.]] (группа 603), [[Участница:Екатерина_Буторина|Буторина Е. В.]] (группа 603)&lt;br /&gt;
&lt;br /&gt;
&lt;br /&gt;
&lt;br /&gt;
== Свойства и структура алгоритма ==&lt;br /&gt;
&lt;br /&gt;
=== Общее описание алгоритма ===&lt;br /&gt;
Разрежённая матрица — это матрица с преимущественно нулевыми элементами. В противном случае, если бо́льшая часть элементов матрицы ненулевые, матрица считается плотной.&lt;br /&gt;
Среди специалистов нет единства в определении того, какое именно количество ненулевых элементов делает матрицу разрежённой. Разные авторы предлагают различные варианты. &lt;br /&gt;
Огромные разрежённые матрицы часто возникают при решении таких задач, как дифференциальное уравнение в частных производных.&lt;br /&gt;
При хранении и преобразовании разрежённых матриц в компьютере бывает полезно, а часто и необходимо, использовать специальные алгоритмы и структуры данных, которые учитывают разрежённую структуру матрицы. Операции и алгоритмы, применяемые для работы с обычными, плотными матрицами, применительно к большим разрежённым матрицам работают относительно медленно и требуют значительных объёмов памяти. Однако разрежённые матрицы могут быть легко сжаты путём записи только своих ненулевых элементов, что снижает требования к компьютерной памяти.&lt;br /&gt;
&lt;br /&gt;
=== Математическое описание алгоритма ===&lt;br /&gt;
Исходные данные:  разреженная матрица &amp;lt;math&amp;gt;M^{n*n}&amp;lt;/math&amp;gt;, вектор &amp;lt;math&amp;gt;x^{n*1}&amp;lt;/math&amp;gt; &lt;br /&gt;
&lt;br /&gt;
Наиболее удобным форматом для вычисления произведения матрицы на вектор является &amp;quot;Compressed Sparse Row&amp;quot; или сокращенно CSR-формат.&lt;br /&gt;
&lt;br /&gt;
Рассмотрим CSR-представление разреженной матрицы: пусть число ненулевых элементов матрицы равно &amp;lt;math&amp;gt;nnz&amp;lt;/math&amp;gt;&lt;br /&gt;
CSR-формат представляет матрицу &amp;lt;math&amp;gt;M&amp;lt;/math&amp;gt; в виде 3-х одномерных массивов:&lt;br /&gt;
&lt;br /&gt;
массив &amp;lt;math&amp;gt;A&amp;lt;/math&amp;gt; размера &amp;lt;math&amp;gt;nnz&amp;lt;/math&amp;gt; содержит ненулевые значения матрицы,&lt;br /&gt;
&amp;lt;math&amp;gt;JA&amp;lt;/math&amp;gt; размера &amp;lt;math&amp;gt;nnz&amp;lt;/math&amp;gt; - номера столбцов ненулевых элементов., &lt;br /&gt;
&amp;lt;math&amp;gt;IA&amp;lt;/math&amp;gt; размера &amp;lt;math&amp;gt;n&amp;lt;/math&amp;gt;- содержит номер с которого начинается описание элементов строки в массивах &amp;lt;math&amp;gt;A&amp;lt;/math&amp;gt; и &amp;lt;math&amp;gt;JA&amp;lt;/math&amp;gt;.&lt;br /&gt;
Этот формат позволяет производить перемножение матрицы &amp;lt;math&amp;gt;M&amp;lt;/math&amp;gt; на вектор &amp;lt;math&amp;gt;x&amp;lt;/math&amp;gt; за &amp;lt;math&amp;gt;O(nnz)&amp;lt;/math&amp;gt; умножений и сложений. &lt;br /&gt;
&lt;br /&gt;
Например, это разреженная матрица с 4-мя ненулевыми элементами&lt;br /&gt;
:: &amp;lt;math&amp;gt;\begin{pmatrix}&lt;br /&gt;
0 &amp;amp; 0 &amp;amp; 0 &amp;amp; 1 \\&lt;br /&gt;
2 &amp;amp; 0 &amp;amp; 0 &amp;amp; 0 \\&lt;br /&gt;
0 &amp;amp; 0 &amp;amp; 3 &amp;amp; 0 \\&lt;br /&gt;
0 &amp;amp; 4 &amp;amp; 0 &amp;amp; 0 \\&lt;br /&gt;
\end{pmatrix}&amp;lt;/math&amp;gt;,&lt;br /&gt;
 представляемая в формате CSR &lt;br /&gt;
    A  = [ 1 2 3 4 ]&lt;br /&gt;
    IA = [ 0 1 2 3 4 ]&lt;br /&gt;
    JA = [ 3 0 2 1 ]&lt;br /&gt;
&lt;br /&gt;
&lt;br /&gt;
Вычисляемые данные: вектор  &amp;lt;math&amp;gt;M*x=y&amp;lt;/math&amp;gt;&lt;br /&gt;
&lt;br /&gt;
=== Вычислительное ядро алгоритма ===&lt;br /&gt;
&lt;br /&gt;
:&amp;lt;math&amp;gt;y_i = \sum_{k = IA_i}^{IA_{i+1}} A_k x_{JA_k}&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;
    число строк матрицы &#039;&#039;n&#039;&#039;; &lt;br /&gt;
    разреженная матрица в формате CSR:&lt;br /&gt;
      строчные указатели &#039;&#039;IA&#039;&#039;,&lt;br /&gt;
      столбцовые указатели&#039;&#039;JA&#039;&#039;, &lt;br /&gt;
      ненулевые элементы &#039;&#039;A&#039;&#039;;&lt;br /&gt;
    вектор &#039;&#039;x&#039;&#039;.&lt;br /&gt;
  &#039;&#039;&#039;Выходные данные&#039;&#039;&#039;: произведение матрицы на вектор &#039;&#039;y&#039;&#039;.&lt;br /&gt;
  &#039;&#039;&#039;read CSR&#039;&#039;&#039; &#039;&#039;n&#039;&#039;, &#039;&#039;IA&#039;&#039;, &#039;&#039;JA&#039;&#039;, &#039;&#039;A&#039;&#039;;&lt;br /&gt;
  &#039;&#039;&#039;read&#039;&#039;&#039; &#039;&#039;x&#039;&#039;&lt;br /&gt;
  &#039;&#039;&#039;for&#039;&#039;&#039; &#039;&#039;i&#039;&#039; = 1,n:&lt;br /&gt;
    &#039;&#039;&#039;for&#039;&#039;&#039; &#039;&#039;k&#039;&#039; = &#039;&#039;IA(i)&#039;&#039;, &#039;&#039;IA(i+1)-1&#039;&#039;:&lt;br /&gt;
            &#039;&#039;y(i)&#039;&#039; += &#039;&#039;A(k)&#039;&#039;*&#039;&#039;x(JA(k))&#039;&#039;;&lt;br /&gt;
  &#039;&#039;&#039;write&#039;&#039;&#039; &#039;&#039;y&#039;&#039;;&lt;br /&gt;
&lt;br /&gt;
=== Схема реализации последовательного алгоритма ===&lt;br /&gt;
Метод можно описать следующим образом:&lt;br /&gt;
# привести матрицу &amp;lt;math&amp;gt;M&amp;lt;/math&amp;gt; к формату CSR&lt;br /&gt;
# для &amp;lt;math&amp;gt;i&amp;lt;/math&amp;gt; от &amp;lt;math&amp;gt;0&amp;lt;/math&amp;gt; до &amp;lt;math&amp;gt;n-1&amp;lt;/math&amp;gt; вычислить &amp;lt;math&amp;gt;y_i&amp;lt;/math&amp;gt; по формуле &amp;lt;math&amp;gt;y_i = \sum_{k = IA_i}^{IA_{i+1}} A_k x_{JA_k}&amp;lt;/math&amp;gt;&lt;br /&gt;
&lt;br /&gt;
=== Последовательная сложность алгоритма ===&lt;br /&gt;
Для вычисления матрично-векторного произведения матрицы размера &amp;lt;math&amp;gt;n*n&amp;lt;/math&amp;gt; и вектора размера n в последовательном варианте требуется:&lt;br /&gt;
&lt;br /&gt;
* &amp;lt;math&amp;gt;nnz&amp;lt;/math&amp;gt; сложений,&lt;br /&gt;
* &amp;lt;math&amp;gt;nnz&amp;lt;/math&amp;gt; умножений.&lt;br /&gt;
&lt;br /&gt;
=== Информационный граф ===&lt;br /&gt;
&lt;br /&gt;
=== Ресурс параллелизма алгоритма ===&lt;br /&gt;
&lt;br /&gt;
=== Входные и выходные данные алгоритма ===&lt;br /&gt;
 &#039;&#039;&#039;Входные данные&#039;&#039;&#039;:&lt;br /&gt;
    число строк матрицы &#039;&#039;n&#039;&#039;; &lt;br /&gt;
    разреженная матрица в формате CSR:&lt;br /&gt;
      строчные указатели &#039;&#039;IA&#039;&#039;,&lt;br /&gt;
      столбцовые указатели&#039;&#039;JA&#039;&#039;, &lt;br /&gt;
      ненулевые элементы &#039;&#039;A&#039;&#039;;&lt;br /&gt;
    вектор &#039;&#039;x&#039;&#039;.&lt;br /&gt;
  &#039;&#039;&#039;Выходные данные&#039;&#039;&#039;: произведение матрицы на вектор &#039;&#039;y&#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;
=== Локальность данных и вычислений ===&lt;br /&gt;
&lt;br /&gt;
=== Возможные способы и особенности параллельной реализации алгоритма ===&lt;br /&gt;
&lt;br /&gt;
=== Масштабируемость алгоритма и его реализации ===&lt;br /&gt;
&lt;br /&gt;
=== Динамические характеристики и эффективность реализации алгоритма ===&lt;br /&gt;
&lt;br /&gt;
=== Выводы для классов архитектур ===&lt;br /&gt;
&lt;br /&gt;
=== Существующие реализации алгоритма ===&lt;br /&gt;
&lt;br /&gt;
Последовательная реализация имеется в пакете SPARSKIT, Python.Scipy&lt;br /&gt;
Параллельный алгоритм реализован в библиотеке Matlab&lt;br /&gt;
&lt;br /&gt;
== Литература ==&lt;br /&gt;
[1] С. Писсанецки. Технология разреженных матриц. Изд. Мир, 1988.&lt;/div&gt;</summary>
		<author><name>Екатерина Буторина</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:%D0%A0%D1%83%D1%84%D0%B8%D0%BD%D0%B0_%D0%A2%D1%80%D0%B5%D1%82%D1%8C%D1%8F%D0%BA%D0%BE%D0%B2%D0%B0/%D0%A5%D1%80%D0%B0%D0%BD%D0%B5%D0%BD%D0%B8%D0%B5_%D0%BD%D0%B5%D0%BD%D1%83%D0%BB%D0%B5%D0%B2%D1%8B%D1%85_%D1%8D%D0%BB%D0%B5%D0%BC%D0%B5%D0%BD%D1%82%D0%BE%D0%B2_%D1%80%D0%B0%D0%B7%D1%80%D0%B5%D0%B6%D0%B5%D0%BD%D0%BD%D1%8B%D1%85_%D0%BC%D0%B0%D1%82%D1%80%D0%B8%D1%86._%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=6390</id>
		<title>Участник:Руфина Третьякова/Хранение ненулевых элементов разреженных матриц. Умножение разреженной матрицы на вектор</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:%D0%A0%D1%83%D1%84%D0%B8%D0%BD%D0%B0_%D0%A2%D1%80%D0%B5%D1%82%D1%8C%D1%8F%D0%BA%D0%BE%D0%B2%D0%B0/%D0%A5%D1%80%D0%B0%D0%BD%D0%B5%D0%BD%D0%B8%D0%B5_%D0%BD%D0%B5%D0%BD%D1%83%D0%BB%D0%B5%D0%B2%D1%8B%D1%85_%D1%8D%D0%BB%D0%B5%D0%BC%D0%B5%D0%BD%D1%82%D0%BE%D0%B2_%D1%80%D0%B0%D0%B7%D1%80%D0%B5%D0%B6%D0%B5%D0%BD%D0%BD%D1%8B%D1%85_%D0%BC%D0%B0%D1%82%D1%80%D0%B8%D1%86._%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=6390"/>
		<updated>2016-10-13T11:31:19Z</updated>

		<summary type="html">&lt;p&gt;Екатерина Буторина: /* Существующие реализации алгоритма */&lt;/p&gt;
&lt;hr /&gt;
&lt;div&gt;{{algorithm&lt;br /&gt;
| name              = Умножение разреженной матрицы на вектор&lt;br /&gt;
| serial_complexity = &amp;lt;math&amp;gt;nnz&amp;lt;/math&amp;gt;&lt;br /&gt;
| pf_height         = &amp;lt;math&amp;gt;&amp;lt;/math&amp;gt;&lt;br /&gt;
| pf_width          = &amp;lt;math&amp;gt;&amp;lt;/math&amp;gt;&lt;br /&gt;
| input_data        = &amp;lt;math&amp;gt;2nnz+2n+1&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;
Авторы статьи: [[Участница:Руфина_Третьякова|Третьякова Р. М.]] (группа 603), [[Участница:Екатерина_Буторина|Буторина Е. В.]] (группа 603)&lt;br /&gt;
&lt;br /&gt;
&lt;br /&gt;
&lt;br /&gt;
== Свойства и структура алгоритма ==&lt;br /&gt;
&lt;br /&gt;
=== Общее описание алгоритма ===&lt;br /&gt;
Разрежённая матрица — это матрица с преимущественно нулевыми элементами. В противном случае, если бо́льшая часть элементов матрицы ненулевые, матрица считается плотной.&lt;br /&gt;
Среди специалистов нет единства в определении того, какое именно количество ненулевых элементов делает матрицу разрежённой. Разные авторы предлагают различные варианты. &lt;br /&gt;
Огромные разрежённые матрицы часто возникают при решении таких задач, как дифференциальное уравнение в частных производных.&lt;br /&gt;
При хранении и преобразовании разрежённых матриц в компьютере бывает полезно, а часто и необходимо, использовать специальные алгоритмы и структуры данных, которые учитывают разрежённую структуру матрицы. Операции и алгоритмы, применяемые для работы с обычными, плотными матрицами, применительно к большим разрежённым матрицам работают относительно медленно и требуют значительных объёмов памяти. Однако разрежённые матрицы могут быть легко сжаты путём записи только своих ненулевых элементов, что снижает требования к компьютерной памяти.&lt;br /&gt;
&lt;br /&gt;
=== Математическое описание алгоритма ===&lt;br /&gt;
Исходные данные:  разреженная матрица &amp;lt;math&amp;gt;M^{n*n}&amp;lt;/math&amp;gt;, вектор &amp;lt;math&amp;gt;x^{n*1}&amp;lt;/math&amp;gt; &lt;br /&gt;
&lt;br /&gt;
Наиболее удобным форматом для вычисления произведения матрицы на вектор является &amp;quot;Compressed Sparse Row&amp;quot; или сокращенно CSR-формат.&lt;br /&gt;
&lt;br /&gt;
Рассмотрим CSR-представление разреженной матрицы: пусть число ненулевых элементов матрицы равно &amp;lt;math&amp;gt;nnz&amp;lt;/math&amp;gt;&lt;br /&gt;
CSR-формат представляет матрицу &amp;lt;math&amp;gt;M&amp;lt;/math&amp;gt; в виде 3-х одномерных массивов:&lt;br /&gt;
&lt;br /&gt;
массив &amp;lt;math&amp;gt;A&amp;lt;/math&amp;gt; размера &amp;lt;math&amp;gt;nnz&amp;lt;/math&amp;gt; содержит ненулевые значения матрицы,&lt;br /&gt;
&amp;lt;math&amp;gt;JA&amp;lt;/math&amp;gt; размера &amp;lt;math&amp;gt;nnz&amp;lt;/math&amp;gt; - номера столбцов ненулевых элементов., &lt;br /&gt;
&amp;lt;math&amp;gt;IA&amp;lt;/math&amp;gt; размера &amp;lt;math&amp;gt;n&amp;lt;/math&amp;gt;- содержит номер с которого начинается описание элементов строки в массивах &amp;lt;math&amp;gt;A&amp;lt;/math&amp;gt; и &amp;lt;math&amp;gt;JA&amp;lt;/math&amp;gt;.&lt;br /&gt;
Этот формат позволяет производить перемножение матрицы &amp;lt;math&amp;gt;M&amp;lt;/math&amp;gt; на вектор &amp;lt;math&amp;gt;x&amp;lt;/math&amp;gt; за &amp;lt;math&amp;gt;O(nnz)&amp;lt;/math&amp;gt; умножений и сложений. &lt;br /&gt;
&lt;br /&gt;
Например, это разреженная матрица с 4-мя ненулевыми элементами&lt;br /&gt;
:: &amp;lt;math&amp;gt;\begin{pmatrix}&lt;br /&gt;
0 &amp;amp; 0 &amp;amp; 0 &amp;amp; 1 \\&lt;br /&gt;
2 &amp;amp; 0 &amp;amp; 0 &amp;amp; 0 \\&lt;br /&gt;
0 &amp;amp; 0 &amp;amp; 3 &amp;amp; 0 \\&lt;br /&gt;
0 &amp;amp; 4 &amp;amp; 0 &amp;amp; 0 \\&lt;br /&gt;
\end{pmatrix}&amp;lt;/math&amp;gt;,&lt;br /&gt;
 представляемая в формате CSR &lt;br /&gt;
    A  = [ 1 2 3 4 ]&lt;br /&gt;
    IA = [ 0 1 2 3 4 ]&lt;br /&gt;
    JA = [ 3 0 2 1 ]&lt;br /&gt;
&lt;br /&gt;
&lt;br /&gt;
Вычисляемые данные: вектор  &amp;lt;math&amp;gt;M*x=y&amp;lt;/math&amp;gt;&lt;br /&gt;
&lt;br /&gt;
=== Вычислительное ядро алгоритма ===&lt;br /&gt;
&lt;br /&gt;
:&amp;lt;math&amp;gt;y_i = \sum_{k = IA_i}^{IA_{i+1}} A_k x_{JA_k}&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;
    число строк матрицы &#039;&#039;n&#039;&#039;; &lt;br /&gt;
    разреженная матрица в формате CSR:&lt;br /&gt;
      строчные указатели &#039;&#039;IA&#039;&#039;,&lt;br /&gt;
      столбцовые указатели&#039;&#039;JA&#039;&#039;, &lt;br /&gt;
      ненулевые элементы &#039;&#039;A&#039;&#039;;&lt;br /&gt;
    вектор &#039;&#039;x&#039;&#039;.&lt;br /&gt;
  &#039;&#039;&#039;Выходные данные&#039;&#039;&#039;: произведение матрицы на вектор &#039;&#039;y&#039;&#039;.&lt;br /&gt;
  &#039;&#039;&#039;read CSR&#039;&#039;&#039; &#039;&#039;n&#039;&#039;, &#039;&#039;IA&#039;&#039;, &#039;&#039;JA&#039;&#039;, &#039;&#039;A&#039;&#039;;&lt;br /&gt;
  &#039;&#039;&#039;read&#039;&#039;&#039; &#039;&#039;x&#039;&#039;&lt;br /&gt;
  &#039;&#039;&#039;for&#039;&#039;&#039; &#039;&#039;i&#039;&#039; = 1,n:&lt;br /&gt;
    &#039;&#039;&#039;for&#039;&#039;&#039; &#039;&#039;k&#039;&#039; = &#039;&#039;IA(i)&#039;&#039;, &#039;&#039;IA(i+1)-1&#039;&#039;:&lt;br /&gt;
            &#039;&#039;y(i)&#039;&#039; += &#039;&#039;A(k)&#039;&#039;*&#039;&#039;x(JA(k))&#039;&#039;;&lt;br /&gt;
  &#039;&#039;&#039;write&#039;&#039;&#039; &#039;&#039;y&#039;&#039;;&lt;br /&gt;
&lt;br /&gt;
=== Схема реализации последовательного алгоритма ===&lt;br /&gt;
Метод можно описать следующим образом:&lt;br /&gt;
# привести матрицу &amp;lt;math&amp;gt;M&amp;lt;/math&amp;gt; к формату CSR&lt;br /&gt;
# для &amp;lt;math&amp;gt;i&amp;lt;/math&amp;gt; от &amp;lt;math&amp;gt;0&amp;lt;/math&amp;gt; до &amp;lt;math&amp;gt;n-1&amp;lt;/math&amp;gt; вычислить &amp;lt;math&amp;gt;y_i&amp;lt;/math&amp;gt; по формуле &amp;lt;math&amp;gt;y_i = \sum_{k = IA_i}^{IA_{i+1}} A_k x_{JA_k}&amp;lt;/math&amp;gt;&lt;br /&gt;
&lt;br /&gt;
=== Последовательная сложность алгоритма ===&lt;br /&gt;
Для вычисления матрично-векторного произведения матрицы размера &amp;lt;math&amp;gt;n*n&amp;lt;/math&amp;gt; и вектора размера n в последовательном варианте требуется:&lt;br /&gt;
&lt;br /&gt;
* &amp;lt;math&amp;gt;nnz&amp;lt;/math&amp;gt; сложений,&lt;br /&gt;
* &amp;lt;math&amp;gt;nnz&amp;lt;/math&amp;gt; умножений.&lt;br /&gt;
&lt;br /&gt;
=== Информационный граф ===&lt;br /&gt;
&lt;br /&gt;
=== Ресурс параллелизма алгоритма ===&lt;br /&gt;
&lt;br /&gt;
=== Входные и выходные данные алгоритма ===&lt;br /&gt;
 &#039;&#039;&#039;Входные данные&#039;&#039;&#039;:&lt;br /&gt;
    число строк матрицы &#039;&#039;n&#039;&#039;; &lt;br /&gt;
    разреженная матрица в формате CSR:&lt;br /&gt;
      строчные указатели &#039;&#039;IA&#039;&#039;,&lt;br /&gt;
      столбцовые указатели&#039;&#039;JA&#039;&#039;, &lt;br /&gt;
      ненулевые элементы &#039;&#039;A&#039;&#039;;&lt;br /&gt;
    вектор &#039;&#039;x&#039;&#039;.&lt;br /&gt;
  &#039;&#039;&#039;Выходные данные&#039;&#039;&#039;: произведение матрицы на вектор &#039;&#039;y&#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;
=== Локальность данных и вычислений ===&lt;br /&gt;
&lt;br /&gt;
=== Возможные способы и особенности параллельной реализации алгоритма ===&lt;br /&gt;
&lt;br /&gt;
=== Масштабируемость алгоритма и его реализации ===&lt;br /&gt;
&lt;br /&gt;
=== Динамические характеристики и эффективность реализации алгоритма ===&lt;br /&gt;
&lt;br /&gt;
=== Выводы для классов архитектур ===&lt;br /&gt;
&lt;br /&gt;
=== Существующие реализации алгоритма ===&lt;br /&gt;
&lt;br /&gt;
Последовательная реализация имеется в пакете SPARSKIT, Matlab, Python.Scipy&lt;br /&gt;
&lt;br /&gt;
== Литература ==&lt;br /&gt;
[1] С. Писсанецки. Технология разреженных матриц. Изд. Мир, 1988.&lt;/div&gt;</summary>
		<author><name>Екатерина Буторина</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:%D0%A0%D1%83%D1%84%D0%B8%D0%BD%D0%B0_%D0%A2%D1%80%D0%B5%D1%82%D1%8C%D1%8F%D0%BA%D0%BE%D0%B2%D0%B0/%D0%A5%D1%80%D0%B0%D0%BD%D0%B5%D0%BD%D0%B8%D0%B5_%D0%BD%D0%B5%D0%BD%D1%83%D0%BB%D0%B5%D0%B2%D1%8B%D1%85_%D1%8D%D0%BB%D0%B5%D0%BC%D0%B5%D0%BD%D1%82%D0%BE%D0%B2_%D1%80%D0%B0%D0%B7%D1%80%D0%B5%D0%B6%D0%B5%D0%BD%D0%BD%D1%8B%D1%85_%D0%BC%D0%B0%D1%82%D1%80%D0%B8%D1%86._%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=6387</id>
		<title>Участник:Руфина Третьякова/Хранение ненулевых элементов разреженных матриц. Умножение разреженной матрицы на вектор</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:%D0%A0%D1%83%D1%84%D0%B8%D0%BD%D0%B0_%D0%A2%D1%80%D0%B5%D1%82%D1%8C%D1%8F%D0%BA%D0%BE%D0%B2%D0%B0/%D0%A5%D1%80%D0%B0%D0%BD%D0%B5%D0%BD%D0%B8%D0%B5_%D0%BD%D0%B5%D0%BD%D1%83%D0%BB%D0%B5%D0%B2%D1%8B%D1%85_%D1%8D%D0%BB%D0%B5%D0%BC%D0%B5%D0%BD%D1%82%D0%BE%D0%B2_%D1%80%D0%B0%D0%B7%D1%80%D0%B5%D0%B6%D0%B5%D0%BD%D0%BD%D1%8B%D1%85_%D0%BC%D0%B0%D1%82%D1%80%D0%B8%D1%86._%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=6387"/>
		<updated>2016-10-13T11:25:59Z</updated>

		<summary type="html">&lt;p&gt;Екатерина Буторина: /* Существующие реализации алгоритма */&lt;/p&gt;
&lt;hr /&gt;
&lt;div&gt;{{algorithm&lt;br /&gt;
| name              = Умножение разреженной матрицы на вектор&lt;br /&gt;
| serial_complexity = &amp;lt;math&amp;gt;nnz&amp;lt;/math&amp;gt;&lt;br /&gt;
| pf_height         = &amp;lt;math&amp;gt;&amp;lt;/math&amp;gt;&lt;br /&gt;
| pf_width          = &amp;lt;math&amp;gt;&amp;lt;/math&amp;gt;&lt;br /&gt;
| input_data        = &amp;lt;math&amp;gt;2nnz+2n+1&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;
Авторы статьи: [[Участница:Руфина_Третьякова|Третьякова Р. М.]] (группа 603), [[Участница:Екатерина_Буторина|Буторина Е. В.]] (группа 603)&lt;br /&gt;
&lt;br /&gt;
&lt;br /&gt;
&lt;br /&gt;
== Свойства и структура алгоритма ==&lt;br /&gt;
&lt;br /&gt;
=== Общее описание алгоритма ===&lt;br /&gt;
Разрежённая матрица — это матрица с преимущественно нулевыми элементами. В противном случае, если бо́льшая часть элементов матрицы ненулевые, матрица считается плотной.&lt;br /&gt;
Среди специалистов нет единства в определении того, какое именно количество ненулевых элементов делает матрицу разрежённой. Разные авторы предлагают различные варианты. &lt;br /&gt;
Огромные разрежённые матрицы часто возникают при решении таких задач, как дифференциальное уравнение в частных производных.&lt;br /&gt;
При хранении и преобразовании разрежённых матриц в компьютере бывает полезно, а часто и необходимо, использовать специальные алгоритмы и структуры данных, которые учитывают разрежённую структуру матрицы. Операции и алгоритмы, применяемые для работы с обычными, плотными матрицами, применительно к большим разрежённым матрицам работают относительно медленно и требуют значительных объёмов памяти. Однако разрежённые матрицы могут быть легко сжаты путём записи только своих ненулевых элементов, что снижает требования к компьютерной памяти.&lt;br /&gt;
&lt;br /&gt;
=== Математическое описание алгоритма ===&lt;br /&gt;
Исходные данные:  разреженная матрица &amp;lt;math&amp;gt;M^{n*n}&amp;lt;/math&amp;gt;, вектор &amp;lt;math&amp;gt;x^{n*1}&amp;lt;/math&amp;gt; &lt;br /&gt;
&lt;br /&gt;
Наиболее удобным форматом для вычисления произведения матрицы на вектор является &amp;quot;Compressed Sparse Row&amp;quot; или сокращенно CSR-формат.&lt;br /&gt;
&lt;br /&gt;
Рассмотрим CSR-представление разреженной матрицы: пусть число ненулевых элементов матрицы равно &amp;lt;math&amp;gt;nnz&amp;lt;/math&amp;gt;&lt;br /&gt;
CSR-формат представляет матрицу &amp;lt;math&amp;gt;M&amp;lt;/math&amp;gt; в виде 3-х одномерных массивов:&lt;br /&gt;
&lt;br /&gt;
массив &amp;lt;math&amp;gt;A&amp;lt;/math&amp;gt; размера &amp;lt;math&amp;gt;nnz&amp;lt;/math&amp;gt; содержит ненулевые значения матрицы,&lt;br /&gt;
&amp;lt;math&amp;gt;JA&amp;lt;/math&amp;gt; размера &amp;lt;math&amp;gt;nnz&amp;lt;/math&amp;gt; - номера столбцов ненулевых элементов., &lt;br /&gt;
&amp;lt;math&amp;gt;IA&amp;lt;/math&amp;gt; размера &amp;lt;math&amp;gt;n&amp;lt;/math&amp;gt;- содержит номер с которого начинается описание элементов строки в массивах &amp;lt;math&amp;gt;A&amp;lt;/math&amp;gt; и &amp;lt;math&amp;gt;JA&amp;lt;/math&amp;gt;.&lt;br /&gt;
Этот формат позволяет производить перемножение матрицы &amp;lt;math&amp;gt;M&amp;lt;/math&amp;gt; на вектор &amp;lt;math&amp;gt;x&amp;lt;/math&amp;gt; за &amp;lt;math&amp;gt;O(nnz)&amp;lt;/math&amp;gt; умножений и сложений. &lt;br /&gt;
&lt;br /&gt;
Например, это разреженная матрица с 4-мя ненулевыми элементами&lt;br /&gt;
:: &amp;lt;math&amp;gt;\begin{pmatrix}&lt;br /&gt;
0 &amp;amp; 0 &amp;amp; 0 &amp;amp; 1 \\&lt;br /&gt;
2 &amp;amp; 0 &amp;amp; 0 &amp;amp; 0 \\&lt;br /&gt;
0 &amp;amp; 0 &amp;amp; 3 &amp;amp; 0 \\&lt;br /&gt;
0 &amp;amp; 4 &amp;amp; 0 &amp;amp; 0 \\&lt;br /&gt;
\end{pmatrix}&amp;lt;/math&amp;gt;,&lt;br /&gt;
 представляемая в формате CSR &lt;br /&gt;
    A  = [ 1 2 3 4 ]&lt;br /&gt;
    IA = [ 0 1 2 3 4 ]&lt;br /&gt;
    JA = [ 3 0 2 1 ]&lt;br /&gt;
&lt;br /&gt;
&lt;br /&gt;
Вычисляемые данные: вектор  &amp;lt;math&amp;gt;M*x=y&amp;lt;/math&amp;gt;&lt;br /&gt;
&lt;br /&gt;
=== Вычислительное ядро алгоритма ===&lt;br /&gt;
&lt;br /&gt;
:&amp;lt;math&amp;gt;y_i = \sum_{k = IA_i}^{IA_{i+1}} A_k x_{JA_k}&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;
    число строк матрицы &#039;&#039;n&#039;&#039;; &lt;br /&gt;
    разреженная матрица в формате CSR:&lt;br /&gt;
      строчные указатели &#039;&#039;IA&#039;&#039;,&lt;br /&gt;
      столбцовые указатели&#039;&#039;JA&#039;&#039;, &lt;br /&gt;
      ненулевые элементы &#039;&#039;A&#039;&#039;;&lt;br /&gt;
    вектор &#039;&#039;x&#039;&#039;.&lt;br /&gt;
  &#039;&#039;&#039;Выходные данные&#039;&#039;&#039;: произведение матрицы на вектор &#039;&#039;y&#039;&#039;.&lt;br /&gt;
  &#039;&#039;&#039;read CSR&#039;&#039;&#039; &#039;&#039;n&#039;&#039;, &#039;&#039;IA&#039;&#039;, &#039;&#039;JA&#039;&#039;, &#039;&#039;A&#039;&#039;;&lt;br /&gt;
  &#039;&#039;&#039;read&#039;&#039;&#039; &#039;&#039;x&#039;&#039;&lt;br /&gt;
  &#039;&#039;&#039;for&#039;&#039;&#039; &#039;&#039;i&#039;&#039; = 1,n:&lt;br /&gt;
    &#039;&#039;&#039;for&#039;&#039;&#039; &#039;&#039;k&#039;&#039; = &#039;&#039;IA(i)&#039;&#039;, &#039;&#039;IA(i+1)-1&#039;&#039;:&lt;br /&gt;
            &#039;&#039;y(i)&#039;&#039; += &#039;&#039;A(k)&#039;&#039;*&#039;&#039;x(JA(k))&#039;&#039;;&lt;br /&gt;
  &#039;&#039;&#039;write&#039;&#039;&#039; &#039;&#039;y&#039;&#039;;&lt;br /&gt;
&lt;br /&gt;
=== Схема реализации последовательного алгоритма ===&lt;br /&gt;
Метод можно описать следующим образом:&lt;br /&gt;
# привести матрицу &amp;lt;math&amp;gt;M&amp;lt;/math&amp;gt; к формату CSR&lt;br /&gt;
# для &amp;lt;math&amp;gt;i&amp;lt;/math&amp;gt; от &amp;lt;math&amp;gt;0&amp;lt;/math&amp;gt; до &amp;lt;math&amp;gt;n-1&amp;lt;/math&amp;gt; вычислить &amp;lt;math&amp;gt;y_i&amp;lt;/math&amp;gt; по формуле &amp;lt;math&amp;gt;y_i = \sum_{k = IA_i}^{IA_{i+1}} A_k x_{JA_k}&amp;lt;/math&amp;gt;&lt;br /&gt;
&lt;br /&gt;
=== Последовательная сложность алгоритма ===&lt;br /&gt;
Для вычисления матрично-векторного произведения матрицы размера &amp;lt;math&amp;gt;n*n&amp;lt;/math&amp;gt; и вектора размера n в последовательном варианте требуется:&lt;br /&gt;
&lt;br /&gt;
* &amp;lt;math&amp;gt;nnz&amp;lt;/math&amp;gt; сложений,&lt;br /&gt;
* &amp;lt;math&amp;gt;nnz&amp;lt;/math&amp;gt; умножений.&lt;br /&gt;
&lt;br /&gt;
=== Информационный граф ===&lt;br /&gt;
&lt;br /&gt;
=== Ресурс параллелизма алгоритма ===&lt;br /&gt;
&lt;br /&gt;
=== Входные и выходные данные алгоритма ===&lt;br /&gt;
 &#039;&#039;&#039;Входные данные&#039;&#039;&#039;:&lt;br /&gt;
    число строк матрицы &#039;&#039;n&#039;&#039;; &lt;br /&gt;
    разреженная матрица в формате CSR:&lt;br /&gt;
      строчные указатели &#039;&#039;IA&#039;&#039;,&lt;br /&gt;
      столбцовые указатели&#039;&#039;JA&#039;&#039;, &lt;br /&gt;
      ненулевые элементы &#039;&#039;A&#039;&#039;;&lt;br /&gt;
    вектор &#039;&#039;x&#039;&#039;.&lt;br /&gt;
  &#039;&#039;&#039;Выходные данные&#039;&#039;&#039;: произведение матрицы на вектор &#039;&#039;y&#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;
=== Локальность данных и вычислений ===&lt;br /&gt;
&lt;br /&gt;
=== Возможные способы и особенности параллельной реализации алгоритма ===&lt;br /&gt;
&lt;br /&gt;
=== Масштабируемость алгоритма и его реализации ===&lt;br /&gt;
&lt;br /&gt;
=== Динамические характеристики и эффективность реализации алгоритма ===&lt;br /&gt;
&lt;br /&gt;
=== Выводы для классов архитектур ===&lt;br /&gt;
&lt;br /&gt;
=== Существующие реализации алгоритма ===&lt;br /&gt;
&lt;br /&gt;
Последовательная реализация имеется в пакете SPARSKIT, ScaLAPACK, Matlab, Python.Scipy&lt;br /&gt;
&lt;br /&gt;
== Литература ==&lt;br /&gt;
[1] С. Писсанецки. Технология разреженных матриц. Изд. Мир, 1988.&lt;/div&gt;</summary>
		<author><name>Екатерина Буторина</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:%D0%A0%D1%83%D1%84%D0%B8%D0%BD%D0%B0_%D0%A2%D1%80%D0%B5%D1%82%D1%8C%D1%8F%D0%BA%D0%BE%D0%B2%D0%B0/%D0%A5%D1%80%D0%B0%D0%BD%D0%B5%D0%BD%D0%B8%D0%B5_%D0%BD%D0%B5%D0%BD%D1%83%D0%BB%D0%B5%D0%B2%D1%8B%D1%85_%D1%8D%D0%BB%D0%B5%D0%BC%D0%B5%D0%BD%D1%82%D0%BE%D0%B2_%D1%80%D0%B0%D0%B7%D1%80%D0%B5%D0%B6%D0%B5%D0%BD%D0%BD%D1%8B%D1%85_%D0%BC%D0%B0%D1%82%D1%80%D0%B8%D1%86._%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=6379</id>
		<title>Участник:Руфина Третьякова/Хранение ненулевых элементов разреженных матриц. Умножение разреженной матрицы на вектор</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:%D0%A0%D1%83%D1%84%D0%B8%D0%BD%D0%B0_%D0%A2%D1%80%D0%B5%D1%82%D1%8C%D1%8F%D0%BA%D0%BE%D0%B2%D0%B0/%D0%A5%D1%80%D0%B0%D0%BD%D0%B5%D0%BD%D0%B8%D0%B5_%D0%BD%D0%B5%D0%BD%D1%83%D0%BB%D0%B5%D0%B2%D1%8B%D1%85_%D1%8D%D0%BB%D0%B5%D0%BC%D0%B5%D0%BD%D1%82%D0%BE%D0%B2_%D1%80%D0%B0%D0%B7%D1%80%D0%B5%D0%B6%D0%B5%D0%BD%D0%BD%D1%8B%D1%85_%D0%BC%D0%B0%D1%82%D1%80%D0%B8%D1%86._%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=6379"/>
		<updated>2016-10-13T11:12:35Z</updated>

		<summary type="html">&lt;p&gt;Екатерина Буторина: /* Входные и выходные данные алгоритма */&lt;/p&gt;
&lt;hr /&gt;
&lt;div&gt;{{algorithm&lt;br /&gt;
| name              = Умножение разреженной матрицы на вектор&lt;br /&gt;
| serial_complexity = &amp;lt;math&amp;gt;nnz&amp;lt;/math&amp;gt;&lt;br /&gt;
| pf_height         = &amp;lt;math&amp;gt;&amp;lt;/math&amp;gt;&lt;br /&gt;
| pf_width          = &amp;lt;math&amp;gt;&amp;lt;/math&amp;gt;&lt;br /&gt;
| input_data        = &amp;lt;math&amp;gt;2nnz+2n+1&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;
Авторы статьи: [[Участница:Руфина_Третьякова|Третьякова Р. М.]] (группа 603), [[Участница:Екатерина_Буторина|Буторина Е. В.]] (группа 603)&lt;br /&gt;
&lt;br /&gt;
&lt;br /&gt;
&lt;br /&gt;
== Свойства и структура алгоритма ==&lt;br /&gt;
&lt;br /&gt;
=== Общее описание алгоритма ===&lt;br /&gt;
Разрежённая матрица — это матрица с преимущественно нулевыми элементами. В противном случае, если бо́льшая часть элементов матрицы ненулевые, матрица считается плотной.&lt;br /&gt;
Среди специалистов нет единства в определении того, какое именно количество ненулевых элементов делает матрицу разрежённой. Разные авторы предлагают различные варианты. &lt;br /&gt;
Огромные разрежённые матрицы часто возникают при решении таких задач, как дифференциальное уравнение в частных производных.&lt;br /&gt;
При хранении и преобразовании разрежённых матриц в компьютере бывает полезно, а часто и необходимо, использовать специальные алгоритмы и структуры данных, которые учитывают разрежённую структуру матрицы. Операции и алгоритмы, применяемые для работы с обычными, плотными матрицами, применительно к большим разрежённым матрицам работают относительно медленно и требуют значительных объёмов памяти. Однако разрежённые матрицы могут быть легко сжаты путём записи только своих ненулевых элементов, что снижает требования к компьютерной памяти.&lt;br /&gt;
&lt;br /&gt;
=== Математическое описание алгоритма ===&lt;br /&gt;
Исходные данные:  разреженная матрица &amp;lt;math&amp;gt;M^{n*n}&amp;lt;/math&amp;gt;, вектор &amp;lt;math&amp;gt;x^{n*1}&amp;lt;/math&amp;gt; &lt;br /&gt;
&lt;br /&gt;
Наиболее удобным форматом для вычисления произведения матрицы на вектор является &amp;quot;Compressed Sparse Row&amp;quot; или сокращенно CSR-формат.&lt;br /&gt;
&lt;br /&gt;
Рассмотрим CSR-представление разреженной матрицы: пусть число ненулевых элементов матрицы равно &amp;lt;math&amp;gt;nnz&amp;lt;/math&amp;gt;&lt;br /&gt;
CSR-формат представляет матрицу &amp;lt;math&amp;gt;M&amp;lt;/math&amp;gt; в виде 3-х одномерных массивов:&lt;br /&gt;
&lt;br /&gt;
массив &amp;lt;math&amp;gt;A&amp;lt;/math&amp;gt; размера &amp;lt;math&amp;gt;nnz&amp;lt;/math&amp;gt; содержит ненулевые значения матрицы,&lt;br /&gt;
&amp;lt;math&amp;gt;JA&amp;lt;/math&amp;gt; размера &amp;lt;math&amp;gt;nnz&amp;lt;/math&amp;gt; - номера столбцов ненулевых элементов., &lt;br /&gt;
&amp;lt;math&amp;gt;IA&amp;lt;/math&amp;gt; размера &amp;lt;math&amp;gt;n&amp;lt;/math&amp;gt;- содержит номер с которого начинается описание элементов строки в массивах &amp;lt;math&amp;gt;A&amp;lt;/math&amp;gt; и &amp;lt;math&amp;gt;JA&amp;lt;/math&amp;gt;.&lt;br /&gt;
Этот формат позволяет производить перемножение матрицы &amp;lt;math&amp;gt;M&amp;lt;/math&amp;gt; на вектор &amp;lt;math&amp;gt;x&amp;lt;/math&amp;gt; за &amp;lt;math&amp;gt;O(nnz)&amp;lt;/math&amp;gt; умножений и сложений. &lt;br /&gt;
&lt;br /&gt;
Например, это разреженная матрица с 4-мя ненулевыми элементами&lt;br /&gt;
:: &amp;lt;math&amp;gt;\begin{pmatrix}&lt;br /&gt;
0 &amp;amp; 0 &amp;amp; 0 &amp;amp; 1 \\&lt;br /&gt;
2 &amp;amp; 0 &amp;amp; 0 &amp;amp; 0 \\&lt;br /&gt;
0 &amp;amp; 0 &amp;amp; 3 &amp;amp; 0 \\&lt;br /&gt;
0 &amp;amp; 4 &amp;amp; 0 &amp;amp; 0 \\&lt;br /&gt;
\end{pmatrix}&amp;lt;/math&amp;gt;,&lt;br /&gt;
 представляемая в формате CSR &lt;br /&gt;
    A  = [ 1 2 3 4 ]&lt;br /&gt;
    IA = [ 0 1 2 3 4 ]&lt;br /&gt;
    JA = [ 3 0 2 1 ]&lt;br /&gt;
&lt;br /&gt;
&lt;br /&gt;
Вычисляемые данные: вектор  &amp;lt;math&amp;gt;M*x=y&amp;lt;/math&amp;gt;&lt;br /&gt;
&lt;br /&gt;
=== Вычислительное ядро алгоритма ===&lt;br /&gt;
&lt;br /&gt;
:&amp;lt;math&amp;gt;y_i = \sum_{k = IA_i}^{IA_{i+1}} A_k x_{JA_k}&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;
    число строк матрицы &#039;&#039;n&#039;&#039;; &lt;br /&gt;
    разреженная матрица в формате CSR:&lt;br /&gt;
      строчные указатели &#039;&#039;IA&#039;&#039;,&lt;br /&gt;
      столбцовые указатели&#039;&#039;JA&#039;&#039;, &lt;br /&gt;
      ненулевые элементы &#039;&#039;A&#039;&#039;;&lt;br /&gt;
    вектор &#039;&#039;x&#039;&#039;.&lt;br /&gt;
  &#039;&#039;&#039;Выходные данные&#039;&#039;&#039;: произведение матрицы на вектор &#039;&#039;y&#039;&#039;.&lt;br /&gt;
  &#039;&#039;&#039;read CSR&#039;&#039;&#039; &#039;&#039;n&#039;&#039;, &#039;&#039;IA&#039;&#039;, &#039;&#039;JA&#039;&#039;, &#039;&#039;A&#039;&#039;;&lt;br /&gt;
  &#039;&#039;&#039;read&#039;&#039;&#039; &#039;&#039;x&#039;&#039;&lt;br /&gt;
  &#039;&#039;&#039;for&#039;&#039;&#039; &#039;&#039;i&#039;&#039; = 1,n:&lt;br /&gt;
    &#039;&#039;&#039;for&#039;&#039;&#039; &#039;&#039;k&#039;&#039; = &#039;&#039;IA(i)&#039;&#039;, &#039;&#039;IA(i+1)-1&#039;&#039;:&lt;br /&gt;
            &#039;&#039;y(i)&#039;&#039; += &#039;&#039;A(k)&#039;&#039;*&#039;&#039;x(JA(k))&#039;&#039;;&lt;br /&gt;
  &#039;&#039;&#039;write&#039;&#039;&#039; &#039;&#039;y&#039;&#039;;&lt;br /&gt;
&lt;br /&gt;
=== Схема реализации последовательного алгоритма ===&lt;br /&gt;
Метод можно описать следующим образом:&lt;br /&gt;
# привести матрицу &amp;lt;math&amp;gt;M&amp;lt;/math&amp;gt; к формату CSR&lt;br /&gt;
# для &amp;lt;math&amp;gt;i&amp;lt;/math&amp;gt; от &amp;lt;math&amp;gt;0&amp;lt;/math&amp;gt; до &amp;lt;math&amp;gt;n-1&amp;lt;/math&amp;gt; вычислить &amp;lt;math&amp;gt;y_i&amp;lt;/math&amp;gt; по формуле &amp;lt;math&amp;gt;y_i = \sum_{k = IA_i}^{IA_{i+1}} A_k x_{JA_k}&amp;lt;/math&amp;gt;&lt;br /&gt;
&lt;br /&gt;
=== Последовательная сложность алгоритма ===&lt;br /&gt;
Для вычисления матрично-векторного произведения матрицы размера &amp;lt;math&amp;gt;n*n&amp;lt;/math&amp;gt; и вектора размера n в последовательном варианте требуется:&lt;br /&gt;
&lt;br /&gt;
* &amp;lt;math&amp;gt;nnz&amp;lt;/math&amp;gt; сложений,&lt;br /&gt;
* &amp;lt;math&amp;gt;nnz&amp;lt;/math&amp;gt; умножений.&lt;br /&gt;
&lt;br /&gt;
=== Информационный граф ===&lt;br /&gt;
&lt;br /&gt;
=== Ресурс параллелизма алгоритма ===&lt;br /&gt;
&lt;br /&gt;
=== Входные и выходные данные алгоритма ===&lt;br /&gt;
 &#039;&#039;&#039;Входные данные&#039;&#039;&#039;:&lt;br /&gt;
    число строк матрицы &#039;&#039;n&#039;&#039;; &lt;br /&gt;
    разреженная матрица в формате CSR:&lt;br /&gt;
      строчные указатели &#039;&#039;IA&#039;&#039;,&lt;br /&gt;
      столбцовые указатели&#039;&#039;JA&#039;&#039;, &lt;br /&gt;
      ненулевые элементы &#039;&#039;A&#039;&#039;;&lt;br /&gt;
    вектор &#039;&#039;x&#039;&#039;.&lt;br /&gt;
  &#039;&#039;&#039;Выходные данные&#039;&#039;&#039;: произведение матрицы на вектор &#039;&#039;y&#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;
=== Локальность данных и вычислений ===&lt;br /&gt;
&lt;br /&gt;
=== Возможные способы и особенности параллельной реализации алгоритма ===&lt;br /&gt;
&lt;br /&gt;
=== Масштабируемость алгоритма и его реализации ===&lt;br /&gt;
&lt;br /&gt;
=== Динамические характеристики и эффективность реализации алгоритма ===&lt;br /&gt;
&lt;br /&gt;
=== Выводы для классов архитектур ===&lt;br /&gt;
&lt;br /&gt;
=== Существующие реализации алгоритма ===&lt;br /&gt;
&lt;br /&gt;
Последовательная реализация имеется в пакете SPARSKIT&lt;br /&gt;
&lt;br /&gt;
== Литература ==&lt;br /&gt;
[1] С. Писсанецки. Технология разреженных матриц. Изд. Мир, 1988.&lt;/div&gt;</summary>
		<author><name>Екатерина Буторина</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:%D0%A0%D1%83%D1%84%D0%B8%D0%BD%D0%B0_%D0%A2%D1%80%D0%B5%D1%82%D1%8C%D1%8F%D0%BA%D0%BE%D0%B2%D0%B0/%D0%A5%D1%80%D0%B0%D0%BD%D0%B5%D0%BD%D0%B8%D0%B5_%D0%BD%D0%B5%D0%BD%D1%83%D0%BB%D0%B5%D0%B2%D1%8B%D1%85_%D1%8D%D0%BB%D0%B5%D0%BC%D0%B5%D0%BD%D1%82%D0%BE%D0%B2_%D1%80%D0%B0%D0%B7%D1%80%D0%B5%D0%B6%D0%B5%D0%BD%D0%BD%D1%8B%D1%85_%D0%BC%D0%B0%D1%82%D1%80%D0%B8%D1%86._%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=6378</id>
		<title>Участник:Руфина Третьякова/Хранение ненулевых элементов разреженных матриц. Умножение разреженной матрицы на вектор</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:%D0%A0%D1%83%D1%84%D0%B8%D0%BD%D0%B0_%D0%A2%D1%80%D0%B5%D1%82%D1%8C%D1%8F%D0%BA%D0%BE%D0%B2%D0%B0/%D0%A5%D1%80%D0%B0%D0%BD%D0%B5%D0%BD%D0%B8%D0%B5_%D0%BD%D0%B5%D0%BD%D1%83%D0%BB%D0%B5%D0%B2%D1%8B%D1%85_%D1%8D%D0%BB%D0%B5%D0%BC%D0%B5%D0%BD%D1%82%D0%BE%D0%B2_%D1%80%D0%B0%D0%B7%D1%80%D0%B5%D0%B6%D0%B5%D0%BD%D0%BD%D1%8B%D1%85_%D0%BC%D0%B0%D1%82%D1%80%D0%B8%D1%86._%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=6378"/>
		<updated>2016-10-13T11:09:40Z</updated>

		<summary type="html">&lt;p&gt;Екатерина Буторина: &lt;/p&gt;
&lt;hr /&gt;
&lt;div&gt;{{algorithm&lt;br /&gt;
| name              = Умножение разреженной матрицы на вектор&lt;br /&gt;
| serial_complexity = &amp;lt;math&amp;gt;nnz&amp;lt;/math&amp;gt;&lt;br /&gt;
| pf_height         = &amp;lt;math&amp;gt;&amp;lt;/math&amp;gt;&lt;br /&gt;
| pf_width          = &amp;lt;math&amp;gt;&amp;lt;/math&amp;gt;&lt;br /&gt;
| input_data        = &amp;lt;math&amp;gt;2nnz+2n+1&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;
Авторы статьи: [[Участница:Руфина_Третьякова|Третьякова Р. М.]] (группа 603), [[Участница:Екатерина_Буторина|Буторина Е. В.]] (группа 603)&lt;br /&gt;
&lt;br /&gt;
&lt;br /&gt;
&lt;br /&gt;
== Свойства и структура алгоритма ==&lt;br /&gt;
&lt;br /&gt;
=== Общее описание алгоритма ===&lt;br /&gt;
Разрежённая матрица — это матрица с преимущественно нулевыми элементами. В противном случае, если бо́льшая часть элементов матрицы ненулевые, матрица считается плотной.&lt;br /&gt;
Среди специалистов нет единства в определении того, какое именно количество ненулевых элементов делает матрицу разрежённой. Разные авторы предлагают различные варианты. &lt;br /&gt;
Огромные разрежённые матрицы часто возникают при решении таких задач, как дифференциальное уравнение в частных производных.&lt;br /&gt;
При хранении и преобразовании разрежённых матриц в компьютере бывает полезно, а часто и необходимо, использовать специальные алгоритмы и структуры данных, которые учитывают разрежённую структуру матрицы. Операции и алгоритмы, применяемые для работы с обычными, плотными матрицами, применительно к большим разрежённым матрицам работают относительно медленно и требуют значительных объёмов памяти. Однако разрежённые матрицы могут быть легко сжаты путём записи только своих ненулевых элементов, что снижает требования к компьютерной памяти.&lt;br /&gt;
&lt;br /&gt;
=== Математическое описание алгоритма ===&lt;br /&gt;
Исходные данные:  разреженная матрица &amp;lt;math&amp;gt;M^{n*n}&amp;lt;/math&amp;gt;, вектор &amp;lt;math&amp;gt;x^{n*1}&amp;lt;/math&amp;gt; &lt;br /&gt;
&lt;br /&gt;
Наиболее удобным форматом для вычисления произведения матрицы на вектор является &amp;quot;Compressed Sparse Row&amp;quot; или сокращенно CSR-формат.&lt;br /&gt;
&lt;br /&gt;
Рассмотрим CSR-представление разреженной матрицы: пусть число ненулевых элементов матрицы равно &amp;lt;math&amp;gt;nnz&amp;lt;/math&amp;gt;&lt;br /&gt;
CSR-формат представляет матрицу &amp;lt;math&amp;gt;M&amp;lt;/math&amp;gt; в виде 3-х одномерных массивов:&lt;br /&gt;
&lt;br /&gt;
массив &amp;lt;math&amp;gt;A&amp;lt;/math&amp;gt; размера &amp;lt;math&amp;gt;nnz&amp;lt;/math&amp;gt; содержит ненулевые значения матрицы,&lt;br /&gt;
&amp;lt;math&amp;gt;JA&amp;lt;/math&amp;gt; размера &amp;lt;math&amp;gt;nnz&amp;lt;/math&amp;gt; - номера столбцов ненулевых элементов., &lt;br /&gt;
&amp;lt;math&amp;gt;IA&amp;lt;/math&amp;gt; размера &amp;lt;math&amp;gt;n&amp;lt;/math&amp;gt;- содержит номер с которого начинается описание элементов строки в массивах &amp;lt;math&amp;gt;A&amp;lt;/math&amp;gt; и &amp;lt;math&amp;gt;JA&amp;lt;/math&amp;gt;.&lt;br /&gt;
Этот формат позволяет производить перемножение матрицы &amp;lt;math&amp;gt;M&amp;lt;/math&amp;gt; на вектор &amp;lt;math&amp;gt;x&amp;lt;/math&amp;gt; за &amp;lt;math&amp;gt;O(nnz)&amp;lt;/math&amp;gt; умножений и сложений. &lt;br /&gt;
&lt;br /&gt;
Например, это разреженная матрица с 4-мя ненулевыми элементами&lt;br /&gt;
:: &amp;lt;math&amp;gt;\begin{pmatrix}&lt;br /&gt;
0 &amp;amp; 0 &amp;amp; 0 &amp;amp; 1 \\&lt;br /&gt;
2 &amp;amp; 0 &amp;amp; 0 &amp;amp; 0 \\&lt;br /&gt;
0 &amp;amp; 0 &amp;amp; 3 &amp;amp; 0 \\&lt;br /&gt;
0 &amp;amp; 4 &amp;amp; 0 &amp;amp; 0 \\&lt;br /&gt;
\end{pmatrix}&amp;lt;/math&amp;gt;,&lt;br /&gt;
 представляемая в формате CSR &lt;br /&gt;
    A  = [ 1 2 3 4 ]&lt;br /&gt;
    IA = [ 0 1 2 3 4 ]&lt;br /&gt;
    JA = [ 3 0 2 1 ]&lt;br /&gt;
&lt;br /&gt;
&lt;br /&gt;
Вычисляемые данные: вектор  &amp;lt;math&amp;gt;M*x=y&amp;lt;/math&amp;gt;&lt;br /&gt;
&lt;br /&gt;
=== Вычислительное ядро алгоритма ===&lt;br /&gt;
&lt;br /&gt;
:&amp;lt;math&amp;gt;y_i = \sum_{k = IA_i}^{IA_{i+1}} A_k x_{JA_k}&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;
    число строк матрицы &#039;&#039;n&#039;&#039;; &lt;br /&gt;
    разреженная матрица в формате CSR:&lt;br /&gt;
      строчные указатели &#039;&#039;IA&#039;&#039;,&lt;br /&gt;
      столбцовые указатели&#039;&#039;JA&#039;&#039;, &lt;br /&gt;
      ненулевые элементы &#039;&#039;A&#039;&#039;;&lt;br /&gt;
    вектор &#039;&#039;x&#039;&#039;.&lt;br /&gt;
  &#039;&#039;&#039;Выходные данные&#039;&#039;&#039;: произведение матрицы на вектор &#039;&#039;y&#039;&#039;.&lt;br /&gt;
  &#039;&#039;&#039;read CSR&#039;&#039;&#039; &#039;&#039;n&#039;&#039;, &#039;&#039;IA&#039;&#039;, &#039;&#039;JA&#039;&#039;, &#039;&#039;A&#039;&#039;;&lt;br /&gt;
  &#039;&#039;&#039;read&#039;&#039;&#039; &#039;&#039;x&#039;&#039;&lt;br /&gt;
  &#039;&#039;&#039;for&#039;&#039;&#039; &#039;&#039;i&#039;&#039; = 1,n:&lt;br /&gt;
    &#039;&#039;&#039;for&#039;&#039;&#039; &#039;&#039;k&#039;&#039; = &#039;&#039;IA(i)&#039;&#039;, &#039;&#039;IA(i+1)-1&#039;&#039;:&lt;br /&gt;
            &#039;&#039;y(i)&#039;&#039; += &#039;&#039;A(k)&#039;&#039;*&#039;&#039;x(JA(k))&#039;&#039;;&lt;br /&gt;
  &#039;&#039;&#039;write&#039;&#039;&#039; &#039;&#039;y&#039;&#039;;&lt;br /&gt;
&lt;br /&gt;
=== Схема реализации последовательного алгоритма ===&lt;br /&gt;
Метод можно описать следующим образом:&lt;br /&gt;
# привести матрицу &amp;lt;math&amp;gt;M&amp;lt;/math&amp;gt; к формату CSR&lt;br /&gt;
# для &amp;lt;math&amp;gt;i&amp;lt;/math&amp;gt; от &amp;lt;math&amp;gt;0&amp;lt;/math&amp;gt; до &amp;lt;math&amp;gt;n-1&amp;lt;/math&amp;gt; вычислить &amp;lt;math&amp;gt;y_i&amp;lt;/math&amp;gt; по формуле &amp;lt;math&amp;gt;y_i = \sum_{k = IA_i}^{IA_{i+1}} A_k x_{JA_k}&amp;lt;/math&amp;gt;&lt;br /&gt;
&lt;br /&gt;
=== Последовательная сложность алгоритма ===&lt;br /&gt;
Для вычисления матрично-векторного произведения матрицы размера &amp;lt;math&amp;gt;n*n&amp;lt;/math&amp;gt; и вектора размера n в последовательном варианте требуется:&lt;br /&gt;
&lt;br /&gt;
* &amp;lt;math&amp;gt;nnz&amp;lt;/math&amp;gt; сложений,&lt;br /&gt;
* &amp;lt;math&amp;gt;nnz&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;
Последовательная реализация имеется в пакете SPARSKIT&lt;br /&gt;
&lt;br /&gt;
== Литература ==&lt;br /&gt;
[1] С. Писсанецки. Технология разреженных матриц. Изд. Мир, 1988.&lt;/div&gt;</summary>
		<author><name>Екатерина Буторина</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:%D0%A0%D1%83%D1%84%D0%B8%D0%BD%D0%B0_%D0%A2%D1%80%D0%B5%D1%82%D1%8C%D1%8F%D0%BA%D0%BE%D0%B2%D0%B0/%D0%A5%D1%80%D0%B0%D0%BD%D0%B5%D0%BD%D0%B8%D0%B5_%D0%BD%D0%B5%D0%BD%D1%83%D0%BB%D0%B5%D0%B2%D1%8B%D1%85_%D1%8D%D0%BB%D0%B5%D0%BC%D0%B5%D0%BD%D1%82%D0%BE%D0%B2_%D1%80%D0%B0%D0%B7%D1%80%D0%B5%D0%B6%D0%B5%D0%BD%D0%BD%D1%8B%D1%85_%D0%BC%D0%B0%D1%82%D1%80%D0%B8%D1%86._%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=6377</id>
		<title>Участник:Руфина Третьякова/Хранение ненулевых элементов разреженных матриц. Умножение разреженной матрицы на вектор</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:%D0%A0%D1%83%D1%84%D0%B8%D0%BD%D0%B0_%D0%A2%D1%80%D0%B5%D1%82%D1%8C%D1%8F%D0%BA%D0%BE%D0%B2%D0%B0/%D0%A5%D1%80%D0%B0%D0%BD%D0%B5%D0%BD%D0%B8%D0%B5_%D0%BD%D0%B5%D0%BD%D1%83%D0%BB%D0%B5%D0%B2%D1%8B%D1%85_%D1%8D%D0%BB%D0%B5%D0%BC%D0%B5%D0%BD%D1%82%D0%BE%D0%B2_%D1%80%D0%B0%D0%B7%D1%80%D0%B5%D0%B6%D0%B5%D0%BD%D0%BD%D1%8B%D1%85_%D0%BC%D0%B0%D1%82%D1%80%D0%B8%D1%86._%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=6377"/>
		<updated>2016-10-13T11:08:41Z</updated>

		<summary type="html">&lt;p&gt;Екатерина Буторина: &lt;/p&gt;
&lt;hr /&gt;
&lt;div&gt;{{algorithm&lt;br /&gt;
| name              = Умножение разреженной матрицы на вектор&lt;br /&gt;
| serial_complexity = &amp;lt;math&amp;gt;nnz&amp;lt;/math&amp;gt;&lt;br /&gt;
| pf_height         = &amp;lt;math&amp;gt;&amp;lt;/math&amp;gt;&lt;br /&gt;
| pf_width          = &amp;lt;math&amp;gt;&amp;lt;/math&amp;gt;&lt;br /&gt;
| input_data        = &amp;lt;math&amp;gt;2nnz+2n+1&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;
Авторы статьи: [[Участница:Руфина_Третьякова|Третьякова Р. М.]] (группа 603), [[Участница:Екатерина_Буторина|Буторина Е. В.]] (группа 603)&lt;br /&gt;
&lt;br /&gt;
&lt;br /&gt;
&lt;br /&gt;
== Свойства и структура алгоритма ==&lt;br /&gt;
&lt;br /&gt;
=== Общее описание алгоритма ===&lt;br /&gt;
Разрежённая матрица — это матрица с преимущественно нулевыми элементами. В противном случае, если бо́льшая часть элементов матрицы ненулевые, матрица считается плотной.&lt;br /&gt;
Среди специалистов нет единства в определении того, какое именно количество ненулевых элементов делает матрицу разрежённой. Разные авторы предлагают различные варианты. &lt;br /&gt;
Огромные разрежённые матрицы часто возникают при решении таких задач, как дифференциальное уравнение в частных производных.&lt;br /&gt;
При хранении и преобразовании разрежённых матриц в компьютере бывает полезно, а часто и необходимо, использовать специальные алгоритмы и структуры данных, которые учитывают разрежённую структуру матрицы. Операции и алгоритмы, применяемые для работы с обычными, плотными матрицами, применительно к большим разрежённым матрицам работают относительно медленно и требуют значительных объёмов памяти. Однако разрежённые матрицы могут быть легко сжаты путём записи только своих ненулевых элементов, что снижает требования к компьютерной памяти.&lt;br /&gt;
&lt;br /&gt;
=== Математическое описание алгоритма ===&lt;br /&gt;
Исходные данные:  разреженная матрица &amp;lt;math&amp;gt;M^{n*n}&amp;lt;/math&amp;gt;, вектор &amp;lt;math&amp;gt;x^{n*1}&amp;lt;/math&amp;gt; &lt;br /&gt;
&lt;br /&gt;
Наиболее удобным форматом для вычисления произведения матрицы на вектор является &amp;quot;Compressed Sparse Row&amp;quot; или сокращенно CSR-формат.&lt;br /&gt;
&lt;br /&gt;
Рассмотрим CSR-представление разреженной матрицы: пусть число ненулевых элементов матрицы равно &amp;lt;math&amp;gt;nnz&amp;lt;/math&amp;gt;&lt;br /&gt;
CSR-формат представляет матрицу &amp;lt;math&amp;gt;M&amp;lt;/math&amp;gt; в виде 3-х одномерных массивов:&lt;br /&gt;
&lt;br /&gt;
массив &amp;lt;math&amp;gt;A&amp;lt;/math&amp;gt; размера &amp;lt;math&amp;gt;nnz&amp;lt;/math&amp;gt; содержит ненулевые значения матрицы,&lt;br /&gt;
&amp;lt;math&amp;gt;JA&amp;lt;/math&amp;gt; размера &amp;lt;math&amp;gt;nnz&amp;lt;/math&amp;gt; - номера столбцов ненулевых элементов., &lt;br /&gt;
&amp;lt;math&amp;gt;IA&amp;lt;/math&amp;gt; размера &amp;lt;math&amp;gt;n&amp;lt;/math&amp;gt;- содержит номер с которого начинается описание элементов строки в массивах &amp;lt;math&amp;gt;A&amp;lt;/math&amp;gt; и &amp;lt;math&amp;gt;JA&amp;lt;/math&amp;gt;.&lt;br /&gt;
Этот формат позволяет производить перемножение матрицы &amp;lt;math&amp;gt;M&amp;lt;/math&amp;gt; на вектор &amp;lt;math&amp;gt;x&amp;lt;/math&amp;gt; за &amp;lt;math&amp;gt;O(nnz)&amp;lt;/math&amp;gt; умножений и сложений. &lt;br /&gt;
&lt;br /&gt;
Например, это разреженная матрица с 4-мя ненулевыми элементами&lt;br /&gt;
:: &amp;lt;math&amp;gt;\begin{pmatrix}&lt;br /&gt;
0 &amp;amp; 0 &amp;amp; 0 &amp;amp; 1 \\&lt;br /&gt;
2 &amp;amp; 0 &amp;amp; 0 &amp;amp; 0 \\&lt;br /&gt;
0 &amp;amp; 0 &amp;amp; 3 &amp;amp; 0 \\&lt;br /&gt;
0 &amp;amp; 4 &amp;amp; 0 &amp;amp; 0 \\&lt;br /&gt;
\end{pmatrix}&amp;lt;/math&amp;gt;,&lt;br /&gt;
 представляемая в формате CSR &lt;br /&gt;
    A  = [ 1 2 3 4 ]&lt;br /&gt;
    IA = [ 0 1 2 3 4 ]&lt;br /&gt;
    JA = [ 3 0 2 1 ]&lt;br /&gt;
&lt;br /&gt;
&lt;br /&gt;
Вычисляемые данные: вектор  &amp;lt;math&amp;gt;M*x=y&amp;lt;/math&amp;gt;&lt;br /&gt;
&lt;br /&gt;
=== Вычислительное ядро алгоритма ===&lt;br /&gt;
&lt;br /&gt;
:&amp;lt;math&amp;gt;y_i = \sum_{k = IA_i}^{IA_{i+1}} A_k x_{JA_k}&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;
    число строк матрицы &#039;&#039;n&#039;&#039;; &lt;br /&gt;
    разреженная матрица в формате CSR:&lt;br /&gt;
      строчные указатели &#039;&#039;IA&#039;&#039;,&lt;br /&gt;
      столбцовые указатели&#039;&#039;JA&#039;&#039;, &lt;br /&gt;
      ненулевые элементы &#039;&#039;A&#039;&#039;;&lt;br /&gt;
    вектор &#039;&#039;x&#039;&#039;.&lt;br /&gt;
  &#039;&#039;&#039;Выходные данные&#039;&#039;&#039;: произведение матрицы на вектор &#039;&#039;y&#039;&#039;.&lt;br /&gt;
  &#039;&#039;&#039;read CSR&#039;&#039;&#039; &#039;&#039;n&#039;&#039;, &#039;&#039;IA&#039;&#039;, &#039;&#039;JA&#039;&#039;, &#039;&#039;A&#039;&#039;;&lt;br /&gt;
  &#039;&#039;&#039;read&#039;&#039;&#039; &#039;&#039;x&#039;&#039;&lt;br /&gt;
  &#039;&#039;&#039;for&#039;&#039;&#039; &#039;&#039;i&#039;&#039; = 1,n:&lt;br /&gt;
    &#039;&#039;&#039;for&#039;&#039;&#039; &#039;&#039;k&#039;&#039; = &#039;&#039;IA(i)&#039;&#039;, &#039;&#039;IA(i+1)-1&#039;&#039;:&lt;br /&gt;
            &#039;&#039;y(i)&#039;&#039; += &#039;&#039;A(k)&#039;&#039;*&#039;&#039;x(JA(k))&#039;&#039;;&lt;br /&gt;
  &#039;&#039;&#039;write&#039;&#039;&#039; &#039;&#039;y&#039;&#039;;&lt;br /&gt;
&lt;br /&gt;
=== Схема реализации последовательного алгоритма ===&lt;br /&gt;
Метод можно описать следующим образом:&lt;br /&gt;
# привести матрицу &amp;lt;math&amp;gt;M&amp;lt;/math&amp;gt; к формату CSR&lt;br /&gt;
# для &amp;lt;math&amp;gt;i&amp;lt;/math&amp;gt; от &amp;lt;math&amp;gt;0&amp;lt;/math&amp;gt; до &amp;lt;math&amp;gt;n-1&amp;lt;/math&amp;gt; вычислить &amp;lt;math&amp;gt;y_i&amp;lt;/math&amp;gt; по формуле &amp;lt;math&amp;gt;y_i = \sum_{k = IA_i}^{IA_{i+1}} A_k x_{JA_k}&amp;lt;/math&amp;gt;&lt;br /&gt;
&lt;br /&gt;
=== Последовательная сложность алгоритма ===&lt;br /&gt;
Для вычисления матрично-векторного произведения матрицы размера &amp;lt;math&amp;gt;n*n&amp;lt;/math&amp;gt; и вектора размера n в последовательном варианте требуется:&lt;br /&gt;
&lt;br /&gt;
* &amp;lt;math&amp;gt;nnz&amp;lt;/math&amp;gt; сложений,&lt;br /&gt;
* &amp;lt;math&amp;gt;nnz&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;
Последовательная реализация имеется в пакете SPARSKIT&lt;br /&gt;
&lt;br /&gt;
== Литература ==&lt;br /&gt;
[1] С. Писсанецки. Технология разреженных матриц. Изд. Мир, 1988.&lt;/div&gt;</summary>
		<author><name>Екатерина Буторина</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:%D0%A0%D1%83%D1%84%D0%B8%D0%BD%D0%B0_%D0%A2%D1%80%D0%B5%D1%82%D1%8C%D1%8F%D0%BA%D0%BE%D0%B2%D0%B0/%D0%A5%D1%80%D0%B0%D0%BD%D0%B5%D0%BD%D0%B8%D0%B5_%D0%BD%D0%B5%D0%BD%D1%83%D0%BB%D0%B5%D0%B2%D1%8B%D1%85_%D1%8D%D0%BB%D0%B5%D0%BC%D0%B5%D0%BD%D1%82%D0%BE%D0%B2_%D1%80%D0%B0%D0%B7%D1%80%D0%B5%D0%B6%D0%B5%D0%BD%D0%BD%D1%8B%D1%85_%D0%BC%D0%B0%D1%82%D1%80%D0%B8%D1%86._%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=6376</id>
		<title>Участник:Руфина Третьякова/Хранение ненулевых элементов разреженных матриц. Умножение разреженной матрицы на вектор</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:%D0%A0%D1%83%D1%84%D0%B8%D0%BD%D0%B0_%D0%A2%D1%80%D0%B5%D1%82%D1%8C%D1%8F%D0%BA%D0%BE%D0%B2%D0%B0/%D0%A5%D1%80%D0%B0%D0%BD%D0%B5%D0%BD%D0%B8%D0%B5_%D0%BD%D0%B5%D0%BD%D1%83%D0%BB%D0%B5%D0%B2%D1%8B%D1%85_%D1%8D%D0%BB%D0%B5%D0%BC%D0%B5%D0%BD%D1%82%D0%BE%D0%B2_%D1%80%D0%B0%D0%B7%D1%80%D0%B5%D0%B6%D0%B5%D0%BD%D0%BD%D1%8B%D1%85_%D0%BC%D0%B0%D1%82%D1%80%D0%B8%D1%86._%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=6376"/>
		<updated>2016-10-13T11:07:59Z</updated>

		<summary type="html">&lt;p&gt;Екатерина Буторина: /* Программная реализация алгоритма */&lt;/p&gt;
&lt;hr /&gt;
&lt;div&gt;{{algorithm&lt;br /&gt;
| name              = Умножение разреженной матрицы на вектор&lt;br /&gt;
| serial_complexity = &amp;lt;math&amp;gt;nnz&amp;lt;/math&amp;gt;&lt;br /&gt;
| pf_height         = &amp;lt;math&amp;gt;&amp;lt;/math&amp;gt;&lt;br /&gt;
| pf_width          = &amp;lt;math&amp;gt;&amp;lt;/math&amp;gt;&lt;br /&gt;
| input_data        = &amp;lt;math&amp;gt;2nnz+2n+1&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;
Авторы статьи: [[Участница:Руфина_Третьякова|Третьякова Р. М.]] (группа 603), [[Участница:Екатерина_Буторина|Буторина Е. В.]] (группа 603)&lt;br /&gt;
&lt;br /&gt;
&lt;br /&gt;
&lt;br /&gt;
== Свойства и структура алгоритма ==&lt;br /&gt;
&lt;br /&gt;
=== Общее описание алгоритма ===&lt;br /&gt;
Разрежённая матрица — это матрица с преимущественно нулевыми элементами. В противном случае, если бо́льшая часть элементов матрицы ненулевые, матрица считается плотной.&lt;br /&gt;
Среди специалистов нет единства в определении того, какое именно количество ненулевых элементов делает матрицу разрежённой. Разные авторы предлагают различные варианты. &lt;br /&gt;
Огромные разрежённые матрицы часто возникают при решении таких задач, как дифференциальное уравнение в частных производных.&lt;br /&gt;
При хранении и преобразовании разрежённых матриц в компьютере бывает полезно, а часто и необходимо, использовать специальные алгоритмы и структуры данных, которые учитывают разрежённую структуру матрицы. Операции и алгоритмы, применяемые для работы с обычными, плотными матрицами, применительно к большим разрежённым матрицам работают относительно медленно и требуют значительных объёмов памяти. Однако разрежённые матрицы могут быть легко сжаты путём записи только своих ненулевых элементов, что снижает требования к компьютерной памяти.&lt;br /&gt;
&lt;br /&gt;
=== Математическое описание алгоритма ===&lt;br /&gt;
Исходные данные:  разреженная матрица &amp;lt;math&amp;gt;M^{n*n}&amp;lt;/math&amp;gt;, вектор &amp;lt;math&amp;gt;x^{n*1}&amp;lt;/math&amp;gt; &lt;br /&gt;
&lt;br /&gt;
Наиболее удобным форматом для вычисления произведения матрицы на вектор является &amp;quot;Compressed Sparse Row&amp;quot; или сокращенно CSR-формат.&lt;br /&gt;
&lt;br /&gt;
Рассмотрим CSR-представление разреженной матрицы: пусть число ненулевых элементов матрицы равно &amp;lt;math&amp;gt;nnz&amp;lt;/math&amp;gt;&lt;br /&gt;
CSR-формат представляет матрицу &amp;lt;math&amp;gt;M&amp;lt;/math&amp;gt; в виде 3-х одномерных массивов:&lt;br /&gt;
&lt;br /&gt;
массив &amp;lt;math&amp;gt;A&amp;lt;/math&amp;gt; размера &amp;lt;math&amp;gt;nnz&amp;lt;/math&amp;gt; содержит ненулевые значения матрицы,&lt;br /&gt;
&amp;lt;math&amp;gt;JA&amp;lt;/math&amp;gt; размера &amp;lt;math&amp;gt;nnz&amp;lt;/math&amp;gt; - номера столбцов ненулевых элементов., &lt;br /&gt;
&amp;lt;math&amp;gt;IA&amp;lt;/math&amp;gt; размера &amp;lt;math&amp;gt;n&amp;lt;/math&amp;gt;- содержит номер с которого начинается описание элементов строки в массивах &amp;lt;math&amp;gt;A&amp;lt;/math&amp;gt; и &amp;lt;math&amp;gt;JA&amp;lt;/math&amp;gt;.&lt;br /&gt;
Этот формат позволяет производить перемножение матрицы &amp;lt;math&amp;gt;M&amp;lt;/math&amp;gt; на вектор &amp;lt;math&amp;gt;x&amp;lt;/math&amp;gt; за &amp;lt;math&amp;gt;O(nnz)&amp;lt;/math&amp;gt; умножений и сложений. &lt;br /&gt;
&lt;br /&gt;
Например, это разреженная матрица с 4-мя ненулевыми элементами&lt;br /&gt;
:: &amp;lt;math&amp;gt;\begin{pmatrix}&lt;br /&gt;
0 &amp;amp; 0 &amp;amp; 0 &amp;amp; 1 \\&lt;br /&gt;
2 &amp;amp; 0 &amp;amp; 0 &amp;amp; 0 \\&lt;br /&gt;
0 &amp;amp; 0 &amp;amp; 3 &amp;amp; 0 \\&lt;br /&gt;
0 &amp;amp; 4 &amp;amp; 0 &amp;amp; 0 \\&lt;br /&gt;
\end{pmatrix}&amp;lt;/math&amp;gt;,&lt;br /&gt;
 представляемая в формате CSR &lt;br /&gt;
    A  = [ 1 2 3 4 ]&lt;br /&gt;
    IA = [ 0 1 2 3 4 ]&lt;br /&gt;
    JA = [ 3 0 2 1 ]&lt;br /&gt;
&lt;br /&gt;
&lt;br /&gt;
Вычисляемые данные: вектор  &amp;lt;math&amp;gt;M*x=y&amp;lt;/math&amp;gt;&lt;br /&gt;
&lt;br /&gt;
=== Вычислительное ядро алгоритма ===&lt;br /&gt;
&lt;br /&gt;
:&amp;lt;math&amp;gt;y_i = \sum_{k = IA_i}^{IA_{i+1}} A_k x_{JA_k}&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;
    число строк матрицы &#039;&#039;n&#039;&#039;; &lt;br /&gt;
    разреженная матрица в формате CSR:&lt;br /&gt;
      строчные указатели &#039;&#039;IA&#039;&#039;,&lt;br /&gt;
      столбцовые указатели&#039;&#039;JA&#039;&#039;, &lt;br /&gt;
      ненулевые элементы &#039;&#039;A&#039;&#039;;&lt;br /&gt;
    вектор &#039;&#039;x&#039;&#039;.&lt;br /&gt;
  &#039;&#039;&#039;Выходные данные&#039;&#039;&#039;: произведение матрицы на вектор &#039;&#039;y&#039;&#039;.&lt;br /&gt;
  &#039;&#039;&#039;read CSR&#039;&#039;&#039; &#039;&#039;n&#039;&#039;, &#039;&#039;IA&#039;&#039;, &#039;&#039;JA&#039;&#039;, &#039;&#039;A&#039;&#039;;&lt;br /&gt;
  &#039;&#039;&#039;read&#039;&#039;&#039; &#039;&#039;x&#039;&#039;&lt;br /&gt;
  &#039;&#039;&#039;for&#039;&#039;&#039; &#039;&#039;i&#039;&#039; = 1,n:&lt;br /&gt;
    &#039;&#039;&#039;for&#039;&#039;&#039; &#039;&#039;k&#039;&#039; = &#039;&#039;IA(i)&#039;&#039;, &#039;&#039;IA(i+1)-1&#039;&#039;:&lt;br /&gt;
            &#039;&#039;y(i)&#039;&#039; += &#039;&#039;A(k)&#039;&#039;*&#039;&#039;x(JA(k))&#039;&#039;;&lt;br /&gt;
  &#039;&#039;&#039;write&#039;&#039;&#039; &#039;&#039;y&#039;&#039;;&lt;br /&gt;
&lt;br /&gt;
=== Схема реализации последовательного алгоритма ===&lt;br /&gt;
Метод можно описать следующим образом:&lt;br /&gt;
# привести матрицу &amp;lt;math&amp;gt;M&amp;lt;/math&amp;gt; к формату CSR&lt;br /&gt;
# для &amp;lt;math&amp;gt;i&amp;lt;/math&amp;gt; от &amp;lt;math&amp;gt;0&amp;lt;/math&amp;gt; до &amp;lt;math&amp;gt;n-1&amp;lt;/math&amp;gt; вычислить &amp;lt;math&amp;gt;y_i&amp;lt;/math&amp;gt; по формуле &amp;lt;math&amp;gt;y_i = \sum_{k = IA_i}^{IA_{i+1}} A_k x_{JA_k}&amp;lt;/math&amp;gt;&lt;br /&gt;
&lt;br /&gt;
=== Последовательная сложность алгоритма ===&lt;br /&gt;
Для вычисления матрично-векторного произведения матрицы размера &amp;lt;math&amp;gt;n*n&amp;lt;/math&amp;gt; и вектора размера n в последовательном варианте требуется:&lt;br /&gt;
&lt;br /&gt;
* &amp;lt;math&amp;gt;nnz&amp;lt;/math&amp;gt; сложений,&lt;br /&gt;
* &amp;lt;math&amp;gt;nnz&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;
Последовательная реализация имеется в пакете SPARSKIT&lt;br /&gt;
&lt;br /&gt;
== Литература ==&lt;br /&gt;
[1] С. Писсанецки. Технология разреженных матриц. Изд. Мир, 1988.&lt;/div&gt;</summary>
		<author><name>Екатерина Буторина</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:%D0%A0%D1%83%D1%84%D0%B8%D0%BD%D0%B0_%D0%A2%D1%80%D0%B5%D1%82%D1%8C%D1%8F%D0%BA%D0%BE%D0%B2%D0%B0/%D0%A5%D1%80%D0%B0%D0%BD%D0%B5%D0%BD%D0%B8%D0%B5_%D0%BD%D0%B5%D0%BD%D1%83%D0%BB%D0%B5%D0%B2%D1%8B%D1%85_%D1%8D%D0%BB%D0%B5%D0%BC%D0%B5%D0%BD%D1%82%D0%BE%D0%B2_%D1%80%D0%B0%D0%B7%D1%80%D0%B5%D0%B6%D0%B5%D0%BD%D0%BD%D1%8B%D1%85_%D0%BC%D0%B0%D1%82%D1%80%D0%B8%D1%86._%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=6375</id>
		<title>Участник:Руфина Третьякова/Хранение ненулевых элементов разреженных матриц. Умножение разреженной матрицы на вектор</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:%D0%A0%D1%83%D1%84%D0%B8%D0%BD%D0%B0_%D0%A2%D1%80%D0%B5%D1%82%D1%8C%D1%8F%D0%BA%D0%BE%D0%B2%D0%B0/%D0%A5%D1%80%D0%B0%D0%BD%D0%B5%D0%BD%D0%B8%D0%B5_%D0%BD%D0%B5%D0%BD%D1%83%D0%BB%D0%B5%D0%B2%D1%8B%D1%85_%D1%8D%D0%BB%D0%B5%D0%BC%D0%B5%D0%BD%D1%82%D0%BE%D0%B2_%D1%80%D0%B0%D0%B7%D1%80%D0%B5%D0%B6%D0%B5%D0%BD%D0%BD%D1%8B%D1%85_%D0%BC%D0%B0%D1%82%D1%80%D0%B8%D1%86._%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=6375"/>
		<updated>2016-10-13T11:07:41Z</updated>

		<summary type="html">&lt;p&gt;Екатерина Буторина: /* Программная реализация алгоритма */&lt;/p&gt;
&lt;hr /&gt;
&lt;div&gt;{{algorithm&lt;br /&gt;
| name              = Умножение разреженной матрицы на вектор&lt;br /&gt;
| serial_complexity = &amp;lt;math&amp;gt;nnz&amp;lt;/math&amp;gt;&lt;br /&gt;
| pf_height         = &amp;lt;math&amp;gt;&amp;lt;/math&amp;gt;&lt;br /&gt;
| pf_width          = &amp;lt;math&amp;gt;&amp;lt;/math&amp;gt;&lt;br /&gt;
| input_data        = &amp;lt;math&amp;gt;2nnz+2n+1&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;
Авторы статьи: [[Участница:Руфина_Третьякова|Третьякова Р. М.]] (группа 603), [[Участница:Екатерина_Буторина|Буторина Е. В.]] (группа 603)&lt;br /&gt;
&lt;br /&gt;
&lt;br /&gt;
&lt;br /&gt;
== Свойства и структура алгоритма ==&lt;br /&gt;
&lt;br /&gt;
=== Общее описание алгоритма ===&lt;br /&gt;
Разрежённая матрица — это матрица с преимущественно нулевыми элементами. В противном случае, если бо́льшая часть элементов матрицы ненулевые, матрица считается плотной.&lt;br /&gt;
Среди специалистов нет единства в определении того, какое именно количество ненулевых элементов делает матрицу разрежённой. Разные авторы предлагают различные варианты. &lt;br /&gt;
Огромные разрежённые матрицы часто возникают при решении таких задач, как дифференциальное уравнение в частных производных.&lt;br /&gt;
При хранении и преобразовании разрежённых матриц в компьютере бывает полезно, а часто и необходимо, использовать специальные алгоритмы и структуры данных, которые учитывают разрежённую структуру матрицы. Операции и алгоритмы, применяемые для работы с обычными, плотными матрицами, применительно к большим разрежённым матрицам работают относительно медленно и требуют значительных объёмов памяти. Однако разрежённые матрицы могут быть легко сжаты путём записи только своих ненулевых элементов, что снижает требования к компьютерной памяти.&lt;br /&gt;
&lt;br /&gt;
=== Математическое описание алгоритма ===&lt;br /&gt;
Исходные данные:  разреженная матрица &amp;lt;math&amp;gt;M^{n*n}&amp;lt;/math&amp;gt;, вектор &amp;lt;math&amp;gt;x^{n*1}&amp;lt;/math&amp;gt; &lt;br /&gt;
&lt;br /&gt;
Наиболее удобным форматом для вычисления произведения матрицы на вектор является &amp;quot;Compressed Sparse Row&amp;quot; или сокращенно CSR-формат.&lt;br /&gt;
&lt;br /&gt;
Рассмотрим CSR-представление разреженной матрицы: пусть число ненулевых элементов матрицы равно &amp;lt;math&amp;gt;nnz&amp;lt;/math&amp;gt;&lt;br /&gt;
CSR-формат представляет матрицу &amp;lt;math&amp;gt;M&amp;lt;/math&amp;gt; в виде 3-х одномерных массивов:&lt;br /&gt;
&lt;br /&gt;
массив &amp;lt;math&amp;gt;A&amp;lt;/math&amp;gt; размера &amp;lt;math&amp;gt;nnz&amp;lt;/math&amp;gt; содержит ненулевые значения матрицы,&lt;br /&gt;
&amp;lt;math&amp;gt;JA&amp;lt;/math&amp;gt; размера &amp;lt;math&amp;gt;nnz&amp;lt;/math&amp;gt; - номера столбцов ненулевых элементов., &lt;br /&gt;
&amp;lt;math&amp;gt;IA&amp;lt;/math&amp;gt; размера &amp;lt;math&amp;gt;n&amp;lt;/math&amp;gt;- содержит номер с которого начинается описание элементов строки в массивах &amp;lt;math&amp;gt;A&amp;lt;/math&amp;gt; и &amp;lt;math&amp;gt;JA&amp;lt;/math&amp;gt;.&lt;br /&gt;
Этот формат позволяет производить перемножение матрицы &amp;lt;math&amp;gt;M&amp;lt;/math&amp;gt; на вектор &amp;lt;math&amp;gt;x&amp;lt;/math&amp;gt; за &amp;lt;math&amp;gt;O(nnz)&amp;lt;/math&amp;gt; умножений и сложений. &lt;br /&gt;
&lt;br /&gt;
Например, это разреженная матрица с 4-мя ненулевыми элементами&lt;br /&gt;
:: &amp;lt;math&amp;gt;\begin{pmatrix}&lt;br /&gt;
0 &amp;amp; 0 &amp;amp; 0 &amp;amp; 1 \\&lt;br /&gt;
2 &amp;amp; 0 &amp;amp; 0 &amp;amp; 0 \\&lt;br /&gt;
0 &amp;amp; 0 &amp;amp; 3 &amp;amp; 0 \\&lt;br /&gt;
0 &amp;amp; 4 &amp;amp; 0 &amp;amp; 0 \\&lt;br /&gt;
\end{pmatrix}&amp;lt;/math&amp;gt;,&lt;br /&gt;
 представляемая в формате CSR &lt;br /&gt;
    A  = [ 1 2 3 4 ]&lt;br /&gt;
    IA = [ 0 1 2 3 4 ]&lt;br /&gt;
    JA = [ 3 0 2 1 ]&lt;br /&gt;
&lt;br /&gt;
&lt;br /&gt;
Вычисляемые данные: вектор  &amp;lt;math&amp;gt;M*x=y&amp;lt;/math&amp;gt;&lt;br /&gt;
&lt;br /&gt;
=== Вычислительное ядро алгоритма ===&lt;br /&gt;
&lt;br /&gt;
:&amp;lt;math&amp;gt;y_i = \sum_{k = IA_i}^{IA_{i+1}} A_k x_{JA_k}&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;
    число строк матрицы &#039;&#039;n&#039;&#039;; &lt;br /&gt;
    разреженная матрица в формате CSR:&lt;br /&gt;
      строчные указатели &#039;&#039;IA&#039;&#039;,&lt;br /&gt;
      столбцовые указатели&#039;&#039;JA&#039;&#039;, &lt;br /&gt;
      ненулевые элементы &#039;&#039;A&#039;&#039;;&lt;br /&gt;
    вектор &#039;&#039;x&#039;&#039;.&lt;br /&gt;
  &#039;&#039;&#039;Выходные данные&#039;&#039;&#039;: произведение матрицы на вектор &#039;&#039;y&#039;&#039;.&lt;br /&gt;
  &#039;&#039;&#039;read CSR&#039;&#039;&#039; &#039;&#039;n&#039;&#039;, &#039;&#039;IA&#039;&#039;, &#039;&#039;JA&#039;&#039;, &#039;&#039;A&#039;&#039;;&lt;br /&gt;
  &#039;&#039;&#039;read&#039;&#039;&#039; &#039;&#039;x&#039;&#039;&lt;br /&gt;
  &#039;&#039;&#039;for&#039;&#039;&#039; &#039;&#039;i&#039;&#039; = 1,n:&lt;br /&gt;
    &#039;&#039;&#039;for&#039;&#039;&#039; &#039;&#039;k&#039;&#039; = &#039;&#039;IA(i)&#039;&#039;, &#039;&#039;IA(i+1)-1&#039;&#039;:&lt;br /&gt;
            &#039;&#039;y(i)&#039;&#039; += &#039;&#039;A(k)&#039;&#039;*&#039;&#039;x(JA(k))&#039;&#039;;&lt;br /&gt;
  &#039;&#039;&#039;write&#039;&#039;&#039; &#039;&#039;y&#039;&#039;;&lt;br /&gt;
&lt;br /&gt;
=== Схема реализации последовательного алгоритма ===&lt;br /&gt;
Метод можно описать следующим образом:&lt;br /&gt;
# привести матрицу &amp;lt;math&amp;gt;M&amp;lt;/math&amp;gt; к формату CSR&lt;br /&gt;
# для &amp;lt;math&amp;gt;i&amp;lt;/math&amp;gt; от &amp;lt;math&amp;gt;0&amp;lt;/math&amp;gt; до &amp;lt;math&amp;gt;n-1&amp;lt;/math&amp;gt; вычислить &amp;lt;math&amp;gt;y_i&amp;lt;/math&amp;gt; по формуле &amp;lt;math&amp;gt;y_i = \sum_{k = IA_i}^{IA_{i+1}} A_k x_{JA_k}&amp;lt;/math&amp;gt;&lt;br /&gt;
&lt;br /&gt;
=== Последовательная сложность алгоритма ===&lt;br /&gt;
Для вычисления матрично-векторного произведения матрицы размера &amp;lt;math&amp;gt;n*n&amp;lt;/math&amp;gt; и вектора размера n в последовательном варианте требуется:&lt;br /&gt;
&lt;br /&gt;
* &amp;lt;math&amp;gt;nnz&amp;lt;/math&amp;gt; сложений,&lt;br /&gt;
* &amp;lt;math&amp;gt;nnz&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;
== Существующие реализации алгоритма ==&lt;br /&gt;
&lt;br /&gt;
Последовательная реализация имеется в пакете SPARSKIT&lt;br /&gt;
&lt;br /&gt;
== Литература ==&lt;br /&gt;
[1] С. Писсанецки. Технология разреженных матриц. Изд. Мир, 1988.&lt;/div&gt;</summary>
		<author><name>Екатерина Буторина</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:%D0%A0%D1%83%D1%84%D0%B8%D0%BD%D0%B0_%D0%A2%D1%80%D0%B5%D1%82%D1%8C%D1%8F%D0%BA%D0%BE%D0%B2%D0%B0/%D0%A5%D1%80%D0%B0%D0%BD%D0%B5%D0%BD%D0%B8%D0%B5_%D0%BD%D0%B5%D0%BD%D1%83%D0%BB%D0%B5%D0%B2%D1%8B%D1%85_%D1%8D%D0%BB%D0%B5%D0%BC%D0%B5%D0%BD%D1%82%D0%BE%D0%B2_%D1%80%D0%B0%D0%B7%D1%80%D0%B5%D0%B6%D0%B5%D0%BD%D0%BD%D1%8B%D1%85_%D0%BC%D0%B0%D1%82%D1%80%D0%B8%D1%86._%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=6239</id>
		<title>Участник:Руфина Третьякова/Хранение ненулевых элементов разреженных матриц. Умножение разреженной матрицы на вектор</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:%D0%A0%D1%83%D1%84%D0%B8%D0%BD%D0%B0_%D0%A2%D1%80%D0%B5%D1%82%D1%8C%D1%8F%D0%BA%D0%BE%D0%B2%D0%B0/%D0%A5%D1%80%D0%B0%D0%BD%D0%B5%D0%BD%D0%B8%D0%B5_%D0%BD%D0%B5%D0%BD%D1%83%D0%BB%D0%B5%D0%B2%D1%8B%D1%85_%D1%8D%D0%BB%D0%B5%D0%BC%D0%B5%D0%BD%D1%82%D0%BE%D0%B2_%D1%80%D0%B0%D0%B7%D1%80%D0%B5%D0%B6%D0%B5%D0%BD%D0%BD%D1%8B%D1%85_%D0%BC%D0%B0%D1%82%D1%80%D0%B8%D1%86._%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=6239"/>
		<updated>2016-10-12T23:03:44Z</updated>

		<summary type="html">&lt;p&gt;Екатерина Буторина: &lt;/p&gt;
&lt;hr /&gt;
&lt;div&gt;{{algorithm&lt;br /&gt;
| name              = Умножение разреженной матрицы на вектор&lt;br /&gt;
| serial_complexity = &amp;lt;math&amp;gt;nnz&amp;lt;/math&amp;gt;&lt;br /&gt;
| pf_height         = &amp;lt;math&amp;gt;&amp;lt;/math&amp;gt;&lt;br /&gt;
| pf_width          = &amp;lt;math&amp;gt;&amp;lt;/math&amp;gt;&lt;br /&gt;
| input_data        = &amp;lt;math&amp;gt;2nnz+2n+1&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;
Авторы статьи: [[Участница:Руфина_Третьякова|Третьякова Р. М.]] (группа 603), [[Участница:Екатерина_Буторина|Буторина Е. В.]] (группа 603)&lt;br /&gt;
&lt;br /&gt;
&lt;br /&gt;
&lt;br /&gt;
== Свойства и структура алгоритма ==&lt;br /&gt;
&lt;br /&gt;
=== Общее описание алгоритма ===&lt;br /&gt;
Разрежённая матрица — это матрица с преимущественно нулевыми элементами. В противном случае, если бо́льшая часть элементов матрицы ненулевые, матрица считается плотной.&lt;br /&gt;
Среди специалистов нет единства в определении того, какое именно количество ненулевых элементов делает матрицу разрежённой. Разные авторы предлагают различные варианты. &lt;br /&gt;
Огромные разрежённые матрицы часто возникают при решении таких задач, как дифференциальное уравнение в частных производных.&lt;br /&gt;
При хранении и преобразовании разрежённых матриц в компьютере бывает полезно, а часто и необходимо, использовать специальные алгоритмы и структуры данных, которые учитывают разрежённую структуру матрицы. Операции и алгоритмы, применяемые для работы с обычными, плотными матрицами, применительно к большим разрежённым матрицам работают относительно медленно и требуют значительных объёмов памяти. Однако разрежённые матрицы могут быть легко сжаты путём записи только своих ненулевых элементов, что снижает требования к компьютерной памяти.&lt;br /&gt;
&lt;br /&gt;
=== Математическое описание алгоритма ===&lt;br /&gt;
Исходные данные:  разреженная матрица &amp;lt;math&amp;gt;M^{n*n}&amp;lt;/math&amp;gt;, вектор &amp;lt;math&amp;gt;x^{n*1}&amp;lt;/math&amp;gt; &lt;br /&gt;
&lt;br /&gt;
Наиболее удобным форматом для вычисления произведения матрицы на вектор является &amp;quot;Compressed Sparse Row&amp;quot; или сокращенно CSR-формат.&lt;br /&gt;
&lt;br /&gt;
Рассмотрим CSR-представление разреженной матрицы: пусть число ненулевых элементов матрицы равно &amp;lt;math&amp;gt;nnz&amp;lt;/math&amp;gt;&lt;br /&gt;
CSR-формат представляет матрицу &amp;lt;math&amp;gt;M&amp;lt;/math&amp;gt; в виде 3-х одномерных массивов:&lt;br /&gt;
&lt;br /&gt;
массив &amp;lt;math&amp;gt;A&amp;lt;/math&amp;gt; размера &amp;lt;math&amp;gt;nnz&amp;lt;/math&amp;gt; содержит ненулевые значения матрицы,&lt;br /&gt;
&amp;lt;math&amp;gt;JA&amp;lt;/math&amp;gt; размера &amp;lt;math&amp;gt;nnz&amp;lt;/math&amp;gt; - номера столбцов ненулевых элементов., &lt;br /&gt;
&amp;lt;math&amp;gt;IA&amp;lt;/math&amp;gt; размера &amp;lt;math&amp;gt;n&amp;lt;/math&amp;gt;- содержит номер с которого начинается описание элементов строки в массивах &amp;lt;math&amp;gt;A&amp;lt;/math&amp;gt; и &amp;lt;math&amp;gt;JA&amp;lt;/math&amp;gt;.&lt;br /&gt;
Этот формат позволяет производить перемножение матрицы &amp;lt;math&amp;gt;M&amp;lt;/math&amp;gt; на вектор &amp;lt;math&amp;gt;x&amp;lt;/math&amp;gt; за &amp;lt;math&amp;gt;O(nnz)&amp;lt;/math&amp;gt; умножений и сложений. &lt;br /&gt;
&lt;br /&gt;
Например, это разреженная матрица с 4-мя ненулевыми элементами&lt;br /&gt;
:: &amp;lt;math&amp;gt;\begin{pmatrix}&lt;br /&gt;
0 &amp;amp; 0 &amp;amp; 0 &amp;amp; 1 \\&lt;br /&gt;
2 &amp;amp; 0 &amp;amp; 0 &amp;amp; 0 \\&lt;br /&gt;
0 &amp;amp; 0 &amp;amp; 3 &amp;amp; 0 \\&lt;br /&gt;
0 &amp;amp; 4 &amp;amp; 0 &amp;amp; 0 \\&lt;br /&gt;
\end{pmatrix}&amp;lt;/math&amp;gt;,&lt;br /&gt;
 представляемая в формате CSR &lt;br /&gt;
    A  = [ 1 2 3 4 ]&lt;br /&gt;
    IA = [ 0 1 2 3 4 ]&lt;br /&gt;
    JA = [ 3 0 2 1 ]&lt;br /&gt;
&lt;br /&gt;
&lt;br /&gt;
Вычисляемые данные: вектор  &amp;lt;math&amp;gt;M*x=y&amp;lt;/math&amp;gt;&lt;br /&gt;
&lt;br /&gt;
=== Вычислительное ядро алгоритма ===&lt;br /&gt;
&lt;br /&gt;
:&amp;lt;math&amp;gt;y_i = \sum_{k = IA_i}^{IA_{i+1}} A_k x_{JA_k}&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;
    число строк матрицы &#039;&#039;n&#039;&#039;; &lt;br /&gt;
    разреженная матрица в формате CSR:&lt;br /&gt;
      строчные указатели &#039;&#039;IA&#039;&#039;,&lt;br /&gt;
      столбцовые указатели&#039;&#039;JA&#039;&#039;, &lt;br /&gt;
      ненулевые элементы &#039;&#039;A&#039;&#039;;&lt;br /&gt;
    вектор &#039;&#039;x&#039;&#039;.&lt;br /&gt;
  &#039;&#039;&#039;Выходные данные&#039;&#039;&#039;: произведение матрицы на вектор &#039;&#039;y&#039;&#039;.&lt;br /&gt;
  &#039;&#039;&#039;read CSR&#039;&#039;&#039; &#039;&#039;n&#039;&#039;, &#039;&#039;IA&#039;&#039;, &#039;&#039;JA&#039;&#039;, &#039;&#039;A&#039;&#039;;&lt;br /&gt;
  &#039;&#039;&#039;read&#039;&#039;&#039; &#039;&#039;x&#039;&#039;&lt;br /&gt;
  &#039;&#039;&#039;for&#039;&#039;&#039; &#039;&#039;i&#039;&#039; = 1,n:&lt;br /&gt;
    &#039;&#039;&#039;for&#039;&#039;&#039; &#039;&#039;k&#039;&#039; = &#039;&#039;IA(i)&#039;&#039;, &#039;&#039;IA(i+1)-1&#039;&#039;:&lt;br /&gt;
            &#039;&#039;y(i)&#039;&#039; += &#039;&#039;A(k)&#039;&#039;*&#039;&#039;x(JA(k))&#039;&#039;;&lt;br /&gt;
  &#039;&#039;&#039;write&#039;&#039;&#039; &#039;&#039;y&#039;&#039;;&lt;br /&gt;
&lt;br /&gt;
=== Схема реализации последовательного алгоритма ===&lt;br /&gt;
Метод можно описать следующим образом:&lt;br /&gt;
# привести матрицу &amp;lt;math&amp;gt;M&amp;lt;/math&amp;gt; к формату CSR&lt;br /&gt;
# для &amp;lt;math&amp;gt;i&amp;lt;/math&amp;gt; от &amp;lt;math&amp;gt;0&amp;lt;/math&amp;gt; до &amp;lt;math&amp;gt;n-1&amp;lt;/math&amp;gt; вычислить &amp;lt;math&amp;gt;y_i&amp;lt;/math&amp;gt; по формуле &amp;lt;math&amp;gt;y_i = \sum_{k = IA_i}^{IA_{i+1}} A_k x_{JA_k}&amp;lt;/math&amp;gt;&lt;br /&gt;
&lt;br /&gt;
=== Последовательная сложность алгоритма ===&lt;br /&gt;
Для вычисления матрично-векторного произведения матрицы размера &amp;lt;math&amp;gt;n*n&amp;lt;/math&amp;gt; и вектора размера n в последовательном варианте требуется:&lt;br /&gt;
&lt;br /&gt;
* &amp;lt;math&amp;gt;nnz&amp;lt;/math&amp;gt; сложений,&lt;br /&gt;
* &amp;lt;math&amp;gt;nnz&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;
Последовательная реализация имеется в пакете SPARSKIT&lt;br /&gt;
&lt;br /&gt;
== Литература ==&lt;br /&gt;
[1] С. Писсанецки. Технология разреженных матриц. Изд. Мир, 1988.&lt;/div&gt;</summary>
		<author><name>Екатерина Буторина</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:%D0%A0%D1%83%D1%84%D0%B8%D0%BD%D0%B0_%D0%A2%D1%80%D0%B5%D1%82%D1%8C%D1%8F%D0%BA%D0%BE%D0%B2%D0%B0/%D0%A5%D1%80%D0%B0%D0%BD%D0%B5%D0%BD%D0%B8%D0%B5_%D0%BD%D0%B5%D0%BD%D1%83%D0%BB%D0%B5%D0%B2%D1%8B%D1%85_%D1%8D%D0%BB%D0%B5%D0%BC%D0%B5%D0%BD%D1%82%D0%BE%D0%B2_%D1%80%D0%B0%D0%B7%D1%80%D0%B5%D0%B6%D0%B5%D0%BD%D0%BD%D1%8B%D1%85_%D0%BC%D0%B0%D1%82%D1%80%D0%B8%D1%86._%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=6174</id>
		<title>Участник:Руфина Третьякова/Хранение ненулевых элементов разреженных матриц. Умножение разреженной матрицы на вектор</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:%D0%A0%D1%83%D1%84%D0%B8%D0%BD%D0%B0_%D0%A2%D1%80%D0%B5%D1%82%D1%8C%D1%8F%D0%BA%D0%BE%D0%B2%D0%B0/%D0%A5%D1%80%D0%B0%D0%BD%D0%B5%D0%BD%D0%B8%D0%B5_%D0%BD%D0%B5%D0%BD%D1%83%D0%BB%D0%B5%D0%B2%D1%8B%D1%85_%D1%8D%D0%BB%D0%B5%D0%BC%D0%B5%D0%BD%D1%82%D0%BE%D0%B2_%D1%80%D0%B0%D0%B7%D1%80%D0%B5%D0%B6%D0%B5%D0%BD%D0%BD%D1%8B%D1%85_%D0%BC%D0%B0%D1%82%D1%80%D0%B8%D1%86._%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=6174"/>
		<updated>2016-10-12T21:53:30Z</updated>

		<summary type="html">&lt;p&gt;Екатерина Буторина: /* Последовательная сложность алгоритма */&lt;/p&gt;
&lt;hr /&gt;
&lt;div&gt;{{algorithm&lt;br /&gt;
| name              = Умножение разреженной матрицы на вектор&lt;br /&gt;
| serial_complexity = &amp;lt;math&amp;gt;nnz&amp;lt;/math&amp;gt;&lt;br /&gt;
| pf_height         = &amp;lt;math&amp;gt;&amp;lt;/math&amp;gt;&lt;br /&gt;
| pf_width          = &amp;lt;math&amp;gt;&amp;lt;/math&amp;gt;&lt;br /&gt;
| input_data        = &amp;lt;math&amp;gt;2nnz+n+1&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;
Авторы статьи: [[Участница:Руфина_Третьякова|Третьякова Р. М.]] (группа 603), [[Участница:Екатерина_Буторина|Буторина Е. В.]] (группа 603)&lt;br /&gt;
&lt;br /&gt;
&lt;br /&gt;
&lt;br /&gt;
== Свойства и структура алгоритма ==&lt;br /&gt;
&lt;br /&gt;
=== Общее описание алгоритма ===&lt;br /&gt;
Разрежённая матрица — это матрица с преимущественно нулевыми элементами. В противном случае, если бо́льшая часть элементов матрицы ненулевые, матрица считается плотной.&lt;br /&gt;
Среди специалистов нет единства в определении того, какое именно количество ненулевых элементов делает матрицу разрежённой. Разные авторы предлагают различные варианты. &lt;br /&gt;
Огромные разрежённые матрицы часто возникают при решении таких задач, как дифференциальное уравнение в частных производных.&lt;br /&gt;
При хранении и преобразовании разрежённых матриц в компьютере бывает полезно, а часто и необходимо, использовать специальные алгоритмы и структуры данных, которые учитывают разрежённую структуру матрицы. Операции и алгоритмы, применяемые для работы с обычными, плотными матрицами, применительно к большим разрежённым матрицам работают относительно медленно и требуют значительных объёмов памяти. Однако разрежённые матрицы могут быть легко сжаты путём записи только своих ненулевых элементов, что снижает требования к компьютерной памяти.&lt;br /&gt;
&lt;br /&gt;
=== Математическое описание алгоритма ===&lt;br /&gt;
Исходные данные:  разреженная матрица &amp;lt;math&amp;gt;M^{n*n}&amp;lt;/math&amp;gt;, вектор &amp;lt;math&amp;gt;x^{n*1}&amp;lt;/math&amp;gt; &lt;br /&gt;
&lt;br /&gt;
Наиболее удобным форматом для вычисления произведения матрицы на вектор является &amp;quot;Compressed Sparse Row&amp;quot; или сокращенно CSR-формат.&lt;br /&gt;
&lt;br /&gt;
Рассмотрим CSR-представление разреженной матрицы: пусть число ненулевых элементов матрицы равно &amp;lt;math&amp;gt;nnz&amp;lt;/math&amp;gt;&lt;br /&gt;
CSR-формат представляет матрицу &amp;lt;math&amp;gt;M&amp;lt;/math&amp;gt; в виде 3-х одномерных массивов:&lt;br /&gt;
&lt;br /&gt;
массив &amp;lt;math&amp;gt;A&amp;lt;/math&amp;gt; размера &amp;lt;math&amp;gt;nnz&amp;lt;/math&amp;gt; содержит ненулевые значения матрицы,&lt;br /&gt;
&amp;lt;math&amp;gt;JA&amp;lt;/math&amp;gt; размера &amp;lt;math&amp;gt;nnz&amp;lt;/math&amp;gt; - номера столбцов ненулевых элементов., &lt;br /&gt;
&amp;lt;math&amp;gt;IA&amp;lt;/math&amp;gt; размера &amp;lt;math&amp;gt;n&amp;lt;/math&amp;gt;- содержит номер с которого начинается описание элементов строки в массивах &amp;lt;math&amp;gt;A&amp;lt;/math&amp;gt; и &amp;lt;math&amp;gt;JA&amp;lt;/math&amp;gt;.&lt;br /&gt;
Этот формат позволяет производить перемножение матрицы &amp;lt;math&amp;gt;M&amp;lt;/math&amp;gt; на вектор &amp;lt;math&amp;gt;x&amp;lt;/math&amp;gt; за &amp;lt;math&amp;gt;O(nnz)&amp;lt;/math&amp;gt; умножений и сложений. &lt;br /&gt;
&lt;br /&gt;
Например, это разреженная матрица с 4-мя ненулевыми элементами&lt;br /&gt;
:: &amp;lt;math&amp;gt;\begin{pmatrix}&lt;br /&gt;
0 &amp;amp; 0 &amp;amp; 0 &amp;amp; 1 \\&lt;br /&gt;
2 &amp;amp; 0 &amp;amp; 0 &amp;amp; 0 \\&lt;br /&gt;
0 &amp;amp; 0 &amp;amp; 3 &amp;amp; 0 \\&lt;br /&gt;
0 &amp;amp; 4 &amp;amp; 0 &amp;amp; 0 \\&lt;br /&gt;
\end{pmatrix}&amp;lt;/math&amp;gt;,&lt;br /&gt;
 представляемая в формате CSR &lt;br /&gt;
    A  = [ 1 2 3 4 ]&lt;br /&gt;
    IA = [ 0 1 2 3 4 ]&lt;br /&gt;
    JA = [ 3 0 2 1 ]&lt;br /&gt;
&lt;br /&gt;
&lt;br /&gt;
Вычисляемые данные: вектор  &amp;lt;math&amp;gt;M*x=y&amp;lt;/math&amp;gt;&lt;br /&gt;
&lt;br /&gt;
=== Вычислительное ядро алгоритма ===&lt;br /&gt;
&lt;br /&gt;
:&amp;lt;math&amp;gt;y_i = \sum_{k = IA_i}^{IA_{i+1}} A_k x_{JA_k}&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;
    число строк матрицы &#039;&#039;n&#039;&#039;; &lt;br /&gt;
    разреженная матрица в формате CSR:&lt;br /&gt;
      строчные указатели &#039;&#039;IA&#039;&#039;,&lt;br /&gt;
      столбцовые указатели&#039;&#039;JA&#039;&#039;, &lt;br /&gt;
      ненулевые элементы &#039;&#039;A&#039;&#039;;&lt;br /&gt;
    вектор &#039;&#039;x&#039;&#039;.&lt;br /&gt;
  &#039;&#039;&#039;Выходные данные&#039;&#039;&#039;: произведение матрицы на вектор &#039;&#039;y&#039;&#039;.&lt;br /&gt;
  &#039;&#039;&#039;read CSR&#039;&#039;&#039; &#039;&#039;n&#039;&#039;, &#039;&#039;IA&#039;&#039;, &#039;&#039;JA&#039;&#039;, &#039;&#039;A&#039;&#039;;&lt;br /&gt;
  &#039;&#039;&#039;read&#039;&#039;&#039; &#039;&#039;x&#039;&#039;&lt;br /&gt;
  &#039;&#039;&#039;for&#039;&#039;&#039; &#039;&#039;i&#039;&#039; = 1,n:&lt;br /&gt;
    &#039;&#039;&#039;for&#039;&#039;&#039; &#039;&#039;k&#039;&#039; = &#039;&#039;IA(i)&#039;&#039;, &#039;&#039;IA(i+1)-1&#039;&#039;:&lt;br /&gt;
            &#039;&#039;y(i)&#039;&#039; += &#039;&#039;A(k)&#039;&#039;*&#039;&#039;x(JA(k))&#039;&#039;;&lt;br /&gt;
  &#039;&#039;&#039;write&#039;&#039;&#039; &#039;&#039;y&#039;&#039;;&lt;br /&gt;
&lt;br /&gt;
=== Схема реализации последовательного алгоритма ===&lt;br /&gt;
Метод можно описать следующим образом:&lt;br /&gt;
# привести матрицу к формату CSR&lt;br /&gt;
# для &amp;lt;math&amp;gt;i&amp;lt;/math&amp;gt; от &amp;lt;math&amp;gt;0&amp;lt;/math&amp;gt; до &amp;lt;math&amp;gt;n-1&amp;lt;/math&amp;gt; вычислить &amp;lt;math&amp;gt;н_i&amp;lt;/math&amp;gt; произведение по формуле&lt;br /&gt;
&lt;br /&gt;
=== Последовательная сложность алгоритма ===&lt;br /&gt;
Для вычисления матрично-векторного произведения матрицы размера &amp;lt;math&amp;gt;n*n&amp;lt;/math&amp;gt; и вектора размера n в последовательном варианте требуется:&lt;br /&gt;
&lt;br /&gt;
* &amp;lt;math&amp;gt;&amp;lt;/math&amp;gt; сложений,&lt;br /&gt;
* &amp;lt;math&amp;gt;nnz&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;
Последовательная реализация реализована в пакете SPARSKIT&lt;br /&gt;
&lt;br /&gt;
== Литература ==&lt;br /&gt;
[1] С. Писсанецки. Технология разреженных матриц. Изд. Мир, 1988.&lt;/div&gt;</summary>
		<author><name>Екатерина Буторина</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:%D0%A0%D1%83%D1%84%D0%B8%D0%BD%D0%B0_%D0%A2%D1%80%D0%B5%D1%82%D1%8C%D1%8F%D0%BA%D0%BE%D0%B2%D0%B0/%D0%A5%D1%80%D0%B0%D0%BD%D0%B5%D0%BD%D0%B8%D0%B5_%D0%BD%D0%B5%D0%BD%D1%83%D0%BB%D0%B5%D0%B2%D1%8B%D1%85_%D1%8D%D0%BB%D0%B5%D0%BC%D0%B5%D0%BD%D1%82%D0%BE%D0%B2_%D1%80%D0%B0%D0%B7%D1%80%D0%B5%D0%B6%D0%B5%D0%BD%D0%BD%D1%8B%D1%85_%D0%BC%D0%B0%D1%82%D1%80%D0%B8%D1%86._%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=6171</id>
		<title>Участник:Руфина Третьякова/Хранение ненулевых элементов разреженных матриц. Умножение разреженной матрицы на вектор</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:%D0%A0%D1%83%D1%84%D0%B8%D0%BD%D0%B0_%D0%A2%D1%80%D0%B5%D1%82%D1%8C%D1%8F%D0%BA%D0%BE%D0%B2%D0%B0/%D0%A5%D1%80%D0%B0%D0%BD%D0%B5%D0%BD%D0%B8%D0%B5_%D0%BD%D0%B5%D0%BD%D1%83%D0%BB%D0%B5%D0%B2%D1%8B%D1%85_%D1%8D%D0%BB%D0%B5%D0%BC%D0%B5%D0%BD%D1%82%D0%BE%D0%B2_%D1%80%D0%B0%D0%B7%D1%80%D0%B5%D0%B6%D0%B5%D0%BD%D0%BD%D1%8B%D1%85_%D0%BC%D0%B0%D1%82%D1%80%D0%B8%D1%86._%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=6171"/>
		<updated>2016-10-12T21:53:06Z</updated>

		<summary type="html">&lt;p&gt;Екатерина Буторина: /* Последовательная сложность алгоритма */&lt;/p&gt;
&lt;hr /&gt;
&lt;div&gt;{{algorithm&lt;br /&gt;
| name              = Умножение разреженной матрицы на вектор&lt;br /&gt;
| serial_complexity = &amp;lt;math&amp;gt;nnz&amp;lt;/math&amp;gt;&lt;br /&gt;
| pf_height         = &amp;lt;math&amp;gt;&amp;lt;/math&amp;gt;&lt;br /&gt;
| pf_width          = &amp;lt;math&amp;gt;&amp;lt;/math&amp;gt;&lt;br /&gt;
| input_data        = &amp;lt;math&amp;gt;2nnz+n+1&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;
Авторы статьи: [[Участница:Руфина_Третьякова|Третьякова Р. М.]] (группа 603), [[Участница:Екатерина_Буторина|Буторина Е. В.]] (группа 603)&lt;br /&gt;
&lt;br /&gt;
&lt;br /&gt;
&lt;br /&gt;
== Свойства и структура алгоритма ==&lt;br /&gt;
&lt;br /&gt;
=== Общее описание алгоритма ===&lt;br /&gt;
Разрежённая матрица — это матрица с преимущественно нулевыми элементами. В противном случае, если бо́льшая часть элементов матрицы ненулевые, матрица считается плотной.&lt;br /&gt;
Среди специалистов нет единства в определении того, какое именно количество ненулевых элементов делает матрицу разрежённой. Разные авторы предлагают различные варианты. &lt;br /&gt;
Огромные разрежённые матрицы часто возникают при решении таких задач, как дифференциальное уравнение в частных производных.&lt;br /&gt;
При хранении и преобразовании разрежённых матриц в компьютере бывает полезно, а часто и необходимо, использовать специальные алгоритмы и структуры данных, которые учитывают разрежённую структуру матрицы. Операции и алгоритмы, применяемые для работы с обычными, плотными матрицами, применительно к большим разрежённым матрицам работают относительно медленно и требуют значительных объёмов памяти. Однако разрежённые матрицы могут быть легко сжаты путём записи только своих ненулевых элементов, что снижает требования к компьютерной памяти.&lt;br /&gt;
&lt;br /&gt;
=== Математическое описание алгоритма ===&lt;br /&gt;
Исходные данные:  разреженная матрица &amp;lt;math&amp;gt;M^{n*n}&amp;lt;/math&amp;gt;, вектор &amp;lt;math&amp;gt;x^{n*1}&amp;lt;/math&amp;gt; &lt;br /&gt;
&lt;br /&gt;
Наиболее удобным форматом для вычисления произведения матрицы на вектор является &amp;quot;Compressed Sparse Row&amp;quot; или сокращенно CSR-формат.&lt;br /&gt;
&lt;br /&gt;
Рассмотрим CSR-представление разреженной матрицы: пусть число ненулевых элементов матрицы равно &amp;lt;math&amp;gt;nnz&amp;lt;/math&amp;gt;&lt;br /&gt;
CSR-формат представляет матрицу &amp;lt;math&amp;gt;M&amp;lt;/math&amp;gt; в виде 3-х одномерных массивов:&lt;br /&gt;
&lt;br /&gt;
массив &amp;lt;math&amp;gt;A&amp;lt;/math&amp;gt; размера &amp;lt;math&amp;gt;nnz&amp;lt;/math&amp;gt; содержит ненулевые значения матрицы,&lt;br /&gt;
&amp;lt;math&amp;gt;JA&amp;lt;/math&amp;gt; размера &amp;lt;math&amp;gt;nnz&amp;lt;/math&amp;gt; - номера столбцов ненулевых элементов., &lt;br /&gt;
&amp;lt;math&amp;gt;IA&amp;lt;/math&amp;gt; размера &amp;lt;math&amp;gt;n&amp;lt;/math&amp;gt;- содержит номер с которого начинается описание элементов строки в массивах &amp;lt;math&amp;gt;A&amp;lt;/math&amp;gt; и &amp;lt;math&amp;gt;JA&amp;lt;/math&amp;gt;.&lt;br /&gt;
Этот формат позволяет производить перемножение матрицы &amp;lt;math&amp;gt;M&amp;lt;/math&amp;gt; на вектор &amp;lt;math&amp;gt;x&amp;lt;/math&amp;gt; за &amp;lt;math&amp;gt;O(nnz)&amp;lt;/math&amp;gt; умножений и сложений. &lt;br /&gt;
&lt;br /&gt;
Например, это разреженная матрица с 4-мя ненулевыми элементами&lt;br /&gt;
:: &amp;lt;math&amp;gt;\begin{pmatrix}&lt;br /&gt;
0 &amp;amp; 0 &amp;amp; 0 &amp;amp; 1 \\&lt;br /&gt;
2 &amp;amp; 0 &amp;amp; 0 &amp;amp; 0 \\&lt;br /&gt;
0 &amp;amp; 0 &amp;amp; 3 &amp;amp; 0 \\&lt;br /&gt;
0 &amp;amp; 4 &amp;amp; 0 &amp;amp; 0 \\&lt;br /&gt;
\end{pmatrix}&amp;lt;/math&amp;gt;,&lt;br /&gt;
 представляемая в формате CSR &lt;br /&gt;
    A  = [ 1 2 3 4 ]&lt;br /&gt;
    IA = [ 0 1 2 3 4 ]&lt;br /&gt;
    JA = [ 3 0 2 1 ]&lt;br /&gt;
&lt;br /&gt;
&lt;br /&gt;
Вычисляемые данные: вектор  &amp;lt;math&amp;gt;M*x=y&amp;lt;/math&amp;gt;&lt;br /&gt;
&lt;br /&gt;
=== Вычислительное ядро алгоритма ===&lt;br /&gt;
&lt;br /&gt;
:&amp;lt;math&amp;gt;y_i = \sum_{k = IA_i}^{IA_{i+1}} A_k x_{JA_k}&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;
    число строк матрицы &#039;&#039;n&#039;&#039;; &lt;br /&gt;
    разреженная матрица в формате CSR:&lt;br /&gt;
      строчные указатели &#039;&#039;IA&#039;&#039;,&lt;br /&gt;
      столбцовые указатели&#039;&#039;JA&#039;&#039;, &lt;br /&gt;
      ненулевые элементы &#039;&#039;A&#039;&#039;;&lt;br /&gt;
    вектор &#039;&#039;x&#039;&#039;.&lt;br /&gt;
  &#039;&#039;&#039;Выходные данные&#039;&#039;&#039;: произведение матрицы на вектор &#039;&#039;y&#039;&#039;.&lt;br /&gt;
  &#039;&#039;&#039;read CSR&#039;&#039;&#039; &#039;&#039;n&#039;&#039;, &#039;&#039;IA&#039;&#039;, &#039;&#039;JA&#039;&#039;, &#039;&#039;A&#039;&#039;;&lt;br /&gt;
  &#039;&#039;&#039;read&#039;&#039;&#039; &#039;&#039;x&#039;&#039;&lt;br /&gt;
  &#039;&#039;&#039;for&#039;&#039;&#039; &#039;&#039;i&#039;&#039; = 1,n:&lt;br /&gt;
    &#039;&#039;&#039;for&#039;&#039;&#039; &#039;&#039;k&#039;&#039; = &#039;&#039;IA(i)&#039;&#039;, &#039;&#039;IA(i+1)-1&#039;&#039;:&lt;br /&gt;
            &#039;&#039;y(i)&#039;&#039; += &#039;&#039;A(k)&#039;&#039;*&#039;&#039;x(JA(k))&#039;&#039;;&lt;br /&gt;
  &#039;&#039;&#039;write&#039;&#039;&#039; &#039;&#039;y&#039;&#039;;&lt;br /&gt;
&lt;br /&gt;
=== Схема реализации последовательного алгоритма ===&lt;br /&gt;
Метод можно описать следующим образом:&lt;br /&gt;
# привести матрицу к формату CSR&lt;br /&gt;
# для &amp;lt;math&amp;gt;i&amp;lt;/math&amp;gt; от &amp;lt;math&amp;gt;0&amp;lt;/math&amp;gt; до &amp;lt;math&amp;gt;n-1&amp;lt;/math&amp;gt; вычислить &amp;lt;math&amp;gt;н_i&amp;lt;/math&amp;gt; произведение по формуле&lt;br /&gt;
&lt;br /&gt;
=== Последовательная сложность алгоритма ===&lt;br /&gt;
Для вычисления матрично-векторного произведения матрицы размера n*n и вектора размера n в последовательном варианте требуется:&lt;br /&gt;
&lt;br /&gt;
* &amp;lt;math&amp;gt;&amp;lt;/math&amp;gt; сложений,&lt;br /&gt;
* &amp;lt;math&amp;gt;nnz&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;
Последовательная реализация реализована в пакете SPARSKIT&lt;br /&gt;
&lt;br /&gt;
== Литература ==&lt;br /&gt;
[1] С. Писсанецки. Технология разреженных матриц. Изд. Мир, 1988.&lt;/div&gt;</summary>
		<author><name>Екатерина Буторина</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:%D0%A0%D1%83%D1%84%D0%B8%D0%BD%D0%B0_%D0%A2%D1%80%D0%B5%D1%82%D1%8C%D1%8F%D0%BA%D0%BE%D0%B2%D0%B0/%D0%A5%D1%80%D0%B0%D0%BD%D0%B5%D0%BD%D0%B8%D0%B5_%D0%BD%D0%B5%D0%BD%D1%83%D0%BB%D0%B5%D0%B2%D1%8B%D1%85_%D1%8D%D0%BB%D0%B5%D0%BC%D0%B5%D0%BD%D1%82%D0%BE%D0%B2_%D1%80%D0%B0%D0%B7%D1%80%D0%B5%D0%B6%D0%B5%D0%BD%D0%BD%D1%8B%D1%85_%D0%BC%D0%B0%D1%82%D1%80%D0%B8%D1%86._%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=6168</id>
		<title>Участник:Руфина Третьякова/Хранение ненулевых элементов разреженных матриц. Умножение разреженной матрицы на вектор</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:%D0%A0%D1%83%D1%84%D0%B8%D0%BD%D0%B0_%D0%A2%D1%80%D0%B5%D1%82%D1%8C%D1%8F%D0%BA%D0%BE%D0%B2%D0%B0/%D0%A5%D1%80%D0%B0%D0%BD%D0%B5%D0%BD%D0%B8%D0%B5_%D0%BD%D0%B5%D0%BD%D1%83%D0%BB%D0%B5%D0%B2%D1%8B%D1%85_%D1%8D%D0%BB%D0%B5%D0%BC%D0%B5%D0%BD%D1%82%D0%BE%D0%B2_%D1%80%D0%B0%D0%B7%D1%80%D0%B5%D0%B6%D0%B5%D0%BD%D0%BD%D1%8B%D1%85_%D0%BC%D0%B0%D1%82%D1%80%D0%B8%D1%86._%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=6168"/>
		<updated>2016-10-12T21:51:27Z</updated>

		<summary type="html">&lt;p&gt;Екатерина Буторина: /* Литература */&lt;/p&gt;
&lt;hr /&gt;
&lt;div&gt;{{algorithm&lt;br /&gt;
| name              = Умножение разреженной матрицы на вектор&lt;br /&gt;
| serial_complexity = &amp;lt;math&amp;gt;nnz&amp;lt;/math&amp;gt;&lt;br /&gt;
| pf_height         = &amp;lt;math&amp;gt;&amp;lt;/math&amp;gt;&lt;br /&gt;
| pf_width          = &amp;lt;math&amp;gt;&amp;lt;/math&amp;gt;&lt;br /&gt;
| input_data        = &amp;lt;math&amp;gt;2nnz+n+1&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;
Авторы статьи: [[Участница:Руфина_Третьякова|Третьякова Р. М.]] (группа 603), [[Участница:Екатерина_Буторина|Буторина Е. В.]] (группа 603)&lt;br /&gt;
&lt;br /&gt;
&lt;br /&gt;
&lt;br /&gt;
== Свойства и структура алгоритма ==&lt;br /&gt;
&lt;br /&gt;
=== Общее описание алгоритма ===&lt;br /&gt;
Разрежённая матрица — это матрица с преимущественно нулевыми элементами. В противном случае, если бо́льшая часть элементов матрицы ненулевые, матрица считается плотной.&lt;br /&gt;
Среди специалистов нет единства в определении того, какое именно количество ненулевых элементов делает матрицу разрежённой. Разные авторы предлагают различные варианты. &lt;br /&gt;
Огромные разрежённые матрицы часто возникают при решении таких задач, как дифференциальное уравнение в частных производных.&lt;br /&gt;
При хранении и преобразовании разрежённых матриц в компьютере бывает полезно, а часто и необходимо, использовать специальные алгоритмы и структуры данных, которые учитывают разрежённую структуру матрицы. Операции и алгоритмы, применяемые для работы с обычными, плотными матрицами, применительно к большим разрежённым матрицам работают относительно медленно и требуют значительных объёмов памяти. Однако разрежённые матрицы могут быть легко сжаты путём записи только своих ненулевых элементов, что снижает требования к компьютерной памяти.&lt;br /&gt;
&lt;br /&gt;
=== Математическое описание алгоритма ===&lt;br /&gt;
Исходные данные:  разреженная матрица &amp;lt;math&amp;gt;M^{n*n}&amp;lt;/math&amp;gt;, вектор &amp;lt;math&amp;gt;x^{n*1}&amp;lt;/math&amp;gt; &lt;br /&gt;
&lt;br /&gt;
Наиболее удобным форматом для вычисления произведения матрицы на вектор является &amp;quot;Compressed Sparse Row&amp;quot; или сокращенно CSR-формат.&lt;br /&gt;
&lt;br /&gt;
Рассмотрим CSR-представление разреженной матрицы: пусть число ненулевых элементов матрицы равно &amp;lt;math&amp;gt;nnz&amp;lt;/math&amp;gt;&lt;br /&gt;
CSR-формат представляет матрицу &amp;lt;math&amp;gt;M&amp;lt;/math&amp;gt; в виде 3-х одномерных массивов:&lt;br /&gt;
&lt;br /&gt;
массив &amp;lt;math&amp;gt;A&amp;lt;/math&amp;gt; размера &amp;lt;math&amp;gt;nnz&amp;lt;/math&amp;gt; содержит ненулевые значения матрицы,&lt;br /&gt;
&amp;lt;math&amp;gt;JA&amp;lt;/math&amp;gt; размера &amp;lt;math&amp;gt;nnz&amp;lt;/math&amp;gt; - номера столбцов ненулевых элементов., &lt;br /&gt;
&amp;lt;math&amp;gt;IA&amp;lt;/math&amp;gt; размера &amp;lt;math&amp;gt;n&amp;lt;/math&amp;gt;- содержит номер с которого начинается описание элементов строки в массивах &amp;lt;math&amp;gt;A&amp;lt;/math&amp;gt; и &amp;lt;math&amp;gt;JA&amp;lt;/math&amp;gt;.&lt;br /&gt;
Этот формат позволяет производить перемножение матрицы &amp;lt;math&amp;gt;M&amp;lt;/math&amp;gt; на вектор &amp;lt;math&amp;gt;x&amp;lt;/math&amp;gt; за &amp;lt;math&amp;gt;O(nnz)&amp;lt;/math&amp;gt; умножений и сложений. &lt;br /&gt;
&lt;br /&gt;
Например, это разреженная матрица с 4-мя ненулевыми элементами&lt;br /&gt;
:: &amp;lt;math&amp;gt;\begin{pmatrix}&lt;br /&gt;
0 &amp;amp; 0 &amp;amp; 0 &amp;amp; 1 \\&lt;br /&gt;
2 &amp;amp; 0 &amp;amp; 0 &amp;amp; 0 \\&lt;br /&gt;
0 &amp;amp; 0 &amp;amp; 3 &amp;amp; 0 \\&lt;br /&gt;
0 &amp;amp; 4 &amp;amp; 0 &amp;amp; 0 \\&lt;br /&gt;
\end{pmatrix}&amp;lt;/math&amp;gt;,&lt;br /&gt;
 представляемая в формате CSR &lt;br /&gt;
    A  = [ 1 2 3 4 ]&lt;br /&gt;
    IA = [ 0 1 2 3 4 ]&lt;br /&gt;
    JA = [ 3 0 2 1 ]&lt;br /&gt;
&lt;br /&gt;
&lt;br /&gt;
Вычисляемые данные: вектор  &amp;lt;math&amp;gt;M*x=y&amp;lt;/math&amp;gt;&lt;br /&gt;
&lt;br /&gt;
=== Вычислительное ядро алгоритма ===&lt;br /&gt;
&lt;br /&gt;
:&amp;lt;math&amp;gt;y_i = \sum_{k = IA_i}^{IA_{i+1}} A_k x_{JA_k}&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;
    число строк матрицы &#039;&#039;n&#039;&#039;; &lt;br /&gt;
    разреженная матрица в формате CSR:&lt;br /&gt;
      строчные указатели &#039;&#039;IA&#039;&#039;,&lt;br /&gt;
      столбцовые указатели&#039;&#039;JA&#039;&#039;, &lt;br /&gt;
      ненулевые элементы &#039;&#039;A&#039;&#039;;&lt;br /&gt;
    вектор &#039;&#039;x&#039;&#039;.&lt;br /&gt;
  &#039;&#039;&#039;Выходные данные&#039;&#039;&#039;: произведение матрицы на вектор &#039;&#039;y&#039;&#039;.&lt;br /&gt;
  &#039;&#039;&#039;read CSR&#039;&#039;&#039; &#039;&#039;n&#039;&#039;, &#039;&#039;IA&#039;&#039;, &#039;&#039;JA&#039;&#039;, &#039;&#039;A&#039;&#039;;&lt;br /&gt;
  &#039;&#039;&#039;read&#039;&#039;&#039; &#039;&#039;x&#039;&#039;&lt;br /&gt;
  &#039;&#039;&#039;for&#039;&#039;&#039; &#039;&#039;i&#039;&#039; = 1,n:&lt;br /&gt;
    &#039;&#039;&#039;for&#039;&#039;&#039; &#039;&#039;k&#039;&#039; = &#039;&#039;IA(i)&#039;&#039;, &#039;&#039;IA(i+1)-1&#039;&#039;:&lt;br /&gt;
            &#039;&#039;y(i)&#039;&#039; += &#039;&#039;A(k)&#039;&#039;*&#039;&#039;x(JA(k))&#039;&#039;;&lt;br /&gt;
  &#039;&#039;&#039;write&#039;&#039;&#039; &#039;&#039;y&#039;&#039;;&lt;br /&gt;
&lt;br /&gt;
=== Схема реализации последовательного алгоритма ===&lt;br /&gt;
Метод можно описать следующим образом:&lt;br /&gt;
&lt;br /&gt;
&lt;br /&gt;
=== Последовательная сложность алгоритма ===&lt;br /&gt;
Для вычисления сингулярных чисел и векторов матрицы порядка n в последовательном варианте требуется:&lt;br /&gt;
&lt;br /&gt;
* &amp;lt;math&amp;gt;&amp;lt;/math&amp;gt; делений,&lt;br /&gt;
* &amp;lt;math&amp;gt;&amp;lt;/math&amp;gt; сложений (вычитаний),&lt;br /&gt;
* &amp;lt;math&amp;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;
== Программная реализация алгоритма ==&lt;br /&gt;
&lt;br /&gt;
=== Масштабируемость алгоритма и его реализации ===&lt;br /&gt;
&lt;br /&gt;
=== Существующие реализации алгоритма ===&lt;br /&gt;
Последовательная реализация реализована в пакете SPARSKIT&lt;br /&gt;
&lt;br /&gt;
== Литература ==&lt;br /&gt;
[1] С. Писсанецки. Технология разреженных матриц. Изд. Мир, 1988.&lt;/div&gt;</summary>
		<author><name>Екатерина Буторина</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:%D0%A0%D1%83%D1%84%D0%B8%D0%BD%D0%B0_%D0%A2%D1%80%D0%B5%D1%82%D1%8C%D1%8F%D0%BA%D0%BE%D0%B2%D0%B0/%D0%A5%D1%80%D0%B0%D0%BD%D0%B5%D0%BD%D0%B8%D0%B5_%D0%BD%D0%B5%D0%BD%D1%83%D0%BB%D0%B5%D0%B2%D1%8B%D1%85_%D1%8D%D0%BB%D0%B5%D0%BC%D0%B5%D0%BD%D1%82%D0%BE%D0%B2_%D1%80%D0%B0%D0%B7%D1%80%D0%B5%D0%B6%D0%B5%D0%BD%D0%BD%D1%8B%D1%85_%D0%BC%D0%B0%D1%82%D1%80%D0%B8%D1%86._%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=6166</id>
		<title>Участник:Руфина Третьякова/Хранение ненулевых элементов разреженных матриц. Умножение разреженной матрицы на вектор</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:%D0%A0%D1%83%D1%84%D0%B8%D0%BD%D0%B0_%D0%A2%D1%80%D0%B5%D1%82%D1%8C%D1%8F%D0%BA%D0%BE%D0%B2%D0%B0/%D0%A5%D1%80%D0%B0%D0%BD%D0%B5%D0%BD%D0%B8%D0%B5_%D0%BD%D0%B5%D0%BD%D1%83%D0%BB%D0%B5%D0%B2%D1%8B%D1%85_%D1%8D%D0%BB%D0%B5%D0%BC%D0%B5%D0%BD%D1%82%D0%BE%D0%B2_%D1%80%D0%B0%D0%B7%D1%80%D0%B5%D0%B6%D0%B5%D0%BD%D0%BD%D1%8B%D1%85_%D0%BC%D0%B0%D1%82%D1%80%D0%B8%D1%86._%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=6166"/>
		<updated>2016-10-12T21:51:06Z</updated>

		<summary type="html">&lt;p&gt;Екатерина Буторина: /* Литература */&lt;/p&gt;
&lt;hr /&gt;
&lt;div&gt;{{algorithm&lt;br /&gt;
| name              = Умножение разреженной матрицы на вектор&lt;br /&gt;
| serial_complexity = &amp;lt;math&amp;gt;nnz&amp;lt;/math&amp;gt;&lt;br /&gt;
| pf_height         = &amp;lt;math&amp;gt;&amp;lt;/math&amp;gt;&lt;br /&gt;
| pf_width          = &amp;lt;math&amp;gt;&amp;lt;/math&amp;gt;&lt;br /&gt;
| input_data        = &amp;lt;math&amp;gt;2nnz+n+1&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;
Авторы статьи: [[Участница:Руфина_Третьякова|Третьякова Р. М.]] (группа 603), [[Участница:Екатерина_Буторина|Буторина Е. В.]] (группа 603)&lt;br /&gt;
&lt;br /&gt;
&lt;br /&gt;
&lt;br /&gt;
== Свойства и структура алгоритма ==&lt;br /&gt;
&lt;br /&gt;
=== Общее описание алгоритма ===&lt;br /&gt;
Разрежённая матрица — это матрица с преимущественно нулевыми элементами. В противном случае, если бо́льшая часть элементов матрицы ненулевые, матрица считается плотной.&lt;br /&gt;
Среди специалистов нет единства в определении того, какое именно количество ненулевых элементов делает матрицу разрежённой. Разные авторы предлагают различные варианты. &lt;br /&gt;
Огромные разрежённые матрицы часто возникают при решении таких задач, как дифференциальное уравнение в частных производных.&lt;br /&gt;
При хранении и преобразовании разрежённых матриц в компьютере бывает полезно, а часто и необходимо, использовать специальные алгоритмы и структуры данных, которые учитывают разрежённую структуру матрицы. Операции и алгоритмы, применяемые для работы с обычными, плотными матрицами, применительно к большим разрежённым матрицам работают относительно медленно и требуют значительных объёмов памяти. Однако разрежённые матрицы могут быть легко сжаты путём записи только своих ненулевых элементов, что снижает требования к компьютерной памяти.&lt;br /&gt;
&lt;br /&gt;
=== Математическое описание алгоритма ===&lt;br /&gt;
Исходные данные:  разреженная матрица &amp;lt;math&amp;gt;M^{n*n}&amp;lt;/math&amp;gt;, вектор &amp;lt;math&amp;gt;x^{n*1}&amp;lt;/math&amp;gt; &lt;br /&gt;
&lt;br /&gt;
Наиболее удобным форматом для вычисления произведения матрицы на вектор является &amp;quot;Compressed Sparse Row&amp;quot; или сокращенно CSR-формат.&lt;br /&gt;
&lt;br /&gt;
Рассмотрим CSR-представление разреженной матрицы: пусть число ненулевых элементов матрицы равно &amp;lt;math&amp;gt;nnz&amp;lt;/math&amp;gt;&lt;br /&gt;
CSR-формат представляет матрицу &amp;lt;math&amp;gt;M&amp;lt;/math&amp;gt; в виде 3-х одномерных массивов:&lt;br /&gt;
&lt;br /&gt;
массив &amp;lt;math&amp;gt;A&amp;lt;/math&amp;gt; размера &amp;lt;math&amp;gt;nnz&amp;lt;/math&amp;gt; содержит ненулевые значения матрицы,&lt;br /&gt;
&amp;lt;math&amp;gt;JA&amp;lt;/math&amp;gt; размера &amp;lt;math&amp;gt;nnz&amp;lt;/math&amp;gt; - номера столбцов ненулевых элементов., &lt;br /&gt;
&amp;lt;math&amp;gt;IA&amp;lt;/math&amp;gt; размера &amp;lt;math&amp;gt;n&amp;lt;/math&amp;gt;- содержит номер с которого начинается описание элементов строки в массивах &amp;lt;math&amp;gt;A&amp;lt;/math&amp;gt; и &amp;lt;math&amp;gt;JA&amp;lt;/math&amp;gt;.&lt;br /&gt;
Этот формат позволяет производить перемножение матрицы &amp;lt;math&amp;gt;M&amp;lt;/math&amp;gt; на вектор &amp;lt;math&amp;gt;x&amp;lt;/math&amp;gt; за &amp;lt;math&amp;gt;O(nnz)&amp;lt;/math&amp;gt; умножений и сложений. &lt;br /&gt;
&lt;br /&gt;
Например, это разреженная матрица с 4-мя ненулевыми элементами&lt;br /&gt;
:: &amp;lt;math&amp;gt;\begin{pmatrix}&lt;br /&gt;
0 &amp;amp; 0 &amp;amp; 0 &amp;amp; 1 \\&lt;br /&gt;
2 &amp;amp; 0 &amp;amp; 0 &amp;amp; 0 \\&lt;br /&gt;
0 &amp;amp; 0 &amp;amp; 3 &amp;amp; 0 \\&lt;br /&gt;
0 &amp;amp; 4 &amp;amp; 0 &amp;amp; 0 \\&lt;br /&gt;
\end{pmatrix}&amp;lt;/math&amp;gt;,&lt;br /&gt;
 представляемая в формате CSR &lt;br /&gt;
    A  = [ 1 2 3 4 ]&lt;br /&gt;
    IA = [ 0 1 2 3 4 ]&lt;br /&gt;
    JA = [ 3 0 2 1 ]&lt;br /&gt;
&lt;br /&gt;
&lt;br /&gt;
Вычисляемые данные: вектор  &amp;lt;math&amp;gt;M*x=y&amp;lt;/math&amp;gt;&lt;br /&gt;
&lt;br /&gt;
=== Вычислительное ядро алгоритма ===&lt;br /&gt;
&lt;br /&gt;
:&amp;lt;math&amp;gt;y_i = \sum_{k = IA_i}^{IA_{i+1}} A_k x_{JA_k}&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;
    число строк матрицы &#039;&#039;n&#039;&#039;; &lt;br /&gt;
    разреженная матрица в формате CSR:&lt;br /&gt;
      строчные указатели &#039;&#039;IA&#039;&#039;,&lt;br /&gt;
      столбцовые указатели&#039;&#039;JA&#039;&#039;, &lt;br /&gt;
      ненулевые элементы &#039;&#039;A&#039;&#039;;&lt;br /&gt;
    вектор &#039;&#039;x&#039;&#039;.&lt;br /&gt;
  &#039;&#039;&#039;Выходные данные&#039;&#039;&#039;: произведение матрицы на вектор &#039;&#039;y&#039;&#039;.&lt;br /&gt;
  &#039;&#039;&#039;read CSR&#039;&#039;&#039; &#039;&#039;n&#039;&#039;, &#039;&#039;IA&#039;&#039;, &#039;&#039;JA&#039;&#039;, &#039;&#039;A&#039;&#039;;&lt;br /&gt;
  &#039;&#039;&#039;read&#039;&#039;&#039; &#039;&#039;x&#039;&#039;&lt;br /&gt;
  &#039;&#039;&#039;for&#039;&#039;&#039; &#039;&#039;i&#039;&#039; = 1,n:&lt;br /&gt;
    &#039;&#039;&#039;for&#039;&#039;&#039; &#039;&#039;k&#039;&#039; = &#039;&#039;IA(i)&#039;&#039;, &#039;&#039;IA(i+1)-1&#039;&#039;:&lt;br /&gt;
            &#039;&#039;y(i)&#039;&#039; += &#039;&#039;A(k)&#039;&#039;*&#039;&#039;x(JA(k))&#039;&#039;;&lt;br /&gt;
  &#039;&#039;&#039;write&#039;&#039;&#039; &#039;&#039;y&#039;&#039;;&lt;br /&gt;
&lt;br /&gt;
=== Схема реализации последовательного алгоритма ===&lt;br /&gt;
Метод можно описать следующим образом:&lt;br /&gt;
&lt;br /&gt;
&lt;br /&gt;
=== Последовательная сложность алгоритма ===&lt;br /&gt;
Для вычисления сингулярных чисел и векторов матрицы порядка n в последовательном варианте требуется:&lt;br /&gt;
&lt;br /&gt;
* &amp;lt;math&amp;gt;&amp;lt;/math&amp;gt; делений,&lt;br /&gt;
* &amp;lt;math&amp;gt;&amp;lt;/math&amp;gt; сложений (вычитаний),&lt;br /&gt;
* &amp;lt;math&amp;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;
== Программная реализация алгоритма ==&lt;br /&gt;
&lt;br /&gt;
=== Масштабируемость алгоритма и его реализации ===&lt;br /&gt;
&lt;br /&gt;
=== Существующие реализации алгоритма ===&lt;br /&gt;
Последовательная реализация реализована в пакете SPARSKIT&lt;br /&gt;
&lt;br /&gt;
== Литература ==&lt;br /&gt;
1. С. Писсанецки. Технология разреженных матриц. Изд. Мир, 1988.&lt;/div&gt;</summary>
		<author><name>Екатерина Буторина</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:%D0%A0%D1%83%D1%84%D0%B8%D0%BD%D0%B0_%D0%A2%D1%80%D0%B5%D1%82%D1%8C%D1%8F%D0%BA%D0%BE%D0%B2%D0%B0/%D0%A5%D1%80%D0%B0%D0%BD%D0%B5%D0%BD%D0%B8%D0%B5_%D0%BD%D0%B5%D0%BD%D1%83%D0%BB%D0%B5%D0%B2%D1%8B%D1%85_%D1%8D%D0%BB%D0%B5%D0%BC%D0%B5%D0%BD%D1%82%D0%BE%D0%B2_%D1%80%D0%B0%D0%B7%D1%80%D0%B5%D0%B6%D0%B5%D0%BD%D0%BD%D1%8B%D1%85_%D0%BC%D0%B0%D1%82%D1%80%D0%B8%D1%86._%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=6165</id>
		<title>Участник:Руфина Третьякова/Хранение ненулевых элементов разреженных матриц. Умножение разреженной матрицы на вектор</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:%D0%A0%D1%83%D1%84%D0%B8%D0%BD%D0%B0_%D0%A2%D1%80%D0%B5%D1%82%D1%8C%D1%8F%D0%BA%D0%BE%D0%B2%D0%B0/%D0%A5%D1%80%D0%B0%D0%BD%D0%B5%D0%BD%D0%B8%D0%B5_%D0%BD%D0%B5%D0%BD%D1%83%D0%BB%D0%B5%D0%B2%D1%8B%D1%85_%D1%8D%D0%BB%D0%B5%D0%BC%D0%B5%D0%BD%D1%82%D0%BE%D0%B2_%D1%80%D0%B0%D0%B7%D1%80%D0%B5%D0%B6%D0%B5%D0%BD%D0%BD%D1%8B%D1%85_%D0%BC%D0%B0%D1%82%D1%80%D0%B8%D1%86._%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=6165"/>
		<updated>2016-10-12T21:50:42Z</updated>

		<summary type="html">&lt;p&gt;Екатерина Буторина: /* Существующие реализации алгоритма */&lt;/p&gt;
&lt;hr /&gt;
&lt;div&gt;{{algorithm&lt;br /&gt;
| name              = Умножение разреженной матрицы на вектор&lt;br /&gt;
| serial_complexity = &amp;lt;math&amp;gt;nnz&amp;lt;/math&amp;gt;&lt;br /&gt;
| pf_height         = &amp;lt;math&amp;gt;&amp;lt;/math&amp;gt;&lt;br /&gt;
| pf_width          = &amp;lt;math&amp;gt;&amp;lt;/math&amp;gt;&lt;br /&gt;
| input_data        = &amp;lt;math&amp;gt;2nnz+n+1&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;
Авторы статьи: [[Участница:Руфина_Третьякова|Третьякова Р. М.]] (группа 603), [[Участница:Екатерина_Буторина|Буторина Е. В.]] (группа 603)&lt;br /&gt;
&lt;br /&gt;
&lt;br /&gt;
&lt;br /&gt;
== Свойства и структура алгоритма ==&lt;br /&gt;
&lt;br /&gt;
=== Общее описание алгоритма ===&lt;br /&gt;
Разрежённая матрица — это матрица с преимущественно нулевыми элементами. В противном случае, если бо́льшая часть элементов матрицы ненулевые, матрица считается плотной.&lt;br /&gt;
Среди специалистов нет единства в определении того, какое именно количество ненулевых элементов делает матрицу разрежённой. Разные авторы предлагают различные варианты. &lt;br /&gt;
Огромные разрежённые матрицы часто возникают при решении таких задач, как дифференциальное уравнение в частных производных.&lt;br /&gt;
При хранении и преобразовании разрежённых матриц в компьютере бывает полезно, а часто и необходимо, использовать специальные алгоритмы и структуры данных, которые учитывают разрежённую структуру матрицы. Операции и алгоритмы, применяемые для работы с обычными, плотными матрицами, применительно к большим разрежённым матрицам работают относительно медленно и требуют значительных объёмов памяти. Однако разрежённые матрицы могут быть легко сжаты путём записи только своих ненулевых элементов, что снижает требования к компьютерной памяти.&lt;br /&gt;
&lt;br /&gt;
=== Математическое описание алгоритма ===&lt;br /&gt;
Исходные данные:  разреженная матрица &amp;lt;math&amp;gt;M^{n*n}&amp;lt;/math&amp;gt;, вектор &amp;lt;math&amp;gt;x^{n*1}&amp;lt;/math&amp;gt; &lt;br /&gt;
&lt;br /&gt;
Наиболее удобным форматом для вычисления произведения матрицы на вектор является &amp;quot;Compressed Sparse Row&amp;quot; или сокращенно CSR-формат.&lt;br /&gt;
&lt;br /&gt;
Рассмотрим CSR-представление разреженной матрицы: пусть число ненулевых элементов матрицы равно &amp;lt;math&amp;gt;nnz&amp;lt;/math&amp;gt;&lt;br /&gt;
CSR-формат представляет матрицу &amp;lt;math&amp;gt;M&amp;lt;/math&amp;gt; в виде 3-х одномерных массивов:&lt;br /&gt;
&lt;br /&gt;
массив &amp;lt;math&amp;gt;A&amp;lt;/math&amp;gt; размера &amp;lt;math&amp;gt;nnz&amp;lt;/math&amp;gt; содержит ненулевые значения матрицы,&lt;br /&gt;
&amp;lt;math&amp;gt;JA&amp;lt;/math&amp;gt; размера &amp;lt;math&amp;gt;nnz&amp;lt;/math&amp;gt; - номера столбцов ненулевых элементов., &lt;br /&gt;
&amp;lt;math&amp;gt;IA&amp;lt;/math&amp;gt; размера &amp;lt;math&amp;gt;n&amp;lt;/math&amp;gt;- содержит номер с которого начинается описание элементов строки в массивах &amp;lt;math&amp;gt;A&amp;lt;/math&amp;gt; и &amp;lt;math&amp;gt;JA&amp;lt;/math&amp;gt;.&lt;br /&gt;
Этот формат позволяет производить перемножение матрицы &amp;lt;math&amp;gt;M&amp;lt;/math&amp;gt; на вектор &amp;lt;math&amp;gt;x&amp;lt;/math&amp;gt; за &amp;lt;math&amp;gt;O(nnz)&amp;lt;/math&amp;gt; умножений и сложений. &lt;br /&gt;
&lt;br /&gt;
Например, это разреженная матрица с 4-мя ненулевыми элементами&lt;br /&gt;
:: &amp;lt;math&amp;gt;\begin{pmatrix}&lt;br /&gt;
0 &amp;amp; 0 &amp;amp; 0 &amp;amp; 1 \\&lt;br /&gt;
2 &amp;amp; 0 &amp;amp; 0 &amp;amp; 0 \\&lt;br /&gt;
0 &amp;amp; 0 &amp;amp; 3 &amp;amp; 0 \\&lt;br /&gt;
0 &amp;amp; 4 &amp;amp; 0 &amp;amp; 0 \\&lt;br /&gt;
\end{pmatrix}&amp;lt;/math&amp;gt;,&lt;br /&gt;
 представляемая в формате CSR &lt;br /&gt;
    A  = [ 1 2 3 4 ]&lt;br /&gt;
    IA = [ 0 1 2 3 4 ]&lt;br /&gt;
    JA = [ 3 0 2 1 ]&lt;br /&gt;
&lt;br /&gt;
&lt;br /&gt;
Вычисляемые данные: вектор  &amp;lt;math&amp;gt;M*x=y&amp;lt;/math&amp;gt;&lt;br /&gt;
&lt;br /&gt;
=== Вычислительное ядро алгоритма ===&lt;br /&gt;
&lt;br /&gt;
:&amp;lt;math&amp;gt;y_i = \sum_{k = IA_i}^{IA_{i+1}} A_k x_{JA_k}&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;
    число строк матрицы &#039;&#039;n&#039;&#039;; &lt;br /&gt;
    разреженная матрица в формате CSR:&lt;br /&gt;
      строчные указатели &#039;&#039;IA&#039;&#039;,&lt;br /&gt;
      столбцовые указатели&#039;&#039;JA&#039;&#039;, &lt;br /&gt;
      ненулевые элементы &#039;&#039;A&#039;&#039;;&lt;br /&gt;
    вектор &#039;&#039;x&#039;&#039;.&lt;br /&gt;
  &#039;&#039;&#039;Выходные данные&#039;&#039;&#039;: произведение матрицы на вектор &#039;&#039;y&#039;&#039;.&lt;br /&gt;
  &#039;&#039;&#039;read CSR&#039;&#039;&#039; &#039;&#039;n&#039;&#039;, &#039;&#039;IA&#039;&#039;, &#039;&#039;JA&#039;&#039;, &#039;&#039;A&#039;&#039;;&lt;br /&gt;
  &#039;&#039;&#039;read&#039;&#039;&#039; &#039;&#039;x&#039;&#039;&lt;br /&gt;
  &#039;&#039;&#039;for&#039;&#039;&#039; &#039;&#039;i&#039;&#039; = 1,n:&lt;br /&gt;
    &#039;&#039;&#039;for&#039;&#039;&#039; &#039;&#039;k&#039;&#039; = &#039;&#039;IA(i)&#039;&#039;, &#039;&#039;IA(i+1)-1&#039;&#039;:&lt;br /&gt;
            &#039;&#039;y(i)&#039;&#039; += &#039;&#039;A(k)&#039;&#039;*&#039;&#039;x(JA(k))&#039;&#039;;&lt;br /&gt;
  &#039;&#039;&#039;write&#039;&#039;&#039; &#039;&#039;y&#039;&#039;;&lt;br /&gt;
&lt;br /&gt;
=== Схема реализации последовательного алгоритма ===&lt;br /&gt;
Метод можно описать следующим образом:&lt;br /&gt;
&lt;br /&gt;
&lt;br /&gt;
=== Последовательная сложность алгоритма ===&lt;br /&gt;
Для вычисления сингулярных чисел и векторов матрицы порядка n в последовательном варианте требуется:&lt;br /&gt;
&lt;br /&gt;
* &amp;lt;math&amp;gt;&amp;lt;/math&amp;gt; делений,&lt;br /&gt;
* &amp;lt;math&amp;gt;&amp;lt;/math&amp;gt; сложений (вычитаний),&lt;br /&gt;
* &amp;lt;math&amp;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;
== Программная реализация алгоритма ==&lt;br /&gt;
&lt;br /&gt;
=== Масштабируемость алгоритма и его реализации ===&lt;br /&gt;
&lt;br /&gt;
=== Существующие реализации алгоритма ===&lt;br /&gt;
Последовательная реализация реализована в пакете SPARSKIT&lt;br /&gt;
&lt;br /&gt;
== Литература ==&lt;br /&gt;
1. С. Писсанецки Технология разреженных матриц. Изд. Мир, 1988.&lt;/div&gt;</summary>
		<author><name>Екатерина Буторина</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:%D0%A0%D1%83%D1%84%D0%B8%D0%BD%D0%B0_%D0%A2%D1%80%D0%B5%D1%82%D1%8C%D1%8F%D0%BA%D0%BE%D0%B2%D0%B0/%D0%A5%D1%80%D0%B0%D0%BD%D0%B5%D0%BD%D0%B8%D0%B5_%D0%BD%D0%B5%D0%BD%D1%83%D0%BB%D0%B5%D0%B2%D1%8B%D1%85_%D1%8D%D0%BB%D0%B5%D0%BC%D0%B5%D0%BD%D1%82%D0%BE%D0%B2_%D1%80%D0%B0%D0%B7%D1%80%D0%B5%D0%B6%D0%B5%D0%BD%D0%BD%D1%8B%D1%85_%D0%BC%D0%B0%D1%82%D1%80%D0%B8%D1%86._%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=6164</id>
		<title>Участник:Руфина Третьякова/Хранение ненулевых элементов разреженных матриц. Умножение разреженной матрицы на вектор</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:%D0%A0%D1%83%D1%84%D0%B8%D0%BD%D0%B0_%D0%A2%D1%80%D0%B5%D1%82%D1%8C%D1%8F%D0%BA%D0%BE%D0%B2%D0%B0/%D0%A5%D1%80%D0%B0%D0%BD%D0%B5%D0%BD%D0%B8%D0%B5_%D0%BD%D0%B5%D0%BD%D1%83%D0%BB%D0%B5%D0%B2%D1%8B%D1%85_%D1%8D%D0%BB%D0%B5%D0%BC%D0%B5%D0%BD%D1%82%D0%BE%D0%B2_%D1%80%D0%B0%D0%B7%D1%80%D0%B5%D0%B6%D0%B5%D0%BD%D0%BD%D1%8B%D1%85_%D0%BC%D0%B0%D1%82%D1%80%D0%B8%D1%86._%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=6164"/>
		<updated>2016-10-12T21:50:28Z</updated>

		<summary type="html">&lt;p&gt;Екатерина Буторина: /* Существующие реализации алгоритма */&lt;/p&gt;
&lt;hr /&gt;
&lt;div&gt;{{algorithm&lt;br /&gt;
| name              = Умножение разреженной матрицы на вектор&lt;br /&gt;
| serial_complexity = &amp;lt;math&amp;gt;nnz&amp;lt;/math&amp;gt;&lt;br /&gt;
| pf_height         = &amp;lt;math&amp;gt;&amp;lt;/math&amp;gt;&lt;br /&gt;
| pf_width          = &amp;lt;math&amp;gt;&amp;lt;/math&amp;gt;&lt;br /&gt;
| input_data        = &amp;lt;math&amp;gt;2nnz+n+1&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;
Авторы статьи: [[Участница:Руфина_Третьякова|Третьякова Р. М.]] (группа 603), [[Участница:Екатерина_Буторина|Буторина Е. В.]] (группа 603)&lt;br /&gt;
&lt;br /&gt;
&lt;br /&gt;
&lt;br /&gt;
== Свойства и структура алгоритма ==&lt;br /&gt;
&lt;br /&gt;
=== Общее описание алгоритма ===&lt;br /&gt;
Разрежённая матрица — это матрица с преимущественно нулевыми элементами. В противном случае, если бо́льшая часть элементов матрицы ненулевые, матрица считается плотной.&lt;br /&gt;
Среди специалистов нет единства в определении того, какое именно количество ненулевых элементов делает матрицу разрежённой. Разные авторы предлагают различные варианты. &lt;br /&gt;
Огромные разрежённые матрицы часто возникают при решении таких задач, как дифференциальное уравнение в частных производных.&lt;br /&gt;
При хранении и преобразовании разрежённых матриц в компьютере бывает полезно, а часто и необходимо, использовать специальные алгоритмы и структуры данных, которые учитывают разрежённую структуру матрицы. Операции и алгоритмы, применяемые для работы с обычными, плотными матрицами, применительно к большим разрежённым матрицам работают относительно медленно и требуют значительных объёмов памяти. Однако разрежённые матрицы могут быть легко сжаты путём записи только своих ненулевых элементов, что снижает требования к компьютерной памяти.&lt;br /&gt;
&lt;br /&gt;
=== Математическое описание алгоритма ===&lt;br /&gt;
Исходные данные:  разреженная матрица &amp;lt;math&amp;gt;M^{n*n}&amp;lt;/math&amp;gt;, вектор &amp;lt;math&amp;gt;x^{n*1}&amp;lt;/math&amp;gt; &lt;br /&gt;
&lt;br /&gt;
Наиболее удобным форматом для вычисления произведения матрицы на вектор является &amp;quot;Compressed Sparse Row&amp;quot; или сокращенно CSR-формат.&lt;br /&gt;
&lt;br /&gt;
Рассмотрим CSR-представление разреженной матрицы: пусть число ненулевых элементов матрицы равно &amp;lt;math&amp;gt;nnz&amp;lt;/math&amp;gt;&lt;br /&gt;
CSR-формат представляет матрицу &amp;lt;math&amp;gt;M&amp;lt;/math&amp;gt; в виде 3-х одномерных массивов:&lt;br /&gt;
&lt;br /&gt;
массив &amp;lt;math&amp;gt;A&amp;lt;/math&amp;gt; размера &amp;lt;math&amp;gt;nnz&amp;lt;/math&amp;gt; содержит ненулевые значения матрицы,&lt;br /&gt;
&amp;lt;math&amp;gt;JA&amp;lt;/math&amp;gt; размера &amp;lt;math&amp;gt;nnz&amp;lt;/math&amp;gt; - номера столбцов ненулевых элементов., &lt;br /&gt;
&amp;lt;math&amp;gt;IA&amp;lt;/math&amp;gt; размера &amp;lt;math&amp;gt;n&amp;lt;/math&amp;gt;- содержит номер с которого начинается описание элементов строки в массивах &amp;lt;math&amp;gt;A&amp;lt;/math&amp;gt; и &amp;lt;math&amp;gt;JA&amp;lt;/math&amp;gt;.&lt;br /&gt;
Этот формат позволяет производить перемножение матрицы &amp;lt;math&amp;gt;M&amp;lt;/math&amp;gt; на вектор &amp;lt;math&amp;gt;x&amp;lt;/math&amp;gt; за &amp;lt;math&amp;gt;O(nnz)&amp;lt;/math&amp;gt; умножений и сложений. &lt;br /&gt;
&lt;br /&gt;
Например, это разреженная матрица с 4-мя ненулевыми элементами&lt;br /&gt;
:: &amp;lt;math&amp;gt;\begin{pmatrix}&lt;br /&gt;
0 &amp;amp; 0 &amp;amp; 0 &amp;amp; 1 \\&lt;br /&gt;
2 &amp;amp; 0 &amp;amp; 0 &amp;amp; 0 \\&lt;br /&gt;
0 &amp;amp; 0 &amp;amp; 3 &amp;amp; 0 \\&lt;br /&gt;
0 &amp;amp; 4 &amp;amp; 0 &amp;amp; 0 \\&lt;br /&gt;
\end{pmatrix}&amp;lt;/math&amp;gt;,&lt;br /&gt;
 представляемая в формате CSR &lt;br /&gt;
    A  = [ 1 2 3 4 ]&lt;br /&gt;
    IA = [ 0 1 2 3 4 ]&lt;br /&gt;
    JA = [ 3 0 2 1 ]&lt;br /&gt;
&lt;br /&gt;
&lt;br /&gt;
Вычисляемые данные: вектор  &amp;lt;math&amp;gt;M*x=y&amp;lt;/math&amp;gt;&lt;br /&gt;
&lt;br /&gt;
=== Вычислительное ядро алгоритма ===&lt;br /&gt;
&lt;br /&gt;
:&amp;lt;math&amp;gt;y_i = \sum_{k = IA_i}^{IA_{i+1}} A_k x_{JA_k}&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;
    число строк матрицы &#039;&#039;n&#039;&#039;; &lt;br /&gt;
    разреженная матрица в формате CSR:&lt;br /&gt;
      строчные указатели &#039;&#039;IA&#039;&#039;,&lt;br /&gt;
      столбцовые указатели&#039;&#039;JA&#039;&#039;, &lt;br /&gt;
      ненулевые элементы &#039;&#039;A&#039;&#039;;&lt;br /&gt;
    вектор &#039;&#039;x&#039;&#039;.&lt;br /&gt;
  &#039;&#039;&#039;Выходные данные&#039;&#039;&#039;: произведение матрицы на вектор &#039;&#039;y&#039;&#039;.&lt;br /&gt;
  &#039;&#039;&#039;read CSR&#039;&#039;&#039; &#039;&#039;n&#039;&#039;, &#039;&#039;IA&#039;&#039;, &#039;&#039;JA&#039;&#039;, &#039;&#039;A&#039;&#039;;&lt;br /&gt;
  &#039;&#039;&#039;read&#039;&#039;&#039; &#039;&#039;x&#039;&#039;&lt;br /&gt;
  &#039;&#039;&#039;for&#039;&#039;&#039; &#039;&#039;i&#039;&#039; = 1,n:&lt;br /&gt;
    &#039;&#039;&#039;for&#039;&#039;&#039; &#039;&#039;k&#039;&#039; = &#039;&#039;IA(i)&#039;&#039;, &#039;&#039;IA(i+1)-1&#039;&#039;:&lt;br /&gt;
            &#039;&#039;y(i)&#039;&#039; += &#039;&#039;A(k)&#039;&#039;*&#039;&#039;x(JA(k))&#039;&#039;;&lt;br /&gt;
  &#039;&#039;&#039;write&#039;&#039;&#039; &#039;&#039;y&#039;&#039;;&lt;br /&gt;
&lt;br /&gt;
=== Схема реализации последовательного алгоритма ===&lt;br /&gt;
Метод можно описать следующим образом:&lt;br /&gt;
&lt;br /&gt;
&lt;br /&gt;
=== Последовательная сложность алгоритма ===&lt;br /&gt;
Для вычисления сингулярных чисел и векторов матрицы порядка n в последовательном варианте требуется:&lt;br /&gt;
&lt;br /&gt;
* &amp;lt;math&amp;gt;&amp;lt;/math&amp;gt; делений,&lt;br /&gt;
* &amp;lt;math&amp;gt;&amp;lt;/math&amp;gt; сложений (вычитаний),&lt;br /&gt;
* &amp;lt;math&amp;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;
== Программная реализация алгоритма ==&lt;br /&gt;
&lt;br /&gt;
=== Масштабируемость алгоритма и его реализации ===&lt;br /&gt;
&lt;br /&gt;
=== Существующие реализации алгоритма ===&lt;br /&gt;
ПоСледовательная реализация реализована в пакете SPARSKIT&lt;br /&gt;
&lt;br /&gt;
== Литература ==&lt;br /&gt;
1. С. Писсанецки Технология разреженных матриц. Изд. Мир, 1988.&lt;/div&gt;</summary>
		<author><name>Екатерина Буторина</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:%D0%A0%D1%83%D1%84%D0%B8%D0%BD%D0%B0_%D0%A2%D1%80%D0%B5%D1%82%D1%8C%D1%8F%D0%BA%D0%BE%D0%B2%D0%B0/%D0%A5%D1%80%D0%B0%D0%BD%D0%B5%D0%BD%D0%B8%D0%B5_%D0%BD%D0%B5%D0%BD%D1%83%D0%BB%D0%B5%D0%B2%D1%8B%D1%85_%D1%8D%D0%BB%D0%B5%D0%BC%D0%B5%D0%BD%D1%82%D0%BE%D0%B2_%D1%80%D0%B0%D0%B7%D1%80%D0%B5%D0%B6%D0%B5%D0%BD%D0%BD%D1%8B%D1%85_%D0%BC%D0%B0%D1%82%D1%80%D0%B8%D1%86._%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=6159</id>
		<title>Участник:Руфина Третьякова/Хранение ненулевых элементов разреженных матриц. Умножение разреженной матрицы на вектор</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:%D0%A0%D1%83%D1%84%D0%B8%D0%BD%D0%B0_%D0%A2%D1%80%D0%B5%D1%82%D1%8C%D1%8F%D0%BA%D0%BE%D0%B2%D0%B0/%D0%A5%D1%80%D0%B0%D0%BD%D0%B5%D0%BD%D0%B8%D0%B5_%D0%BD%D0%B5%D0%BD%D1%83%D0%BB%D0%B5%D0%B2%D1%8B%D1%85_%D1%8D%D0%BB%D0%B5%D0%BC%D0%B5%D0%BD%D1%82%D0%BE%D0%B2_%D1%80%D0%B0%D0%B7%D1%80%D0%B5%D0%B6%D0%B5%D0%BD%D0%BD%D1%8B%D1%85_%D0%BC%D0%B0%D1%82%D1%80%D0%B8%D1%86._%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=6159"/>
		<updated>2016-10-12T21:46:08Z</updated>

		<summary type="html">&lt;p&gt;Екатерина Буторина: &lt;/p&gt;
&lt;hr /&gt;
&lt;div&gt;{{algorithm&lt;br /&gt;
| name              = Умножение разреженной матрицы на вектор&lt;br /&gt;
| serial_complexity = &amp;lt;math&amp;gt;nnz&amp;lt;/math&amp;gt;&lt;br /&gt;
| pf_height         = &amp;lt;math&amp;gt;&amp;lt;/math&amp;gt;&lt;br /&gt;
| pf_width          = &amp;lt;math&amp;gt;&amp;lt;/math&amp;gt;&lt;br /&gt;
| input_data        = &amp;lt;math&amp;gt;2nnz+n+1&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;
Авторы статьи: [[Участница:Руфина_Третьякова|Третьякова Р. М.]] (группа 603), [[Участница:Екатерина_Буторина|Буторина Е. В.]] (группа 603)&lt;br /&gt;
&lt;br /&gt;
&lt;br /&gt;
&lt;br /&gt;
== Свойства и структура алгоритма ==&lt;br /&gt;
&lt;br /&gt;
=== Общее описание алгоритма ===&lt;br /&gt;
Разрежённая матрица — это матрица с преимущественно нулевыми элементами. В противном случае, если бо́льшая часть элементов матрицы ненулевые, матрица считается плотной.&lt;br /&gt;
Среди специалистов нет единства в определении того, какое именно количество ненулевых элементов делает матрицу разрежённой. Разные авторы предлагают различные варианты. &lt;br /&gt;
Огромные разрежённые матрицы часто возникают при решении таких задач, как дифференциальное уравнение в частных производных.&lt;br /&gt;
При хранении и преобразовании разрежённых матриц в компьютере бывает полезно, а часто и необходимо, использовать специальные алгоритмы и структуры данных, которые учитывают разрежённую структуру матрицы. Операции и алгоритмы, применяемые для работы с обычными, плотными матрицами, применительно к большим разрежённым матрицам работают относительно медленно и требуют значительных объёмов памяти. Однако разрежённые матрицы могут быть легко сжаты путём записи только своих ненулевых элементов, что снижает требования к компьютерной памяти.&lt;br /&gt;
&lt;br /&gt;
=== Математическое описание алгоритма ===&lt;br /&gt;
Исходные данные:  разреженная матрица &amp;lt;math&amp;gt;M^{n*n}&amp;lt;/math&amp;gt;, вектор &amp;lt;math&amp;gt;x^{n*1}&amp;lt;/math&amp;gt; &lt;br /&gt;
&lt;br /&gt;
Наиболее удобным форматом для вычисления произведения матрицы на вектор является &amp;quot;Compressed Sparse Row&amp;quot; или сокращенно CSR-формат.&lt;br /&gt;
&lt;br /&gt;
Рассмотрим CSR-представление разреженной матрицы: пусть число ненулевых элементов матрицы равно &amp;lt;math&amp;gt;nnz&amp;lt;/math&amp;gt;&lt;br /&gt;
CSR-формат представляет матрицу &amp;lt;math&amp;gt;M&amp;lt;/math&amp;gt; в виде 3-х одномерных массивов:&lt;br /&gt;
&lt;br /&gt;
массив &amp;lt;math&amp;gt;A&amp;lt;/math&amp;gt; размера &amp;lt;math&amp;gt;nnz&amp;lt;/math&amp;gt; содержит ненулевые значения матрицы,&lt;br /&gt;
&amp;lt;math&amp;gt;JA&amp;lt;/math&amp;gt; размера &amp;lt;math&amp;gt;nnz&amp;lt;/math&amp;gt; - номера столбцов ненулевых элементов., &lt;br /&gt;
&amp;lt;math&amp;gt;IA&amp;lt;/math&amp;gt; размера &amp;lt;math&amp;gt;n&amp;lt;/math&amp;gt;- содержит номер с которого начинается описание элементов строки в массивах &amp;lt;math&amp;gt;A&amp;lt;/math&amp;gt; и &amp;lt;math&amp;gt;JA&amp;lt;/math&amp;gt;.&lt;br /&gt;
Этот формат позволяет производить перемножение матрицы &amp;lt;math&amp;gt;M&amp;lt;/math&amp;gt; на вектор &amp;lt;math&amp;gt;x&amp;lt;/math&amp;gt; за &amp;lt;math&amp;gt;O(nnz)&amp;lt;/math&amp;gt; умножений и сложений. &lt;br /&gt;
&lt;br /&gt;
Например, это разреженная матрица с 4-мя ненулевыми элементами&lt;br /&gt;
:: &amp;lt;math&amp;gt;\begin{pmatrix}&lt;br /&gt;
0 &amp;amp; 0 &amp;amp; 0 &amp;amp; 1 \\&lt;br /&gt;
2 &amp;amp; 0 &amp;amp; 0 &amp;amp; 0 \\&lt;br /&gt;
0 &amp;amp; 0 &amp;amp; 3 &amp;amp; 0 \\&lt;br /&gt;
0 &amp;amp; 4 &amp;amp; 0 &amp;amp; 0 \\&lt;br /&gt;
\end{pmatrix}&amp;lt;/math&amp;gt;,&lt;br /&gt;
 представляемая в формате CSR &lt;br /&gt;
    A  = [ 1 2 3 4 ]&lt;br /&gt;
    IA = [ 0 1 2 3 4 ]&lt;br /&gt;
    JA = [ 3 0 2 1 ]&lt;br /&gt;
&lt;br /&gt;
&lt;br /&gt;
Вычисляемые данные: вектор  &amp;lt;math&amp;gt;M*x=y&amp;lt;/math&amp;gt;&lt;br /&gt;
&lt;br /&gt;
=== Вычислительное ядро алгоритма ===&lt;br /&gt;
&lt;br /&gt;
:&amp;lt;math&amp;gt;y_i = \sum_{k = IA_i}^{IA_{i+1}} A_k x_{JA_k}&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;
    число строк матрицы &#039;&#039;n&#039;&#039;; &lt;br /&gt;
    разреженная матрица в формате CSR:&lt;br /&gt;
      строчные указатели &#039;&#039;IA&#039;&#039;,&lt;br /&gt;
      столбцовые указатели&#039;&#039;JA&#039;&#039;, &lt;br /&gt;
      ненулевые элементы &#039;&#039;A&#039;&#039;;&lt;br /&gt;
    вектор &#039;&#039;x&#039;&#039;.&lt;br /&gt;
  &#039;&#039;&#039;Выходные данные&#039;&#039;&#039;: произведение матрицы на вектор &#039;&#039;y&#039;&#039;.&lt;br /&gt;
  &#039;&#039;&#039;read CSR&#039;&#039;&#039; &#039;&#039;n&#039;&#039;, &#039;&#039;IA&#039;&#039;, &#039;&#039;JA&#039;&#039;, &#039;&#039;A&#039;&#039;;&lt;br /&gt;
  &#039;&#039;&#039;read&#039;&#039;&#039; &#039;&#039;x&#039;&#039;&lt;br /&gt;
  &#039;&#039;&#039;for&#039;&#039;&#039; &#039;&#039;i&#039;&#039; = 1,n:&lt;br /&gt;
    &#039;&#039;&#039;for&#039;&#039;&#039; &#039;&#039;k&#039;&#039; = &#039;&#039;IA(i)&#039;&#039;, &#039;&#039;IA(i+1)-1&#039;&#039;:&lt;br /&gt;
            &#039;&#039;y(i)&#039;&#039; += &#039;&#039;A(k)&#039;&#039;*&#039;&#039;x(JA(k))&#039;&#039;;&lt;br /&gt;
  &#039;&#039;&#039;write&#039;&#039;&#039; &#039;&#039;y&#039;&#039;;&lt;br /&gt;
&lt;br /&gt;
=== Схема реализации последовательного алгоритма ===&lt;br /&gt;
Метод можно описать следующим образом:&lt;br /&gt;
&lt;br /&gt;
&lt;br /&gt;
=== Последовательная сложность алгоритма ===&lt;br /&gt;
Для вычисления сингулярных чисел и векторов матрицы порядка n в последовательном варианте требуется:&lt;br /&gt;
&lt;br /&gt;
* &amp;lt;math&amp;gt;&amp;lt;/math&amp;gt; делений,&lt;br /&gt;
* &amp;lt;math&amp;gt;&amp;lt;/math&amp;gt; сложений (вычитаний),&lt;br /&gt;
* &amp;lt;math&amp;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;
== Программная реализация алгоритма ==&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>Екатерина Буторина</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:%D0%A0%D1%83%D1%84%D0%B8%D0%BD%D0%B0_%D0%A2%D1%80%D0%B5%D1%82%D1%8C%D1%8F%D0%BA%D0%BE%D0%B2%D0%B0/%D0%A5%D1%80%D0%B0%D0%BD%D0%B5%D0%BD%D0%B8%D0%B5_%D0%BD%D0%B5%D0%BD%D1%83%D0%BB%D0%B5%D0%B2%D1%8B%D1%85_%D1%8D%D0%BB%D0%B5%D0%BC%D0%B5%D0%BD%D1%82%D0%BE%D0%B2_%D1%80%D0%B0%D0%B7%D1%80%D0%B5%D0%B6%D0%B5%D0%BD%D0%BD%D1%8B%D1%85_%D0%BC%D0%B0%D1%82%D1%80%D0%B8%D1%86._%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=6157</id>
		<title>Участник:Руфина Третьякова/Хранение ненулевых элементов разреженных матриц. Умножение разреженной матрицы на вектор</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:%D0%A0%D1%83%D1%84%D0%B8%D0%BD%D0%B0_%D0%A2%D1%80%D0%B5%D1%82%D1%8C%D1%8F%D0%BA%D0%BE%D0%B2%D0%B0/%D0%A5%D1%80%D0%B0%D0%BD%D0%B5%D0%BD%D0%B8%D0%B5_%D0%BD%D0%B5%D0%BD%D1%83%D0%BB%D0%B5%D0%B2%D1%8B%D1%85_%D1%8D%D0%BB%D0%B5%D0%BC%D0%B5%D0%BD%D1%82%D0%BE%D0%B2_%D1%80%D0%B0%D0%B7%D1%80%D0%B5%D0%B6%D0%B5%D0%BD%D0%BD%D1%8B%D1%85_%D0%BC%D0%B0%D1%82%D1%80%D0%B8%D1%86._%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=6157"/>
		<updated>2016-10-12T21:45:03Z</updated>

		<summary type="html">&lt;p&gt;Екатерина Буторина: /* Математическое описание алгоритма */&lt;/p&gt;
&lt;hr /&gt;
&lt;div&gt;{{algorithm&lt;br /&gt;
| name              = Умножение разреженной матрицы на вектор&lt;br /&gt;
| serial_complexity = &amp;lt;math&amp;gt;&amp;lt;/math&amp;gt;&lt;br /&gt;
| pf_height         = &amp;lt;math&amp;gt;&amp;lt;/math&amp;gt;&lt;br /&gt;
| pf_width          = &amp;lt;math&amp;gt;&amp;lt;/math&amp;gt;&lt;br /&gt;
| input_data        = &amp;lt;math&amp;gt;2nnz+n+1&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;
Авторы статьи: [[Участница:Руфина_Третьякова|Третьякова Р. М.]] (группа 603), [[Участница:Екатерина_Буторина|Буторина Е. В.]] (группа 603)&lt;br /&gt;
&lt;br /&gt;
&lt;br /&gt;
&lt;br /&gt;
== Свойства и структура алгоритма ==&lt;br /&gt;
&lt;br /&gt;
=== Общее описание алгоритма ===&lt;br /&gt;
Разрежённая матрица — это матрица с преимущественно нулевыми элементами. В противном случае, если бо́льшая часть элементов матрицы ненулевые, матрица считается плотной.&lt;br /&gt;
Среди специалистов нет единства в определении того, какое именно количество ненулевых элементов делает матрицу разрежённой. Разные авторы предлагают различные варианты. &lt;br /&gt;
Огромные разрежённые матрицы часто возникают при решении таких задач, как дифференциальное уравнение в частных производных.&lt;br /&gt;
При хранении и преобразовании разрежённых матриц в компьютере бывает полезно, а часто и необходимо, использовать специальные алгоритмы и структуры данных, которые учитывают разрежённую структуру матрицы. Операции и алгоритмы, применяемые для работы с обычными, плотными матрицами, применительно к большим разрежённым матрицам работают относительно медленно и требуют значительных объёмов памяти. Однако разрежённые матрицы могут быть легко сжаты путём записи только своих ненулевых элементов, что снижает требования к компьютерной памяти.&lt;br /&gt;
&lt;br /&gt;
=== Математическое описание алгоритма ===&lt;br /&gt;
Исходные данные:  разреженная матрица &amp;lt;math&amp;gt;M^{n*n}&amp;lt;/math&amp;gt;, вектор &amp;lt;math&amp;gt;x^{n*1}&amp;lt;/math&amp;gt; &lt;br /&gt;
&lt;br /&gt;
Наиболее удобным форматом для вычисления произведения матрицы на вектор является &amp;quot;Compressed Sparse Row&amp;quot; или сокращенно CSR-формат.&lt;br /&gt;
&lt;br /&gt;
Рассмотрим CSR-представление разреженной матрицы: пусть число ненулевых элементов матрицы равно &amp;lt;math&amp;gt;nnz&amp;lt;/math&amp;gt;&lt;br /&gt;
CSR-формат представляет матрицу &amp;lt;math&amp;gt;M&amp;lt;/math&amp;gt; в виде 3-х одномерных массивов:&lt;br /&gt;
&lt;br /&gt;
массив &amp;lt;math&amp;gt;A&amp;lt;/math&amp;gt; размера &amp;lt;math&amp;gt;nnz&amp;lt;/math&amp;gt; содержит ненулевые значения матрицы,&lt;br /&gt;
&amp;lt;math&amp;gt;JA&amp;lt;/math&amp;gt; размера &amp;lt;math&amp;gt;nnz&amp;lt;/math&amp;gt; - номера столбцов ненулевых элементов., &lt;br /&gt;
&amp;lt;math&amp;gt;IA&amp;lt;/math&amp;gt; размера &amp;lt;math&amp;gt;n&amp;lt;/math&amp;gt;- содержит номер с которого начинается описание элементов строки в массивах &amp;lt;math&amp;gt;A&amp;lt;/math&amp;gt; и &amp;lt;math&amp;gt;JA&amp;lt;/math&amp;gt;.&lt;br /&gt;
Этот формат позволяет производить перемножение матрицы &amp;lt;math&amp;gt;M&amp;lt;/math&amp;gt; на вектор &amp;lt;math&amp;gt;x&amp;lt;/math&amp;gt; за &amp;lt;math&amp;gt;O(nnz)&amp;lt;/math&amp;gt; умножений и сложений. &lt;br /&gt;
&lt;br /&gt;
Например, это разреженная матрица с 4-мя ненулевыми элементами&lt;br /&gt;
:: &amp;lt;math&amp;gt;\begin{pmatrix}&lt;br /&gt;
0 &amp;amp; 0 &amp;amp; 0 &amp;amp; 1 \\&lt;br /&gt;
2 &amp;amp; 0 &amp;amp; 0 &amp;amp; 0 \\&lt;br /&gt;
0 &amp;amp; 0 &amp;amp; 3 &amp;amp; 0 \\&lt;br /&gt;
0 &amp;amp; 4 &amp;amp; 0 &amp;amp; 0 \\&lt;br /&gt;
\end{pmatrix}&amp;lt;/math&amp;gt;,&lt;br /&gt;
 представляемая в формате CSR &lt;br /&gt;
    A  = [ 1 2 3 4 ]&lt;br /&gt;
    IA = [ 0 1 2 3 4 ]&lt;br /&gt;
    JA = [ 3 0 2 1 ]&lt;br /&gt;
&lt;br /&gt;
&lt;br /&gt;
Вычисляемые данные: вектор  &amp;lt;math&amp;gt;M*x=y&amp;lt;/math&amp;gt;&lt;br /&gt;
&lt;br /&gt;
=== Вычислительное ядро алгоритма ===&lt;br /&gt;
&lt;br /&gt;
:&amp;lt;math&amp;gt;y_i = \sum_{k = IA_i}^{IA_{i+1}} A_k x_{JA_k}&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;
    число строк матрицы &#039;&#039;n&#039;&#039;; &lt;br /&gt;
    разреженная матрица в формате CSR:&lt;br /&gt;
      строчные указатели &#039;&#039;IA&#039;&#039;,&lt;br /&gt;
      столбцовые указатели&#039;&#039;JA&#039;&#039;, &lt;br /&gt;
      ненулевые элементы &#039;&#039;A&#039;&#039;;&lt;br /&gt;
    вектор &#039;&#039;x&#039;&#039;.&lt;br /&gt;
  &#039;&#039;&#039;Выходные данные&#039;&#039;&#039;: произведение матрицы на вектор &#039;&#039;y&#039;&#039;.&lt;br /&gt;
  &#039;&#039;&#039;read CSR&#039;&#039;&#039; &#039;&#039;n&#039;&#039;, &#039;&#039;IA&#039;&#039;, &#039;&#039;JA&#039;&#039;, &#039;&#039;A&#039;&#039;;&lt;br /&gt;
  &#039;&#039;&#039;read&#039;&#039;&#039; &#039;&#039;x&#039;&#039;&lt;br /&gt;
  &#039;&#039;&#039;for&#039;&#039;&#039; &#039;&#039;i&#039;&#039; = 1,n:&lt;br /&gt;
    &#039;&#039;&#039;for&#039;&#039;&#039; &#039;&#039;k&#039;&#039; = &#039;&#039;IA(i)&#039;&#039;, &#039;&#039;IA(i+1)-1&#039;&#039;:&lt;br /&gt;
            &#039;&#039;y(i)&#039;&#039; += &#039;&#039;A(k)&#039;&#039;*&#039;&#039;x(JA(k))&#039;&#039;;&lt;br /&gt;
  &#039;&#039;&#039;write&#039;&#039;&#039; &#039;&#039;y&#039;&#039;;&lt;br /&gt;
&lt;br /&gt;
=== Схема реализации последовательного алгоритма ===&lt;br /&gt;
Метод можно описать следующим образом:&lt;br /&gt;
&lt;br /&gt;
&lt;br /&gt;
=== Последовательная сложность алгоритма ===&lt;br /&gt;
Для вычисления сингулярных чисел и векторов матрицы порядка n в последовательном варианте требуется:&lt;br /&gt;
&lt;br /&gt;
* &amp;lt;math&amp;gt;&amp;lt;/math&amp;gt; делений,&lt;br /&gt;
* &amp;lt;math&amp;gt;&amp;lt;/math&amp;gt; сложений (вычитаний),&lt;br /&gt;
* &amp;lt;math&amp;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;
== Программная реализация алгоритма ==&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>Екатерина Буторина</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:%D0%A0%D1%83%D1%84%D0%B8%D0%BD%D0%B0_%D0%A2%D1%80%D0%B5%D1%82%D1%8C%D1%8F%D0%BA%D0%BE%D0%B2%D0%B0/%D0%A5%D1%80%D0%B0%D0%BD%D0%B5%D0%BD%D0%B8%D0%B5_%D0%BD%D0%B5%D0%BD%D1%83%D0%BB%D0%B5%D0%B2%D1%8B%D1%85_%D1%8D%D0%BB%D0%B5%D0%BC%D0%B5%D0%BD%D1%82%D0%BE%D0%B2_%D1%80%D0%B0%D0%B7%D1%80%D0%B5%D0%B6%D0%B5%D0%BD%D0%BD%D1%8B%D1%85_%D0%BC%D0%B0%D1%82%D1%80%D0%B8%D1%86._%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=6154</id>
		<title>Участник:Руфина Третьякова/Хранение ненулевых элементов разреженных матриц. Умножение разреженной матрицы на вектор</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:%D0%A0%D1%83%D1%84%D0%B8%D0%BD%D0%B0_%D0%A2%D1%80%D0%B5%D1%82%D1%8C%D1%8F%D0%BA%D0%BE%D0%B2%D0%B0/%D0%A5%D1%80%D0%B0%D0%BD%D0%B5%D0%BD%D0%B8%D0%B5_%D0%BD%D0%B5%D0%BD%D1%83%D0%BB%D0%B5%D0%B2%D1%8B%D1%85_%D1%8D%D0%BB%D0%B5%D0%BC%D0%B5%D0%BD%D1%82%D0%BE%D0%B2_%D1%80%D0%B0%D0%B7%D1%80%D0%B5%D0%B6%D0%B5%D0%BD%D0%BD%D1%8B%D1%85_%D0%BC%D0%B0%D1%82%D1%80%D0%B8%D1%86._%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=6154"/>
		<updated>2016-10-12T21:44:36Z</updated>

		<summary type="html">&lt;p&gt;Екатерина Буторина: /* Математическое описание алгоритма */&lt;/p&gt;
&lt;hr /&gt;
&lt;div&gt;{{algorithm&lt;br /&gt;
| name              = Умножение разреженной матрицы на вектор&lt;br /&gt;
| serial_complexity = &amp;lt;math&amp;gt;&amp;lt;/math&amp;gt;&lt;br /&gt;
| pf_height         = &amp;lt;math&amp;gt;&amp;lt;/math&amp;gt;&lt;br /&gt;
| pf_width          = &amp;lt;math&amp;gt;&amp;lt;/math&amp;gt;&lt;br /&gt;
| input_data        = &amp;lt;math&amp;gt;2nnz+n+1&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;
Авторы статьи: [[Участница:Руфина_Третьякова|Третьякова Р. М.]] (группа 603), [[Участница:Екатерина_Буторина|Буторина Е. В.]] (группа 603)&lt;br /&gt;
&lt;br /&gt;
&lt;br /&gt;
&lt;br /&gt;
== Свойства и структура алгоритма ==&lt;br /&gt;
&lt;br /&gt;
=== Общее описание алгоритма ===&lt;br /&gt;
Разрежённая матрица — это матрица с преимущественно нулевыми элементами. В противном случае, если бо́льшая часть элементов матрицы ненулевые, матрица считается плотной.&lt;br /&gt;
Среди специалистов нет единства в определении того, какое именно количество ненулевых элементов делает матрицу разрежённой. Разные авторы предлагают различные варианты. &lt;br /&gt;
Огромные разрежённые матрицы часто возникают при решении таких задач, как дифференциальное уравнение в частных производных.&lt;br /&gt;
При хранении и преобразовании разрежённых матриц в компьютере бывает полезно, а часто и необходимо, использовать специальные алгоритмы и структуры данных, которые учитывают разрежённую структуру матрицы. Операции и алгоритмы, применяемые для работы с обычными, плотными матрицами, применительно к большим разрежённым матрицам работают относительно медленно и требуют значительных объёмов памяти. Однако разрежённые матрицы могут быть легко сжаты путём записи только своих ненулевых элементов, что снижает требования к компьютерной памяти.&lt;br /&gt;
&lt;br /&gt;
=== Математическое описание алгоритма ===&lt;br /&gt;
Исходные данные:  разреженная матрица &amp;lt;math&amp;gt;M^{n*n}&amp;lt;/math&amp;gt;, вектор &amp;lt;math&amp;gt;x^{n*1}&amp;lt;/math&amp;gt; &lt;br /&gt;
&lt;br /&gt;
Наиболее удобным форматом для вычисления произведения матрицы на вектор является &amp;quot;Compressed Sparse Row&amp;quot; или сокращенно CSR-формат.&lt;br /&gt;
&lt;br /&gt;
Рассмотрим CSR-представление разреженной матрицы: пусть число ненулевых элементов матрицы равно &amp;lt;math&amp;gt;nnz&amp;lt;/math&amp;gt;&lt;br /&gt;
CSR-формат представляет матрицу &amp;lt;math&amp;gt;M&amp;lt;/math&amp;gt; в виде 3-х одномерных массивов:&lt;br /&gt;
&lt;br /&gt;
массив &amp;lt;math&amp;gt;A&amp;lt;/math&amp;gt; размера &amp;lt;math&amp;gt;nnz&amp;lt;/math&amp;gt; содержит ненулевые значения матрицы,&lt;br /&gt;
&amp;lt;math&amp;gt;JA&amp;lt;/math&amp;gt; размера &amp;lt;math&amp;gt;nnz&amp;lt;/math&amp;gt; - номера столбцов ненулевых элементов., &lt;br /&gt;
&amp;lt;math&amp;gt;IA&amp;lt;/math&amp;gt; размера &amp;lt;math&amp;gt;n&amp;lt;/math&amp;gt;- содержит номер с которого начинается описание элементов строки в массивах &amp;lt;math&amp;gt;A&amp;lt;/math&amp;gt; и &amp;lt;math&amp;gt;JA&amp;lt;/math&amp;gt;.&lt;br /&gt;
Этот формат позволяет производить перемножение матрицы &amp;lt;math&amp;gt;M&amp;lt;/math&amp;gt; на вектор &amp;lt;math&amp;gt;x&amp;lt;/math&amp;gt; за &amp;lt;math&amp;gt;O(nnz)&amp;lt;/math&amp;gt; умножений и сложений. &lt;br /&gt;
&lt;br /&gt;
Например, это разреженная матрица с 4-мя ненулевыми элементами&lt;br /&gt;
:: &amp;lt;math&amp;gt;\begin{pmatrix}&lt;br /&gt;
0 &amp;amp; 0 &amp;amp; 0 &amp;amp; 1 \\&lt;br /&gt;
2 &amp;amp; 0 &amp;amp; 0 &amp;amp; 0 \\&lt;br /&gt;
0 &amp;amp; 0 &amp;amp; 3 &amp;amp; 0 \\&lt;br /&gt;
0 &amp;amp; 4 &amp;amp; 0 &amp;amp; 0 \\&lt;br /&gt;
\end{pmatrix}&amp;lt;/math&amp;gt;,&lt;br /&gt;
&lt;br /&gt;
 представляемая в формате CSR &lt;br /&gt;
&lt;br /&gt;
    A  = [ 1 2 3 4 ]&lt;br /&gt;
    IA = [ 0 1 2 3 4 ]&lt;br /&gt;
    JA = [ 3 0 2 1 ]&lt;br /&gt;
&lt;br /&gt;
&lt;br /&gt;
Вычисляемые данные: вектор  &amp;lt;math&amp;gt;M*x=y&amp;lt;/math&amp;gt;&lt;br /&gt;
&lt;br /&gt;
=== Вычислительное ядро алгоритма ===&lt;br /&gt;
&lt;br /&gt;
:&amp;lt;math&amp;gt;y_i = \sum_{k = IA_i}^{IA_{i+1}} A_k x_{JA_k}&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;
    число строк матрицы &#039;&#039;n&#039;&#039;; &lt;br /&gt;
    разреженная матрица в формате CSR:&lt;br /&gt;
      строчные указатели &#039;&#039;IA&#039;&#039;,&lt;br /&gt;
      столбцовые указатели&#039;&#039;JA&#039;&#039;, &lt;br /&gt;
      ненулевые элементы &#039;&#039;A&#039;&#039;;&lt;br /&gt;
    вектор &#039;&#039;x&#039;&#039;.&lt;br /&gt;
  &#039;&#039;&#039;Выходные данные&#039;&#039;&#039;: произведение матрицы на вектор &#039;&#039;y&#039;&#039;.&lt;br /&gt;
  &#039;&#039;&#039;read&#039;&#039;&#039; &#039;&#039;n&#039;&#039;, &#039;&#039;IA&#039;&#039;, &#039;&#039;JA&#039;&#039;, &#039;&#039;A&#039;&#039;;&lt;br /&gt;
  &#039;&#039;&#039;read&#039;&#039;&#039; &#039;&#039;x&#039;&#039;&lt;br /&gt;
  &#039;&#039;&#039;for&#039;&#039;&#039; &#039;&#039;i&#039;&#039; = 1,n:&lt;br /&gt;
    &#039;&#039;&#039;for&#039;&#039;&#039; &#039;&#039;k&#039;&#039; = &#039;&#039;IA(i)&#039;&#039;, &#039;&#039;IA(i+1)-1&#039;&#039;:&lt;br /&gt;
            &#039;&#039;y(i)&#039;&#039; += &#039;&#039;A(k)&#039;&#039;*&#039;&#039;x(JA(k))&#039;&#039;;&lt;br /&gt;
  &#039;&#039;&#039;write&#039;&#039;&#039; &#039;&#039;y&#039;&#039;;&lt;br /&gt;
&lt;br /&gt;
=== Схема реализации последовательного алгоритма ===&lt;br /&gt;
Метод можно описать следующим образом:&lt;br /&gt;
&lt;br /&gt;
&lt;br /&gt;
=== Последовательная сложность алгоритма ===&lt;br /&gt;
Для вычисления сингулярных чисел и векторов матрицы порядка n в последовательном варианте требуется:&lt;br /&gt;
&lt;br /&gt;
* &amp;lt;math&amp;gt;&amp;lt;/math&amp;gt; делений,&lt;br /&gt;
* &amp;lt;math&amp;gt;&amp;lt;/math&amp;gt; сложений (вычитаний),&lt;br /&gt;
* &amp;lt;math&amp;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;
== Программная реализация алгоритма ==&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>Екатерина Буторина</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:%D0%A0%D1%83%D1%84%D0%B8%D0%BD%D0%B0_%D0%A2%D1%80%D0%B5%D1%82%D1%8C%D1%8F%D0%BA%D0%BE%D0%B2%D0%B0/%D0%A5%D1%80%D0%B0%D0%BD%D0%B5%D0%BD%D0%B8%D0%B5_%D0%BD%D0%B5%D0%BD%D1%83%D0%BB%D0%B5%D0%B2%D1%8B%D1%85_%D1%8D%D0%BB%D0%B5%D0%BC%D0%B5%D0%BD%D1%82%D0%BE%D0%B2_%D1%80%D0%B0%D0%B7%D1%80%D0%B5%D0%B6%D0%B5%D0%BD%D0%BD%D1%8B%D1%85_%D0%BC%D0%B0%D1%82%D1%80%D0%B8%D1%86._%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=6152</id>
		<title>Участник:Руфина Третьякова/Хранение ненулевых элементов разреженных матриц. Умножение разреженной матрицы на вектор</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:%D0%A0%D1%83%D1%84%D0%B8%D0%BD%D0%B0_%D0%A2%D1%80%D0%B5%D1%82%D1%8C%D1%8F%D0%BA%D0%BE%D0%B2%D0%B0/%D0%A5%D1%80%D0%B0%D0%BD%D0%B5%D0%BD%D0%B8%D0%B5_%D0%BD%D0%B5%D0%BD%D1%83%D0%BB%D0%B5%D0%B2%D1%8B%D1%85_%D1%8D%D0%BB%D0%B5%D0%BC%D0%B5%D0%BD%D1%82%D0%BE%D0%B2_%D1%80%D0%B0%D0%B7%D1%80%D0%B5%D0%B6%D0%B5%D0%BD%D0%BD%D1%8B%D1%85_%D0%BC%D0%B0%D1%82%D1%80%D0%B8%D1%86._%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=6152"/>
		<updated>2016-10-12T21:44:12Z</updated>

		<summary type="html">&lt;p&gt;Екатерина Буторина: &lt;/p&gt;
&lt;hr /&gt;
&lt;div&gt;{{algorithm&lt;br /&gt;
| name              = Умножение разреженной матрицы на вектор&lt;br /&gt;
| serial_complexity = &amp;lt;math&amp;gt;&amp;lt;/math&amp;gt;&lt;br /&gt;
| pf_height         = &amp;lt;math&amp;gt;&amp;lt;/math&amp;gt;&lt;br /&gt;
| pf_width          = &amp;lt;math&amp;gt;&amp;lt;/math&amp;gt;&lt;br /&gt;
| input_data        = &amp;lt;math&amp;gt;2nnz+n+1&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;
Авторы статьи: [[Участница:Руфина_Третьякова|Третьякова Р. М.]] (группа 603), [[Участница:Екатерина_Буторина|Буторина Е. В.]] (группа 603)&lt;br /&gt;
&lt;br /&gt;
&lt;br /&gt;
&lt;br /&gt;
== Свойства и структура алгоритма ==&lt;br /&gt;
&lt;br /&gt;
=== Общее описание алгоритма ===&lt;br /&gt;
Разрежённая матрица — это матрица с преимущественно нулевыми элементами. В противном случае, если бо́льшая часть элементов матрицы ненулевые, матрица считается плотной.&lt;br /&gt;
Среди специалистов нет единства в определении того, какое именно количество ненулевых элементов делает матрицу разрежённой. Разные авторы предлагают различные варианты. &lt;br /&gt;
Огромные разрежённые матрицы часто возникают при решении таких задач, как дифференциальное уравнение в частных производных.&lt;br /&gt;
При хранении и преобразовании разрежённых матриц в компьютере бывает полезно, а часто и необходимо, использовать специальные алгоритмы и структуры данных, которые учитывают разрежённую структуру матрицы. Операции и алгоритмы, применяемые для работы с обычными, плотными матрицами, применительно к большим разрежённым матрицам работают относительно медленно и требуют значительных объёмов памяти. Однако разрежённые матрицы могут быть легко сжаты путём записи только своих ненулевых элементов, что снижает требования к компьютерной памяти.&lt;br /&gt;
&lt;br /&gt;
=== Математическое описание алгоритма ===&lt;br /&gt;
Исходные данные:  разреженная матрица &amp;lt;math&amp;gt;M^{n*n}&amp;lt;/math&amp;gt;, вектор &amp;lt;math&amp;gt;x^{n*1}&amp;lt;/math&amp;gt; &lt;br /&gt;
&lt;br /&gt;
Наиболее удобным форматом для вычисления произведения матрицы на вектор является &amp;quot;Compressed Sparse Row&amp;quot; или сокращенно CSR-формат.&lt;br /&gt;
&lt;br /&gt;
Рассмотрим CSR-представление разреженной матрицы: пусть число ненулевых элементов матрицы равно &amp;lt;math&amp;gt;NNZ&amp;lt;/math&amp;gt;&lt;br /&gt;
CSR-формат представляет матрицу &amp;lt;math&amp;gt;M&amp;lt;/math&amp;gt; в виде 3-х одномерных массивов:&lt;br /&gt;
&lt;br /&gt;
массив &amp;lt;math&amp;gt;A&amp;lt;/math&amp;gt; размера &amp;lt;math&amp;gt;nnz&amp;lt;/math&amp;gt; содержит ненулевые значения матрицы,&lt;br /&gt;
&amp;lt;math&amp;gt;JA&amp;lt;/math&amp;gt; размера &amp;lt;math&amp;gt;nnz&amp;lt;/math&amp;gt; - номера столбцов ненулевых элементов., &lt;br /&gt;
&amp;lt;math&amp;gt;IA&amp;lt;/math&amp;gt; размера &amp;lt;math&amp;gt;n&amp;lt;/math&amp;gt;- содержит номер с которого начинается описание элементов строки в массивах &amp;lt;math&amp;gt;A&amp;lt;/math&amp;gt; и &amp;lt;math&amp;gt;JA&amp;lt;/math&amp;gt;.&lt;br /&gt;
Этот формат позволяет производить перемножение матрицы &amp;lt;math&amp;gt;M&amp;lt;/math&amp;gt; на вектор &amp;lt;math&amp;gt;x&amp;lt;/math&amp;gt; за &amp;lt;math&amp;gt;O(nnz)&amp;lt;/math&amp;gt; умножений и сложений. &lt;br /&gt;
&lt;br /&gt;
Например, это разреженная матрица с 4-мя ненулевыми элементами&lt;br /&gt;
:: &amp;lt;math&amp;gt;\begin{pmatrix}&lt;br /&gt;
0 &amp;amp; 0 &amp;amp; 0 &amp;amp; 1 \\&lt;br /&gt;
2 &amp;amp; 0 &amp;amp; 0 &amp;amp; 0 \\&lt;br /&gt;
0 &amp;amp; 0 &amp;amp; 3 &amp;amp; 0 \\&lt;br /&gt;
0 &amp;amp; 4 &amp;amp; 0 &amp;amp; 0 \\&lt;br /&gt;
\end{pmatrix}&amp;lt;/math&amp;gt;,&lt;br /&gt;
&lt;br /&gt;
 представляемая в формате CSR &lt;br /&gt;
&lt;br /&gt;
    A  = [ 1 2 3 4 ]&lt;br /&gt;
    IA = [ 0 1 2 3 4 ]&lt;br /&gt;
    JA = [ 3 0 2 1 ]&lt;br /&gt;
&lt;br /&gt;
&lt;br /&gt;
Вычисляемые данные: вектор  &amp;lt;math&amp;gt;M*x=y&amp;lt;/math&amp;gt;&lt;br /&gt;
&lt;br /&gt;
=== Вычислительное ядро алгоритма ===&lt;br /&gt;
&lt;br /&gt;
:&amp;lt;math&amp;gt;y_i = \sum_{k = IA_i}^{IA_{i+1}} A_k x_{JA_k}&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;
  число строк матрицы &#039;&#039;n&#039;&#039;; &lt;br /&gt;
  разреженная матрица в формате CSR:&lt;br /&gt;
    строчные указатели &#039;&#039;IA&#039;&#039;,&lt;br /&gt;
    столбцовые указатели&#039;&#039;JA&#039;&#039;, &lt;br /&gt;
    ненулевые элементы &#039;&#039;A&#039;&#039;;&lt;br /&gt;
  вектор &#039;&#039;x&#039;&#039;.&lt;br /&gt;
  &#039;&#039;&#039;Выходные данные&#039;&#039;&#039;: произведение матрицы на вектор &#039;&#039;y&#039;&#039;.&lt;br /&gt;
  &#039;&#039;&#039;read&#039;&#039;&#039; &#039;&#039;n&#039;&#039;, &#039;&#039;IA&#039;&#039;, &#039;&#039;JA&#039;&#039;, &#039;&#039;A&#039;&#039;;&lt;br /&gt;
  &#039;&#039;&#039;read&#039;&#039;&#039; &#039;&#039;x&#039;&#039;&lt;br /&gt;
  &#039;&#039;&#039;for&#039;&#039;&#039; &#039;&#039;i&#039;&#039; = 1,n:&lt;br /&gt;
    &#039;&#039;&#039;for&#039;&#039;&#039; &#039;&#039;k&#039;&#039; = &#039;&#039;IA(i)&#039;&#039;, &#039;&#039;IA(i+1)-1&#039;&#039;:&lt;br /&gt;
            &#039;&#039;y(i)&#039;&#039; += &#039;&#039;A(k)&#039;&#039;*&#039;&#039;x(JA(k))&#039;&#039;;&lt;br /&gt;
  &#039;&#039;&#039;write&#039;&#039;&#039; &#039;&#039;y&#039;&#039;;&lt;br /&gt;
&lt;br /&gt;
=== Схема реализации последовательного алгоритма ===&lt;br /&gt;
Метод можно описать следующим образом:&lt;br /&gt;
&lt;br /&gt;
&lt;br /&gt;
=== Последовательная сложность алгоритма ===&lt;br /&gt;
Для вычисления сингулярных чисел и векторов матрицы порядка n в последовательном варианте требуется:&lt;br /&gt;
&lt;br /&gt;
* &amp;lt;math&amp;gt;&amp;lt;/math&amp;gt; делений,&lt;br /&gt;
* &amp;lt;math&amp;gt;&amp;lt;/math&amp;gt; сложений (вычитаний),&lt;br /&gt;
* &amp;lt;math&amp;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;
== Программная реализация алгоритма ==&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>Екатерина Буторина</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:%D0%A0%D1%83%D1%84%D0%B8%D0%BD%D0%B0_%D0%A2%D1%80%D0%B5%D1%82%D1%8C%D1%8F%D0%BA%D0%BE%D0%B2%D0%B0/%D0%A5%D1%80%D0%B0%D0%BD%D0%B5%D0%BD%D0%B8%D0%B5_%D0%BD%D0%B5%D0%BD%D1%83%D0%BB%D0%B5%D0%B2%D1%8B%D1%85_%D1%8D%D0%BB%D0%B5%D0%BC%D0%B5%D0%BD%D1%82%D0%BE%D0%B2_%D1%80%D0%B0%D0%B7%D1%80%D0%B5%D0%B6%D0%B5%D0%BD%D0%BD%D1%8B%D1%85_%D0%BC%D0%B0%D1%82%D1%80%D0%B8%D1%86._%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=6148</id>
		<title>Участник:Руфина Третьякова/Хранение ненулевых элементов разреженных матриц. Умножение разреженной матрицы на вектор</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:%D0%A0%D1%83%D1%84%D0%B8%D0%BD%D0%B0_%D0%A2%D1%80%D0%B5%D1%82%D1%8C%D1%8F%D0%BA%D0%BE%D0%B2%D0%B0/%D0%A5%D1%80%D0%B0%D0%BD%D0%B5%D0%BD%D0%B8%D0%B5_%D0%BD%D0%B5%D0%BD%D1%83%D0%BB%D0%B5%D0%B2%D1%8B%D1%85_%D1%8D%D0%BB%D0%B5%D0%BC%D0%B5%D0%BD%D1%82%D0%BE%D0%B2_%D1%80%D0%B0%D0%B7%D1%80%D0%B5%D0%B6%D0%B5%D0%BD%D0%BD%D1%8B%D1%85_%D0%BC%D0%B0%D1%82%D1%80%D0%B8%D1%86._%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=6148"/>
		<updated>2016-10-12T21:43:15Z</updated>

		<summary type="html">&lt;p&gt;Екатерина Буторина: /* Макроструктура алгоритма */&lt;/p&gt;
&lt;hr /&gt;
&lt;div&gt;{{algorithm&lt;br /&gt;
| name              = Умножение разреженной матрицы на вектор&lt;br /&gt;
| serial_complexity = &amp;lt;math&amp;gt;&amp;lt;/math&amp;gt;&lt;br /&gt;
| pf_height         = &amp;lt;math&amp;gt;&amp;lt;/math&amp;gt;&lt;br /&gt;
| pf_width          = &amp;lt;math&amp;gt;&amp;lt;/math&amp;gt;&lt;br /&gt;
| input_data        = &amp;lt;math&amp;gt;2NNZ+n+1&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;
Авторы статьи: [[Участница:Руфина_Третьякова|Третьякова Р. М.]] (группа 603), [[Участница:Екатерина_Буторина|Буторина Е. В.]] (группа 603)&lt;br /&gt;
&lt;br /&gt;
&lt;br /&gt;
&lt;br /&gt;
== Свойства и структура алгоритма ==&lt;br /&gt;
&lt;br /&gt;
=== Общее описание алгоритма ===&lt;br /&gt;
Разрежённая матрица — это матрица с преимущественно нулевыми элементами. В противном случае, если бо́льшая часть элементов матрицы ненулевые, матрица считается плотной.&lt;br /&gt;
Среди специалистов нет единства в определении того, какое именно количество ненулевых элементов делает матрицу разрежённой. Разные авторы предлагают различные варианты. &lt;br /&gt;
Огромные разрежённые матрицы часто возникают при решении таких задач, как дифференциальное уравнение в частных производных.&lt;br /&gt;
При хранении и преобразовании разрежённых матриц в компьютере бывает полезно, а часто и необходимо, использовать специальные алгоритмы и структуры данных, которые учитывают разрежённую структуру матрицы. Операции и алгоритмы, применяемые для работы с обычными, плотными матрицами, применительно к большим разрежённым матрицам работают относительно медленно и требуют значительных объёмов памяти. Однако разрежённые матрицы могут быть легко сжаты путём записи только своих ненулевых элементов, что снижает требования к компьютерной памяти.&lt;br /&gt;
&lt;br /&gt;
=== Математическое описание алгоритма ===&lt;br /&gt;
Исходные данные:  разреженная матрица &amp;lt;math&amp;gt;M^{n*n}&amp;lt;/math&amp;gt;, вектор &amp;lt;math&amp;gt;x^{n*1}&amp;lt;/math&amp;gt; &lt;br /&gt;
&lt;br /&gt;
Наиболее удобным форматом для вычисления произведения матрицы на вектор является &amp;quot;Compressed Sparse Row&amp;quot; или сокращенно CSR-формат.&lt;br /&gt;
&lt;br /&gt;
Рассмотрим CSR-представление разреженной матрицы: пусть число ненулевых элементов матрицы равно &amp;lt;math&amp;gt;NNZ&amp;lt;/math&amp;gt;&lt;br /&gt;
CSR-формат представляет матрицу &amp;lt;math&amp;gt;M&amp;lt;/math&amp;gt; в виде 3-х одномерных массивов:&lt;br /&gt;
&lt;br /&gt;
массив &amp;lt;math&amp;gt;A&amp;lt;/math&amp;gt; размера &amp;lt;math&amp;gt;NNZ&amp;lt;/math&amp;gt; содержит ненулевые значения матрицы,&lt;br /&gt;
&amp;lt;math&amp;gt;JA&amp;lt;/math&amp;gt; размера &amp;lt;math&amp;gt;NNZ&amp;lt;/math&amp;gt; - номера столбцов ненулевых элементов., &lt;br /&gt;
&amp;lt;math&amp;gt;IA&amp;lt;/math&amp;gt; размера &amp;lt;math&amp;gt;n&amp;lt;/math&amp;gt;- содержит номер с которого начинается описание элементов строки в массивах &amp;lt;math&amp;gt;A&amp;lt;/math&amp;gt; и &amp;lt;math&amp;gt;JA&amp;lt;/math&amp;gt;.&lt;br /&gt;
Этот формат позволяет производить перемножение матрицы &amp;lt;math&amp;gt;M&amp;lt;/math&amp;gt; на вектор &amp;lt;math&amp;gt;x&amp;lt;/math&amp;gt; за &amp;lt;math&amp;gt;O(NNZ)&amp;lt;/math&amp;gt; умножений и сложений. &lt;br /&gt;
&lt;br /&gt;
Например, это разреженная матрица с 4-мя ненулевыми элементами&lt;br /&gt;
:: &amp;lt;math&amp;gt;\begin{pmatrix}&lt;br /&gt;
0 &amp;amp; 0 &amp;amp; 0 &amp;amp; 1 \\&lt;br /&gt;
2 &amp;amp; 0 &amp;amp; 0 &amp;amp; 0 \\&lt;br /&gt;
0 &amp;amp; 0 &amp;amp; 3 &amp;amp; 0 \\&lt;br /&gt;
0 &amp;amp; 4 &amp;amp; 0 &amp;amp; 0 \\&lt;br /&gt;
\end{pmatrix}&amp;lt;/math&amp;gt;,&lt;br /&gt;
&lt;br /&gt;
 представляемая в формате CSR &lt;br /&gt;
&lt;br /&gt;
    A  = [ 1 2 3 4 ]&lt;br /&gt;
    IA = [ 0 1 2 3 4 ]&lt;br /&gt;
    JA = [ 3 0 2 1 ]&lt;br /&gt;
&lt;br /&gt;
&lt;br /&gt;
Вычисляемые данные: вектор  &amp;lt;math&amp;gt;M*x=y&amp;lt;/math&amp;gt;&lt;br /&gt;
&lt;br /&gt;
=== Вычислительное ядро алгоритма ===&lt;br /&gt;
&lt;br /&gt;
:&amp;lt;math&amp;gt;y_i = \sum_{k = IA_i}^{IA_{i+1}} A_k x_{JA_k}&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;
  число строк матрицы &#039;&#039;n&#039;&#039;; &lt;br /&gt;
  разреженная матрица в формате CSR:&lt;br /&gt;
    строчные указатели &#039;&#039;IA&#039;&#039;,&lt;br /&gt;
    столбцовые указатели&#039;&#039;JA&#039;&#039;, &lt;br /&gt;
    ненулевые элементы &#039;&#039;A&#039;&#039;;&lt;br /&gt;
  вектор &#039;&#039;x&#039;&#039;.&lt;br /&gt;
 &#039;&#039;&#039;Выходные данные&#039;&#039;&#039;: произведение матрицы на вектор &#039;&#039;y&#039;&#039;.&lt;br /&gt;
  &#039;&#039;&#039;read&#039;&#039;&#039; &#039;&#039;n&#039;&#039;, &#039;&#039;IA&#039;&#039;, &#039;&#039;JA&#039;&#039;, &#039;&#039;A&#039;&#039;;&lt;br /&gt;
 &#039;&#039;&#039;read&#039;&#039;&#039; &#039;&#039;x&#039;&#039;&lt;br /&gt;
 &#039;&#039;&#039;for&#039;&#039;&#039; &#039;&#039;i&#039;&#039; = 1,n:&lt;br /&gt;
  &#039;&#039;&#039;for&#039;&#039;&#039; &#039;&#039;k&#039;&#039; = &#039;&#039;IA(i)&#039;&#039;, &#039;&#039;IA(i+1)-1&#039;&#039;:&lt;br /&gt;
            &#039;&#039;y(i)&#039;&#039; += &#039;&#039;A(k)&#039;&#039;*&#039;&#039;x(JA(k))&#039;&#039;;&lt;br /&gt;
 &#039;&#039;&#039;write&#039;&#039;&#039; &#039;&#039;y&#039;&#039;;&lt;br /&gt;
&lt;br /&gt;
=== Схема реализации последовательного алгоритма ===&lt;br /&gt;
Метод можно описать следующим образом:&lt;br /&gt;
&lt;br /&gt;
&lt;br /&gt;
=== Последовательная сложность алгоритма ===&lt;br /&gt;
Для вычисления сингулярных чисел и векторов матрицы порядка n в последовательном варианте требуется:&lt;br /&gt;
&lt;br /&gt;
* &amp;lt;math&amp;gt;&amp;lt;/math&amp;gt; делений,&lt;br /&gt;
* &amp;lt;math&amp;gt;&amp;lt;/math&amp;gt; сложений (вычитаний),&lt;br /&gt;
* &amp;lt;math&amp;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;
== Программная реализация алгоритма ==&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>Екатерина Буторина</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:%D0%A0%D1%83%D1%84%D0%B8%D0%BD%D0%B0_%D0%A2%D1%80%D0%B5%D1%82%D1%8C%D1%8F%D0%BA%D0%BE%D0%B2%D0%B0/%D0%A5%D1%80%D0%B0%D0%BD%D0%B5%D0%BD%D0%B8%D0%B5_%D0%BD%D0%B5%D0%BD%D1%83%D0%BB%D0%B5%D0%B2%D1%8B%D1%85_%D1%8D%D0%BB%D0%B5%D0%BC%D0%B5%D0%BD%D1%82%D0%BE%D0%B2_%D1%80%D0%B0%D0%B7%D1%80%D0%B5%D0%B6%D0%B5%D0%BD%D0%BD%D1%8B%D1%85_%D0%BC%D0%B0%D1%82%D1%80%D0%B8%D1%86._%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=6143</id>
		<title>Участник:Руфина Третьякова/Хранение ненулевых элементов разреженных матриц. Умножение разреженной матрицы на вектор</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:%D0%A0%D1%83%D1%84%D0%B8%D0%BD%D0%B0_%D0%A2%D1%80%D0%B5%D1%82%D1%8C%D1%8F%D0%BA%D0%BE%D0%B2%D0%B0/%D0%A5%D1%80%D0%B0%D0%BD%D0%B5%D0%BD%D0%B8%D0%B5_%D0%BD%D0%B5%D0%BD%D1%83%D0%BB%D0%B5%D0%B2%D1%8B%D1%85_%D1%8D%D0%BB%D0%B5%D0%BC%D0%B5%D0%BD%D1%82%D0%BE%D0%B2_%D1%80%D0%B0%D0%B7%D1%80%D0%B5%D0%B6%D0%B5%D0%BD%D0%BD%D1%8B%D1%85_%D0%BC%D0%B0%D1%82%D1%80%D0%B8%D1%86._%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=6143"/>
		<updated>2016-10-12T21:41:42Z</updated>

		<summary type="html">&lt;p&gt;Екатерина Буторина: &lt;/p&gt;
&lt;hr /&gt;
&lt;div&gt;{{algorithm&lt;br /&gt;
| name              = Умножение разреженной матрицы на вектор&lt;br /&gt;
| serial_complexity = &amp;lt;math&amp;gt;&amp;lt;/math&amp;gt;&lt;br /&gt;
| pf_height         = &amp;lt;math&amp;gt;&amp;lt;/math&amp;gt;&lt;br /&gt;
| pf_width          = &amp;lt;math&amp;gt;&amp;lt;/math&amp;gt;&lt;br /&gt;
| input_data        = &amp;lt;math&amp;gt;2NNZ+n+1&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;
Авторы статьи: [[Участница:Руфина_Третьякова|Третьякова Р. М.]] (группа 603), [[Участница:Екатерина_Буторина|Буторина Е. В.]] (группа 603)&lt;br /&gt;
&lt;br /&gt;
&lt;br /&gt;
&lt;br /&gt;
== Свойства и структура алгоритма ==&lt;br /&gt;
&lt;br /&gt;
=== Общее описание алгоритма ===&lt;br /&gt;
Разрежённая матрица — это матрица с преимущественно нулевыми элементами. В противном случае, если бо́льшая часть элементов матрицы ненулевые, матрица считается плотной.&lt;br /&gt;
Среди специалистов нет единства в определении того, какое именно количество ненулевых элементов делает матрицу разрежённой. Разные авторы предлагают различные варианты. &lt;br /&gt;
Огромные разрежённые матрицы часто возникают при решении таких задач, как дифференциальное уравнение в частных производных.&lt;br /&gt;
При хранении и преобразовании разрежённых матриц в компьютере бывает полезно, а часто и необходимо, использовать специальные алгоритмы и структуры данных, которые учитывают разрежённую структуру матрицы. Операции и алгоритмы, применяемые для работы с обычными, плотными матрицами, применительно к большим разрежённым матрицам работают относительно медленно и требуют значительных объёмов памяти. Однако разрежённые матрицы могут быть легко сжаты путём записи только своих ненулевых элементов, что снижает требования к компьютерной памяти.&lt;br /&gt;
&lt;br /&gt;
=== Математическое описание алгоритма ===&lt;br /&gt;
Исходные данные:  разреженная матрица &amp;lt;math&amp;gt;M^{n*n}&amp;lt;/math&amp;gt;, вектор &amp;lt;math&amp;gt;x^{n*1}&amp;lt;/math&amp;gt; &lt;br /&gt;
&lt;br /&gt;
Наиболее удобным форматом для вычисления произведения матрицы на вектор является &amp;quot;Compressed Sparse Row&amp;quot; или сокращенно CSR-формат.&lt;br /&gt;
&lt;br /&gt;
Рассмотрим CSR-представление разреженной матрицы: пусть число ненулевых элементов матрицы равно &amp;lt;math&amp;gt;NNZ&amp;lt;/math&amp;gt;&lt;br /&gt;
CSR-формат представляет матрицу &amp;lt;math&amp;gt;M&amp;lt;/math&amp;gt; в виде 3-х одномерных массивов:&lt;br /&gt;
&lt;br /&gt;
массив &amp;lt;math&amp;gt;A&amp;lt;/math&amp;gt; размера &amp;lt;math&amp;gt;NNZ&amp;lt;/math&amp;gt; содержит ненулевые значения матрицы,&lt;br /&gt;
&amp;lt;math&amp;gt;JA&amp;lt;/math&amp;gt; размера &amp;lt;math&amp;gt;NNZ&amp;lt;/math&amp;gt; - номера столбцов ненулевых элементов., &lt;br /&gt;
&amp;lt;math&amp;gt;IA&amp;lt;/math&amp;gt; размера &amp;lt;math&amp;gt;n&amp;lt;/math&amp;gt;- содержит номер с которого начинается описание элементов строки в массивах &amp;lt;math&amp;gt;A&amp;lt;/math&amp;gt; и &amp;lt;math&amp;gt;JA&amp;lt;/math&amp;gt;.&lt;br /&gt;
Этот формат позволяет производить перемножение матрицы &amp;lt;math&amp;gt;M&amp;lt;/math&amp;gt; на вектор &amp;lt;math&amp;gt;x&amp;lt;/math&amp;gt; за &amp;lt;math&amp;gt;O(NNZ)&amp;lt;/math&amp;gt; умножений и сложений. &lt;br /&gt;
&lt;br /&gt;
Например, это разреженная матрица с 4-мя ненулевыми элементами&lt;br /&gt;
:: &amp;lt;math&amp;gt;\begin{pmatrix}&lt;br /&gt;
0 &amp;amp; 0 &amp;amp; 0 &amp;amp; 1 \\&lt;br /&gt;
2 &amp;amp; 0 &amp;amp; 0 &amp;amp; 0 \\&lt;br /&gt;
0 &amp;amp; 0 &amp;amp; 3 &amp;amp; 0 \\&lt;br /&gt;
0 &amp;amp; 4 &amp;amp; 0 &amp;amp; 0 \\&lt;br /&gt;
\end{pmatrix}&amp;lt;/math&amp;gt;,&lt;br /&gt;
&lt;br /&gt;
 представляемая в формате CSR &lt;br /&gt;
&lt;br /&gt;
    A  = [ 1 2 3 4 ]&lt;br /&gt;
    IA = [ 0 1 2 3 4 ]&lt;br /&gt;
    JA = [ 3 0 2 1 ]&lt;br /&gt;
&lt;br /&gt;
&lt;br /&gt;
Вычисляемые данные: вектор  &amp;lt;math&amp;gt;M*x=y&amp;lt;/math&amp;gt;&lt;br /&gt;
&lt;br /&gt;
=== Вычислительное ядро алгоритма ===&lt;br /&gt;
&lt;br /&gt;
:&amp;lt;math&amp;gt;y_i = \sum_{k = IA_i}^{IA_{i+1}} A_k x_{JA_k}&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;
  число строк матрицы &#039;&#039;n&#039;&#039;; &lt;br /&gt;
  разреженная матрица в формате CSR:&lt;br /&gt;
    строчные указатели &#039;&#039;IA&#039;&#039;,&lt;br /&gt;
    столбцовые указатели&#039;&#039;JA&#039;&#039;, &lt;br /&gt;
    ненулевые элементы &#039;&#039;A&#039;&#039;;&lt;br /&gt;
  вектор &#039;&#039;x&#039;&#039;.&lt;br /&gt;
 &#039;&#039;&#039;Выходные данные&#039;&#039;&#039;: произведение матрицы на вектор &#039;&#039;y&#039;&#039;.&lt;br /&gt;
 &lt;br /&gt;
 &#039;&#039;&#039;for&#039;&#039;&#039; &#039;&#039;i&#039;&#039; = 1,n:&lt;br /&gt;
  &#039;&#039;&#039;for&#039;&#039;&#039; &#039;&#039;k&#039;&#039; = &#039;&#039;IA(i)&#039;&#039;, &#039;&#039;IA(i+1)-1&#039;&#039;:&lt;br /&gt;
            &#039;&#039;y(i)&#039;&#039; += &#039;&#039;A(k)&#039;&#039;*&#039;&#039;x(JA(k))&#039;&#039;;&lt;br /&gt;
&lt;br /&gt;
=== Схема реализации последовательного алгоритма ===&lt;br /&gt;
Метод можно описать следующим образом:&lt;br /&gt;
&lt;br /&gt;
&lt;br /&gt;
=== Последовательная сложность алгоритма ===&lt;br /&gt;
Для вычисления сингулярных чисел и векторов матрицы порядка n в последовательном варианте требуется:&lt;br /&gt;
&lt;br /&gt;
* &amp;lt;math&amp;gt;&amp;lt;/math&amp;gt; делений,&lt;br /&gt;
* &amp;lt;math&amp;gt;&amp;lt;/math&amp;gt; сложений (вычитаний),&lt;br /&gt;
* &amp;lt;math&amp;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;
== Программная реализация алгоритма ==&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>Екатерина Буторина</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:%D0%A0%D1%83%D1%84%D0%B8%D0%BD%D0%B0_%D0%A2%D1%80%D0%B5%D1%82%D1%8C%D1%8F%D0%BA%D0%BE%D0%B2%D0%B0/%D0%A5%D1%80%D0%B0%D0%BD%D0%B5%D0%BD%D0%B8%D0%B5_%D0%BD%D0%B5%D0%BD%D1%83%D0%BB%D0%B5%D0%B2%D1%8B%D1%85_%D1%8D%D0%BB%D0%B5%D0%BC%D0%B5%D0%BD%D1%82%D0%BE%D0%B2_%D1%80%D0%B0%D0%B7%D1%80%D0%B5%D0%B6%D0%B5%D0%BD%D0%BD%D1%8B%D1%85_%D0%BC%D0%B0%D1%82%D1%80%D0%B8%D1%86._%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=6137</id>
		<title>Участник:Руфина Третьякова/Хранение ненулевых элементов разреженных матриц. Умножение разреженной матрицы на вектор</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:%D0%A0%D1%83%D1%84%D0%B8%D0%BD%D0%B0_%D0%A2%D1%80%D0%B5%D1%82%D1%8C%D1%8F%D0%BA%D0%BE%D0%B2%D0%B0/%D0%A5%D1%80%D0%B0%D0%BD%D0%B5%D0%BD%D0%B8%D0%B5_%D0%BD%D0%B5%D0%BD%D1%83%D0%BB%D0%B5%D0%B2%D1%8B%D1%85_%D1%8D%D0%BB%D0%B5%D0%BC%D0%B5%D0%BD%D1%82%D0%BE%D0%B2_%D1%80%D0%B0%D0%B7%D1%80%D0%B5%D0%B6%D0%B5%D0%BD%D0%BD%D1%8B%D1%85_%D0%BC%D0%B0%D1%82%D1%80%D0%B8%D1%86._%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=6137"/>
		<updated>2016-10-12T21:38:05Z</updated>

		<summary type="html">&lt;p&gt;Екатерина Буторина: &lt;/p&gt;
&lt;hr /&gt;
&lt;div&gt;{{algorithm&lt;br /&gt;
| name              = Умножение разреженной матрицы на вектор&lt;br /&gt;
| serial_complexity = &amp;lt;math&amp;gt;&amp;lt;/math&amp;gt;&lt;br /&gt;
| pf_height         = &amp;lt;math&amp;gt;&amp;lt;/math&amp;gt;&lt;br /&gt;
| pf_width          = &amp;lt;math&amp;gt;&amp;lt;/math&amp;gt;&lt;br /&gt;
| input_data        = &amp;lt;math&amp;gt;2NNZ+N+1&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;
Авторы статьи: [[Участница:Руфина_Третьякова|Третьякова Р. М.]] (группа 603), [[Участница:Екатерина_Буторина|Буторина Е. В.]] (группа 603)&lt;br /&gt;
&lt;br /&gt;
&lt;br /&gt;
&lt;br /&gt;
== Свойства и структура алгоритма ==&lt;br /&gt;
&lt;br /&gt;
=== Общее описание алгоритма ===&lt;br /&gt;
Разрежённая матрица — это матрица с преимущественно нулевыми элементами. В противном случае, если бо́льшая часть элементов матрицы ненулевые, матрица считается плотной.&lt;br /&gt;
Среди специалистов нет единства в определении того, какое именно количество ненулевых элементов делает матрицу разрежённой. Разные авторы предлагают различные варианты. &lt;br /&gt;
Огромные разрежённые матрицы часто возникают при решении таких задач, как дифференциальное уравнение в частных производных.&lt;br /&gt;
При хранении и преобразовании разрежённых матриц в компьютере бывает полезно, а часто и необходимо, использовать специальные алгоритмы и структуры данных, которые учитывают разрежённую структуру матрицы. Операции и алгоритмы, применяемые для работы с обычными, плотными матрицами, применительно к большим разрежённым матрицам работают относительно медленно и требуют значительных объёмов памяти. Однако разрежённые матрицы могут быть легко сжаты путём записи только своих ненулевых элементов, что снижает требования к компьютерной памяти.&lt;br /&gt;
&lt;br /&gt;
=== Математическое описание алгоритма ===&lt;br /&gt;
Исходные данные:  разреженная матрица &amp;lt;math&amp;gt;M^{n*n}&amp;lt;/math&amp;gt;, вектор &amp;lt;math&amp;gt;x^{n*1}&amp;lt;/math&amp;gt; &lt;br /&gt;
&lt;br /&gt;
Наиболее удобным форматом для вычисления произведения матрицы на вектор является &amp;quot;Compressed Sparse Row&amp;quot; или сокращенно CSR-формат.&lt;br /&gt;
&lt;br /&gt;
Рассмотрим CSR-представление разреженной матрицы: пусть число ненулевых элементов матрицы&lt;br /&gt;
CSR-формат представляет матрицу &amp;lt;math&amp;gt;M&amp;lt;/math&amp;gt; в виде 3-х одномерных массивов:&lt;br /&gt;
&lt;br /&gt;
массив &amp;lt;math&amp;gt;A&amp;lt;/math&amp;gt; размера &amp;lt;math&amp;gt;nnz&amp;lt;/math&amp;gt; содержит ненулевые значения матрицы,&lt;br /&gt;
&amp;lt;math&amp;gt;JA&amp;lt;/math&amp;gt; - номера столбцов ненулевых элементов., &lt;br /&gt;
&amp;lt;math&amp;gt;IA&amp;lt;/math&amp;gt;- содержит номер с которого начинается описание элементов в массивах, &lt;br /&gt;
Этот формат позволяет быстро производить перемножение матрицы &amp;lt;math&amp;gt;M&amp;lt;/math&amp;gt; на вектор &amp;lt;math&amp;gt;x&amp;lt;/math&amp;gt;. &lt;br /&gt;
&lt;br /&gt;
Например, это разреженная матрица с 4-мя ненулевыми элементами&lt;br /&gt;
:: &amp;lt;math&amp;gt;\begin{pmatrix}&lt;br /&gt;
0 &amp;amp; 0 &amp;amp; 0 &amp;amp; 1 \\&lt;br /&gt;
2 &amp;amp; 0 &amp;amp; 0 &amp;amp; 0 \\&lt;br /&gt;
0 &amp;amp; 0 &amp;amp; 3 &amp;amp; 0 \\&lt;br /&gt;
0 &amp;amp; 4 &amp;amp; 0 &amp;amp; 0 \\&lt;br /&gt;
\end{pmatrix}&amp;lt;/math&amp;gt;,&lt;br /&gt;
&lt;br /&gt;
 представляемая в формате CSR &lt;br /&gt;
&lt;br /&gt;
    A  = [ 1 2 3 4 ]&lt;br /&gt;
    IA = [ 0 1 2 3 4 ]&lt;br /&gt;
    JA = [ 3 0 2 1 ]&lt;br /&gt;
&lt;br /&gt;
&lt;br /&gt;
Вычисляемые данные: вектор  &amp;lt;math&amp;gt;M*x=y&amp;lt;/math&amp;gt;&lt;br /&gt;
&lt;br /&gt;
=== Вычислительное ядро алгоритма ===&lt;br /&gt;
&lt;br /&gt;
:&amp;lt;math&amp;gt;y_i = \sum_{k = IA_i}^{IA_{i+1}} A_k x_{JA_k}&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;
  число строк матрицы &#039;&#039;n&#039;&#039;; &lt;br /&gt;
  разреженная матрица в формате CSR:&lt;br /&gt;
    строчные указатели &#039;&#039;IA&#039;&#039;,&lt;br /&gt;
    столбцовые указатели&#039;&#039;JA&#039;&#039;, &lt;br /&gt;
    ненулевые элементы &#039;&#039;A&#039;&#039;;&lt;br /&gt;
  вектор &#039;&#039;x&#039;&#039;.&lt;br /&gt;
 &#039;&#039;&#039;Выходные данные&#039;&#039;&#039;: произведение матрицы на вектор &#039;&#039;y&#039;&#039;.&lt;br /&gt;
 &lt;br /&gt;
 &#039;&#039;&#039;for&#039;&#039;&#039; &#039;&#039;i&#039;&#039; = 1,n:&lt;br /&gt;
  &#039;&#039;&#039;for&#039;&#039;&#039; &#039;&#039;k&#039;&#039; = &#039;&#039;IA(i)&#039;&#039;, &#039;&#039;IA(i+1)-1&#039;&#039;:&lt;br /&gt;
            &#039;&#039;y(i)&#039;&#039; += &#039;&#039;A(k)&#039;&#039;*&#039;&#039;x(JA(k))&#039;&#039;;&lt;br /&gt;
&lt;br /&gt;
=== Схема реализации последовательного алгоритма ===&lt;br /&gt;
Метод можно описать следующим образом:&lt;br /&gt;
&lt;br /&gt;
&lt;br /&gt;
=== Последовательная сложность алгоритма ===&lt;br /&gt;
Для вычисления сингулярных чисел и векторов матрицы порядка n в последовательном варианте требуется:&lt;br /&gt;
&lt;br /&gt;
* &amp;lt;math&amp;gt;&amp;lt;/math&amp;gt; делений,&lt;br /&gt;
* &amp;lt;math&amp;gt;&amp;lt;/math&amp;gt; сложений (вычитаний),&lt;br /&gt;
* &amp;lt;math&amp;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;
== Программная реализация алгоритма ==&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>Екатерина Буторина</name></author>
	</entry>
</feed>