简体   繁体   中英

MATLAB Vector of elements x(i) or y(i) with max(abs(x),abs(y))

Sorry for the title, couldn't think of a concise way to phrase the problem. I need to write a MATLAB one-liner that gives you a vector of elements z(i) where z(i) is the element x(i) or y(i) given by max(abs(x(i)),abs(y(i))). Ie, z is the vector whose elements are the ith elements of x or y which has the maximum absolute value.

I have

max(abs(x),abs(y))

But this obviously gives you a vector of the greatest absolute values. This is close to what I want, but I need to get the sign back of the original vector. I'm not sure how to do this on a single line.

Under the assumption that x and y are arrays (not necessarily vectors) of identical dimensions, you can use logical indexing:

(abs(x)>=abs(y)).*x + (abs(x)<abs(y)).*y

For information, abs(x)>=abs(y) is a logical array for which, for all valid indices, the k th component is

  • 1 if x(k) is greater than or equal to y(k) ,
  • 0 otherwise.

Example:

>>  x = [4;7;-1;9;6];
>>  y = [5;2;-3;9;3];
>>  (abs(x)>=abs(y)).*x + (abs(x)<abs(y)).*y

ans =

     5
     7
    -3
     9
     6

If you are interested in a generic code that you could use when working with a number of 2D matrices, let's say x , y and p , you can try this -

x = [-2 4 1;
    4 -3 2]
y = [8 -3 -5;
    -9 1 5]
p = [6 8 6;
    7 -1 -2]

mats = cat(3,x,y,p);%// concatenate all identically sized 2D matrices into 3D

[m,n] = size(x);%// get size
[maxval,dim3ind] = max(abs(mats),[],3);%// Max abs values and indices across dim3
mats_sign = sign(mats); %// signum values
out = mats_sign((dim3ind-1)*m*n + bsxfun(@plus,[1:m]',[0:n-1]*m)).*maxval %// output

Output -

x =
    -2     4     1
     4    -3     2
y =
     8    -3    -5
    -9     1     5
p =
     6     8     6
     7    -1    -2
out =
     8     8     6
    -9    -3     5

So, if you would like to include one more 2D matrix say q into the mix, just edit the first line of code -

mats = cat(3,x,y,p,q);

The technical post webpages of this site follow the CC BY-SA 4.0 protocol. If you need to reprint, please indicate the site URL or the original address.Any question please contact:yoyou2525@163.com.

 
粤ICP备18138465号  © 2020-2024 STACKOOM.COM