Dear all
I just began to work w Matlab. I have an array with decimal numbers and zeros from which I have to calculate log10 and write a new array, but it doesn't work. When i run this i got error "Attempted to access log10(0.946491); index must be a positive integer or logical." code is as follows
log10=zeros(2030,1354);
for j=1:1354
for i=1:2030
log10(i,j)=R547(i,j)/R531(i,j);
end
end
log10(isnan(log10)) = 0 ; %my array
>> for j=1:1354
for i=1:2030
if log10(i,j)~=0
X(i,j)=log10(double(log10(i,j)));
end
end
end
Anyone please help me
Thank you

1 commentaire

Stephen23
Stephen23 le 19 Déc 2014
Modifié(e) : Stephen23 le 19 Déc 2014
This is the danger of overwriting inbuilt function names with your own functions or variables. Some common ones that should be avoided:
  • log
  • i, j
  • plot
  • sum
  • input
  • size, length, etc.

Connectez-vous pour commenter.

 Réponse acceptée

Thorsten
Thorsten le 18 Déc 2014

1 vote

You overwrite Matlabs log10 function with your log10 matrix; rename it and everything should work fine.

5 commentaires

Alina
Alina le 18 Déc 2014
Modifié(e) : Alina le 18 Déc 2014
I tried but the answer is the same
U=zeros(2030,1354);
for j=1:1354
for i=1:2030
U(i,j)=R547(i,j)/R531(i,j);
end
end
U(isnan(U)) = 0 ;
>> for j=1:1354
for i=1:2030
if U(i,j)~=0
X(i,j)=log10(double(U(i,j)));
end
end
end
Attempted to access log10(0.946491); index must be a positive integer or logical.
Thorsten
Thorsten le 18 Déc 2014
Modifié(e) : Thorsten le 18 Déc 2014
Your log10 matrix is still in the workspace; use
clear log10
And then have a look which log10 is used now
which log10
BTW: you can get rid of the for loops:
U = R547./R341;
U(isnan(U)) = 0;
idx = find(U~=0);
X(idx) = log10(U(idx));
Alina
Alina le 18 Déc 2014
Thank you Thorsten
It works, but some answeres are 0.000000000000000 + 0.000000000000000i where must be 0
Thorsten
Thorsten le 18 Déc 2014
Use
X = real(X);
Alina
Alina le 18 Déc 2014
Thank you!

Connectez-vous pour commenter.

Plus de réponses (2)

Azzi Abdelmalek
Azzi Abdelmalek le 18 Déc 2014

1 vote

Try this
clear log10
U=zeros(2030,1354);
for j=1:1354
for i=1:2030
U(i,j)=R547(i,j)/R531(i,j);
end
end
U(isnan(U)) = 0 ;
for j=1:1354
for i=1:2030
if U(i,j)~=0
X(i,j)=log10(double(U(i,j)));
end
end
end
Star Strider
Star Strider le 18 Déc 2014

1 vote

Your code can be reduced to this:
R547 = randi(50,10,15); % Created Data
R531 = randi(50,10,15); % Created Data
Log_10 = double(R547./R531); % Do Element-Wise Division
Log_10(1:5:end,1:5:end) = NaN; % Created Data (Insert NaN)
X = log10(Log_10); % Take Logs
X(isnan(X)) = 0; % Set ‘NaN’ Values To Zero
First, please never name your variables the same as built-in MATLAB functions, such as log10. MATLAB will take the most recent definition (as it did in your code) and treat it as a variable rather than a function. I renamed your ‘log10’ array ‘Log_10’ to be sure that you do not ‘overshadow’ the log10 function.
Second, if you need to do element-wise operations, use the dot operators, for instance instead of (/), use (./), (*), use (.*) and (^), use (.^).
Third, the log10 of NaN is NaN, so you only need to test for it and replace it after you do everything else.

2 commentaires

Alina
Alina le 18 Déc 2014
Thank you. Now I know it.
Star Strider
Star Strider le 18 Déc 2014
My pleasure!

Connectez-vous pour commenter.

Catégories

En savoir plus sur Historical Contests dans Centre d'aide et File Exchange

Produits

Community Treasure Hunt

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

Start Hunting!

Translated by