假设我有一个数组:
[0, -2, 0, 0, -3, 0, -1, 0, 1, 0, 3, 0, 2, 0, 0, 0]
我想知道它是否适合下面的模式:
[1, 1, 1 , 0, 0 , 0 , 0, 0, 1, 1, 1, 0, 0, 0, 0, 0];
其中1表示该数字是唯一的,0表示所有这些数字都匹配。如果我这样安排,我们会有一场比赛:
[-3, -2, -1, 0, 0, 0, 0, 0, 1, 2, 3, 0, 0, 0, 0, 0];
是否有任何Matlab功能,或者我必须以自己的方式思考?
答案 0 :(得分:1)
正如你在评论中所说,你可以把任何唯一的数字放在1,而且所有不是零的数字都是唯一的,所以我认为以下是这样的:
A = [0, -2, 0, 0, -3, 0, -1, 0, 1, 0, 3, 0, 2, 0, 0, 0];
B = [1, 1, 1 , 0, 0 , 0 , 0, 0, 1, 1, 1, 0, 0, 0, 0, 0];
B(B==1)= A(A~=0)
给出了这个:
B =
-2 -3 -1 0 0 0 0 0 1 3 2 0 0 0 0 0
要匹配问题中您的确切输出,您可以使用以下内容:
A = [0, -2, 0, 0, -3, 0, -1, 0, 1, 0, 3, 0, 2, 0, 0, 0];
B = [1, 1, 1 , 0, 0 , 0 , 0, 0, 1, 1, 1, 0, 0, 0, 0, 0];
A=sort(A);
B(B==1)= A(A~=0)
给出了这个:
B =
-3 -2 -1 0 0 0 0 0 1 2 3 0 0 0 0 0
答案 1 :(得分:1)
假设:
ind = logical([1, 1, 1 , 0, 0 , 0 , 0, 0, 1, 1, 1, 0, 0, 0, 0, 0]);
你可以写:
B = zeros(size(ind)); % only if the zeros at the end of 'B' are important
B(ind) = nonzeros(A)
因此,您使用ind
作为逻辑索引来排序0
中不是A
的元素,以获取:
B =
-2 -3 -1 0 0 0 0 0 1 3 2 0 0 0 0 0
如果您还想对其进行排序(如您的示例所示),请将最后一行替换为:
B(ind) = nonzeros(sort(A))
答案 2 :(得分:1)
对我而言,感觉就像是插值问题,所以我认为以下将是一个强大的解决方案:
%// data
A = [0, -2, 0, 0, -3, 0, -1, 0, 1, 0, 3, 0, 2, 0, 0, 0]
B = [1, 1, 1 , 0, 0 , 0 , 0, 0, 1, 1, 1, 0, 0, 0, 0, 0]
%// input data for interpolation
x = 1:numel(A)
v = A;
%// query points
mask = logical(B) & ~logical(A);
xq = find( mask )
%// interpolation
vq = interp1(x(~mask),v(~mask),xq,'linear','extrap')
%// output
out = A.*B;
out(xq) = vq
out =
-3 -2 -1 0 0 0 0 0 1 2 3 0 0 0 0 0