randi generating random complex numbers from 4-QAM

I am trying to generate the transmitted symbol x randomly from the set of constellation points seen below from a 4-QAM constellation diagram. This is in respect to the input-output model y = h · x + w for a total of 10^4 independent realizations. I went to the Matlab site and found the following code:
a = randi([-5,5],10,1,"like",1i)
I tweaked it to represent the points on my 4-QAM diagram as so
a = randi([-2,2],10e4,1,"like",1i)
However when I try to run it I get the following error:
Error using randi
Complex or sparse input following 'like' is not supported.
Error in Untitled (line 2)
a = randi([-2,2],10,1,"like",1i)
Perhaps I am overcomplicating this but I can use some assistance in updating my code to produce a random generation of complex numbers in respect to the constellation points on the 4-QAM diagram seen below. Thank you in advance.

 채택된 답변

Your code works fine for me, and here:
a = randi([-2,2],10e4,1,"like",1i);
plot(real(a),imag(a),"o")
I'm not sure what to suggest, other than restarting MATLAB. What do you get from
which randi -all

댓글 수: 3

I submitted this issue to the Mathworks technical support. I am using version R2020a so maybe that is the issue. I tried to run which randi -all with no luck. Is there a different way to generate random complex integers you can recommend? Thank you for your response.
I notice the user has marked R2020a; perhaps it was not supported then.
(I had no idea it was supported at all!)
the cyclist
the cyclist 2023년 4월 4일
편집: the cyclist 2023년 4월 4일
I think you are correct. I looked for this in the version history of randi, but missed it! Looks like this was introduced in R2022a.
EDIT: The Mathematics section of the release notes (for R2022a) corroborates this.

댓글을 달려면 로그인하십시오.

추가 답변 (1개)

the cyclist
the cyclist 2023년 4월 4일
편집: the cyclist 2023년 4월 4일
My other answer focused on "Why didn't this syntax work?" (and concluded that you don't have a recent enough version).
This is answer is focused "How can I do what I need?"
There are two straightforward solutions:
(1) Generate the real and imaginary parts separately, and add them. For example.
N = 11;
re = 4*randi(2,N,1) - 6;
im = 4*randi(2,N,1) - 6;
c = re + i*im
c =
2.0000 + 2.0000i -2.0000 + 2.0000i -2.0000 + 2.0000i 2.0000 - 2.0000i 2.0000 + 2.0000i -2.0000 - 2.0000i 2.0000 - 2.0000i 2.0000 + 2.0000i -2.0000 + 2.0000i -2.0000 + 2.0000i -2.0000 - 2.0000i
(2) Generate a random value from 1 to 4 (because you have 4 distinct points), and use that as an index into the complex values you want.
N = 11;
c_vals = [-2-2*i, -2+2*i, 2-2*i,2+2*i];
idx = randi(4,N,1);
c = c_vals(idx)'
c =
-2.0000 + 2.0000i 2.0000 + 2.0000i 2.0000 + 2.0000i 2.0000 - 2.0000i 2.0000 - 2.0000i -2.0000 + 2.0000i -2.0000 + 2.0000i -2.0000 - 2.0000i -2.0000 - 2.0000i 2.0000 + 2.0000i 2.0000 + 2.0000i

댓글 수: 2

Thank you for your input. I ended up upgrading to R2023a and it ran the original code a = randi([-5,5],10,1,"like",1i) with no issues.
Glad to hear you have a solution

댓글을 달려면 로그인하십시오.

카테고리

도움말 센터File Exchange에서 Test and Measurement에 대해 자세히 알아보기

제품

릴리스

R2020a

질문:

2023년 4월 4일

댓글:

2023년 4월 4일

Community Treasure Hunt

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

Start Hunting!

Translated by