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 日間)
古いコメントを表示
Matheus Henrique Fessel
2018 年 8 月 23 日
編集済み: Matheus Henrique Fessel
2018 年 8 月 23 日
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!