How to replace negative elements in a Matrix with zeros?
95 visualizaciones (últimos 30 días)
Mostrar comentarios más antiguos
Matthew Davern
el 17 de En. de 2018
Editada: Walter Roberson
el 4 de Mayo de 2024
A = [2, 3, -1, 5; -1, 4, -7, -3; -6, 0, 3, 9; 7, 6, -3, 8];
B = [9; 17; 15; -3];
AI = inv(A)
I = A*AI
X = AI*B
A*X
Now I am trying to set up a nested for loop to redefine negative elements in A. I need to replace negative elements in A with a zero. How do I go about doing this?
0 comentarios
Respuesta aceptada
Stephen23
el 17 de En. de 2018
Editada: Stephen23
el 20 de Dic. de 2018
A = max(A,0)
For example:
>> A = [2, 3, -1, 5; -1, 4, -7, -3; -6, 0, 3, 9; 7, 6, -3, 8]
A =
2 3 -1 5
-1 4 -7 -3
-6 0 3 9
7 6 -3 8
>> A = max(A,0)
A =
2 3 0 5
0 4 0 0
0 0 3 9
7 6 0 8
3 comentarios
DGM
el 30 de Abr. de 2021
Doing this:
B = max(A);
returns the maximum values along dim1.
On the other hand, doing this:
B = max(A,0)
is equivalent to doing
B = max(A,zeros(size(A)))
In these cases, we're comparing each element of A against 0 and picking the largest of the two values.
Stephen23
el 30 de Abr. de 2021
Editada: Stephen23
el 30 de Abr. de 2021
Michael Seitaridis wrote: "I did not read in the documentation this syntax, nor I can understand it"
"Shouldn't A = max(A,0) produce ... "
The max documentation describes it as:
What my answer shows is consistent with that explanation (given scalar expansion). Lets consider element A(1,4), which has value five. Can you explain why you think that the "largest" of zero and five should be zero? As far as I am aware, five is generally considered to be larger than zero.
"(replace max number in every row) ?"
I do not see that written anywhere in max the documentation.
Más respuestas (2)
Jan
el 17 de En. de 2018
Or:
A(A < 0) = 0
3 comentarios
Jerzy Pela
el 27 de Feb. de 2020
Editada: Jerzy Pela
el 27 de Feb. de 2020
I compared both methods, since it was one of the bottlenecks in my calculations and max(A,0) was significantly faster. Keep it in mind if you need to do that calculation numerous times in your script. Otherwise both methods are equal
Johnny Zheng
el 14 de Oct. de 2020
A = A*(A>0);
This also works!
Have a summary of possible methods:
A = A*(A>0);
A = max(A,0);
A(A<0) = 0;
2 comentarios
Stephen23
el 14 de Oct. de 2020
For non-scalar A (such as that shown in the question) the mtimes operator needs to be replaced with an element-wise times operator otherwise an error or incorrect output is quite likely:
A.*(A>0)
Also note that this method changes -Inf values to NaN, which may be an undesired side-effect:
>> A = [-1,0,1,;-Inf,Inf,NaN];
>> A = A.*(A>0)
A =
0 0 1
NaN Inf NaN
Adam Danz
el 14 de Oct. de 2020
You'd need to multiple element-wise,
A = A.*(A>0);
Ver también
Categorías
Más información sobre Variables en Help Center y File Exchange.
Community Treasure Hunt
Find the treasures in MATLAB Central and discover how the community can help you!
Start Hunting!
