Ask the Expert: Calling Python Libraries from MATLAB
MATLAB® provides flexible, two-way integration with many programming languages for greater collaboration between developer teams. In this session, we answer questions about how to call Python® libraries from MATLAB and vice versa, package and distribute your MATLAB programs, and more.
Hello, and welcome to MATLAB with Python Ask the Experts session. A couple of weeks ago, Gianluca and I worked through the integration of MATLAB with Python [INAUDIBLE] example on how to call one language from the other in both directions.
Following the webinar, we were able to see quite a number of questions from you which we plan to address in today's session with the help of our in-house subject expert. Gianluca, would you like to introduce our guest?
Yeah. Sure. First, let me say hi to everyone and thank you for being here today and joining this session. Our guest is Yann Debray, who is a product manager for MATLAB. And his job focus is on the integration between MATLAB and Python.
Before joining MathWorks less than a year ago, Yann worked in an open source software company. And so he is knowledgeable on the subject, especially on the Python side of things. Hello, Yann. I can see you. Can you hear us?
Bonjour, Gianluca. Can you hear me?
Yeah. Yeah. I can hear you.
Thank you for having me.
Thank you, Yann, for joining us. Today [INAUDIBLE] to answer the top question we have received in the past days. If during today's session some of the audience has a question, don't hesitate to share with us your question. You can post the question on the Q&A panel any time during the sessions.
There are many situations where the two languages are the best balance for integrated software solution. MATLAB provides a flexible two-way integration with Python. So the question we got cover how to call the MATLAB from Python and how to call Python libraries for MATLAB. We got the question about how to set up and connect the two environments.
Then we got asked how we can use our existing Python code in MATLAB, how we can debug from Python and manage the errors.
And we got the same question on how to bring existing TesorFlow Keras model into MATLAB using the neural network toolbox importer for TensorFlow Keras models. Some Simulink users are looking for some info on how to run Simulink model from Python script that handles simulation inputs.
Then we also got asked a lot how we can manage the data exchange between the two languages and also, finally, how we can deploy and share the applications that are based on both MATLAB and Python. So I think we can get started. Yann, you should be able to share your screen any second from now. So I'll wait, also, for that to happen. Francesca should make you the presenter.
And to start with, we got a few questions related to the setup process, especially with regards to calling a Python function from MATLAB as sometimes users struggle to get this to work. So I would like you to ask, Yann, if you have some tips to share in this regard.
Of course. So I hope you can see my screen right now. I summarized a couple of tips that we usually give in such kind of situation. The first three are how to call Python from MATLAB and how to set up some of the environmental, namely the pyenv function.
So what I'm going to do is I'm going to go through all of them. And I'm going to share my environment, my MATLAB environment. And you'll see more interactively, so first with the pyenv function and then entering all code is on path, and checking environment settings depending on how you've got your Python set up.
So let me share my MATLAB. So you should see it right now. So I'm going to clear the console. What I'm going to do is I'm just going to call the pyenv function. As you can see, I don't need to give it any arguments. It's just going to find the Python versions that I've installed. Here, it's an Anaconda version, this 3.7.
As it turns out, I do have other versions installed as well. So I can also have a pyenv. And here, as you can see, different versions. Here I'm going to call the version. And let's try the 3.8. I believe I have 3.8 installed.
So as you can see, as simply as that, I can switch between the different versions that I've installed on my local PC. And it's giving me lots of flexibility. So we used to have the [INAUDIBLE] version before 2019 B. If you look at the documentation for pyenv, you'll see that we recommend not use this anymore as of 2019 B. Now we recommend to use this new version that has been introduced in 2019 B.
There's also a way to call this Python out of process as an execution mode. The reason for this mode we've introduced to lately is because sometimes there are conflicts between the libraries, the underlying libraries, that are used for numerics such as NumPy. Numpy ships with Anaconda.
Sometimes it's conflicting with our own underlying libraries. And so in such cases, you might want to try out the execution model out of process. But regularly as default, I would recommend to stick with the execution mode in process. So that's it for pyenv.
Now ensuring that everything is on path. It's quite tricky because you end up having different path to manage, namely your environment variable. So if I take here path, you will be able to edit the system properties, the environment variable. You want to make sure that here in your path you have the different versions of Python that are available.
Now as you can see here, the Anaconda version stays on top of my path. So it means that if I am to call in the command Python with the name of the version, you'll see that the first version that comes up is 3.7. That is the one that I have shipped with Anaconda.
And you can call another version. And you can just also check out the different versions that are available with which Python where Python. I'm confusing some command lines between Linux and Windows. So in here you can see that the first version is Anaconda. And here I am also the 3.8 version that I downloaded online. So that's it.
So what else? Check environment settings depending on how you set up Python. I think we've covered that. Now let's switch how to how to call MATLAB from Python and how to select the different MATLAB engine versions.
So in order to do that, let's look at the documentation. So you have two main pages. And as you can see, I was already prompted in the documentation as I was looking at it just before the webinar. You have one page. I'm going to go straight to this here.
One page is calling MATLAB from Python. It's located in the external language interfaces in here, the same way you can call MATLAB from C++, Java, and so on. And you can also here look at the Python libraries in MATLAB on how to call Python MATLAB from Python function from MATLAB.
So they are references in both directions here. [INAUDIBLE] up in this Python libraries in MATLAB in the external language interface. And here you can go back to the previous two. You can go back and forth between those two.
I think we have someone with a microphone that is on.
Sorry I don't get [INAUDIBLE].
Here, what I wanted to show you--
Could I request, please, that you turn off your microphone? So getting starting with the API and installing the MATLAB Engine API, so we had a request concerning the different versions. So here you have a very simple way on how to install the engine API. Let me show you, very shortly, how it works.
So you need to know where your MATLAB is installed. And for that, you need to type in the MATLAB root just to figure out where MATLAB is installed. So this is the location of my MATLAB. Now bear in mind, if you look at here, that you need to have administrator rights in order to execute those commands.
So what I'm going to do is I'm going to open the Anaconda prompt as administrator. And here, what I'm going to do is I'm going to CD into the previous location here. I know that it's located in the extern. Where is that located again? Well, let me just CD into that. I think it's because I shouldn't be using those kind of quotes, but instead those ones. And now here, now it's working.
So extern. We have Python and Java. I'm going to select-- no. We have engines. And then we have Python or Java. So this is the location where-- and if I just look into that, I have the setup.py. The very simple ways to just Python, setup.py. Install. And it's just going to install the version of this MATLAB engine.
But if you want to have different versions installed at the same time-- not going to display that right now. But you can prefix this with location where you want to install this package. And what it's going to do is, essentially, it will install this package in another location. I did it previously. So I can show you here in my folder in today's Python with MATLAB.
I've installed here-- not here, actually. It's for the other demonstration, other PID. I've installed the MATLAB 20b py30 3.7 here. All of the libraries are installed here. So it's in case I enter this prefix with a specific folder name. Shall we move on? What do you think, Gianluca and Francesca?
We have a question. [INAUDIBLE] a quite common question. Is it some difficult to identify where Python is installing. The question is, if I ran [INAUDIBLE] environment, I get an empty answer as if I [INAUDIBLE] installed on my PC. Any suggestion? Might be called tech support.
So I'd say that, yes, you can always call tech support. They have very good experience with solving all of those issues. They have a very large knowledge base. All of those kind of questions, they store it into a central knowledge base. And so they are able to answer very easily such questions.
And if not, then they can call out experts such as Gianluca and Francesca locally in Italy, especially if you want to have a conversation in Italian. Because unfortunately, I'm sorry I won't be able to speak Italian with you today. And if not, then Gianluca and Francesca would be calling me. And we can solve this.
For this particular question, I would say that it has probably to do with your windows path. So again, you want to pass in your path in the environment variable here. You want to make sure that you have your Python that is located in here and also, discrete directory as well. Those two need to be located in your path for it to be found by MATLAB.
Yeah. I think it's time to reach to the next section. The next section is about calling Python from MATLAB. Here is the list of the topics. So Yann, can you share with us any advice on calling the MATLAB standard
library and user defined Python modules? Any suggestion how to convert Python Pandas data frame to a MATLAB data type?
So let's proceed one by one. I'm going to start by accessing just the Python standard library modules from MATLAB. Then I'm going to write a very small user-defined function that I said I'm going to call just the same way. I'm going to show you how you can modify this function. And then you can reload the module. And then we're going to [INAUDIBLE] I am going to show you how to exchange data frames with Pandas and also import models from TensorFlow.
So first off, this is a way-- and I'm going to show it to you just intractably right now-- how you can call some different methods. So let me clear this. I'm going to clear and clear the console. So we start from scratch.
First, what I'm going to do is I'm going to, so py dot the name of a module. So I'm going to use, for instance, a math module that is incorporated directly in base Python and a function such as a sqrt, the square root of 42. So here it's calling this function, making the transfer, and giving it back to MATLAB, and translating it actually as a MATLAB data type, naturally.
So this is one way, very easily. What we can do is-- so let me go back to this repository where I add a little more interesting examples for the Q&A. What did I have? Here mymod. So I developed a very simple here basic module. It's called mymod. And I have two functions, search and heather. Let's start with the search function.
So what I'm going to do first is I'm going to define a list l equals a py.list. So this is a way to define a list in Python, a Python list, from MATLAB. So first I'm going to give it a couple of names, so Francesca-- please tell me if I misspell your name-- Gianluca, and myself now. OK.
And I forgot here it's live effect. So I need to pass it as [INAUDIBLE] because the conversion between-- and what did I do wrong? No. I meant this. So I wanted to assign this, not compare it.
So the conversion between a list in Python and a data type in MATLAB is cell. So the equivalent of a list is a cell. The reason for that is that in a list, you can have an heterogeneous type of data included. You could have the first data is a string, the second is a float, the third is an integer. So in order to mirror this heterogeneity, we use cells in MATLAB.
And so this is how I define very easily my list. And now I'm going to call py.mymodule dot search. That is the name of the function. Interestingly, you can see that you have autocomplete because there's a search in with mymod. And it's discovering what function I have.
So here, I'm going to search in this list. And you might have seen it previously. It was giving me back the word that contains "ca," so Gianluca and Francesca. Now I have another function, heather. It's just going to append the name heather, my colleague.
So what I'm going to do is, instead, I'm just going to l.append heather. And it's just going to do the exact same thing as this function. So I'm going to call it l2 and Python [INAUDIBLE] type with no property.
It seems like I did something wrong. The reason why is probably because I gave it-- that's interesting. So let's try it this way around. What I'm going to do is I'm going to call py.mymod.heather. And I'm going to give it l. And now it's working. Something must have gone wrong.
So let me go back here. This is a list. I'm trying to append a new name. And here, what I can do as well, is to convert this list to a cell. So as I've told you just now, what we can do is, I'm going to do it this way around. Let me show you [INAUDIBLE] now.
I am going to convert this list. And the way I'm going to do that is I'm going to use a cell fun. So it's a function that is applied on cells. I'm going to use a function string for start. And I'm going to give it the cell of-- no, I'm just going to give it. I'm going to get the cell of l. And that's it.
So as you can see, this function, if I were to just call cell.l, it's giving me a cell array. But in cell array, I have py strings in each of those elements. And what I'm doing here is I'm calling this add string, the string function, to turn this cell into a string array instead of a cell. So this is one very simple conversion type. Shall we move on?
So you can ask for the documentation. Let me show you that briefly. py.help of list.append. And I think I need to give it, here, quotes. So this is a way to call the help from Python directly in the MATLAB command. And you can see here the method append that is used on the list. So you can append a new object at the end of the list.
Now how to create list tuples dictionary types. I'm not going to display anything here. All of this you can find in the documentation. And we will forward you those slides so that you can have this table to look at the conversion between lists, how you define them in MATLAB, tuples and dictionaries.
Now let's modify this script. So we've called it. And what we're going to do, here you can see how you can attach this to the py.sys.path. So there's also a specific path for Python. Let me show you just now, py.sys. Sys is a system module where you have a function called path. If I'm calling this, you'll just get a list of all of the location Python is searching for in order to execute a script.
So here, the idea is to search if the current-- print current directory so the current directory is in the Python path. And if it is not, then we can insert it. So that's a good way in order to specify to Python where to search for our user defined modules. Let's move on.
So here, we've seen that already. Now what we're going to see is how to reload this module. So for instance now, I don't have in mymod, I don't have any test function. If I give it like this it's unable to resolve. Because I don't have this function.
So what I'm going to do is I'm going to define here a new function. It's not going to take anything. It's just going to return version 1 called Ciao. So I'm going to save this. But the problem is that now I'm calling it. It still doesn't know. Because I loaded it previously and now what I need to do is I need to clear the classes.
So I've cleared all of the classes. And I'm going to need to call a module in Python that's called importlib. [INAUDIBLE] It's called importlib. It just doesn't-- it doesn't know it to completion. I was searching for auto completion.
Now here I can have it once I've specified the name of the module. So there's an embedded imported module in Python that enables you to import a module. Here, it's mymod. So I'm going to give it to this variable mod. So I'm importing it.
And what I'm going to do now is I'm going to py.importlib.reload mymod. So [INAUDIBLE] importlib.reload and mod. And it doesn't work. And it seems like there's a problem. And yes, there's a problem at line 13. I forgot this here. So let me save it, do all of this again. And now reload.
Now as you can see, this module has three functions. It previously had two functions. Now it has three functions. So now I can call mymod.test. There you go. Ciao. And there's only one other word that I know in Italian. That's ciao bella. So I'm going to do it all over again. Clear classes. Import it and reload it. And now, if I call mymod, it's ciao bella.
So now you know how to iterate when you develop some code in Python. And all of this is, again, you can find in the documentation. Do we have other types of questions relevant by now, Francisco or Gianluca, that you want me to address?
Well, we got a question from the chat. So the question is, do we need any MATLAB additional package to perform the task that you are showing in this session.
Yeah, that's a good question. I didn't address that straight from the start. You need nothing other than bare MATLAB. This is only what I have shown you so far. It's only with base MATLAB.
I think you can continue. I don't any other question for now.
So a little more like let's go a little more further in the direction of debugging. So you can find yourself in an uncomfortable situation. You have such kind of messages such as unable to resolve the name py.myfunc. So that's something that happened to me. I think you might recall here, unable to resolve the name.
So there might be several reasons for that. I tried to list them down in occurrence, let's say in probability of occurrence. From the very basic, it might be the fact that Python is not installed. And MATLAB cannot find it. So we had a question previously like this. I would suggest you to go back to this section on the documentation.
You even have here a link where you have different ways of troubleshooting, making sure that Python is installed and making sure that MATLAB can find Python. So if you want to make sure that it is a case, you can give it the path of the executable. Just make sure that you give it version and then where your Python executable is located on your machine.
There might be, also, another scenario. So all of us here we mentioned just before. Your current directory might not be where your file is located. And in such cases, I advised you to use the py.sys.path in order to set the path where Python is searching for this module. So again, those issues of path are very, very [INAUDIBLE] all the time. So you will be an expert pretty soon in that.
You want to be able to test like I did with py.importlib dot import the module. Make sure that you're able to import this module. If you are, then it means that your MATLAB knows how to find it. But it can be more annoying and more likely there's an error in your text that is prompting a message.
So this is what I had previously. If I go back and I forgot, for instance, to type here a colon here, then I had this kind of error here. So make sure in here the Python error is mentioned. So we go a little further in showing you how to handle exception in Python.
So here we're going to trigger a problem. Let me exit the presentation mode and just select this. Where is my presentation? It's here. So I'm going to select this example. Here, we create a list. And here there's going to be an error message. I'm just going to show you that right now.
So as you can see, we had three arguments. And we expected only one. I think you might recall from previously, maybe we can ask the audience if they followed along. Or maybe you, Gianluca and Francesca, do you have an idea on what type of problem we are encountering here with the definition of the list?
Since remember, I defined a list, Python list previously with your names, with Francesca, Gianluca, and myself. And I gave--
The curly braces.
The curly braces. Exactly. [INAUDIBLE] So indeed, you need to give it curly braces. The reason why is the correspondence, again, between the different data types, at least in Python, is represented in MATLAB with a cell. So you need to pass it a cell. And so here it's expecting one argument that is a cell. And instead, we give it three arguments. That is not what MATLAB is expecting.
So let's modify this, curly braces, and again calibrate this. And here you go. So now you can see that we can have heterogeneous data types, an x, y, and a number that is represented here as a float. So here you go. So you can just forward and have those types of error from Python that are handled directly in your MATLAB code. Let's move on.
If you want to go into much deeper debugging and you have, for instance, Visual Studio, there's one way where you can attach a process to MATLAB, to the [? executation ?] of MATLAB. And here you can set breakpoints in your Python code in order to have this debugging a lot deeper.
So here there's a Stack Overflow exchange about this. Not going to go into much more detail. But I think you've seen a lot about debugging this way around.
Now the data frames. So what I would suggest for you to exchange between Pandas' data frame and table, so here you can see a table with temperature, time, and so on. You can use the file format that is called Parquet. Parquet is a very efficient storage and transfer format for tabular data-- so essentially, tables, data frame, such type of things-- between all of the different parties of the [INAUDIBLE] ecosystem. So you can exchange data. It's very, very convenient.
We contribute to this project. So that you know, MathWorks is committed to some of those very important open source projects in the ecosystem. And so we have a way to read and write a Parquet file. This is a very simple example. Let me show that you just now.
So here, I'm going to create a data frame. So what I'm going to do is I'm going to do that from my command line, probably, somewhere here. Do I have a command line? Or maybe what I'm going to do is I'm going to do it from Visual Studio code. That's going to be more convenient. So where was I? MATLAB with Python, weather prediction. This is a project.
So this is a file that I wanted to show to you. It's a very simple importing Pandas in NumPy, defining a data frame. We can bring the data frame. I'm just going to execute that. You're going to see that it's going to create-- how can I show you that? I'm going to delete this data out of Parquet so that you can see that it's going to create it again also. I'm going to delete this one.
Let me go to full mode and execute this. So it's prompting me to data frame. And it's creating [INAUDIBLE] Parquet file. So maybe I need to move it back here. Now what I'm going to do is I'm going to open the read data frame mlx from MATLAB. I have first a function where I can read-- let me increment this to just read the Parquet file.
So it's giving me the file name, the variable name, and so on. I can read this in here. Well, let me just-- so I'm reading the file. And here it is, column 1, column 2, column 3. So you can see that there's a very perfect correlation between what we generate and what we read.
And so in the end, we can also examine the data type. Here, what is the class of data column 2? That is a string. We have only strings in here. String, string, string. And what I'm going to do is I'm going to define a new type. It's going to be a cell instead of a string.
And we can write the results back to Parquet. And here we created a new-- where is that? I don't have it. Did I execute that? That is strange. Am I locating the right location? That is a demo effect. That's really
weird. Well, I would suggest to move on. Because do you have ideas on what was happening just now, Gianluca and Francesca?
Not in this moment.
That's weird. It was working yesterday.
Yeah. I think we can suggest we move on since time flies.
Exactly. And we'll finish with this part that is on importing models from TensorFlow. I have a very short video for that [INAUDIBLE] to get to it quickly. So you can go to your [INAUDIBLE] and just search for the importer of TensorFlow, the Keras TensorFlow importer. So you can just download it. It's already unloaded here. So in order to access it, you just need to type the resnet example. And this function, import Keras network, it's going, based on the model path, it's going to just import every layer from this network.
And then you can visualize it. So you have a network analyzer that you can use with a neural network toolbox. Now it's called a deep learning toolbox. So it's enabling you to analyze deep neural network.
And then you can just try it out on a new example. Here, it's just going to classify this function. So it's a very simple classifier. So that's it. You can go to this video to have all of the voiceover.
So now, do we have some more time, guys, for--
I don't see any additional questions in the chat. So let's see [INAUDIBLE] people have additional questions. Since we have 35 minutes left, so there are still a few things that we would like to show. But I would give priority to calling Simulink from Python, since we had a question from the chat regarding this before. So we can discuss about that. Then, if we have time, then we can also discuss the other topics like running MATLAB parallel code from Python.
So I had an example for that. Let me close this and open this one, the PID controller. So I have here a folder and a file. I have a Python file that is calling from the MATLAB engine, starting the MATLAB engine in the desktop mode. And then it's a [INAUDIBLE] project where everything is, it's here. It's an example of a PID controller, very basic.
I turned it into a notebook so that you can see step by step how it's working. I'm not going to execute it right now because my MATLAB engine is completely messed up. I modified things just before the webinar and it's a little bit messed up right now. So let me just show you how it's working, so just embodying some libraries.
Starting the engine with the desktop mode is going to prompt you a MATLAB desktop directly. It's starting Simulink with a project. And we are opening this simulate PID. It's this model over here. You can print the name of the model and so on. Here I've just represented with the image from the [INAUDIBLE] display. The image function, I've represented the equivalent of what I get from this sys print. So it's just a representation of the model.
And we can put the variable into the workspace. So we assign here the different arguments, Kp, i, and d, so the different parameters of the PID. We run the simulation with a simple MATLAB engine dot sim function with the name of the model. We give it an output argument of one. So it's going to output us one argument here. So this is the reason why we give it this parameter as an entry.
And here afterwards, this is where the demo ends. So let's move on and try to see if we can cover a little more ground today. Do we want to go through this subject of parallel code as well? We have this cool demo. Francesca, do you want to-- do you think it's appropriate to show that quickly?
Yeah, I think so. And I think it's also important to cover the question related to the code generation.
So let me just introduce this demonstration that you shared with us, Francesca. It's a very basic example that is running the birthdays. So it's a birthday match in a group to see if two people have the same birthday. So we can parallelize this example. Just going to show you right now the video. It's a very short piece of code with a [INAUDIBLE] function where it's just trying to see if it's-- well, if we have matches.
And we can call this from Python. So essentially, what's really cool in this demo is that we are going to be setting or calling parallel MATLAB piece of code from Python, and not a lot of overwriting. Here, we're just starting the Python prompt. And we'll be here displaying the different processes that are running. So let's search for the MATLAB process. Once we will import MATLAB [INAUDIBLE] engine, here you can see that there's a MATLAB process that appears.
And we are running the script. So let's look at the way processes evolves. Here it's starting to parallel [INAUDIBLE]. And so what you will see that there's three new MATLAB that just popped up. So the job is parallelized. So it's pretty cool. All of it's just done in a couple of lines of code calling the MATLAB engine from Python. So that's it.
This we showed previously, shortly. And now let's go to the section of code generation. So what type of question do you guys have typically in this kind of context?
So the typical question is, essentially, if we can generate a C or C++ code from MATLAB code which calls a Python function, essentially recalling Python from MATLAB and then generate a C code. That's the question.
So it seems quite complicated. What I would say that the best way is to get out of MATLAB is one way. You generate code for embedded hardware. And this is not very feasible if you have a Python function embedded because, essentially, the way code generation works is that we map all of our language through equivalency and C++ or other low level representation. We don't do that with the Python language. So we are not able to generate the equivalent code.
What we can do instead is if you want to generate for enterprise systems, then we can embed such application to your enterprise system with both MATLAB and Python. So that's one way where it's possible, not for C++ but for enterprise deployment. So if you have enterprise deployment, you can do that with MATLAB and Python. But if you want to generate code for embedded controller, then you cannot [INAUDIBLE].
Maybe it's a segue into the last subject that is how to deploy a MATLAB-Python application in a Docker container. So essentially we have [INAUDIBLE] new feature since 20b, since the second release of MATLAB Compiler in 2020. This enables you just the same way we were able to generate an executable, you now are able to generate a Docker container image.
And this is a way to deploy either locally or you can upload it to your corporate registry. So if you have a Docker registry, you can work with your IT to just push this [INAUDIBLE] to your corporate registry. And this way, your IT can then be deploy it on the cloud to all sorts of things. So it's a very convenient way to share your standalone application with very modern technologies, virtualization technologies, such as Docker.
So it's just Docker run the name of your standalone application. And it's just going to run and produce potentially written output. Here, let me show you a very short video that covers this. So here we took a very basic function that is mymagic. It's just a magic square.
So what it's going to do, here we're going to call the compiler runtime function with download. It's going to download the runtime. Because essentially, in order to build this container, you need to have a runtime, a MATLAB runtime. That would be what executes, essentially, those functions.
So you're downloading this runtime first. Then what you'll do is you will build a standalone application. You need to give it an argument, treat input as numeric. Because here you have an input that is x and you want to make sure that this input is treated as a numeric input. So that's important because it's something that Docker wouldn't know how to treat if you didn't specifically told him so.
And then you're going to MATLAB, so compiler.package. It's a little below. So we don't see it very well. This function, sorry again, it's essentially building the Docker file and compiling it. So it's essentially building, just like you would do normally with Doctor. But it's doing it completely transparently for you. And it's building your container. And afterwards, you can just Docker run this command with the name of your application in here.
So we just run the command with a number, five. So this is the size of the magic square that we want to get as output. And this is the result. So here you've got a way to make those kind of computes seamlessly with Docker containers. [INAUDIBLE] I think we've covered a lot of ground today.
That was all very useful information. So thank you very much, Yann, for that. And since we're out of time, I would end it here. For the questions that have been posted on the chat, we'll follow up with you after the webinar. And last but not least, I want to remind you-- well, actually, I want to show you that the webinar that Francesca and I ran a couple of weeks ago is online. And so you can access it and watch it again.
And then if you have additional questions, then you can either contact technical support or let Francesca and I know. And we'll follow up. So thank you again, everyone, for today and for being interactive, [INAUDIBLE] this session directly with your questions. And I wish everyone a very nice day. Thank you.
You can also select a web site from the following list:
How to Get Best Site Performance
Select the China site (in Chinese or English) for best site performance. Other MathWorks country sites are not optimized for visits from your location.