Foreversoft.ru

IT Справочник
0 просмотров
Рейтинг статьи
1 звезда2 звезды3 звезды4 звезды5 звезд
Загрузка...

Матрицы си шарп

Массивы

Ярким примером ссылочного типа данных являются массивы (как объекты!).

Массив представляет собой совокупность переменных одного типа с общим для обращения к ним именем.
В C# массивы могут быть как одномерными, так и многомерными.
Массивы служат самым разным целям, поскольку они предоставляют удобные средства для объединения связанных вместе переменных.
Массивами в C# можно пользоваться практически так же, как и в других языках программирования.
Тем не менее, у них имеется одна особенность: они реализованы в виде объектов. Смотрите также заметку «Массивы. Класс System.Array».
Объединение данных возможно и в коллекции, об этом — в статье Класс ArrayList. Пример необобщенной коллекции

Объявление массивов

Для того чтобы воспользоваться массивом в программе, требуется двухэтапная процедура. Во-первых, необходимо объявить переменную, которая может обращаться к массиву. И во-вторых, нужно создать экземпляр массива (объект), используя оператор new.

Важно! Если массив только объявляется, но явно не инициализируется, каждый его элемент будет установлен в значение, принятое по умолчанию для соответствующего типа данных (например, элементы массива типа bool будут устанавливаться в false, а элементы массива типа int — в 0). В примере, если мы удалим строки с инициализацией, будет напечатано пять нулей.

Примечание. Такие же действия с полями объекта-структуры выполняет конструктор по умолчанию (без параметров).

Доступ к элементам массива

Для обращения к элементам массива используются индексы . Индекс представляет номер элемента в массиве, при этом нумерация начинается с нуля, поэтому индекс первого элемента будет равен 0. А чтобы обратиться к пятому элементу в массиве, нам надо использовать индекс 4, к примеру: myArr[4] .

Инициализация массива

Помимо заполнения массива элемент за элементом (как показано в предыдущем примере), можно также заполнять его с использованием специального синтаксиса инициализации массивов.

Для этого необходимо перечислить включаемые в массив элементы в фигурных скобках < >. Такой синтаксис удобен при создании массива известного размера, когда нужно быстро задать его начальные значения:

1) инициализация массива с использованием ключевого слова new:
int[] m1 = new int[] <10,20,30,40,50>;

2) инициализации строкового массива без использования слова new:
string[] m2 = < «Фамилия», «Имя», «Отчество» >;

3) используем ключевое слово new и желаемый размер массива символов:
char[] m3 = new char[4] < ‘Я’,’з’,’ы’,’к’ >;

Обратите внимание, что в случае применения синтаксиса с фигурными скобками размер массива указывать не требуется (как видно на примере создания переменной m1), поскольку этот размер автоматически вычисляется на основе количества элементов внутри фигурных скобок.

Кроме того, применять ключевое слово new не обязательно (как при создании массива m2).

Неявно типизированные массивы

Ключевое слово var позволяет определить переменную так, чтобы лежащий в ее основе тип выводился компилятором. Аналогичным образом можно также определять неявно типизированные локальные массивы. С использованием такого подхода можно определить новую переменную массива без указания типа элементов, содержащихся в массиве.

Результат:

Разумеется, как и при создании массива с использованием явного синтаксиса C#, элементы, указываемые в списке инициализации массива, должны обязательно иметь один и тот же базовый тип (т.е. должны все быть int, string или char). Обратите внимание на метод GetType(), позволяющий программным путем определять тип элементов массива.

Определение массива объектов

В большинстве случаев при определении массива тип элемента, содержащегося в массиве, указывается явно.

Хотя на первый взгляд это выглядит довольно понятно, существует одна важная особенность. В основе каждого типа в системе типов .NET (в том числе фундаментальных типов данных) в конечном итоге лежит базовый класс System.Object.

В результате получается, что в случае определения массива объектов находящиеся внутри него элементы могут представлять собой что угодно.

Если обратимся к определению массива, данному выше: «Массив представляет собой совокупность переменных одного типа с общим для обращения к ним именем», то это выглядит несколько противоречиво. Но тем не менее, все это возможно потому, что каждый элемент является объектом. Приведем пример:

Результат:

