【问题标题】:What are the relationships between workspace, .m scripts and Simulink models and how can I use them efficiently?工作区、.m 脚本和 Simulink 模型之间有什么关系,如何有效地使用它们?
【发布时间】:2015-12-26 12:59:20
【问题描述】:

我在 Control 类中使用了很多 MATLAB,但有些东西真的让我很沮丧。他们希望我们大量使用 Simulink,尽管我发现视觉表示没有多大帮助,而且 Simulink 和 MATLAB 脚本之间的接口通常很难弄清楚。

所以我有一个模型,我为sinks 添加了scopes,它可以在从 Simulink 运行时将数据直接保存到工作区。但是,当我在脚本中使用命令sim 来根据某些参数(stopTimesolving method 等)直接使用模型时,结果被埋在一个文档很少的对象中,至少可以这么说我有:

simout = sim('lab','StopTime','100','Solver','ode1','FixedStep','2');

现在我的工作区中有一个对象,但要访问我想要的数据,我需要在 simout 的成员中深入 3、地狱 4 层。我的第一个问题是:

  1. 有没有一种方法可以直接访问或至少知道这些成员是什么而无需使用繁琐的who

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

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

  3. 如何知道 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 等)?通过隐藏机制,最后一个选项可能会减少pretty,但为了能够正确编写代码,我觉得我必须了解代码的大部分底层机制。

【问题讨论】:

  • 因为matlab没有namespace的概念。因此,一切都被埋在struct 对象下,它们喜欢冗长的树。一个更简单的版本是使用To Workspace 块并使用选项Signals with Time 仅保存变量,然后所有内容至少将保存在同一个容器下。
  • 谢谢。关于他们为什么不包含这个和其他 OO 概念的任何想法?我觉得他们在 Mathworks 刚开始时就已经众所周知(对于这类人:我明白了,我明白了,Mat 用于矩阵,Matlab 擅长矩阵。但这如何证明不包括这些概念是合理的?)
  • 我不能在这里咆哮,但 matlab 就像 Internet Explorer。正如我在微软工作的一位朋友所说,IE 是被取消项目的坟墓。 Matlab 是一个很棒的 Fortran 包装器。但以编程方式,它是一个非常糟糕的界面。长期以来,人们一直在抱怨这个问题,例如,有著名的博客 Abandon Matlab 但现在不可用,还有无数其他的。原因是 matlab 并不是从企业套件开始的。甚至 .m 文件也很晚才引入,因此它不是建筑物,而是一堆干草。现在越来越乱了。

标签: matlab simulink


【解决方案1】:

常规

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

Simulink 使用了不同的,它可以防止隐藏变量名我猜。

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

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

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

您的问题

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

2. 确实……

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

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

所以我会选择:

sim('modelname');
signals=ScopeData.signals;
time=ScopeData.time;

或者当指定为数组时:

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

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

