MATLAB Simulink 中的结构数组
Array of structures in MATLAB Simulink
我试图在 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
我收到了这个错误:
派生的输出是结构类型。 'Inherited type' 不受此支持
必须改用类型和定义的总线对象。点击 'a' 和
将 'a' 的数据类型设置为 'Bus: ',其中 '' 是
来自 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 中创建结构数组?
米哈伊尔
Simulink 希望您将函数的输出定义为总线。
例如'Bus: My_test_bus'。
看看 Simulink Bus Editor。您可以在菜单Edit->Bus Editor下的任何模型中找到它。
瑞克,我认为你是对的!
这个问题我试了很久,得到的结果是:
具有讽刺意味的是,我从来没有能够创建结构数组,但我用数组结构做到了! :D
我为此做了以下步骤:
要使用数组结构,我们需要在一些 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);
要处理这些数据,我们必须使用总线选择器。
所以我们在 "numbers" 和 "movement" 中有数组。
但是!开始吧,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 模型时为我们的结构设置了总线类型。
- 最后一步:直接定义MATLAB函数输出类型。
在 Model Explorer 中选择您的 MATLAB 函数。选择输出变量。为其设置DataType:Bus:slBus1(这个Bus类型的名字你可以在matlab的wokspace中看到,因为它是一个全局变量)。
就是这样!现在可以使用了!
(试图添加图片,但我没有足够的声誉:( )
现在我的程序以这种方式工作,但我也尝试创建结构数组但仍然有问题。我试图为它创建 Bus,但无法将它传输到 Bus Selector - 它不知道如何处理结构......我还尝试添加一个 MATLAB 函数以从结构创建一些数据然后显示它, 但它也不起作用(
我试图在 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
我收到了这个错误:
派生的输出是结构类型。 'Inherited type' 不受此支持 必须改用类型和定义的总线对象。点击 'a' 和 将 'a' 的数据类型设置为 'Bus: ',其中 '' 是 来自 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 中创建结构数组?
米哈伊尔
Simulink 希望您将函数的输出定义为总线。
例如'Bus: My_test_bus'。
看看 Simulink Bus Editor。您可以在菜单Edit->Bus Editor下的任何模型中找到它。
瑞克,我认为你是对的! 这个问题我试了很久,得到的结果是:
具有讽刺意味的是,我从来没有能够创建结构数组,但我用数组结构做到了! :D
我为此做了以下步骤:
要使用数组结构,我们需要在一些 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);
要处理这些数据,我们必须使用总线选择器。
所以我们在 "numbers" 和 "movement" 中有数组。
但是!开始吧,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 模型时为我们的结构设置了总线类型。
- 最后一步:直接定义MATLAB函数输出类型。 在 Model Explorer 中选择您的 MATLAB 函数。选择输出变量。为其设置DataType:Bus:slBus1(这个Bus类型的名字你可以在matlab的wokspace中看到,因为它是一个全局变量)。
就是这样!现在可以使用了!
(试图添加图片,但我没有足够的声誉:( )
现在我的程序以这种方式工作,但我也尝试创建结构数组但仍然有问题。我试图为它创建 Bus,但无法将它传输到 Bus Selector - 它不知道如何处理结构......我还尝试添加一个 MATLAB 函数以从结构创建一些数据然后显示它, 但它也不起作用(