[英]Pattern Matching and auto-complete for two arrays
假設我有一個數組:
[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函數嗎?還是我必須自己考慮一下?
正如您在評論中所說,您可以將任何唯一數字放在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
假設:
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
作為邏輯索引來排序A
ind
0
的元素,以獲得:
B =
-2 -3 -1 0 0 0 0 0 1 3 2 0 0 0 0 0
如果您還希望對它進行排序(如您的示例中所示),則將最后一行替換為:
B(ind) = nonzeros(sort(A))
對我來說,這就像一個插值問題 ,所以我認為以下將是一個可靠的解決方案:
%// 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
聲明:本站的技術帖子網頁,遵循CC BY-SA 4.0協議,如果您需要轉載,請注明本站網址或者原文地址。任何問題請咨詢:yoyou2525@163.com.