Обратите внимание на четвертый тип цикла foreach (object me in arrByObject). Легко запомнить: Для каждого (for each) объекта с именем me, входящего в (in) массив arrByObject (учите английский!). На печать выводится как сам объект (элемент массива объектов), так и тип этого объекта (метод GetType(), присущий всем объектам класса Object, от которого наследуются все типы).

Свойство Length

Реализация в C# массивов в виде объектов дает целый ряд преимуществ. Одно из них заключается в том, что с каждым массивом связано свойство Length, содержащее число элементов, из которых может состоять массив. Следовательно, у каждого массива имеется специальное свойство, позволяющее определить его длину.

Когда запрашивается длина многомерного массива, то возвращается общее число элементов, из которых может состоять массив. Благодаря наличию у массивов свойства Length операции с массивами во многих алгоритмах становятся более простыми, а значит, и более надежными.

Вставим в предыдущем примере перед Console.ReadKey() оператор
Console.WriteLine(arrByObject.Length);
Будет напечатано значение, равное 4 (число объектов в массиве). Чаще всего оно используется для задания числа элементов массива в цикле for<>.

Многомерные массивы

Многомерным называется такой массив, который отличается двумя или более измерениями, причем доступ к каждому элементу такого массива осуществляется с помощью определенной комбинации двух или более индексов. Многомерный массив индексируется двумя и более целыми числами.

Двумерные массивы. Простейшей формой многомерного массива является двумерный массив. Местоположение любого элемента в двумерном массиве обозначается двумя индексами. Такой массив можно представить в виде таблицы, на строки которой указывает первый индекс, а на столбцы — второй. Пример объявления и инициализации двумерного массива показан ниже:

Обратите особое внимание на способ объявления двумерного массива. Схематическое представление массива myArr[,] показано ниже:

Заметим, что в программе используется еще один объект – ran, принадлежащий к классу Random, метод которого (функция Next() ) возвращает целое число в заданном диапазоне (1,15).

В C# допускаются массивы трех и более измерений. Ниже приведена общая форма объявления многомерного массива:
тип[,…,] имя_массива = new тип[размер1, размер2, … размеры];

Инициализация многомерных массивов

Для инициализации многомерного массива достаточно заключить в фигурные скобки список инициализаторов каждого его размера:
тип[,] имя_массива = <
,
< val, val, val, …, val>,

>;
где val обозначает инициализирующее значение, а каждый внутренний блок — отдельный ряд.

Первое значение в каждом ряду сохраняется на первой позиции в массиве, второе значение — на второй позиции и т.д.

Обратите внимание на то, что блоки инициализаторов разделяются запятыми, а после завершающей эти блоки закрывающей фигурной скобки ставится точка с запятой.

Ниже в качестве примера приведена общая форма инициализации двумерного массива (4 строки, 2 столбца):

Перейдем к рассмотрению примеров решения задач, где применяются массивы и циклы.

Задача «Три цикла»

Требуется найти сумму и произведение N элементов массива, используя три варианта циклов (for, while, do-while).
Решение. В классе Program объявим статический массив действительных чисел a[1000] и 7 методов (кроме Main()), ввод исходных данных и вычисление сумм и произведений с использованием трех типов циклов.

Тогда наша программа может быть написана так:

Результат:

Задание. Сравните алгоритмы вычисления суммы и произведения и циклы между собой, найдите общее и различия.

Оператор foreach

Последний пример иллюстрирует применение оператора foreach к массивам. Если есть необходимость выполнить некоторые действия со всеми элементами массивов, то этот оператор цикла будет самым кратким.

Результат:

Задачи, предполагающие использование массивов и циклов, подробно рассмотрены в разделе «Примеры решения задач на тему «Массивы строки»»

Перейдем к рассмотрению объектов, относящихся к классу String (строка).

BestProg

Пример создания двумерной матрицы на форме. Аналог компонента TStringGrid в Delphi

Часто в задачах нужно ввести числа или другие данные в двумерный массив (матрицу) и иметь возможность их обрабатывать.

В работе реализован аналог компонента TStringGrid используемого в Delphi для представления данных в виде двумерной таблицы строк. Для этого в C# используется двумерный массив элементов управления типа TextBox .

Содержание

Условие задачи

Составить программу, которая осуществляет произведение двух матриц размерностью n . Матрицы вводятся из клавиатуры в отдельной форме и заносятся во внутренние структуры данных. Пользователь имеет возможность просмотреть результирующую матрицу.

Также есть возможность сохранения результирующей матрицы в текстовом файле “ Res_Matrix.txt ”.

