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

13 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
Walter Roberson
Walter Roberson on 24 May 2012
Why assign the non-complex zeros to a variable that is already complex zeros, especially since you need the variable to store complex values? It seems redundant at best and wrong at worst.
Also, this code gives the impression that out1 is unused ? If it will be a copy of yvec1 after the calculation and if yvec1 is still going to be complex, then out1 should also be initialized as complex.
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
Walter Roberson
Walter Roberson on 24 May 2012
Two separate variables? How could the compiler keep track of which one is supposed to be associated with which name?
The documentation for complex() specifically indicates that adding 0i to a real array results in a real array, not a complex array, but that complex() specifying a 0 complex part results in a real array. Is the compiler acting differently than that documentation ?
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.

Products

Community Treasure Hunt

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

Start Hunting!