A compact way to replace zeros with Inf in a matrix
11 visualizzazioni (ultimi 30 giorni)
Mostra commenti meno recenti
Would you be so nice to suggest me a more compact way to replace zeros with Inf in the following matrix? (maybe with just one line of code?)
% Input
A = [0 3 2 5 6;
1 1 4 3 2;
9 0 8 1 1;
5 9 8 2 0;
3 1 7 6 9];
% Replace zeros with Inf
[row,col] = ind2sub(size(A),find(A==0));
for i = 1 : length(row)
A(row(i),col(i))=Inf;
end
% Output
A
0 Commenti
Risposta accettata
J. Alex Lee
il 16 Ott 2023
Modificato: J. Alex Lee
il 16 Ott 2023
You can implicitly index "linearly" for any arrays - it will do all the ind2sub and sub2ind in the background:
% Input
A = [0 3 2 5 6;
1 1 4 3 2;
9 0 8 1 1;
5 9 8 2 0;
3 1 7 6 9];
B = A;
% Replace zeros with Inf
[row,col] = ind2sub(size(A),find(A==0));
for i = 1 : 3
A(row(i),col(i))=Inf;
end
% Output
A
B(B==0) = Inf
isequal(A,B)
0 Commenti
Più risposte (4)
Les Beckham
il 16 Ott 2023
Modificato: Les Beckham
il 16 Ott 2023
If you want to retain the non-zero elements of A and replace the zeros with Inf, then this is how I would suggest that you do that.
% Input
A = [0 3 2 5 6;
1 1 4 3 2;
9 0 8 1 1;
5 9 8 2 0;
3 1 7 6 9];
A(A==0) = Inf
Note that your loop doesn't do this, it creates a matrix with Inf in the positions of the zeros in A and zero everywhere else. If that is really what you want then you could do that like this.
A = [0 3 2 5 6;
1 1 4 3 2;
9 0 8 1 1;
5 9 8 2 0;
3 1 7 6 9];
B = zeros(size(A));
B(A==0) = Inf
3 Commenti
Les Beckham
il 16 Ott 2023
Modificato: Les Beckham
il 16 Ott 2023
You are quite welcome.
If you are just getting started with Matlab, I would highly recommend that you take a couple of hours to go through the free online tutorial: Matlab Onramp
Matt J
il 16 Ott 2023
Allso just for fun.
A = [0 3 2 5 6;
1 1 4 3 2;
9 0 8 1 1;
5 9 8 2 0;
3 1 7 6 9];
A=A+1./(A~=0)-1
2 Commenti
Walter Roberson
il 23 Ott 2023
A = [0 3 2 5 6;
1 1 4 3 2;
9 0 8 1 1;
5 9 8 2 0;
3 1 7 6 9];
A(~A) = inf
2 Commenti
J. Alex Lee
il 23 Ott 2023
by the way, on huge matrices this is actually faster than testing for zero.
Alexander
il 16 Ott 2023
Only for fun. My maybe a bit old-fashoned approach would be:
B=1./A;
B(B==Inf)=0;
C=1./B
6 Commenti
Stephen23
il 23 Ott 2023
"But I think it depends on the problem you have to solve whether these are significant or not."
I can't think of many problems where a more complex, slower, obfuscated approach with precision errors would be preferred over the simpler, clearer, much more robust approach using indexing. Can you give an example?
Vedere anche
Categorie
Scopri di più su Loops and Conditional Statements in Help Center e File Exchange
Community Treasure Hunt
Find the treasures in MATLAB Central and discover how the community can help you!
Start Hunting!