Выполнение

1. Запуск Microsoft Visual Studio . Создание проекта

Подробный пример запуска Microsoft Visual Studio и создания приложения по шаблону Windows Forms Application описывается в теме:

Сохранить проект под любым именем.

2. Создание главной формы Form1

Создать форму, как показано на рисунке 1.

Разместить на форме элементы управления следующих типов:

  • четыре элемента управления типа Button . Автоматически будут созданы четыре объекта (переменные) с именами button1 , button2 , button3 , button4 ;
  • три элемента управления типа Label с именами label1 , label2 , label3 ;
  • один элемент управления типа TextBox , доступ к которому можно получить по имени textBox1 .

Сформировать свойства элементов управления типа Button и Label:

  • в объекте button1 свойство Text = “ Ввод матрицы 1 … «;
  • в объекте button2 свойство Text = “ Ввод матрицы 2 … «;
  • в объекте button3 свойство Text = “Результат …» ;
  • в объекте button4 свойство Text = “ Сохранить в файле “Res_Matr.txt” ”;
  • в элементе управления label1 свойство Text = “ n = ”.

Для настройки вида и поведения формы нужно выполнить следующие действия:

  • установить название формы. Для этого свойство Text = “ Произведение матриц ”;
  • свойство StartPosition = “ CenterScreen ” (форма размещается по центру экрана);
  • свойство MaximizeBox = “ false ” (убрать кнопку развертывания на весь экран).

Рис. 1. Форма приложения

3. Создание второстепенной формы Form2

Во второстепенной форме Form2 будут вводиться данные в матрицы и выводиться исходный результат.

Пример создания новой формы в MS Visual Studio – C# подробно описан здесь .

Добавить новую форму к приложению, вызвав команду

В открывшемся окне выбрать « Windows Form ». Имя файла оставить без изменений « Form2.cs ».

Разместить на форме в любом месте элемент управления типа Button (рис. 2). В результате будет получен объект с именем button1.

В элементе управления button1 нужно установить следующие свойства:

  • свойство Text = “ OK ”;
  • свойство DialogResult = “ OK ” (рис. 3). Это означает, что при нажатии (клике «мышкой») на button1, окно закроется с кодом возвращения равным “ OK ”;
  • свойство Modifiers = “Public”. Это означает, что кнопка button1 будет видимой из других модулей (из формы Form1).

Настроить свойства формы Form2:

  • свойство Text = “ Ввод матрицы ”;
  • свойство StartPosition = “CenterScreen” (форма размещается по центру экрана);
  • свойство MaximizeBox = “false” (убрать кнопку развертывания на весь экран).

Рис. 2. Форма Form2 после настройки

Рис. 3. Свойство DialogResult элемента управления button1 формы Form2

4. Ввод внутренних переменных

Следующий шаг – введение внутренних переменных в текст модуля “ Form1.cs ”.

Для этого сначала нужно активировать модуль “ Form1.cs ”.

В тексте модуля “ Form1.cs ” добавляем следующий код:

Объясним некоторые значения переменных:

  • Max – максимально-допустимая размерность матрицы;
  • n – размерность матрицы, введенная пользователем из клавиатуры в элементе управления TextBox1;
  • MatrText – двумерная матрица элементов управления типа TextBox. В эту матрицу будут вводиться элементы матрицы в виде строк. Ввод данных будет формироваться в форме Form2;
  • Matr1, Matr2 – матрицы элементов типа double, в которые будут копироваться данные из матрицы MatrText;
  • Matr3 – результирующая матрица, которая равная произведению матриц Matr1 и Matr2;
  • f1, f2 – переменные, определяющие были ли введенные данные соответственно в матрицы Matr1 и Matr2;
  • dx, dy – габариты одной ячейки типа TextBox в матрице MatrText;
  • form2 – объект класса формы Form2, по которыму будет получен доступ к этой форме.

5. Программирование события Load формы Form1

Процесс программирования любого события в Microsoft Visual C# подробно описан здесь .

Листинг обработчика события Load формы Form1 следующий:

Объясним некоторые фрагменты кода в методе Form1_Load().

Событие Load генерируется (вызывается) в момент загрузки любой формы. Поскольку форма Form1 есть главной формой приложения, то событие Load формы Form1 будет вызываться сразу после запуска приложения на выполнение. Поэтому, здесь целесообразно ввести начальную инициализацию глобальных элементов управления и внутренних переменных программы. Эти элементы управления могут быть вызваны из других методов класса.

