Custom object class array initilization within Simulink Matlab Function Block

1 vue (au cours des 30 derniers jours)
The summary of my question is I need know how to preallocate an array of custom objects in a way that is compatible with Simulink when using the Matlab Function block in Simulink.
Details: I am attempting to port over some code I have written in Matlab to run as a function in Simulink using the "Matlab Function" block. I have created a custom class called "pulse." (minimal example at the bottom of this question). I want to be able to initialize an array of these pulse objects. My Matlab code works fine now with the call:
pulse_array(1:2,1:4) = pulse;
This creates a 2x4 array of pulse objects as expected. The problem I am having is when I use my code within Simulink. When I try to run this same line within the Simulink Matlab Function block I get the error:
Undefined function or variable 'pulse_array'. The first assignment to a local variable determines its class.
It looks to me like the coder doesn't know that pulse_array should be a pulse object. To try to fix this, I tried to intialize pulse_array as a pulse object and then expand the array with for loops:
pulse_array = pulse;
for i = 1:2
for j = 1:4
pulse_array(i,j) = pulse;
end
end
Simulink didn't like that either, as the loop trys to specify pulse_array(1,2) when it believed the size of pulse_array is 1x1 (I get size mismatch errors, which isn't totally unexpected). I understand this, as coder needs to know the size of the array.....this is why I tried the initial call of pulse_array(1:2,1:4) = pulse.
Any help would be....extremely helpful. Thanks
-Michel
classdef pulse
properties
A %Amplitude
end
methods
function obj = pulse(A)
if nargin>0 %Allows for array construction https://www.mathworks.com/help/matlab/matlab_oop/initialize-object-arrays.html
obj.A = A;
end
end
end
end

Réponse acceptée

Uday Pradhan
Uday Pradhan le 5 Mai 2021
Hi Michael,
According to the documentation for MATLAB Classes for Code generation, creation of arrays of objects is not supported yet. As a workaround, you could define a cell - array to store the objects, as such:
pulse_array = cell(2,4);
for idx = 1 : 8
pulse_array{idx} = pulse;
end
pulse_array =
2×4 cell array
{1×1 pulse} {1×1 pulse} {1×1 pulse} {1×1 pulse}
{1×1 pulse} {1×1 pulse} {1×1 pulse} {1×1 pulse}
  1 commentaire
Michael
Michael le 5 Mai 2021
Modifié(e) : Michael le 5 Mai 2021
Thanks. This seems like a work around that might meet my needs but it makes sorting based on the object properties a bit of a challenge. Do you know if system objects face a similar limitation, as I am beginning to explore coverting some of my custom classes to system objects for stream processing.

Connectez-vous pour commenter.

Plus de réponses (0)

Tags

Produits

Community Treasure Hunt

Find the treasures in MATLAB Central and discover how the community can help you!

Start Hunting!

Translated by