Использование Matlab из обновления переменной c #

1

В коде, который я использовал ниже, я использую dll из matlab из приложения С#. Значения, возвращаемые объектом matlab, являются случайными величинами, поэтому я ожидаю, что они будут меняться при разных вызовах. В Matlab он работает нормально (возвращает разные значения в каждом вызове), но когда я снова нажимаю кнопку, он возвращает те же значения

Здесь powerRecLog() должен возвращать различное значение, но всякий раз, когда я снова нажимаю кнопку

onum.lqia, onum.lqib, onum.lqic, onum.lqid не меняется.

private void button1_Click(object sender, EventArgs e) // Yeni Olcum
        {
            var acCtx = Type.GetTypeFromProgID("matlab.application.single");
            var matlab = (MLApp.MLApp)Activator.CreateInstance(acCtx);
            matlab.Visible = 0;
            matlab.PutWorkspaceData("Pr", "base", 0);
            onum = new OnlineOlcum();
            try
            {
                onum.xpos = Convert.ToDouble(textBox1.Text);
                onum.ypos = Convert.ToDouble(textBox2.Text);
                label1.Text += " " + onum.xpos + "   " + onum.ypos + "\n";

            double t1, t2, t3, t4;
            t1 = Math.Round(T1.Mesafe(onum), 8);
            t2 = Math.Round(T2.Mesafe(onum), 8);
            t3 = Math.Round(T3.Mesafe(onum), 8);
            t4 = Math.Round(T4.Mesafe(onum), 8);

            string s1, s2, s3, s4;
            s1 = t1.ToString(new CultureInfo("en-US"));
            s2 = t2.ToString(new CultureInfo("en-US"));
            s3 = t3.ToString(new CultureInfo("en-US"));
            s4 = t4.ToString(new CultureInfo("en-US"));

            matlab.Execute("Pr=PowerRecLog(" + s1 + ",1,160,1);");
            onum.lqia = Math.Round((double)matlab.GetVariable("Pr", "base"), 8);
            matlab.Execute("Pr=PowerRecLog(" + s2 + ",1,160,1);");
            onum.lqib = Math.Round((double)matlab.GetVariable("Pr", "base"), 8);
            matlab.Execute("Pr=PowerRecLog(" + s3 + ",1,160,1);");
            onum.lqic = Math.Round((double)matlab.GetVariable("Pr", "base"), 8);
            matlab.Execute("Pr=PowerRecLog(" + s4 + ",1,160,1);");
            onum.lqid = Math.Round((double)matlab.GetVariable("Pr", "base"), 8);

        }
            catch(Exception ex)
            {
                MessageBox.Show(ex.Message);
            }

            matlab.Quit();
        }
Теги:
callback
random

1 ответ

2
Лучший ответ

Поведение, описанное выше (повторяющиеся значения, возвращаемые MATLAB), может иметь смысл. Ваш код выше, кажется, создает новый экземпляр MATLAB всякий раз, когда button1_Click функция button1_Click. Затем код создает и вызывает функцию (MATLAB?) PowerRecLog которая генерирует некоторые числа, которые вы ожидаете быть случайными, но не являются - они повторяются при каждом вызове button1_Click. Предположительно, в теле PowerRecLog используются генераторы псевдослучайных чисел MATLAB rand, randn или randi.

Если я запустил MATLAB с моего рабочего стола и набрал rand(50,1), я получу матрицу 50x1 равномерно распределенных псевдослучайных чисел. Если я выйду из MATLAB, перезапустите его и введите команду rand(50,1) Я получаю одинаковые 50 равномерно распределенных псевдослучайных чисел!

Согласно документации MATLAB (почему случайные числа повторяются после запуска) генератор случайных чисел (что все функции rand извлекают случайные числа) сбрасывает себя в одно и то же состояние при запуске.

Чтобы обойти это (см. rng('shuffle') же ссылку), вы можете управлять генерацией случайных чисел, вызывая rng('shuffle') который rng('shuffle') генератор случайных чисел на основе текущего времени, так что функции rand производят разные последовательности чисел после каждого раза, когда вы call rng.

Таким образом, каждый раз, button1_Click вызывается button1_Click, вы можете вызвать (в MATLAB) rng('shuffle') чтобы перезапустить генератор случайных чисел. Или добавьте эту команду в файл MATLAB startup.m чтобы это автоматически происходило при каждом запуске MATLAB.

Ещё вопросы

Сообщество Overcoder
Наверх
Меню