В обработчике события Form1_Load() выделяется память для двумерной матрицы строк MatrText один лишь раз. При завершении приложения эта память будет автоматически освобождена.

Память выделяется в два этапа:

  • для самой матрицы MatrText – как двумерного массива;
  • для каждого элемента матрицы, который есть сложным объектом типа TextBox.

После выделения памяти для любого объекта осуществляется настройка основных внутренних свойств (позиция, размер, текст, видимость в некоторой форме ).

Также каждая созданная ячейка добавляется (размещается) на форму Form2 с помощью метода Add() из класса Controls. Каждая новая ячейка может быть добавлена в любую другую форму приложения.

6. Разработка дополнительного метода обнуления данных в матрице MatrText

В будущем, чтобы многократно не использовать код обнуления строк матрицы MatrText, нужно создать собственный метод (например, Clear_MatrText()) реализующий этот код.

Листинг метода Clear_MatText() следующий:

7. Программирование события клика на кнопке button1 (« Ввод матрицы 1 … »)

При нажатии (клике) на button1 должно вызываться окно ввода новой матрицы. Размер матрицы зависит от значения n .

Листинг обработчика события клика на кнопке button1 следующий:

В вышеприведенном листинге читается значение n . После этого осуществляется настройка ячеек матрицы строк MatrText.

На основе введенного значения n формируются размеры формы form2 и позиция кнопки button1.

Если в форме Form2 пользователь нажал на кнопке OK (button2), то строки с MatrText переносятся в двумерную матрицу вещественных чисел Matr1. Преобразование из строки в соответствующее вещественное число выполняется методом Parse() из класса Double.

Также формируется переменная f1, которая указывает что данные в матрицу Matr1 внесены.

8. Программирование события клика на кнопке button2 (“ Ввод матрицы 2… «)

Листинг обработчика события клика на кнопке button2 подобен листингу обработчика события клика на кнопке button1. Только он отличается шагами 7-8. На этом участке формируются матрица Matr2 и переменная f2.

9. Программирование события Leave потери фокуса ввода элементом управления textBox1

В приложении может возникнуть ситуация, когда пользователь изменяет значение n на новое. В этом случае должны заново формироваться флажки f1 и f2. Также изменяется размер матрицы MatrText, которая выводится в форме Form2.

Изменение значения n можно проконтролировать с помощью события Leave элемента управление textBox1. Событие Leave генерируется в момент потери фокуса ввода элементом управления textBox1 (рис. 4).

Рис. 4. Событие Leave элемента управления textBox1

Листинг обработчика события Leave следующий:

10. Программирование события клика на кнопке button3 (« Результат »)

Вывод результата будет осуществляться в ту же форму, в которой вводились матрицы Matr1 и Matr2. Сначала произведение этих матриц будет сформировано в матрице Matr3. Потом значение с Matr3 переносится в MatrText и отображается на форме Form2.

Листинг обработчика события клика на кнопке button3.

11. Программирование события клика на кнопке button4 (« Сохранить в файле «Res_Matr.txt” ”)

Для сохранения результирующей матрицы Matr3 можно использовать возможности класса FileStream.

Класс FileStream описан в модуле System.IO . Поэтому в начале приложения нужно добавить следующий код:

Листинг обработчика события клика на кнопке button4 следующий:

12. Запуск приложения на выполнение

После этого можно запускать приложение на выполнение и тестировать его работу.

C#: Класс «Матрица» (сложение, вычитание, умножение матриц)

Данный класс позволяет производить некоторые операции над матрицами:

  1. Сложение матрицы А с матрицой Б
  2. Вычитание матрицы Б из матрицы А
  3. Умножение матрицы А на матрицу Б
  4. Умножение матрица А на число
  5. Проверка матрицы А на единичность
  6. Выполнение нексольких операций над матрицами одновременно, образуя матрицу D

Так же он содержит операторы перегрузки и скрытые поля для соблудения инкапсуляции.

Язык программирования С#

using System ;
using System . Collections . Generic ;
using System . Linq ;
using System . Text ;
using System . Threading . Tasks ;

namespace ConsoleApplication1
<
class Matrix
<
// Скрытые поля
private int n ;
private int [ , ] mass ;

