RError.com

RError.com Logo RError.com Logo

RError.com Navigation

  • 主页

Mobile menu

Close
  • 主页
  • 系统&网络
    • 热门问题
    • 最新问题
    • 标签
  • Ubuntu
    • 热门问题
    • 最新问题
    • 标签
  • 帮助
主页 / user-411997

Кирилл's questions

Martin Hope
Кирилл
Asked: 2024-03-29 00:52:16 +0000 UTC

为什么施特拉森的算法在 2047 年之后速度急剧下降?

  • 9

我注意到维度从 1 到 2047 的矩阵的计算时间超过 6 秒

从 2048 开始,它们从 44 +- 秒开始。时间如此跳跃的原因可能是什么?

对于 2047 矩阵,RAM 升至 279 MB;对于 2048,RAM 升至 1042 MB

同时,有足够的RAM,她很难只数数

using System.Diagnostics;
using System.Text;
class Program
{
    static void Main(string[] args)
    {
        int m = 0, n = 0;
        while (true)
        {
            Stopwatch stopwatch = new Stopwatch();
            InputDate(ref m, "строк m");
            InputDate(ref n, "колонок n");

            int[][] matrix1 = GenerateMatrix(m, n);
            int[][] matrix2 = GenerateMatrix(m, n);
            int nn = GetNewDimension(ref m, ref n);

            int[][] aN = Addition2SquareMatrix(matrix1, nn, m, n);          
            int[][] bN = Addition2SquareMatrix(matrix2, nn, m, n);
           
            stopwatch.Start();
            int[][] temp = MultiStrassen(aN, bN, nn);

            stopwatch.Stop();

            //OutputMatrix(matrix1);
            //OutputMatrix(matrix2);
            //OutputMatrix(GetSubmatrix(temp, m, n));
            Console.WriteLine("\n" + stopwatch.Elapsed);
            Console.ReadKey();
        }
    }
    /// <summary>
    /// Ввод количество строк и столбцов
    /// </summary>
    /// <param name="number">запись числа в переменную</param>
    /// <param name="txt">передаваемый текст</param>
    static void InputDate(ref int number, string txt)
    {
        do
        {
            Console.Write($"Введите число {txt}: ");
            number = int.Parse(Console.ReadLine());
        }
        while (number <= 0);
    }
    
    /// <summary>
    /// получаем новую степень матрицы
    /// </summary>
    /// <param name="m">строка</param>
    /// <param name="n">столбец</param>
    /// <returns>возвращаем степень матрицы</returns>
    static int GetNewDimension(ref int m, ref int n) => 1 << (int)(Math.Log2(Math.Max(m, n))+1);
    
    /// <summary>
    /// Преобразуем матрицу к виду 2^n путём добавление дополнительных строк
    /// </summary>
    /// <param name="a">передаваемый массив</param>
    /// <param name="nn">наша новая степень матрицы (размерность)</param>
    /// <param name="m">количество строк</param>
    /// <param name="n">количество столбцов</param>
    /// <returns>возвращаем обновленную матрицу</returns>
    static int[][] Addition2SquareMatrix(int[][] a, int nn, int m, int n)
    {       
        int[][] result = new int[nn][];
        for (int i = 0; i < nn; i++)
        {
            result[i] = new int[nn];
            if (i < m)
            {
                for (int j = 0; j < n; j++)
                {
                    result[i][j] = a[i][j];
                }
            }
        }           
        return result;            
    }
    /// <summary>
    /// Алгоритм Штрассена
    /// </summary>
    /// <param name="a">1 матрица</param>
    /// <param name="b">2 матрица</param>
    /// <param name="n">размерность матрицы</param>
    /// <returns>возвращаем результат</returns>
    static int[][] MultiStrassen(int[][] a, int[][] b, int n)
    {
        if (n <= 64)
        {
            return Multiply(a, b);
        }

        n = n >> 1;

        int[][] a11 = new int[n][];
        int[][] a12 = new int[n][];
        int[][] a21 = new int[n][];
        int[][] a22 = new int[n][];

        int[][] b11 = new int[n][];
        int[][] b12 = new int[n][];
        int[][] b21 = new int[n][];
        int[][] b22 = new int[n][];

        for (int i = 0; i < n; i++)
        {
            a11[i] = new int[n];
            a12[i] = new int[n];
            a21[i] = new int[n];
            a22[i] = new int[n];

            b11[i] = new int[n];
            b12[i] = new int[n];
            b21[i] = new int[n];
            b22[i] = new int[n];
        }

        SplitMatrix(a, a11, a12, a21, a22);
        SplitMatrix(b, b11, b12, b21, b22);

        int[][] p1 = MultiStrassen(Summation(a11, a22), Summation(b11, b22), n);
        int[][] p2 = MultiStrassen(Summation(a21, a22), b11, n);
        int[][] p3 = MultiStrassen(a11, Subtraction(b12, b22), n);
        int[][] p4 = MultiStrassen(a22, Subtraction(b21, b11), n);
        int[][] p5 = MultiStrassen(Summation(a11, a12), b22, n);
        int[][] p6 = MultiStrassen(Subtraction(a21, a11), Summation(b11, b12), n);
        int[][] p7 = MultiStrassen(Subtraction(a12, a22), Summation(b21, b22), n);

        int[][] c11 = Summation(Summation(p1, p4), Subtraction(p7, p5));
        int[][] c12 = Summation(p3, p5);
        int[][] c21 = Summation(p2, p4);
        int[][] c22 = Summation(Subtraction(p1, p2), Summation(p3, p6));
        return CollectMatrix(c11, c12, c21, c22);
    }

