Matlab workspace、.m脚本和Simulink模型之间的关系是什么?如何有效地使用它们?

Matlab workspace、.m脚本和Simulink模型之间的关系是什么?如何有效地使用它们?,matlab,simulink,Matlab,Simulink,我在控制类中使用了大量的MATLAB,有些东西真的让我很烦。他们希望我们使用大量Simulink,尽管我发现可视化表示没有多大帮助,而且Simulink和MATLAB脚本之间的接口通常很难理解 因此,我有一个模型,并为接收器添加了作用域,当从Simulink运行时,它可以将数据直接保存到工作区。但是,当我使用脚本中的命令sim根据一些参数直接使用模型时(stopTime,求解方法,等等),结果被隐藏在一个对象中,该对象的文档记录很差,至少可以说我有: simout = sim('lab','St

我在控制类中使用了大量的MATLAB,有些东西真的让我很烦。他们希望我们使用大量Simulink,尽管我发现可视化表示没有多大帮助,而且Simulink和MATLAB脚本之间的接口通常很难理解

因此,我有一个模型,并为
接收器添加了
作用域
,当从Simulink运行时,它可以将数据直接保存到工作区。但是,当我使用脚本中的命令
sim
根据一些参数直接使用模型时(
stopTime
求解方法
,等等),结果被隐藏在一个对象中,该对象的文档记录很差,至少可以说我有:

simout = sim('lab','StopTime','100','Solver','ode1','FixedStep','2');
现在我的工作区中有了一个对象,但要访问我想要的数据,我需要在
simout
的成员中深入3、4层。我的第一个问题是:

  • 有没有一种方法可以直接访问或至少知道这些成员是什么,而不必繁琐地使用
    who

    我不想编译代码来访问它的文档!而
    help
    对于这些情况并没有真正的帮助

  • 为什么Simulink模型在调用时不按照接收器属性中的规定保存数据。我知道我提到的代码行覆盖了一些simulink块规定(例如,使用的解决方法)

  • 如何知道simulink模型如何与matlab脚本交互,虽然我在编码方面是个新手,但文档并没有真正告诉我模型的形式定义以及在matlab中的使用方式。我害怕在某些时候,“sim”的默认设置会超过我在早期模型中设置的一些设置,这将被证明是一个令人讨厌的调试业务

  • TL;DR有没有一种快速方法可以接触到物体的深埋部分?例如,现在我必须做:

    simout = sim('lab','StopTime','100','Solver','ode1','FixedStep','2');
    who(simout)
    ScopeData = (simout.get('ScopeData'))
    signals = (ScopeData.signals)
    time = (ScopeData.time)
    
    我可以做一些类似于
    (Simout->ScopeData.signals)的C-ish吗


    最后,为什么MATLAB套件被那些通常需要了解自己编码的EE用户大量使用,却被当作是一个日内交易者的应用程序?为什么没有使用带有标题的库以及用于在代码中导入内容(例如boost、string等)的良好文档?通过隐藏机制,最后一个选项可能不那么漂亮,但是为了能够正确地编写代码,我觉得我必须了解代码的大部分基本机制。

    General

    简而言之,工作空间就是您工作的可变环境。如果运行脚本,您的工作区是
    'base'
    ,这与控制台使用的相同。所以Matlab有不同的环境,一种是包含的环境,称为路径,另一种是变量,称为工作空间

    Simulink使用了另一种方法,这可以防止隐藏变量名

    要检查当前工作区中的成员,请使用
    who

    要将成员写入另一个工作区,请使用
    assignin

    要在指定的工作区中运行某些内容,请使用
    evalin

    您的问题

    1. 谁列出了当前工作区中的所有变量?你不需要它来完成你想做的事情。 整个simulink文档都不是那么好

    2. 它确实

    3. 如果运行脚本并定义变量,它们将在
    base
    工作区中定义。当您在simulink中仅通过输入变量名称(例如a)来指定变量时,它确实会从
    base
    工作区加载该变量(因此这种方式不会出现问题)。 另一种方法是使用给定的导出块,或者通过使用
    global
    assignin
    在您自己的块中指定导出值

    4. 如果打开范围块并点击选项按钮(小齿轮),可以选择导出选项。您还可以指定不想使用的类型。您似乎使用了struct with time选项,这是LVL最多的选项,如果您的问题只是因为它是一个struct,我建议您使用数组类型。 还可以使用Outputblock指定导出类型和名称

    因此,我同意:

    sim('modelname');
    signals=ScopeData.signals;
    time=ScopeData.time;
    
    或指定为数组时:

    sim('modelname');
    signals=ScopeData(:,2);
    time=ScopeData(:,1);
    

    在上面的示例中,我没有指定模型的运行方式,但是您也可以在发布时指定它。

    大多数人开始使用MATLAB或Simulink时都会讨厌它。我看到的主要原因是人们对MATLAB的学习非常差,这妨碍了他们理解MATLAB的功能以及何时应该使用它

    在我开始描述MATLAB工作区之前,
    m
    文件和Simulink都是相关的,让我们首先定义它们各自是什么,以及可以使用它们做的一些事情

    MATLAB工作空间 包含在MATLAB中通过命令窗口显式或通过运行
    .m
    文件隐式创建的所有变量。向MATLAB工作区添加变量的最简单方法是直接在命令窗口中键入,如

    >> A = 1
    A =
    
         1
    
    它将变量
    A
    添加到工作区,并为其赋值
    1
    。更简单的方法是简单地键入
    1
    如下

    >> 1
    ans =
    
         1
    
    它将变量
    ans
    添加到值为
    1
    的工作区中。对于MATLAB执行的任何未明确指定给变量的命令,默认工作区变量是
    ans

    MATLAB中的“工作空间浏览器”显示有关当前在“工作空间”中的所有变量的信息
    >> A = 5;
    >> B = [6 8];
    >> C = [3 6 7; 9 11 12];
    >> D = eye(max(size(C)));
    
    >> mfile_test.m
    ans =
    
        -2     1     2
         4     6     7
    
    function [A, C] = circle(r)
        A = pi*r*r;
        C = 2*pi*r;
    end
    
    >> circle(5)
    ans =
    
       78.5398
    
    >> [A, C] = circle(5)
    A =
    
       78.5398
    
    C =
    
       31.4159
    
    % Script developed to describe the relationship between the MATLAB
    % workspace, m-files and Simulink
    close all
    clear all
    
    % Initialise variables
    start_time = 0;
    stop_time = 10;
    step_time = (stop_time - start_time) / 1000; % Creates 1000 + 1 points
    
    % Choose k
    k = 60;
    
    % Execute Simulink model
    sim('stackoverflow_model');
    
    whos % To display variables returned from Simulink
    
    % Plot results
    figure;
    plot(tout, yout, 'r');
    title('Sample Plot');
    xlabel('Time (s)');
    ylabel('Output');
    
    >> stackoverflow_script
      Name               Size            Bytes  Class     Attributes
    
      k                  1x1                 8  double              
      start_time         1x1                 8  double              
      step_time          1x1                 8  double              
      stop_time          1x1                 8  double              
      tout            1001x1              8008  double              
      yout            1001x1              8008  double