// Создаем конструкторы матрицы
public Matrix () < >
public int N
<
get < return n ; >
set < if ( value >0 ) n = value ; >
>

// Задаем аксессоры для работы с полями вне класса Matrix
public Matrix ( int n )
<
this . n = n ;
mass = new int [ this . n , this . n ] ;
>
public int this [ int i , int j ]
<
get
<
return mass [ i , j ] ;
>
set
<
mass [ i , j ] = value ;
>
>

// Ввод матрицы с клавиатуры
public void WriteMat ()
<
for ( int i = 0 ; i n ; i ++ )
<
for ( int j = 0 ; j n ; j ++ )
<
Console . WriteLine ( » Введите элемент матрицы < 0 >: < 1 >» , i + 1 , j + 1 ) ;
mass [ i , j ] = Convert . ToInt32 ( Console . ReadLine ()) ;
>
>
>

// Вывод матрицы с клавиатуры
public void ReadMat ()
<
for ( int i = 0 ; i n ; i ++ )
<
for ( int j = 0 ; j n ; j ++ )
<
Console . Write ( mass [ i , j ] + » t » ) ;
>
Console . WriteLine () ;
>
>

// Проверка матрицы А на единичность
public void oneMat ( Matrix a ) <
int count = 0 ;
for ( int i = 0 ; i n ; i ++ )
<
for ( int j = 0 ; j n ; j ++ )
<
if ( a [ i , j ] == 1 && i == j )
<
count ++;
>
>

>
if ( count == a . N )
<
Console . WriteLine ( » Единичная » ) ;
>
else Console . WriteLine ( » Не единичная » ) ;
>

// Умножение матрицы А на число
public static Matrix umnch ( Matrix a , int ch )
<
Matrix resMass = new Matrix ( a . N ) ;
for ( int i = 0 ; i a . N ; i ++ )
<
for ( int j = 0 ; j a . N ; j ++ )
<
resMass [ i , j ] = a [ i , j ] * ch ;
>
>
return resMass ;
>

// Умножение матрицы А на матрицу Б
public static Matrix umn ( Matrix a , Matrix b )
<
Matrix resMass = new Matrix ( a . N ) ;
for ( int i = 0 ; i a . N ; i ++ )
for ( int j = 0 ; j b . N ; j ++ )
for ( int k = 0 ; k b . N ; k ++ )
resMass [ i , j ] += a [ i , k ] * b [ k , j ] ;

// перегрузка оператора умножения
public static Matrix operator * ( Matrix a , Matrix b )
<
return Matrix . umn ( a , b ) ;
>

public static Matrix operator * ( Matrix a , int b )
<
return Matrix . umnch ( a , b ) ;
>

// Метод вычитания матрицы Б из матрицы А
public static Matrix razn ( Matrix a , Matrix b )
<
Matrix resMass = new Matrix ( a . N ) ;
for ( int i = 0 ; i a . N ; i ++ )
<
for ( int j = 0 ; j b . N ; j ++ )
<
resMass [ i , j ] = a [ i , j ] — b [ i , j ] ;
>
>
return resMass ;
>

// Перегрузка оператора вычитания
public static Matrix operator — ( Matrix a , Matrix b )
<
return Matrix . razn ( a , b ) ;
>
public static Matrix Sum ( Matrix a , Matrix b )
<
Matrix resMass = new Matrix ( a . N ) ;
for ( int i = 0 ; i a . N ; i ++ )
<
for ( int j = 0 ; j b . N ; j ++ )
<
resMass [ i , j ] = a [ i , j ] + b [ i , j ] ;
>
>
return resMass ;
>
// Перегрузка сложения
public static Matrix operator + ( Matrix a , Matrix b )
<
return Matrix . Sum ( a , b ) ;
>
// Деструктор Matrix

Matrix ()
<
Console . WriteLine ( » Очистка » ) ;
>

static void Main ( string [] args )
<
Console . WriteLine ( » Введите размерность матрицы : » ) ;
int nn = Convert . ToInt32 ( Console . ReadLine ()) ;
// Инициализация
Matrix mass1 = new Matrix ( nn ) ;
Matrix mass2 = new Matrix ( nn ) ;
Matrix mass3 = new Matrix ( nn ) ;
Matrix mass4 = new Matrix ( nn ) ;
Matrix mass5 = new Matrix ( nn ) ;
Matrix mass6 = new Matrix ( nn ) ;
Matrix mass7 = new Matrix ( nn ) ;
Matrix mass8 = new Matrix ( nn ) ;
Console . WriteLine ( » ввод Матрица А : » ) ;
mass1 . WriteMat () ;
Console . WriteLine ( » Ввод Матрица B : » ) ;
mass2 . WriteMat () ;

