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?
6 次查看(过去 30 天)
显示 更早的评论
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 个评论
采纳的回答
Adam Danz
2018-8-23
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 个评论
Adam Danz
2018-8-23
编辑:Adam Danz
2018-8-23
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.
更多回答(2 个)
Stephen23
2018-8-23
编辑:Stephen23
2018-8-23
>> 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 个评论
另请参阅
类别
在 Help Center 和 File Exchange 中查找有关 Matrix Indexing 的更多信息
Community Treasure Hunt
Find the treasures in MATLAB Central and discover how the community can help you!
Start Hunting!