How can i use the 'mod' function in an Embedded Matlab function?
古いコメントを表示
I have the following function. I want to use this algorithm in an embedded Matlab function in simulink.
function y = fcn( u )
y=[0;0;0;0;0;0;0;0;0;0];
newu=0;
nr=0;
s=false;
if u<0 s=true;
end
while u~=0
newu=newu*10+mod(u,10);
u=(u/10);
nr=nr+1;
end;
for i=nr:0
y(i)=mod(newu,10);
newu=(newu/10);
end;
for i=0:nr
y = y+65;
end
end
After compilation it gives me the error :'Function 'mod' is not defined for values of class 'embedded.fi'. 'u'(input value) being of class 'embedded.fi'. What do i have to change to get my output value?
Thank you, Zoli
15 件のコメント
Walter Roberson
2012 年 12 月 17 日
Note:
for i=nr:0
is not going to execute any loops when nr > 0.
Note: if u < 0 then you set s, but you do not do anything with s and you do not change the sign of u; are you sure you are going to get the right answer? Perhaps you want nr:-1:0 ? But then how are you going to store a value at y(0) ?
Note: y = y + 65 is going to add 65 to every member of y. And you have that in a loop...
Azzi Abdelmalek
2012 年 12 月 17 日
編集済み: Azzi Abdelmalek
2012 年 12 月 17 日
I think he wants for i=nr:-1:0
Walter Roberson
2012 年 12 月 17 日
Probably wants to count backwards, yes, but still has problems at y(0)
Azzi Abdelmalek
2012 年 12 月 17 日
編集済み: Azzi Abdelmalek
2012 年 12 月 17 日
y(i+1)=mod(newu,10);
Walter Roberson
2012 年 12 月 17 日
nr is the number of digits, but nr:-1:0 is looping nr+1 times.
Zoltan
2012 年 12 月 18 日
Walter Roberson
2012 年 12 月 18 日
Syntax is
for i = nr: -1: 0
but please re-check whether you want to stop at 0 or at 1.
Zoltan
2012 年 12 月 18 日
Zoltan
2012 年 12 月 18 日
Walter Roberson
2012 年 12 月 18 日
Look at your code again, what you show above. In the two "for" loops, where is the data being stored when "i" is 0 ?
Zoltan
2012 年 12 月 19 日
Walter Roberson
2012 年 12 月 19 日
Correct. You cannot use 0 as an index. But you probably don't want to: you are only manipulating nr values, not nr+1 values, so 1:nr and nr:-1:1 would seem to be appropriate.
Zoltan
2012 年 12 月 19 日
Walter Roberson
2012 年 12 月 19 日
Double-check the parity of the line. But even more so, double check how the heck an 8 bit result is generating a negative number below -128, as 8 bit signed values can only be in the range -128 to +127 . Check your scope settings.
Zoltan
2012 年 12 月 20 日
回答 (1 件)
Azzi Abdelmalek
2012 年 12 月 17 日
編集済み: Azzi Abdelmalek
2012 年 12 月 17 日
In the below part of your code
while u~=0
newu=newu*10+mod(u,10);
u=(u/10);
nr=nr+1;
end;
newu increases rapidly to infinity. that's what causes a problem when
y(i)=mod(newu,10);
6 件のコメント
Zoltan
2012 年 12 月 17 日
Azzi Abdelmalek
2012 年 12 月 17 日
newu=newu*10+mod(u,10);
Azzi Abdelmalek
2012 年 12 月 17 日
try this
u=1,newu=0;nr=0
while u~=0
newu=newu*10+mod(u,10);
u=(u/10);
nr=nr+1;
end;
newu
Walter Roberson
2012 年 12 月 17 日
Remember, Azzi, the input is fixed point, so the division is going to truncate at some point.
Azzi Abdelmalek
2012 年 12 月 17 日
編集済み: Azzi Abdelmalek
2012 年 12 月 17 日
Yes, but after 309 iterations, 10^309=inf
In the above example, nr=324
Walter Roberson
2012 年 12 月 17 日
This is only a problem if the fi object has a representation for infinity and if the input is infinity. Otherwise abs(u) is diminishing in each step and there would be a finite end to the process. It could potentially overflow the buffer of 10 y locations, but that would depend upon the maximum value possible for that particular fi object.
カテゴリ
ヘルプ センター および File Exchange で Introduction to Installation and Licensing についてさらに検索
Community Treasure Hunt
Find the treasures in MATLAB Central and discover how the community can help you!
Start Hunting!