Sorting array of sym

I get wrong answers in this case. Am I doing anything wrong ?
>> a = sym.empty();
>> a = [a,0,pi,pi/2,-pi/2,pi/4]
a =
[0, pi, pi/2, -pi/2, pi/4]
>> sort(a)
ans =
[0, pi, -pi/2, pi/2, pi/4]

4 件のコメント

Torsten
Torsten 2024 年 7 月 15 日
Symbolic arrays are sorted according to their lexicographic order, not their numerical order.
Paul
Paul 2024 年 7 月 15 日
Any idea what lexicographic order means in the Symbolic Toolbox? I mean, what are the "alphabet" and "word" definitions that lexicographically define all things the toobox supports, like sybolic constants, variables, expressions, etc. The doc page under the "Input Arguments" section does define some rules for specific cases, but in the most general case it just says: "Therefore, sort uses internal sorting rules to optimize its performance."
Walter Roberson
Walter Roberson 2024 年 7 月 15 日
Pi = sym(pi);
a = [-Pi/4 -Pi/3 -Pi/2 -Pi -Pi*3/4 -Pi*2/3 Pi/4 Pi/3 Pi/2 Pi Pi*3/4 Pi*2/3 -Pi*1/5 -Pi*2/5 -Pi*3/5 -Pi*4/5 Pi*1/5 Pi*2/5 Pi*3/5 Pi*4/5]
a = 
sort(a)
ans = 
a = a(randperm(numel(a)))
a = 
sort(a)
ans = 
So the sorting results are stable, but they are not obvious.
Tanmaya
Tanmaya 2024 年 7 月 18 日
Thanks

サインインしてコメントする。

回答 (1 件)

Milan Bansal
Milan Bansal 2024 年 7 月 15 日

1 投票

Hi Tanmaya
To sort the symbolic array numerically, you can convert the symbolic expressions to their numerical equivalents before sorting. Here's how you can do it:
  1. Convert the symbolic expressions to numerical values.
  2. Sort the numerical values.
  3. Recreate the sorted symbolic array using the indices from the sorted numerical values.
Please refer to the following code snippet to implement the same:
a = sym.empty();
a = [a, 0, pi, pi/2, -pi/2, pi/4];
a = sym(a); % Ensure the array is symbolic
% Convert to numerical values
num_a = double(a);
% Sort the numerical values and get the sorting indices
[sorted_num_a, sort_idx] = sort(num_a);
% Recreate the sorted symbolic array using the indices
sorted_a = a(sort_idx);
disp(sorted_a);
Hope this helps!

2 件のコメント

John D'Errico
John D'Errico 2024 年 7 月 15 日
This is pretty much all you can do, to convert the elements to actual numbers in some form. But there is no value in creating a as a sym.empty first.
a = sym([0, pi, pi/2, -pi/2, pi/4]);
a = sym(a)
a = 
You don't need ot go all the way to doubles though. vpa would seem more accurate, and still works.
[~,idx] = sort(vpa(a));
a = a(idx)
a = 
Tanmaya
Tanmaya 2024 年 7 月 18 日
Thanks

サインインしてコメントする。

カテゴリ

ヘルプ センター および File ExchangeShifting and Sorting Matrices についてさらに検索

製品

リリース

R2023b

タグ

質問済み:

2024 年 7 月 15 日

コメント済み:

2024 年 7 月 18 日

Community Treasure Hunt

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

Start Hunting!

Translated by