none
Перемножение матриц RRS feed

  • Вопрос

  • Очень нужна ваша помощь, курсач горит а написать не получается.)
    задача такова, нужно сделать перемножение матриц линейных уравнений в windows форме. Пользователь вводит размерность матрицы, следующим окном у него появляется нужно колличество ячеек для ввода цифр. Например матрица 3х2 у него появляется 3 строки ячеек в 2 столбца. И чтобы введеные данные записывались в массив под нужными номерами. Заранее спасибо.
    • Перемещено I.Vorontsov 3 июня 2010 г. 5:50 (От:Visual C#)
    • Перемещено SachinW 1 октября 2010 г. 21:32 MSDN Forums Consolidation (От:Начинающие разработчики)
    2 июня 2010 г. 20:44

Ответы

  • Ок, давайте без оффтопа.

    Собственно решение:

    На окне создаем 4 текстбокса для ввода числа строк и столбцов у двух перемножаемых матриц

    matrix1[Nrows1, Ncols1] и matrix2[Nrows2, Ncols2]

    также создаем 2 кноки

    1я - для генерации внутренних числовых данных на основе введенной пользователем информации(кнопка заполнения маттриц)

    2я - для умножения матриц

    Собственно код окна

    <Window x:Class="WpfApplication1.MainWindow"
      xmlns="http://schemas.microsoft.com/winfx/2006/xaml/presentation"
      xmlns:x="http://schemas.microsoft.com/winfx/2006/xaml"
      Title="MainWindow" Height="350" Width="525">
     <Grid>
      <Grid.RowDefinitions>
       <RowDefinition Height="Auto"/>
       <RowDefinition Height="*"/>
       <RowDefinition Height="Auto"/>
      </Grid.RowDefinitions>
      <Grid.ColumnDefinitions>
       <ColumnDefinition/>
       <ColumnDefinition/>
      </Grid.ColumnDefinitions>
      <StackPanel>
       <TextBlock Text="First matrix number rows"/>
       <TextBox Name="tbxFirstMatrixNumberRows"/>
       <TextBlock Text="First matrix number columns"/>
       <TextBox Name="tbxFirstMatrixNumberColumns"/>
       <TextBlock Text="Second Matrix number rows"/>
       <TextBox Name="tbxSecondMatrixNumberRows"/>
       <TextBlock Text="Second matrix Number columns"/>
       <TextBox Name="tbxSecondMatrixNumberColumns"/>
       <Button Name="btnCreateMatrices" Content="Creste matrices" Click="btnCreateMatrices_Click" />
       <Button Name="btnMutiplyMatrices" Content="Multiply matrices" Click="btnMutiplyMatrices_Click" />
      </StackPanel>
      <Grid Name="firstGrid" Grid.Row="1" Grid.Column="0">
    
      </Grid>
      <Grid Name="secondGrid" Grid.Row="1" Grid.Column="1"/>
      <TextBlock Name="tbxResult" Grid.Row="2" Grid.Column="0" Grid.ColumnSpan="2"/>
     </Grid>
    </Window>
    
     

    Метод, который вызывается при нажатии первой кнопки для генерации матриц как в UI, так  и в памяти

      List<TextBox> textBoxes1 = new List<TextBox>();
      List<TextBox> textBoxes2 = new List<TextBox>();
      int NRows1, NCols1, Nrows2, NCols2;
    
      public void CreateMatrices(int nrows, int ncols, Grid gr, List<TextBox> lst, out int nr, out int nc)
      {
       nr = nrows;
       nc = ncols;
    
       for(int i = 0; i < nrows; i++)
       {
        gr.RowDefinitions.Add(new RowDefinition()); 
       }
       for (int i = 0; i < ncols; i++)
       {
        gr.ColumnDefinitions.Add(new ColumnDefinition());
       }
    
       for (int i = 0; i < nrows; i++)
       {
        for (int j = 0; j < ncols; j++)
        {
         TextBox t = new TextBox();
         gr.Children.Add(t);
         Grid.SetRow(t, i);
         Grid.SetColumn(t, j);
         lst.Add(t);
        }
       }
      }

    Метод для получения матрицы из TetxBox-ов на гриде

      private int[,] GetValuesTextBoxes(int nrows1, int ncols1, List<TextBox> lst)
      {
       int[,] matrix = new int[nrows1, ncols1];
       for (int i = 0; i < nrows1; i++)
       {
        for (int j = 0; j < ncols1; j++)
        {
         matrix[i, j] = int.Parse(lst[i * ncols1 + j].Text);
        }
       }
       return matrix;
      }

    Умножаем матрицы и выводим результат

    private void btnMutiplyMatrices_Click(object sender, RoutedEventArgs e)
      {
       var m1 = GetValuesTextBoxes(NRows1, NCols1, textBoxes1);
       var m2 = GetValuesTextBoxes(Nrows2, NCols2, textBoxes2);
    
       int nrows1 = m1.GetUpperBound(0) + 1;
       int ncols1 = m1.GetUpperBound(1) + 1;
       int nrows2 = m2.GetUpperBound(0) + 1;
       int ncols2 = m2.GetUpperBound(1) + 1;
       int[,] resultMatrix = new int[nrows1, ncols2];
       for (int i = 0; i < nrows1; i++)
       {
        for (int j = 0; j < ncols2; j++)
        {
         for (int k = 0; k < ncols1; k++)
         {
          resultMatrix[i, j] += m1[i, k] * m2[k, j];
         }
        }
       }
    
    
       string strOutput = string.Empty;
       for (int i = 0; i < resultMatrix.GetUpperBound(0) + 1; i++)
       {
        for (int j = 0; j < resultMatrix.GetUpperBound(1) + 1; j++)
        {
         strOutput += string.Format("{0}\t", resultMatrix[i, j]);
        }
        strOutput += Environment.NewLine;
       }
       tbxResult.Text = strOutput;
      }

    Даем команду умножить матрицы

      private void btnCreateMatrices_Click(object sender, RoutedEventArgs e)
      {
         CreateMatrices(int.Parse(tbxFirstMatrixNumberRows.Text), 
          int.Parse(tbxFirstMatrixNumberColumns.Text), firstGrid, textBoxes1, out NRows1, out NCols1);
        CreateMatrices(int.Parse(tbxSecondMatrixNumberRows.Text),
         int.Parse(tbxSecondMatrixNumberColumns.Text), secondGrid, textBoxes2, out Nrows2, out NCols2);
    
      }
    
     
    Курсач закончен
    • Помечено в качестве ответа I.Vorontsov 3 июня 2010 г. 9:43

Все ответы

  • Здесь не место для решения банальных курсачей для дэбильных студентов....

    Имхо, предполагается что если ты заходишь на этот форум, то ты умеешь решить задачу перемножения матриц.

  • IMHO, нигде даже косвенно нет требований к умениям заходящих на форум :)

    Xrandom - найди соседа-студента, который решит задачу за пиво. 

    Имеет целью развитие у студентов навыков самостоятельной творческой работы, овладение методами современных научных исследований, углублённое изучение какого-либо вопроса, темы, раздела учебной дисциплины (включая изучение литературы и источников)». (Большая советская энциклопедия)

  • Я предлагаю тебе начать, а мы поможем, на то и форум.....По поводу того что курсач горит, ну ка быстро мне написали, это не по адресу. Есть куча услуг которые этим занимаются.

     

    пс. OlegGel как то жёстковат=)


    Для связи [Mail]
  • вобще всё это странно, у нас эту задачу давали на первом курсе в первом семестре - но она никак не тянула на курсач, хм...

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

  • вобще всё это странно, у нас эту задачу давали на первом курсе в первом семестре - но она никак не тянула на курсач, хм...

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


    Видимо такая система образования в вузе.

    пс. Давайте не будем оффтопить..


    Для связи [Mail]
  • Ок, давайте без оффтопа.

    Собственно решение:

    На окне создаем 4 текстбокса для ввода числа строк и столбцов у двух перемножаемых матриц

    matrix1[Nrows1, Ncols1] и matrix2[Nrows2, Ncols2]

    также создаем 2 кноки

    1я - для генерации внутренних числовых данных на основе введенной пользователем информации(кнопка заполнения маттриц)

    2я - для умножения матриц

    Собственно код окна

    <Window x:Class="WpfApplication1.MainWindow"
      xmlns="http://schemas.microsoft.com/winfx/2006/xaml/presentation"
      xmlns:x="http://schemas.microsoft.com/winfx/2006/xaml"
      Title="MainWindow" Height="350" Width="525">
     <Grid>
      <Grid.RowDefinitions>
       <RowDefinition Height="Auto"/>
       <RowDefinition Height="*"/>
       <RowDefinition Height="Auto"/>
      </Grid.RowDefinitions>
      <Grid.ColumnDefinitions>
       <ColumnDefinition/>
       <ColumnDefinition/>
      </Grid.ColumnDefinitions>
      <StackPanel>
       <TextBlock Text="First matrix number rows"/>
       <TextBox Name="tbxFirstMatrixNumberRows"/>
       <TextBlock Text="First matrix number columns"/>
       <TextBox Name="tbxFirstMatrixNumberColumns"/>
       <TextBlock Text="Second Matrix number rows"/>
       <TextBox Name="tbxSecondMatrixNumberRows"/>
       <TextBlock Text="Second matrix Number columns"/>
       <TextBox Name="tbxSecondMatrixNumberColumns"/>
       <Button Name="btnCreateMatrices" Content="Creste matrices" Click="btnCreateMatrices_Click" />
       <Button Name="btnMutiplyMatrices" Content="Multiply matrices" Click="btnMutiplyMatrices_Click" />
      </StackPanel>
      <Grid Name="firstGrid" Grid.Row="1" Grid.Column="0">
    
      </Grid>
      <Grid Name="secondGrid" Grid.Row="1" Grid.Column="1"/>
      <TextBlock Name="tbxResult" Grid.Row="2" Grid.Column="0" Grid.ColumnSpan="2"/>
     </Grid>
    </Window>
    
     

    Метод, который вызывается при нажатии первой кнопки для генерации матриц как в UI, так  и в памяти

      List<TextBox> textBoxes1 = new List<TextBox>();
      List<TextBox> textBoxes2 = new List<TextBox>();
      int NRows1, NCols1, Nrows2, NCols2;
    
      public void CreateMatrices(int nrows, int ncols, Grid gr, List<TextBox> lst, out int nr, out int nc)
      {
       nr = nrows;
       nc = ncols;
    
       for(int i = 0; i < nrows; i++)
       {
        gr.RowDefinitions.Add(new RowDefinition()); 
       }
       for (int i = 0; i < ncols; i++)
       {
        gr.ColumnDefinitions.Add(new ColumnDefinition());
       }
    
       for (int i = 0; i < nrows; i++)
       {
        for (int j = 0; j < ncols; j++)
        {
         TextBox t = new TextBox();
         gr.Children.Add(t);
         Grid.SetRow(t, i);
         Grid.SetColumn(t, j);
         lst.Add(t);
        }
       }
      }

    Метод для получения матрицы из TetxBox-ов на гриде

      private int[,] GetValuesTextBoxes(int nrows1, int ncols1, List<TextBox> lst)
      {
       int[,] matrix = new int[nrows1, ncols1];
       for (int i = 0; i < nrows1; i++)
       {
        for (int j = 0; j < ncols1; j++)
        {
         matrix[i, j] = int.Parse(lst[i * ncols1 + j].Text);
        }
       }
       return matrix;
      }

    Умножаем матрицы и выводим результат

    private void btnMutiplyMatrices_Click(object sender, RoutedEventArgs e)
      {
       var m1 = GetValuesTextBoxes(NRows1, NCols1, textBoxes1);
       var m2 = GetValuesTextBoxes(Nrows2, NCols2, textBoxes2);
    
       int nrows1 = m1.GetUpperBound(0) + 1;
       int ncols1 = m1.GetUpperBound(1) + 1;
       int nrows2 = m2.GetUpperBound(0) + 1;
       int ncols2 = m2.GetUpperBound(1) + 1;
       int[,] resultMatrix = new int[nrows1, ncols2];
       for (int i = 0; i < nrows1; i++)
       {
        for (int j = 0; j < ncols2; j++)
        {
         for (int k = 0; k < ncols1; k++)
         {
          resultMatrix[i, j] += m1[i, k] * m2[k, j];
         }
        }
       }
    
    
       string strOutput = string.Empty;
       for (int i = 0; i < resultMatrix.GetUpperBound(0) + 1; i++)
       {
        for (int j = 0; j < resultMatrix.GetUpperBound(1) + 1; j++)
        {
         strOutput += string.Format("{0}\t", resultMatrix[i, j]);
        }
        strOutput += Environment.NewLine;
       }
       tbxResult.Text = strOutput;
      }

    Даем команду умножить матрицы

      private void btnCreateMatrices_Click(object sender, RoutedEventArgs e)
      {
         CreateMatrices(int.Parse(tbxFirstMatrixNumberRows.Text), 
          int.Parse(tbxFirstMatrixNumberColumns.Text), firstGrid, textBoxes1, out NRows1, out NCols1);
        CreateMatrices(int.Parse(tbxSecondMatrixNumberRows.Text),
         int.Parse(tbxSecondMatrixNumberColumns.Text), secondGrid, textBoxes2, out Nrows2, out NCols2);
    
      }
    
     
    Курсач закончен
    • Помечено в качестве ответа I.Vorontsov 3 июня 2010 г. 9:43
  • OlegGel спасибо

    Для связи [Mail]