Logical Indexing instead of for (if) loop

조회 수: 8 (최근 30일)
Giovanni Gardan
Giovanni Gardan 2020년 5월 20일
댓글: Giovanni Gardan 2020년 5월 20일
I'd like to write the following piece of code usiging Logical indexing instead of for loop with if condition.
As you can see, I commented the original code, wheareas the alternative code is not. CAR_GEN is the main input matrix (with 10000 rows), Y_car_gen is a matrix (10000x10000), En is a column vector (10000x1). So:
  • If I run the first code (with for loop) no problem.
  • But if I run the second code Matlab says to me that I have a problem:
Error using ^ in N(a-1,1) = -(abs(En(Ngen)))^2*conj(Y_car_gen(Ngen,Ngen));
Incorrect dimensions for raising a matrix to a power. Check that the matrix is square and the power is a scalar.
To perform elementwise matrix powers, use '.^'.
My question is: why this dimension problem doesn't exist in the first code? Have I to modify something in the second code?
%Initializing N & Ncorr
N = zeros(10000 - 1,1);
Ncorr = zeros(10000 - 1,1);
% for Riga = 2:10000
%
% if CAR_GEN(Riga,1) == abs('G')
% Ngen = CAR_GEN(Riga,2);
% N(Riga-1,1) = -(abs(En(Ngen)))^2*conj(Y_car_gen(Ngen,Ngen));
% Ncorr(Riga-1,1) = En(Ngen).*conj(Ix(Ngen-1));
% else
% Ncar = CAR_GEN(Riga,2);
% N(Riga-1,1) = (abs(En(Ncar)))^2*conj(Y_car_gen(Ncar,Ncar));
% Ncorr(Riga-1,1) = -En(Ncar).*conj(Il(Ncar-N_nodi_gen));
% end
%
% end
--------------------------------------------------------------------------------------------------
--------------------------------------------------------------------------------------------------
CAR_GEN2 = CAR_GEN(2:end,:);
a = (CAR_GEN2(:,1) == abs('G'));
Ngen = CAR_GEN2(a,2);
N(a-1,1) = -(abs(En(Ngen)))^2*conj(Y_car_gen(Ngen,Ngen)); %PROBLEM!
Ncorr(a-1,1) = En(Ngen).*conj(Ix(Ngen-1));
b = (CAR_GEN2(:,1) == abs('C'));
Ncar = CAR_GEN2(b,2);
N(b-1,1) = (abs(En(Ncar)))^2*conj(Y_car_gen(Ncar,Ncar)); %PROBLEM!
Ncorr(b-1,1) = -En(Ncar).*conj(Il(Ncar - N_nodi_gen));

채택된 답변

Walter Roberson
Walter Roberson 2020년 5월 20일
In the original code, you are working with one element at a time, which is a scalar, which is a 1 x 1 matrix, which is square. When you use A^2 then that means the same as A*A which is algebraic matrix multiplication between A and itself, which is defined for square matrices, and for the special case of scalars is the same as squaring the (one) element of the array.
In the newer code you are working with vectors of values. Suppose there were 17 matches, then it might give you a 17 x 1 vector. When you have a 17 x 1 vector algebrically matrix multiplied by itself (because that is what ^2 does) then that would be (17x1) * (17x1) which would fail because the second dimension of the first array (1) does not match the first dimension of the second array (17).
You need to switch to using .^
  댓글 수: 1
Giovanni Gardan
Giovanni Gardan 2020년 5월 20일
Thank you, thank you, thank you very much Walter!
I finally took another modify, putting the last factor of the product as diag in order to make the product in the right side consistent with the vector of left side:
N(Ngen-1,1) = (-(abs(En(Ngen))).^2).*diag(conj(Y_car_gen(Ngen,Ngen)));
So the full-piece of code is:
CAR_GEN2 = CAR_GEN(2:end,:);
a = CAR_GEN2(:,1) == abs('G');
Ngen = CAR_GEN2(a,2);
N(Ngen-1,1) = (-(abs(En(Ngen))).^2).*diag(conj(Y_car_gen(Ngen,Ngen)));
Ncorr(Ngen-1,1) = En(Ngen).*conj(Ix(Ngen-1));
b = CAR_GEN2(:,1) == abs('C');
Ncar = CAR_GEN2(b,2);
N(Ncar-1,1) = ((abs(En(Ncar))).^2).*diag(conj(Y_car_gen(Ncar,Ncar)));
Ncorr(Ncar-1,1) = -En(Ncar).*conj(Il(Ncar - N_nodi_gen));

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

추가 답변 (0개)

카테고리

Help CenterFile Exchange에서 Loops and Conditional Statements에 대해 자세히 알아보기

Community Treasure Hunt

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

Start Hunting!

Translated by