元素x(i)或y(i)的MATLAB向量与max(abs(x),abs(y))

时间:2014-09-16 19:05:17

标签: arrays matlab sorting vector

对于标题感到抱歉,无法想出一个简洁的方法来表达问题。我需要写一个MATLAB单行程,它给你一个元素z(i)的向量,其中z(i)是由max(abs(x(i)),abs给出的元素x(i)或y(i) (义)))。即,z是矢量,其元素是具有最大绝对值的x或y的第i个元素。

我有

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

但这显然会给你一个最大绝对值的向量。这接近我想要的,但我需要得到原始矢量的符号。我不知道如何在一条线上做到这一点。

2 个答案:

答案 0 :(得分:4)

假设xy是相同维度的数组(不一定是向量),您可以使用逻辑索引:

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

有关信息,abs(x)>=abs(y)是一个逻辑数组,对于所有有效索引,k分量为

  • 1如果x(k)大于或等于y(k)
  • 0否则。

示例:

>>  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

答案 1 :(得分:1)

如果您对使用多个2D矩阵时可以使用的通用代码感兴趣,请说xyp,您可以试试这个 -

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

输出 -

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

因此,如果您想在混合中再添加一个2D矩阵q,只需编辑第一行代码 -

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