Умножение матрицы на вектор c# WPF

103
26 марта 2021, 07:00

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

public partial class Window1 : Window
{
    //Matrix A= new Matrix()
    ObservableCollection<ObservableCollection<int>> matrix = new ObservableCollection<ObservableCollection<int>>();
    ObservableCollection<ObservableCollection<int>> vector = new ObservableCollection<ObservableCollection<int>>();
    //ObservableCollection<ObservableCollection<int>> matrix1 = new ObservableCollection<ObservableCollection<int>>();
    ObservableCollection<ObservableCollection<int>> matrix1 = new ObservableCollection<ObservableCollection<int>>();
    Vector vectorr=new Vector(1, numberrow);
    Random rnd = new Random();
    static byte numberrow;
    static byte numbercolumn;//(countColumn)
    public Window1()
    {
        InitializeComponent();
        dgMatrix.ItemsSource=matrix;
    }
    void DataGrid_LoadingRow(object sender, DataGridRowEventArgs e)
    {
        e.Row.Header=e.Row.GetIndex()+1;
    }
    private void CreateDataGrid(DataGrid dgMatrix, int numbercolumn)
    {
        dgMatrix.Columns.Clear();
        if(numbercolumn>0)
        {
            for(int i=0;i<numbercolumn;i++)
            {
                DataGridTextColumn column = new DataGridTextColumn
                {
                    Header = (i+1).ToString(),
                    Binding = new Binding(string.Format("[{0}]",i))
                };
                dgMatrix.Columns.Add(column);
            }
        }
    }

    /*  private ObservableCollection<ObservableCollection<int>> CreateVector(int numberrow, int numbercolumn)
    {
        vector.Clear();
        if(numberrow>0 && numbercolumn>0)
        {
            for(int i =0; i <numberrow;i++)
            {
                vector[i].Add(rnd.Next(-10,10));
            }
        }
        return vector;
    }*/
    private ObservableCollection<ObservableCollection<int>> CreateMatrix(int numberrow, int numbercolumn)
    {
        matrix.Clear();
        if(numberrow>0 && numbercolumn>0)
        {
            for(int i =0; i <numberrow;i++)
            {
                matrix.Add(new ObservableCollection<int>());
                for(int j=0;j<numbercolumn;j++)
                    matrix[i].Add(rnd.Next(-10,10));
            }
        }
        return matrix;
    }

    void button1_Click(object sender, RoutedEventArgs e)
    {
        otvet.Clear();
        if(!byte.TryParse(TextRow.Text, out numberrow)||!byte.TryParse(TextColumn.Text, out numbercolumn))
        {
            MessageBox.Show("Была установлена неправильная размерность!","Информация", MessageBoxButton.OK,MessageBoxImage.Error);
        }
        CreateMatrix(numberrow, numbercolumn);
        //CreateVector(numberrow, numbercolumn);
        CreateDataGrid(dgMatrix, numbercolumn);
        dgMatrix.Visibility=Visibility.Visible;
    }

    void TextRow_GotFocus(object sender, RoutedEventArgs e)
    {
        TextRow.Clear();
    }
    void TextColumn_GotFocus(object sender, RoutedEventArgs e)
    {
        TextColumn.Clear();
    }
    void DgMatrix_TextInput(object sender, TextCompositionEventArgs e)
    {
        MessageBox.Show("Были введены недопустимые символы! Введите число!","Информация", MessageBoxButton.OK,MessageBoxImage.Error);
    }
    void MenuItem_Click4(object sender, RoutedEventArgs e)
    {
        MessageBoxResult result = MessageBox.Show("Вариант 45. Найти максимальное собственное число матрицы, методом сколярных произведений", "Задание", MessageBoxButton.OK, MessageBoxImage.None);
    }
    void MenuItem_Click5(object sender, RoutedEventArgs e)
    {
        MessageBoxResult result = MessageBox.Show("Разработано студентом первого курса, группы БПИ-111, Чуриловым Андреем Алексеевичем, в качестве практической работы", "Задание", MessageBoxButton.OK, MessageBoxImage.None);
    }
    void button2_Click(object sender, RoutedEventArgs e)
    {
        double lmbd=0;
        if (otvet.Text==String.Empty)
        {
            otvet.Clear();
            int B=0;
            //Vector x = new Vector(1,numberrow);
            int j=0;
            int i=0;
            //var Y=VectorY(matrix, vector);//считаем Y
            var Y = VectorY(matrix, vector);
            lmbd+=matrix1[i][j]*vector[i][j];

            otvet.Text+=8;
        }
    }
    private ObservableCollection<ObservableCollection<int>> VectorY(ObservableCollection<ObservableCollection<int>> matrix, ObservableCollection<ObservableCollection<int>> vector)
    {//процесс умножения
        var matrix1 = new ObservableCollection<ObservableCollection<int>>();
        int num = 0;
        for (int i = 0; i < matrix.Count-1; i++)
        {
            matrix1.Add(new ObservableCollection<int>());
            for (int j = 0; j < matrix[i].Count-1; j++)
            {
                for (int k = 0; k < vector[i].Count-1; k++)
                {
                    num += matrix[i][k] * vector[k][j];
                }
                matrix1[i].Add(num);
                num=0;
            }
        }
        return matrix1;
    }
}
Answer 1

Если вам нужно именно перемножение вектора и матрицы, не изобретайте велосипед, используйте Vector.Multiply.

UPD:

Инициализируйте ваш вектор через .NET Framework класс Vector. А матрицу, соответственно, через Matrix.

Посмотрите на ссылки, там написано, какие библиотеки нужно подключить.

После результата выполнения операции Multiply вы можете работать с результатом.

READ ALSO
Как получить значение слайдера?

Как получить значение слайдера?

В WPF/MVVM приложении в модели нужно получить значение слайдера из формы, как это сделать? Мой метод не работает

137
Не удаётся преобразовать строку в дату

Не удаётся преобразовать строку в дату

Нужно преобразовать строку (string) "Ноя 2018" в дату (DateTime)Делаю все внутри конструктора Xamarin

110
Написать linq аналог алгоритма

Написать linq аналог алгоритма

Необходимо найти индекс элемента, максимально приближенного к среднему арифметическому и записать в linq форме

121
ASP.NET core mvc, передать параметр в функцию

ASP.NET core mvc, передать параметр в функцию

как из input передать параметры в функцию?я хочу взять из input value и передать в функцию как параметр, как это сделать?

110