对于标题感到抱歉,无法想出一个简洁的方法来表达问题。我需要写一个MATLAB单行程,它给你一个元素z(i)的向量,其中z(i)是由max(abs(x(i)),abs给出的元素x(i)或y(i) (义)))。即,z是矢量,其元素是具有最大绝对值的x或y的第i个元素。
我有
max(abs(x),abs(y))
但这显然会给你一个最大绝对值的向量。这接近我想要的,但我需要得到原始矢量的符号。我不知道如何在一条线上做到这一点。
答案 0 :(得分:4)
假设x
和y
是相同维度的数组(不一定是向量),您可以使用逻辑索引:
(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矩阵时可以使用的通用代码感兴趣,请说x
,y
和p
,您可以试试这个 -
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);