How do I replace certain values of a vector A that are greater than certain values of a vector B for the values this vector?
4 Ansichten (letzte 30 Tage)
Ältere Kommentare anzeigen
Matheus Henrique Fessel
am 23 Aug. 2018
Bearbeitet: Matheus Henrique Fessel
am 23 Aug. 2018
My problem is the following: I have a matrix A(x,y) that some of it values are greater than a vector B(x) that sets a limit of amplitude. I want to replace the values of A that are greater than the values of B for the respective values of B. I tried this code but without succsess:
for ii = 1:size(A,1)
A(A(ii,:) > B(ii)) = B(ii);
end
Any clarification will help a lot! Thanks in advance.
0 Kommentare
Akzeptierte Antwort
Adam Danz
am 23 Aug. 2018
Here's a solution with fake data that match the dimensions in your question (an earlier answer by me, now deleted, used a vector instead of a matrix for A).
% fake data
A = [ 9 2 3; 4 5 6; 1 1 8];
B = [2;3;9];
%replicate B to match A
Br = repmat(B, 1, size(A,2));
%Replace values in A that exceed vals in B
A(A>Br) = Br(A>Br);
1 Kommentar
Adam Danz
am 23 Aug. 2018
Bearbeitet: Adam Danz
am 23 Aug. 2018
Note that this solution (and Stephen's) takes care of the whole matrix at once. It looks like you're doing this in a loop which will require adaptation if you decide to keep the loop. Stephen's bsxfun solution is higher level and is unnoticeably slower (microseconds) than mine. If you're looking for a 1-liner, use Stephen's solution.
Weitere Antworten (2)
Stephen23
am 23 Aug. 2018
Bearbeitet: Stephen23
am 23 Aug. 2018
>> A = [9,2,3;4,5,6;1,1,8];
>> B = [2;3;9];
>> min(A,B)
ans =
2 2 2
3 3 3
1 1 8
For older versions try the two following methods.
Method TWO: repmat with min:
>> min(A,repmat(B,1,3))
ans =
2 2 2
3 3 3
1 1 8
Method THREE: Use min with bsxfun:
>> bsxfun(@min,A,B)
ans =
2 2 2
3 3 3
1 1 8
0 Kommentare
Siehe auch
Kategorien
Mehr zu Logical 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!