【问题标题】:Array of structures in MATLAB SimulinkMATLAB Simulink 中的结构体数组
【发布时间】:2015-06-01 12:05:25
【问题描述】:

我正在尝试在 Simulink 中创建一个结构数组,但遇到了一些问题。 首先,我尝试使用以下方法直接在 Simulink 中创建它:

function a = fcn(Dibhole, t , x, const)
%#codegen
%Output = zeros(10,10);
f1 = 'number';
f2 = 'move';
cube = struct(f1, 0, f2, 0);
a = repmat(cube, 20, 10);
for i = 1:20
    for j = 1:10
        a(i,j).number = 0;
        a(i,j).move   = 0;
    end
end

我得到了这个错误:

派生的输出是结构类型。不支持“继承类型” 必须使用类型和定义的总线对象。点击“a”和 将“a”的数据类型设置为“总线:”,其中“”是 MATLAB 工作区中总线对象的名称。

所以我找到了一些如何在 Matlab 中创建结构并将其接收到 Simulink 的示例:http://blogs.mathworks.com/seth/2011/12/05/initializing-buses-using-a-matlab-structure/ 这很好用,但我仍然不能用数组重复这个:

f1 = 'number';
f2 = 'move';
cube = struct(f1, 0, f2, 0);
myStruct2 = repmat(cube, 20, 10);
for i = 1:20
    for j = 1:10
        myStruct2(i,j).number = 1;
        myStruct2(i,j).move   = 1;
    end
end

busInfo = Simulink.Bus.createObject(myStruct2);

谁能向我澄清问题是什么?或者也许有不同的方法可以在 Simulink 中创建结构数组?

米哈伊尔

【问题讨论】:

    标签: arrays matlab struct simulink


    【解决方案1】:

    Simulink 希望您将函数的输出定义为总线。

    作为 'Bus: My_test_bus',例如。

    看看 Simulink Bus Editor。您可以在菜单下的任何模型中找到它,Edit->Bus Editor

    This would be a good start.

    【讨论】:

    • 谢谢你,Rick 现在我了解了这个项目。我所有的问题是没有办法将结构放入总线。所以要使用结构数组,我需要在 MATLAB 函数中定义它并创建相同类型的全局总线信号:num1 = ones(15,15,15); move1 = ones(15,15,15); a1 = struct('number',num1,'movement', move1); arr = [ a a1]; busInfo1 = Simulink.Bus.createObject(arr); 这会在全局变量中创建 slBus。然后为任何 MATLAB 函数(如 slBus)定义输出数据类型。所有的麻烦都是 - 我不能使用总线选择器,我必须再创建一个 MATLAB 函数来处理它的字段
    【解决方案2】:

    瑞克,我认为你是对的! 这个问题我试了很久,得到了这样的结果:

    具有讽刺意味的是,我从未能够创建结构数组,但我用数组结构做到了这一点! :D

    我为此做了以下步骤:

    1. 要使用数组结构,我们需要在一些 MATLAB 函数中定义和初始化它。像这样:

      number = zeros(10,1);
      move   = zeros(10,1);
      
      for i = 1:10
      
          number(i,1) = i+1;
          move(i,1)   = i+2;
      end
      
      a = struct('numbers',number,'movement', move);
      
    2. 要处理这些数据,我们必须使用总线选择器。

    所以我们在“数字”和“运动”中有数组。

    1. 但是!来了,Rick:我们必须定义 MATLAB 函数的输出类型,比如 Bus!如何在simulink中做到这一点?我发现这种方式: 在 simulink Callbacks/PreLoadFcn 的模型属性中定义一些函数,并在与项目相同的文件夹中创建 .m 文件,命名为刚刚定义的函数。 在此文件中创建数组结构并为其定义总线类型:

      number = zeros(10,1);
      move   = zeros(10,1);
      
      a = struct('numbers',number,'movement', move);
      
      busInfo = Simulink.Bus.createObject(a);
      

    现在我们的结构在第一次加载 simulink 模型时就有了 Bus 类型。

    1. 最后一步:直接定义MATLAB函数输出类型。 在 Model Explorer 中选择您的 MATLAB 函数。选择输出变量。为其设置DataType:Bus:slBus1(这个Bus类型的名字你可以在matlab的wokspace中看到,因为它是一个全局变量)。

    就是这样!现在可以了!

    (试图添加图片,但我没有足够的声誉:()

    现在我的程序以这种方式工作,但我也尝试创建结构数组,但仍然存在问题。我试图为它创建总线,但无法将其传输到总线选择器 - 它不知道如何处理结构......我还尝试添加另一个 MATLAB 函数来从结构创建一些数据然后显示它,但它也不起作用(

    【讨论】:

      猜你喜欢
      • 2016-05-04
      • 1970-01-01
      • 1970-01-01
      • 2017-02-21
      • 1970-01-01
      • 1970-01-01
      • 1970-01-01
      • 1970-01-01
      • 2013-10-19
      相关资源
      最近更新 更多