Codegen saying variable is constrained to being non-complex when it's defined as complex

29 views (last 30 days)
Any idea why I'd get this error:
The left-hand side has been constrained to be non-complex, but the right-hand side is complex. To correct this problem, make the right-hand side real using the function REAL, or change the initial assignment to the left-hand side variable to be a complex value using the COMPLEX function
When setting up my fields in coder I specifically put the variable as a complex variable. Do I need to explicitly put that in my code as complex? If so, how do I do that? Here is my line of code tripping the error:
yvec1(:,tic_ct) = DelayProfile .* (Fade1.Ix + 1i * Fade1.Qx);
Any ideas?
  10 Comments
Adam Kaas
Adam Kaas on 24 May 2012
This doesn't include the ending of the code that shows where out1 is used.
%add doppler shifts (if any)
if (Fade1.UseDoppler)
t_vec_norm = Fade1.t_norm + [1:tics];
Fade1.t_norm = Fade1.t_norm + tics; %update time at end of this update
doppler_tones = exp(2*pi*1i*Fade1.DopplerProfileNorm'*t_vec_norm);
out1 = yvec1 .* doppler_tones;
else
out1 = yvec1;
end
And I agree that it seems wrong. The code works fine and yvec1 shows up in my workspace as complex. But when I used Coder, it says it's non-complex.

Sign in to comment.

Accepted Answer

Fred Smith
Fred Smith on 24 May 2012
MATLAB Coder automatically renames variables. These two lines are actually constraining two separate variables.
yvec1 = complex(zeros(M,N),zeros(M,N));
yvec1 = zeros(Fade1.num_taps,tics);
If you delete the first line and replace the second line with this you should be set.
yvec1 = zeros(Fade1.num_taps,tics) + 0i;
Hope this helps.
Good luck.
  3 Comments
Fred Smith
Fred Smith on 25 May 2012
MATLAB Coder treats "complex" as a type whereas MATLAB treats it as an attribute. After all, in generated C code, there is no natural way to make complex behave like an attribute.

Sign in to comment.

More Answers (1)

Prateek Tiwari
Prateek Tiwari on 1 Jun 2020
Hi erveryone, I need to post this question here, because no one responds to the question i have asked in the past. Sorry for that, but would appreciate if you can answer.
Hello everyone, I am having an issue with the interaction of matlab function block in the simulink with my model block. Below you can also find the picture.
I have created a matlab function with three inputs and 1 output. Since in the matlab function block, i have solved an differential equation, it has complex expressions in the form of for example .
(exp(sqrt(-a/b)))
This generates the output of complex data type from the function block. When passing this to the integrator which is the input to my plant, I cannnot run the simulink due to the error
"Cannot pass the complex value to non-complex location"
I tried chaning the data types of integrator, then the same thing happens to other blocks in the simulink.
I also tried using absolute values, which ofcourse gives real number, but turns out to be very large numbr and genrates high magnitude. I really need help in solving this issue.
Can anyone help me in this/
Thanks in advance.

Community Treasure Hunt

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

Start Hunting!

Translated by