Matlab coder - wrong answer

4 次查看(过去 30 天)
Hi guys,
I'm tring to export matlab code to C code, in my matlab code i have Eigen function in order to calculate the Eigen vector right matrix.
Although when i compile my code in C compiler (atollic true studio) i received a wrong answers.
Can anyone please help me to solve this problem ?
input matrix and function :[cN,~]=eig([6506.1709323862497 + 0 * i, 352.72061684167767 + -3710.3651327887619 * i, 2011.5655185722712 + 384.26985324363284 * i, 1725.5363173165599 + -5930.123440499453 * i; 352.72061684167767 + 3710.3651327887619 * i, 6199.5160239281295 + 0 * i, 356.19284194608099 + -3663.5190286699631 * i, 1768.5916083618101 + 331.40000184453999 * i; 2011.5655185722712 + -384.26985324363284 * i, 356.19284194608099 + 3663.5190286699631 * i, 6447.9241828420545 + 0 * i, 382.01986570001651 + -4005.4837002418008 * i; 1725.5363173165599 + 5930.123440499453 * i, 1768.5916083618101 + -331.40000184453999 * i, 382.01986570001651 + 4005.4837002418008 * i, 6611.8755981240902 + 0 * i])
The first picture is the values that i received after the eigen function, and the second picture the the correct values that i expect to receive
  2 个评论
Wilson A N
Wilson A N 2020-6-9
Hi Tamir,
Can you share the exact values you had used with the eigen function. Additionally, providing the commands used for code generation would help.
- Wilson
Tamir Mizrahi
Tamir Mizrahi 2020-6-9
Thanks Wilson , i updated my post

请先登录,再进行评论。

采纳的回答

Areej Varamban Kallan
编辑:Areej Varamban Kallan 2020-6-9
Hi Tamir,
Thanks for sharing the values. I am able to reproduce the results.
The computed results in the generated code are correct. For a given matrix, the eigenvector corresponding to a particular eigevalue is not unique. If v is an eigenvector, then alpha*v, which is a scaled version of v is also an eigenvector for the same eigenvalue.
For the inputs considered here, each eigenvector returned by the C code is a scaled version of the corresponding eigenvector returned by MATLAB.
To better understand the results, let us compute eigenvalues as well.
function [v,d] = myeig(a)
%#codegen
[v,d] = eig(a);
>> cfg = coder.config('lib');
>> cfg.VerificationMode = 'SIL';
>> codegen myeig -args {coder.typeof(1i,[4 4])} -config cfg
>> [vmatlab,dmatlab] = myeig(A)
vmatlab =
Columns 1 through 2
-0.376796540203342 - 0.355408671476361i -0.398541780958145 + 0.374702617926804i
0.001275398603249 + 0.561417931091213i -0.143284708674997 + 0.311017096268371i
0.480804533726921 - 0.184887065618415i 0.248485110194001 + 0.324562032274043i
-0.388794414636469 + 0.000000000000000i 0.645302171278108 + 0.000000000000000i
Columns 3 through 4
-0.045415333593944 + 0.168282082335769i 0.176847576029146 - 0.608945780485925i
-0.699329885477756 - 0.125756891058523i 0.246152272181504 + 0.045586320593164i
0.056552956858085 - 0.672545130245288i 0.032517800265024 - 0.333145334730278i
0.096053707488093 + 0.000000000000000i 0.650536467977805 + 0.000000000000000i
dmatlab =
1.0e+04 *
0.000172468967993 0 0 0
0 0.000229944404698 0 0
0 0 1.036674139012830 0
0 0 0 1.539472121342531
[vccode,dccode] = myeig_sil(A)
vccode =
Columns 1 through 2
-0.634105692072699 + 0.000000000000000i -0.174302644158693 - 0.000000000000000i
-0.024872565084105 - 0.249099195565696i -0.060800388869246 - 0.707940955930921i
-0.328995848224188 + 0.061684303010346i 0.664049974356741 - 0.120635072441042i
-0.181430002787685 - 0.624724619538480i 0.025027223135727 + 0.092735930600402i
Columns 3 through 4
0.547026144759982 + 0.000000000002153i -0.517968103718098 + 0.000000000008760i
0.317432475274703 - 0.128447520612772i 0.386149968271705 + 0.407529044359775i
0.041282386650599 - 0.406670784952457i 0.222899861257117 - 0.464404864894278i
-0.470141837021641 - 0.442019847222879i -0.282828979683157 + 0.266774933423510i
dccode =
1.0e+04 *
1.539472121342530 0 0 0
0 1.036674139012831 0 0
0 0 0.000229944404698 0
0 0 0 0.000172468967994
The eigenvalues returned by MATLAB and C code are the same but they appear in a different order.
Now we must check if the computed results are correct by verifying if they satisfy the eigenvalue equation, ie for
[V,D] = eig(A), A*V - V*D = 0 must be satisfied within some tolerance.
>> norm(A*vmat- vmat*dmat)
ans =
3.294189142814234e-12
>> norm(A*vccode- vccode*dccode)
ans =
1.220174523947488e-11
We see that the computed values are solutions to the given eigenvalue problem
  1 个评论
Tamir Mizrahi
Tamir Mizrahi 2020-6-9
Thanks alot ! , but my C algorithm expect to receive the not scaled eigenvector ,and this is the only eigenvector that works well in the next C algorithm code.
so how can i extract the first eigenvector matrix in this case?

请先登录,再进行评论。

更多回答(1 个)

Areej Varamban Kallan
Hi Tamir,
Could you please share the inputs that were passed to eig. Which version of MATLAB are you using?
Please note that the generated code might return eigenvalues in a different sorted order compared to MATLAB. Moreover, the matrix of eigen vectors could be returned in a different basis.
Please check this link for details.
  1 个评论
Tamir Mizrahi
Tamir Mizrahi 2020-6-9
Thanks Areej, i update my post.
my version is : '9.6.0.1114505 (R2019a) Update 2'

请先登录,再进行评论。

产品

Community Treasure Hunt

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

Start Hunting!

Translated by