matlab 寻找两个向量

nwwlzxa7  于 2023-03-08  发布在  Matlab
关注(0)|答案(4)|浏览(231)

我有一个大小为100x1的向量S。使用S创建子向量A和B,例如A = S(1:50)和B = S(5:55)。注意A和B中元素的移位。生成的合成向量为R = a * A + b * B。
现在的问题是a,b,R,并且A和B之间的位移已经给出,如何计算A和B?
谢谢大家!
我想不出任何流程,所以请帮帮我。

gjmwrych

gjmwrych1#

关系式R=a*A + b*B可以写成convolutionc=conv([b,0,0,0,a], S),其中第一信号中零的数目等于shift-25-2==3
因此,我们可以使用deconvolution来计算S

S1 = deconv(R, [a, 0, 0, 0, b]);

注意,在反褶积中,a是第一个元素,b是最后一个元素。
结果与原始S * 几乎 * 相同,并且它只包含AB共享的S部分。

vzgqcmou

vzgqcmou2#

实际上,你有一个线性系统,其中变量的数量等于numel(R)+shift,方程的数量等于numel(R),我认为你不可能得到你想要的结果,因为未知变量的数量总是比方程的数量多:

% First chain of variables
R(1) = a*S(1)+b*S(5); %One equation, two unknowns
R(5) = a*S(5)+b*S(9); %Two equations, three unknowns
R(9) = a*S(9)+b*S(13); %Three equations, four unknowns

% Second chain of variables
R(2) = a*S(2)+b*S(6); %Four equations, six unknowns
R(6) = a*S(6)+b*S(10); %Five equations, seven unknowns

% etc.
sxpgvts3

sxpgvts33#

你有一个超定方程组,所以你不能得到精确的结果,但是matlab完全能够估计出这样一个方程组的解:

% Define the parameters
start = 10;
offset = 2;
len = 20;
a = 5;
b = 25;
% Create A and B from a random array S.
S = randi(30,1,100);
A = S(start:start+len-1);
B = S(start+offset:start+offset+len-1);
% We compute R
R = a*A+b*B;
% We create our system of linear equation:
M = cat(2,diag(ones(len,1)*a),zeros(len,offset))+cat(2,zeros(len,offset),diag(ones(len,1)*b));
% We solve the system
S_theta = (M\R.').'

让我们将S_theta与S进行比较:

S_theta(offset+1:end)-B

结果:

注意到结果会更好,如果:
1.偏移量较小(方程组中的未知量较少)

  1. a和b之间的差别很大。
qyswt5oh

qyswt5oh4#

shift个零分别打在S的前面(或后面),将前者乘以a,后者乘以b,然后将它们相加,这将问题简化为子串搜索,您可以使用暴力或更复杂的方法;见
https://en.wikipedia.org/wiki/String-searching_algorithm

相关问题