Multiplying a matrix by a c# WPF vector

It is necessary to multiply the matrix by the vector, while full manipulation of the matrix should be available, how much I fight does not work, help, who knows how?

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;
    }

}
Author: Frager, 2019-07-09

1 answers

If you need exactly the multiplication of a vector and a matrix, do not reinvent the wheel, use Vector. Multiply.

UPD:

Initialize your vector via .NET Framework class Vector. And the matrix, respectively, through Matrix.

Look at the links, it says which libraries you need to connect.

After the result of executing the Multiply operation, you can work with the result.

 0
Author: Макс Жуков, 2019-07-09 16:48:27