How to call element of matrix of symbolic variables
187 vues (au cours des 30 derniers jours)
Afficher commentaires plus anciens
Hazim Nasir
le 16 Juil 2018
Commenté : Walter Roberson
le 2 Fév 2023
I have two symbolic variables
syms th1(t) Lc1
and generated a matrix in terms of th(t) and Lc1
tc1(t) =
[ cos(th1(t)), -sin(th1(t)), 0, Lc1*cos(th1(t))]
[ sin(th1(t)), cos(th1(t)), 0, Lc1*sin(th1(t))]
[ 0, 0, 1, 0]
[ 0, 0, 0, 1]
now when I try to call the first three elements of the last column
pc1 = tc1(1:3,4);
I got this error:
Error using symfun/subsref (line 169)
Symbolic function expected 1 inputs and received 2.
Error in Fk (line 10)
pc1 = tc1(1:3,4);
thanks
0 commentaires
Réponse acceptée
Walter Roberson
le 17 Juil 2018
It is not possible to index the entries of a symbolic function that computes a matrix.
The closest you can get is to call the function passing in variables for the parameters, get an array output, index into the array, and use the resulting expression or turn it into a function if needed.
10 commentaires
Walter Roberson
le 20 Oct 2022
Using () indexing to access the components of a symbolic function that defines an array, is something that is not going to be permitted. The () indexing method for symbolic function is already overloaded to evaluate the function, and there is no way to say "when I write these () brackets I mean indexing instead of evaluation".
Plus de réponses (2)
Nathan Hardenberg
le 19 Mai 2022
syms th1(t) Lc1
tc1(t) = [
cos(th1(t)), -sin(th1(t)), 0, Lc1*cos(th1(t));
sin(th1(t)), cos(th1(t)), 0, Lc1*sin(th1(t));
0, 0, 1, 0;
0, 0, 0, 1;]
pc1 = tc1(t); % call the function with t first
pc1 = pc1(1:3,4) % now you can index
2 commentaires
Stu
le 19 Oct 2022
Wow, thanks for that. It's beautiful.
Now I can pass a vector (which itself contains symbolic variables) into another symbolic function which requires that vector input.
João Vitor Fraga
le 1 Fév 2023
Modifié(e) : João Vitor Fraga
le 1 Fév 2023
Here's a simple solution that doesn't turn your symfun into a sym: simply left-multiply and right-multiply your symfun by appropriate matrices whose entries are either zero or one, depending on which elements you wish to extract. Your symfun will remain a symfun. In your case:
syms th1(t) Lc1
tc1(t) = [ cos(th1(t)), -sin(th1(t)), 0, Lc1*cos(th1(t))
sin(th1(t)), cos(th1(t)), 0, Lc1*sin(th1(t))
0, 0, 1, 0
0, 0, 0, 1];
Lmatrix = [1 0 0 0
0 1 0 0
0 0 1 0];
Rmatrix = [0
0
0
1];
pc1 = Lmatrix*tc1*Rmatrix
class(pc1)
This can easily be condensed into a simple function you could call whenever needed.
Voir également
Catégories
En savoir plus sur Linear Algebra dans Help Center et File Exchange
Community Treasure Hunt
Find the treasures in MATLAB Central and discover how the community can help you!
Start Hunting!