• Регистрация
gothic2
gothic2 0.00
н/д

MATLAB GUI обновление графика

В программе реализован динамический синусоидальный сигнал. С помощью слайдера можно менять амплитуду данного сигнала, однако при изменении амплитуды меняется весь сигнал, а мне необходимо, чтобы сигна...

В программе реализован динамический синусоидальный сигнал. С помощью слайдера можно менять амплитуду данного сигнала, однако при изменении амплитуды меняется весь сигнал, а мне необходимо, чтобы сигнал с предыдущей амлитудой сохранялся, а дальше продолжал строиться с новой амплитудой, т.е. чтобы весь сигнал не перезаписывался сигналом с новой амплитудой, как реализовано сейчас. Код программы представлен, подскажите, как мне реализовать задуманное

Файлы

  • primer.m

Теги

    02.03.2020

    Комментарии

    • gothic2
      gothic20.00
      2.03.2020 04:59

      • Andrey Ermakov
        Andrey Ermakov +56.93
        2.03.2020 09:27
        function PushButtonPressed(h, eventdata)
        x = 0:0.1:15;
        n = numel(x);
        y = 1:1:n;
        for i = 1:n
        global lok;
        y(i) = lok.*sin(x(i));
        axes('Position', [0.075 0.175 0.65 0.7], 'fontsize',14, 'parent', h2);
        plot(x(1:i),y(1:i))
        grid on
        xlim([0 15])
        ylim([-2.1 2.1])
        pause(0.05)
        % eh1 = uicontrol('Style','edit','Position', [300, 450, 100, 20]);
        % set(eh1, 'String', num2str(y(i)));
        end
        end

        Попробуйте так. 

        • aBoomest
          aBoomest+923.89
          2.03.2020 09:34

          1. У вас в каждой итерации по i создается новый график. Представляете сколько их там у вас и как все это не оптимально? 

          2. Надо вам один глобальный plot создать и на нем все перерисовывать.

          3. Чтоб строилось так ка вы хотите так же надо создать глобальную переменную и на каждой итеррации ДОписывать в нее, а затем перестраивать на графике. А то вы получается строите график от 1:i (имитируя этим шаги) но при этомпеременная lok (т.е. как я понимаю амплитуда) у вас всегда измененное новое значение имеет и поэтому так и строит сразу новое, т.к. старого у вас не осталось.

          • kurguz
            kurguz+270.00
            2.03.2020 14:51

            Плюсую всем трем пунктам!

          • aBoomest
            aBoomest+923.89
            2.03.2020 09:57

            Во вложении только п.3

            • kurguz
              kurguz+270.00
              2.03.2020 14:41

              Прикрепляю свой вариант.

              Основная проблема была в строке:

              y = lok*sin(x);

              Вы перезаписывали все данные в y, и строили график по ним. Заменил на:

              y(i) = Slider.UserData.lok*sin(x(i));

              Еще несколько нюансов:

              Не используйте глобальные переменные - для обмена данными нужно использовать поле UserData.

              Для создания анимации не стоит строить графики командой plot в цикле, скорее всего ничего хорошего не получится. В моем примере я один раз строю p=plot(), и потом в цикле изменяю данные на графике (p.XData, p.YData). Есть и другие вараинты создания анимации, это только один из них.

              Не стоит несколько раз инициализировать переменную, как это было у вас с переменной lok.

              • aBoomest
                aBoomest+923.89
                3.03.2020 08:36

                А можно доп. вопросик. UserData - принадлежность объекта GUI. А есть что-то (что-то встроенное может быть) когда не используется GUI, а просто скрипт? Тоже какая-то такая встроенная фиговинка. Или тут уже глобальные переменные только?