    /// <summary>
    /// Разделение на матрицу на под матрицы
    /// </summary>
    /// <param name="a">исходная матрица</param>
    /// <param name="a11">матрицы а11</param>
    /// <param name="a12">матрица а12</param>
    /// <param name="a21">матрица а21</param>
    /// <param name="a22">матрица а22</param>
    static void SplitMatrix(int[][] a, int[][] a11, int[][] a12, int[][] a21, int[][] a22)
    {
        int n = a.Length >> 1;

        for (int i = 0; i < n; i++)
        {
            Array.Copy(a[i], 0, a11[i], 0, n);
            Array.Copy(a[i], n, a12[i], 0, n);
            Array.Copy(a[i + n], 0, a21[i], 0, n);
            Array.Copy(a[i + n], n, a22[i], 0, n);
        }
    }
    /// <summary>
    /// Объединение подматриц в одну матрицу
    /// </summary>
    /// <param name="a11"></param>
    /// <param name="a12"></param>
    /// <param name="a21"></param>
    /// <param name="a22"></param>
    /// <returns>возвращаем объединённую матрицу</returns>
    static int[][] CollectMatrix(int[][] a11, int[][] a12, int[][] a21, int[][] a22)
    {
        int n = a11.Length;
        var b = (n << 1);

        int[][] a = new int[b][];
        for (int i = 0; i < b; i++)
        {
            a[i] = new int[b];
        }

        for (int i = 0; i < n; i++)
        {
            Array.Copy(a11[i], 0, a[i], 0, n);
            Array.Copy(a12[i], 0, a[i], n, n);
            Array.Copy(a21[i], 0, a[i + n], 0, n);
            Array.Copy(a22[i], 0, a[i + n], n, n);
        }

        return a;
    }
    /// <summary>
    /// Разность между матрицами
    /// </summary>
    /// <param name="a">матрица 1</param>
    /// <param name="b">матрица 2</param>
    /// <returns>результат разности матриц</returns>
    static int[][] Subtraction(int[][] a, int[][] b)
    {
        int n = a.Length;
        int m = a[0].Length;
        int[][] c = new int[n][];

        for (int i = 0; i < n; i++)
        {
            c[i] = new int[m];
            for (int j = 0; j < m; j++)
            {
                c[i][j] = a[i][j] - b[i][j];
            }
        }
        return c;
    }
    /// <summary>
    /// Умножение матриц
    /// </summary>
    /// <param name="a"></param>
    /// <param name="b"></param>
    /// <returns>результат умножения </returns>
    static int[][] Multiply(int[][] a, int[][] b)
    {
        int rowsA = a.Length;
        int columnsB = b[0].Length;
        int columnsA_rowsB = a[0].Length;

        int[][] c = new int[rowsA][];
        for (int i = 0; i < rowsA; i++)
        {
            c[i] = new int[columnsB];
            for (int j = 0; j < columnsB; j++)
            {
                int sum = 0;
                for (int k = 0; k < columnsA_rowsB; k++)
                {
                    sum += a[i][k] * b[k][j];
                }
                c[i][j] = sum;
            }
        }
        return c;
    }