Console . WriteLine ( » Матрица А : » ) ;
mass1 . ReadMat () ;
Console . WriteLine () ;
Console . WriteLine ( » Матрица В : » ) ;
Console . WriteLine () ;
mass2 . ReadMat () ;

Console . WriteLine ( » Сложение матриц А и Б : » ) ;
mass4 = ( mass1 + mass2 ) ;
mass4 . ReadMat () ;

Console . WriteLine ( » Вычитание матриц А и Б : » ) ;
mass6 = ( mass1 — mass2 ) ;
mass6 . ReadMat () ;

Console . WriteLine ( » Умножение матриц А и Б : » ) ;
mass8 = ( mass1 * mass2 ) ;
mass8 . ReadMat () ;

Console . WriteLine ( » Умножение матрицы А на число 2 : » ) ;
mass5 = ( mass1 * 2 ) ;
mass5 . ReadMat () ;

Console . WriteLine ( » Матрица D по формуле D = 3AB + ( A — B ) A : » ) ;
mass7 = ( ( mass1 * 3 ) * mass2 + ( mass1 — mass2 ) * mass1 ) ;
mass7 . ReadMat () ;

Воскресенье, Июнь 12, 2016, 16:40 Заметки

Как я могу умножить две матрицы в C#?

как описано в заголовке, есть ли какая-то библиотека в Microsoft framework, которая позволяет умножать две матрицы или мне нужно написать свой собственный метод для этого? / У меня уже есть ответ на этот вопрос!—2—>

второй вопрос: Я написал этот мультикласс с методом MultiplyMatrix, но он не работает так, как я хочу. Кто-нибудь может помочь и сказать, где я ошибся?

Я забыл сказать: я хочу сделать веб-сервис для умножения на он.

12 ответов

нет ничего встроенного .Сеть. Вам придется написать умножение самостоятельно или использовать стороннюю библиотеку. Я блоге об одном способе достижения этого сравнения двух разных реализаций: стандартного наивного алгоритма и одного, использующего небезопасный код.

в то время как нет встроенного в Maths framework для этого в .NET (можно использовать библиотеку математики XNA), есть Matrix на система.Окна.СМИ пространство имен. Структура матрицы имеет способ умножить который принимает другую матрицу и выводит матрицу.

это в основном используется для 2D-преобразования:

представляет аффинное преобразование 3×3 матрица используется для преобразований в 2-D пространство.

но если это соответствует вашим потребностям, то нет необходимости в каких-либо сторонних библиотеках.

логика умножения двух матриц показана ниже на рисунке:

берется строка первой Матрицы и столбец второй Матрицы. Соответствующие термины умножаются и складываются вместе. Они хранятся в местоположении (матрица C), которое задается номером строки матрицы A и номером столбца матрицы B. самый простой способ сделать это в вашем коде-добавить в общей сложности 3 для циклов. Первые две петли имитируют Номер строки и номер столбца. Третий цикл добавляет три пары элементов и сохраняет результат в матрицу c. Смотрите код ниже:

умножить матрицу 2 :

CSML-C# Matrix Library-компактный и легкий пакет для численной линейной алгебры. Многие матричные операции известны из Matlab, Scilab и Co. реализуются. См.этой!

таких встроенных библиотек нет. Если вы не используете XNA — это Matrix класс, хотя он ограничен и предназначен для 3D-игр.

хотя вы можете умножать матрицы итерационным подходом (для циклов), выполнение вычислений с помощью линейной алгебры очистит ваш код и даст вам прирост производительности, который в несколько раз быстрее!

есть бесплатная библиотека, доступная в nuget —сайт mathnet.Цифры. Это делает его чрезвычайно легко умножать матрицы:

Он не имеет зависимостей и может использоваться в .net core 2.0, что делает его отличным выбором для избежать итерационные методы умножения матриц и воспользоваться линейной алгеброй.

по крайней мере сегодня, или, скорее, начиная с .NET Framework 3.0 Я думаю Матрица.Умножь сделал бы лучшую работу.

Читать еще:  C си шарп
Ссылка на основную публикацию
Adblock
detector