# A compact way to replace zeros with Inf in a matrix

12 Ansichten (letzte 30 Tage)
Sim am 16 Okt. 2023
Bearbeitet: Sim am 23 Okt. 2023
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
A = 5×5
Inf 3 2 5 6 1 1 4 3 2 9 Inf 8 1 1 5 9 8 2 Inf 3 1 7 6 9
##### 0 Kommentare-2 ältere Kommentare anzeigen-2 ältere Kommentare ausblenden

Melden Sie sich an, um zu kommentieren.

### Akzeptierte Antwort

J. Alex Lee am 16 Okt. 2023
Bearbeitet: J. Alex Lee am 16 Okt. 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
A = 5×5
Inf 3 2 5 6 1 1 4 3 2 9 Inf 8 1 1 5 9 8 2 Inf 3 1 7 6 9
B(B==0) = Inf
B = 5×5
Inf 3 2 5 6 1 1 4 3 2 9 Inf 8 1 1 5 9 8 2 Inf 3 1 7 6 9
isequal(A,B)
ans = logical
1
##### 0 Kommentare-2 ältere Kommentare anzeigen-2 ältere Kommentare ausblenden

Melden Sie sich an, um zu kommentieren.

### Weitere Antworten (4)

Les Beckham am 16 Okt. 2023
Bearbeitet: Les Beckham am 16 Okt. 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
A = 5×5
Inf 3 2 5 6 1 1 4 3 2 9 Inf 8 1 1 5 9 8 2 Inf 3 1 7 6 9
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
B = 5×5
Inf 0 0 0 0 0 0 0 0 0 0 Inf 0 0 0 0 0 0 0 Inf 0 0 0 0 0
##### 3 Kommentare1 älteren Kommentar anzeigen1 älteren Kommentar ausblenden
Les Beckham am 16 Okt. 2023
Bearbeitet: Les Beckham am 16 Okt. 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
Sim am 17 Okt. 2023
thanks :-)

Melden Sie sich an, um zu kommentieren.

Matt J am 16 Okt. 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
A = 5×5
Inf 3 2 5 6 1 1 4 3 2 9 Inf 8 1 1 5 9 8 2 Inf 3 1 7 6 9
##### 2 KommentareKeine anzeigenKeine ausblenden
Alexander am 16 Okt. 2023
It can't be shorter. Thumbs up.
Sim am 17 Okt. 2023
Thumb up! :-)

Melden Sie sich an, um zu kommentieren.

Walter Roberson am 23 Okt. 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
A = 5×5
Inf 3 2 5 6 1 1 4 3 2 9 Inf 8 1 1 5 9 8 2 Inf 3 1 7 6 9
##### 2 KommentareKeine anzeigenKeine ausblenden
J. Alex Lee am 23 Okt. 2023
by the way, on huge matrices this is actually faster than testing for zero.
Sim am 23 Okt. 2023
Bearbeitet: Sim am 23 Okt. 2023
@Walter Roberson Wow!! Thumb up! :-)

Melden Sie sich an, um zu kommentieren.

Alexander am 16 Okt. 2023
Only for fun. My maybe a bit old-fashoned approach would be:
B=1./A;
B(B==Inf)=0;
C=1./B
##### 6 Kommentare4 ältere Kommentare anzeigen4 ältere Kommentare ausblenden
Alexander am 22 Okt. 2023
Thanks @Stephen23 for the advice and yes, there are precision errors. But I think it depends on the problem you have to solve whether these are significant or not.
Stephen23 am 23 Okt. 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?

Melden Sie sich an, um zu kommentieren.

### Kategorien

Mehr zu Loops and Conditional Statements finden Sie in Help Center und File Exchange

### Community Treasure Hunt

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

Start Hunting!

Translated by