    /// <summary>
    /// Суммирование матриц
    /// </summary>
    /// <param name="a"></param>
    /// <param name="b"></param>
    /// <returns></returns>
    static int[][] Summation(int[][] a, int[][] b)
    {
        int n = a.Length;
        int m = a[0].Length;
        int[][] c = new int[n][];
        for (int i = 0; i < n; i++)
        {
            c[i] = new int[m];
        }

        for (int i = 0; i < n; i++)
        {
            for (int j = 0; j < m; j++)
            {
                c[i][j] = a[i][j] + b[i][j];
            }
        }

        return c;
    }
    /// <summary>
    /// Убирает лишние строки матриц
    /// </summary>
    /// <param name="a"></param>
    /// <param name="n"></param>
    /// <param name="m"></param>
    /// <returns>возвращаем матрицу</returns>
    static int[][] GetSubmatrix(int[][] a, int n, int m)
    {        
        int[][] result = new int[n][];
        for (int i = 0; i < n; i++)
        {
            result[i] = new int[m];
            Array.Copy(a[i], 0, result[i], 0, m);
        }
        return result;       
    }

    /// <summary>
    /// Генерация произвольного размера матрицы
    /// </summary>
    /// <param name="m">количество строк</param>
    /// <param name="n">количество столбцов</param>
    /// <returns>возврощаем матрицу</returns>
    static int[][] GenerateMatrix(int m, int n)
    {
        Random rand = new Random();
        int[][] matrix = new int[m][];

        for (int i = 0; i < m; i++)
        {
            matrix[i] = new int[n];
            for (int j = 0; j < n; j++)
            {
                matrix[i][j] = rand.Next(1, 100);
            }
        }
        return matrix;
    }
    /// <summary>
    /// Вывод на экран матриц
    /// </summary>
    /// <param name="matrix"></param>
    static void OutputMatrix(int[][] matrix)
    {
        var sb = new StringBuilder();
        foreach (int[] row in matrix)
        {
            foreach (int element in row)
            {
                sb.Append(element);
                sb.Append(' ');
            }
            sb.Length--;
            sb.AppendLine();
        }
        Console.WriteLine($"\n" + sb);
    }
}
    
c#
  • 2 个回答
  • 135 Views
Martin Hope
Кирилл
Asked: 2022-04-23 20:02:08 +0000 UTC

如何更改标签中的特定字符?

  • 1

默认情况下,我Label有 content 0/0,但是当你输入它时,结果是这样的:

输入文本字段后,它会Label显示输入的字符数。

如何更改 1 个字符Label,而不是整个内容?也就是说,例如:它是0/0,他们进入фыв,它变成了3/0。

代码本身在这里:

private void pbPas_PasswordChanged(object sender, RoutedEventArgs e)
{
    labP.Content = pbPas.Password.Length.ToString(CultureInfo.InvariantCulture);
}

private void tbLog_TextChanged(object sender, TextChangedEventArgs e)
{
    labL.Content = tbLog.Text.Length.ToString(CultureInfo.InvariantCulture);
}
c#
  • 1 个回答
  • 10 Views
Martin Hope
Кирилл
Asked: 2022-04-01 23:00:55 +0000 UTC

如何从库中访问 TextBox 元素

  • 0

我创建了一个类库。我想在其中分配一个方法,该方法将包含诸如(TextBox,PasswordBox ....)之类的参数

如果你在类本身注册它(项目在哪里,那么它理解这些参数)

但是当我尝试在库本身中注册它时,它看不到这样的元素。

在此处输入图像描述

c#
  • 1 个回答
  • 10 Views
Martin Hope
Кирилл
Asked: 2022-03-09 23:00:40 +0000 UTC

如何正确检查程序是否连接到Sql server?

  • 1

并且该块需要太多时间才能工作catch

在此处输入图像描述

代码本身在这里