【讨论】:

    【解决方案2】:

    当大多数人开始使用 MATLAB 或 Simulink 时,他们总是讨厌它。我看到的主要原因是人们对 MATLAB 的教导很差,这使他们无法理解 MATLAB 的强大功能以及何时应该使用它。

    在我开始描述 MATLAB 工作区、m 文件和 Simulink 之间的关系之前,让我们首先定义它们各自的区别以及您可以用它们做的一些事情。

    MATLAB 工作区

    MATLAB workspace 包含您在 MATLAB 中通过命令窗口显式创建或通过运行 .m 文件隐式创建的 所有 变量(不要担心我会回到这些)。将变量添加到 MATLAB 工作区的最简单方法是直接在命令窗口中键入,例如

    >> A = 1
    A =
    
         1
    

    将变量A 添加到工作区并为其分配值1。更简单的是简单类型1 like

    >> 1
    ans =
    
         1
    

    将变量ans 添加到值为1 的工作区。 MATLAB 执行的任何未明确分配给变量的命令的默认工作区variableans

    MATLAB 中的工作区浏览器显示有关当前工作区中所有变量的信息。例如,如果我们要在命令窗口中执行,

    >> A = 5;
    >> B = [6 8];
    >> C = [3 6 7; 9 11 12];
    >> D = eye(max(size(C)));
    

    工作区浏览器看起来像

                               

    一些有用的工作区命令

    saveclear 命令是与 MATLAB 工作区一起使用的有用命令。 save 允许您将变量从工作区保存到文件中,而clear 允许您从工作区中删除变量,从而释放内存。 clear all 将清除工作区中的所有变量。

    m 文件

    m-file(或脚本文件)是一个带有.m 文件扩展名的简单文本文件。您可以在其中键入 MATLAB 命令,这些命令可以通过在命令窗口中执行 m-file 来顺序执行。例如,让我们从上面复制我们的命令并将它们粘贴到名为mfile_test.mm-file 中。现在让我们将命令C - A 添加到m-file 的底部(注意 不要在命令后附加;)。我们可以从命令窗口执行这个m-file,并查看其中所有命令按顺序执行的输出

    >> mfile_test.m
    ans =
    
        -2     1     2
         4     6     7
    

    m 文件和函数

    m 文件也可以包含functions。例如,我们可以编写一个函数来计算圆的面积和周长,例如

    function [A, C] = circle(r)
        A = pi*r*r;
        C = 2*pi*r;
    end
    

    并将其放入名为circle.mm-file 中。然后我们可以像这样使用它

    >> circle(5)
    ans =
    
       78.5398
    

    其中ans 现在包含半径为5 的圆的面积或

    >> [A, C] = circle(5)
    A =
    
       78.5398
    
    C =
    
       31.4159
    

    其中A 保存圆的面积,C 保存圆周。

    Simulink 模型

    Simulink 是一种图形工具,可用于对各种不同类型的系统进行建模以及对动态系统行为进行建模。 Simulink 紧密嵌入到 MATLAB 生态系统中,这为其增加了额外的功能(稍后我将在描述相似之处时再次谈到这一点)。

    Simulink 模型包含的模块都表现出不同的行为。如果需要,还可以创建自己的 Simulink 模块。 Simulink 中的模型是通过连接不同类型的模块来模拟您要建模的系统。

    Simulink 相当广泛,我不建议您自学。学习 Simulink 的最佳方式总是作为课程的一部分,控制系统或系统分析类型的课程非常适合此目的。出于这个原因,我不打算在这里讨论太久了。

    MATLAB 工作区、m 文件和 Simulink 有何关联?

    好吧,m 文件和 Simulink 都可以使用 MATLAB 工作区。 MATLAB 工作区中的变量可以在m 文件和 Simulink 中使用。

    m 仅包含脚本(而非函数)的文件会将其中创建的每个变量写入 MATLAB 工作区。 m 仅包含函数的文件不会将这些函数中使用的任何 new 变量写入 MATLAB 工作区。函数更改 MATLAB 工作区中的变量的唯一方法是将输出值分配给 ans,或者在调用函数时显式声明 output arguments

    Simulink 和 MATLAB 工作区与 m 文件和 MATLAB 工作区的关系非常相似。 MATLAB 工作区中的任何变量都可在 Simulink 中使用(在任何部分,包括配置)。例如在下面的配置中,我使用 MATLAB 工作区变量start_timestop_timestep_time 来设置模型的参数。通常,在使用 sim() 运行 Simulink 模型之前,我会在 m-file 中定义这些。这就是我们可以将所有 3 个联系在一起的方式。

       

    Simulink 可以通过将输出参数添加到 sim() 命令来将变量写入 MATLAB 工作区。但是,正如您发现的那样,导航和提取您真正想要的内容可能会非常讨厌!更好的方法是使用 Simulink 中的 Data Import/Export 选项和 To Workspace 块来获取您关心的输出,这样您就可以忽略其他所有内容。

    下面是 Simulink Data Import/Export 窗格的屏幕截图。您可以在此处看到我们将变量发送到 MATLAB 工作区的选项。通常,您需要的最常见的是tout,它将是前面配置窗格中start_time:step_time:stop_time 给出的范围。此屏幕中主要感兴趣的其他区域是 xInitialxout,它们用于根轨迹分析。

       

    但是,除了 Simulink 中最好的模块之一之外,还有 To Workspace 模块。此模块可用于将变量直接存储在 MATLAB 工作区中,并且是能够链接 MATLAB 和 Simulink 的关键之一。您可以获得 Simulink 的强大功能,以及 MATLAB 的计算和绘图能力。我在下面包含了它的屏幕截图以及我将使用的典型配置。此块的默认Save FormatTimeseries,但是,我建议将其更改为Array,因为它会让您的生活更轻松。

      

    好吧,我在哪里?我觉得我是在讲课而不是写答案!

    实用说明

    Simulink 模型

    现在让我们通过一个简单的示例将我们学到的所有知识付诸实践。首先我们要像这样创建一个简单的 Simulink 模型

                     

    现在我们将为此设置我们的配置,就像之前的 Solver 部分一样

       

    我们还将取消选中 Data Import/Export 部分中的 Limit data points to last:

       

    而且,就是这样。我们简单的 Simulink 模型已经创建和设置。 出于此答案的目的,我将我的保存为stackoverflow_model.slx

    MATLAB 脚本

    现在我们将创建一个名为 stackoverflow_script.m 的简单 MATLAB 脚本 (m-file),它将通过将变量添加到 MATLAB 工作区来为我们的 Simulink 模型设置必要的变量。然后,我们将调用 Simulink 模型并检查它添加到工作区的新变量。最后,我们将生成一个简单的图表来展示这种方法的好处。

    这是 MATLAB 脚本

    % 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 执行此脚本,然后坐下来惊叹 MATLAB 和 Simulink 结合的POWER

    >> 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
    

    我们可以从上面的输出中看到 Simulink 需要的所有变量(kstart_timestep_timestop_time)都在 MATLAB 工作区中。我们还可以看到 Simulink 向 MATLAB 工作区 toutyout 添加了 2 个 变量,它们是简单的 1001x1 双精度向量。没有讨厌的structs 导航。

    最后,这产生了一个很好的情节

                        

    至此,我们的 MATLAB、m 文件和 Simulink 之旅就这样结束了!我希望你和我写它一样喜欢它!

    P.S.我没有检查拼写或语法错误,所以非常欢迎编辑;)

    【讨论】:

    • 谢谢!我在课程(信号、控制、数值分析等)的上下文中使用了 MatLab,因为它是 EE 的通用语,但从未真正解释过机制。如果可以的话,我还有两个简短的问题:您将模型配置为使用 to Workspace 块和在配置框中将数据发送到工作区,这是为什么呢?你需要两者吗,它们是如何相互关联的?其次:路径在哪里适合所有这些?我总是将我的 .m 保存在课程特定的文件夹中。这会影响脚本、工作区和 simulink 模型的范围吗?还是机器学习会搜索所有路径?
    • 最后一个问题,阴影和重新定义不是很危险吗?
    • 我使用 Configuration 窗格仅“发送”回') tout,因为这是访问它的最简单方法。然后,我使用To Workspace 块作为输出,作为“发送”回结果的最简单方法。我也可以使用不同的块并在 * Configuration* 窗格中使用 yout。 MATLAB 将搜索自己的内置 PATH(您可以编辑)或当前工作文件夹。与内置 MATLAB 函数同名的脚本和变量将在内置函数之前调用。将文件放在特定文件夹中将是一个很好的组织习惯。
    猜你喜欢
    • 2016-10-17
    • 1970-01-01
    • 2015-06-19
    • 2017-02-26
    • 2011-11-16
    • 2021-08-10
    • 1970-01-01
    • 1970-01-01
    • 1970-01-01
    相关资源
    最近更新 更多