How to replace negative elements in a Matrix with zeros?

조회 수: 53 (최근 30일)
Matthew Davern
Matthew Davern 2018년 1월 17일
편집: Walter Roberson 2024년 5월 4일
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?

채택된 답변

Stephen23
Stephen23 2018년 1월 17일
편집: Stephen23 2018년 12월 20일
The simplest way is to use max:
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
DGM
DGM 2021년 4월 30일
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
Stephen23 2021년 4월 30일
편집: Stephen23 2021년 4월 30일
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:
"C = max(A,B) returns an array with the largest elements taken from A or B."
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.

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

추가 답변 (2개)

Jan
Jan 2018년 1월 17일
Or:
A(A < 0) = 0
  댓글 수: 3
Jerzy Pela
Jerzy Pela 2020년 2월 27일
편집: Jerzy Pela 2020년 2월 27일
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
Josh
Josh 2024년 5월 4일
thank you for this extra little insight!

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


Johnny Zheng
Johnny Zheng 2020년 10월 14일
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
Stephen23
Stephen23 2020년 10월 14일
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
Adam Danz 2020년 10월 14일
You'd need to multiple element-wise,
A = A.*(A>0);

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

카테고리

Help CenterFile Exchange에서 Variables에 대해 자세히 알아보기

Community Treasure Hunt

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

Start Hunting!

Translated by