private void btnVhod_Click(object sender, RoutedEventArgs e)
{
    EditInfo editInfo = new EditInfo();
    try 
    {
        foreach (var user in AvtoServicEntities.GetContext().Users)
        {
            if (logBox.Text == user.Login && passBox.Password == user.Password)
            {
                Visibility = Visibility.Hidden;
                UpdateLayout();
                if (user.iDRole == 1)
                {
                    editInfo.EditFrame.Navigate(new ClientPahe());
                    editInfo.Show();
                }
                else if (user.iDRole == 2)
                {
                    editInfo.EditFrame.Navigate(new ManegerPahe());
                    editInfo.btnManeger.Visibility = Visibility.Visible;
                    editInfo.btnClient.Visibility = Visibility.Visible;
                    editInfo.btnManeger.IsEnabled = false;
                    editInfo.Show();
                }
                else if (user.iDRole == 3)
                {
                    editInfo.EditFrame.Navigate(new AdmManegerPahe());
                    editInfo.Show();
                }
                break;
            }
            else if (logBox.Text != user.Login || passBox.Password != user.Password)
            {
                if (logBox.Text == user.Login && passBox.Password != user.Password)
                {
                    MesBox.MesBoxErrorPassword();
                    break;
                }
                else if (passBox.Password == user.Password && logBox.Text != user.Login)
                {
                    MesBox.MesBoxErrorLogin();
                    break;
                }
            }
            else if (logBox.Text != user.Login && passBox.Password != user.Password)
            {
                MesBox.MesBoxErrorLoginPassword();
                break;
            }
        }
    }
    catch
    {
        MesBox.MesBoxErrorServer();
    }
}
c#
  • 1 个回答
  • 10 Views

Sidebar

Stats

  • 问题 10021
  • Answers 30001
  • 最佳答案 8000
  • 用户 6900
  • 常问
  • 回答
  • Marko Smith

    我看不懂措辞

    • 1 个回答
  • Marko Smith

    请求的模块“del”不提供名为“default”的导出

    • 3 个回答
  • Marko Smith

    "!+tab" 在 HTML 的 vs 代码中不起作用

    • 5 个回答
  • Marko Smith

    我正在尝试解决“猜词”的问题。Python

    • 2 个回答
  • Marko Smith

    可以使用哪些命令将当前指针移动到指定的提交而不更改工作目录中的文件?

    • 1 个回答
  • Marko Smith

    Python解析野莓

    • 1 个回答
  • Marko Smith

    问题:“警告:检查最新版本的 pip 时出错。”

    • 2 个回答
  • Marko Smith

    帮助编写一个用值填充变量的循环。解决这个问题

    • 2 个回答
  • Marko Smith

    尽管依赖数组为空,但在渲染上调用了 2 次 useEffect

    • 2 个回答
  • Marko Smith

    数据不通过 Telegram.WebApp.sendData 发送

    • 1 个回答
  • Martin Hope
    Alexandr_TT 2020年新年大赛! 2020-12-20 18:20:21 +0000 UTC
  • Martin Hope
    Alexandr_TT 圣诞树动画 2020-12-23 00:38:08 +0000 UTC
  • Martin Hope
    Air 究竟是什么标识了网站访问者? 2020-11-03 15:49:20 +0000 UTC
  • Martin Hope
    Qwertiy 号码显示 9223372036854775807 2020-07-11 18:16:49 +0000 UTC
  • Martin Hope
    user216109 如何为黑客设下陷阱,或充分击退攻击? 2020-05-10 02:22:52 +0000 UTC
  • Martin Hope
    Qwertiy 并变成3个无穷大 2020-11-06 07:15:57 +0000 UTC
  • Martin Hope
    koks_rs 什么是样板代码? 2020-10-27 15:43:19 +0000 UTC
  • Martin Hope
    Sirop4ik 向 git 提交发布的正确方法是什么? 2020-10-05 00:02:00 +0000 UTC
  • Martin Hope
    faoxis 为什么在这么多示例中函数都称为 foo? 2020-08-15 04:42:49 +0000 UTC
  • Martin Hope
    Pavel Mayorov 如何从事件或回调函数中返回值?或者至少等他们完成。 2020-08-11 16:49:28 +0000 UTC

热门标签

javascript python java php c# c++ html android jquery mysql

Explore

  • 主页
  • 问题
    • 热门问题
    • 最新问题
  • 标签
  • 帮助

Footer

RError.com

关于我们

  • 关于我们
  • 联系我们

Legal Stuff

  • Privacy Policy

帮助

© 2023 RError.com All Rights Reserve   沪ICP备12040472号-5