what exactly norm(x) function do?

Good Afternoon,
I have to convert a part of my matlab code into C++.
I would be great if you can explain me what exactly norm(x) do on a vector of complex number so that I can write a C++ code for it.
I just asked a similar question on stack overflow but could not get much response.
Thank you in advance.

5 Comments

Adam Danz
Adam Danz on 21 Sep 2022
Moved: Adam Danz on 22 Sep 2022
The doc page for norm gives you the forumula :)
See more info section.
Manu Chaudhary
Manu Chaudhary on 21 Sep 2022
Moved: Adam Danz on 22 Sep 2022
Thank you Adam.
Are you performing the conversion to C++ manually or using MATLAB Coder? According to the Extended Capabilities section on its documentation page you can automatically generate C or C++ code from the norm function using MATLAB Coder.
Hi Steven,
Thank you updating me regarding the MATLAB coder. I will try to use this feature of MATLAB.
Manu Chaudhary
Manu Chaudhary on 22 Sep 2022
Edited: Manu Chaudhary on 22 Sep 2022
The formula of norm(x) is defined as above on your website. Just for confirmation, |vk| means a^2 + b^2?

Sign in to comment.

 Accepted Answer

The equivalent function to norm( ) for a complex column vector x is
sqrt(x' * x)
where x' is the complex conjugate transpose. Essentially sqrt(dot(x,x)). Note that dot( ) does the complex conjugate part of the calculation automatically.
E.g.,
x = [1;2;3;4] + [5;6;7;8]*1i
x =
1.0000 + 5.0000i 2.0000 + 6.0000i 3.0000 + 7.0000i 4.0000 + 8.0000i
norm(x)
ans = 14.2829
sqrt(x'*x)
ans = 14.2829
sqrt(dot(x,x))
ans = 14.2829
So in C/C++ just run a loop to sum up the individual element-by-element multiplies for the dot product result. For an element of the form a+b*i you will be summing a^2+b^2 and then taking the sqrt( ) of the final sum.

4 Comments

int sum=0;
for(int i=0;i < data_size; i++){
// real_number and img_number are the vectors
sum= pow(real_number[i],2)+ pow(img_number[i],2);
}
float normalized_value= sqrt(sum);
I think, this is the algorithm for norm(x) in c/c++ ?
You need to do
sum = sum + pow(etc) + pow(etc);
Also I would advise doing all of the arithmetic in double.
Thank you James. I think now the conversion of norm x in c++ is correct.
int sum=0;
for(int i=0;i < data_size_val; i++){
sum= sum +pow(real_number[i],2)+ pow(img_number[i],2); // Need some correction Here
}
float normalized_value= sqrt(sum);
std::cout << "The normalized value" << normalized_value << std::endl;
James Tursa
James Tursa on 22 Sep 2022
Edited: James Tursa on 22 Sep 2022
Yes this algorithm is correct, but I still advise changing your code to do the arithmetic in double to avoid potential pitfalls where the int calculations might overflow.

Sign in to comment.

More Answers (1)

Matt J
Matt J on 22 Sep 2022
Edited: Matt J on 22 Sep 2022
Assuming you only care about p=2, If you already have code that computes norm(x) for real x, you can extend it to complex x via,
norm(x) = norm( [norm(real(x)), norm(imag(x)) ] )
which is easily verified below,
x=complex(rand(5,1), rand(5,1));
norm(x)
ans = 1.2548
norm( [norm(real(x)), norm(imag(x)) ] )
ans = 1.2548
Alternatively, if you have an implementation of abs, you could do norm(abs(x),p) which will work for any p-norm:
p=3;
norm(x,p)
ans = 1.0042
norm(abs(x),p)
ans = 1.0042

Categories

Find more on Loops and Conditional Statements in Help Center and File Exchange

Tags

Community Treasure Hunt

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

Start Hunting!