簡體   English   中英

模式匹配和兩個陣列的自動完成

[英]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.

 
粵ICP備18138465號  © 2020-2024 STACKOOM.COM