Importing a matrix in Simulink, extracting rows and interpolate
8 views (last 30 days)
Show older comments
Hello,
I have spent a good amount of hours searching for the answer to my problem on this website, I hope this post doesn't replicate another one.
I have a matlab function which loads a data file, searches the lines of interest in the matrix depending on inputs and interpolates using interp1. It works very well. However, when I input it in a Matlab function bloc in Simulink, it doesn't work. First error is the "importdata" which doesn't work. Then, the sign "==" for dynamic calculation like in: table = table( table(:,1) == MN , :); (where MN is an input) Eventually the "interp1" function doesn't seem to work ( underlined in red but since the function freezes before I can't say).
Any good way to solve this problem?
Also, I have tried the "from workspace" but then I don't care about the time parameter because I just want my matrix (it is absolutely not time dependent) and I want to play on its values.
Thanks
0 Comments
Accepted Answer
Orion
on 10 Nov 2014
Here's what I'd do :
change your function as :
function a = interpolation(MyInput)
% 1 - remove the line table = importdata('data.dat');
% 2 - fusion your input in one with a mux block in the simulink model
% get your 2 input
b = MyInput(1);
c = MyInput(2);
% get your matrix from the base workspace
table = evalin('base','table');
table = table(table(:,1) == b, :); % I just keep the data in table which has b in its first column
x = table(:, 2)';
y = table(:, 3)';
a = interp1(x, y, c);
end
then use this function in an interpreted matlab function (Not the embedded).
before the simulation call your import script
table = importdata('data.dat');
table = table.data;
so in the base workspace, table will be available (as a matrix).
and so normally, it should work.
2 Comments
Orion
on 10 Nov 2014
Edited: Orion
on 10 Nov 2014
If you want multiple outputs (of the same data type of course), just make a vector in your function :
function MyOutput = interpolation(MyInput)
% 1 - remove the line table = importdata('data.dat');
% 2 - fusion your input in one with a mux block in the simulink model
% get your 2 input
b = MyInput(1);
c = MyInput(2);
% get your matrix from the base workspace
table = evalin('base','table');
table = table(table(:,1) == b, :); % I just keep the data in table which has b in its first column
x = table(:, 2)';
y = table(:, 3)';
% creating a vector : here a 3x1 vector
MyOutput(1) = interp1(x, y, c);
MyOutput(2) = interp1(x, y, 2*c);
MyOutput(3) = interp1(x, y, 3*c);
end
Now, you get a vector as output of your matlab function block. use a demux block (of size 3) to get the individual signals.
More Answers (1)
Orion
on 10 Nov 2014
Hi,
a lot of classical matlab functions are NOT supported by the "Matlab function" block (in the preivous version, it was "Embedded Matlab function")
you could instead use the "interpreted Matlab function" block, which call an external script .m (difference with the matlab function, which is a simulink block, so the code inside is interpreted by simulink not matlab).
BUT, it's not obvious, because all your Mcode will be executed at each time step. so you can encapsulate your Interpreted Matlab function in a enabled subsystem which is activate only at t==0, and then the output will be constant.
it will work but it's not really pretty. also, you can't generate C code with an interpreted function in a model.
Note : if your M-code calculate just a matrix independant of the time, why don't you load it in your model with a Constant block ?
See Also
Community Treasure Hunt
Find the treasures in MATLAB Central and discover how the community can help you!
Start Hunting!