matlab中求两个数组相同的连续元素部分

2024-12-26 14:41:36
推荐回答(2个)
回答1:

matlab不建议过多的利用循环处理,多利用matlab自带的函数比较方便。下面给个参考程序吧:

%输入信号
inputA=[ 10,1,2,10,3,4,5,6,7,10,8,9];
inputB=[ 100,1,2,100,3,4,5,6,7,8,100,9];

%自动按最大长度补齐
len=max(length(inputA),length(inputB));
A=[inputA,zeros(len-length(inputA))];
B=[inputB,zeros(len-length(inputB))];

%寻找相等点
temp1=(A==B);
%寻找相等点与其左右两端是否连续
temp2=[temp1,0,0]+[0,temp1,0]+[0,0,temp1];
temp2=temp2(2:length(temp2)-1);
%去掉其中的0点干扰
temp3=temp1.*temp2;
%对连续的点置为1
temp3=(temp3>1);
%求得结果
result=A.*temp3;
%%%%%%%%---------------------------------%%%%%%%%
对于新需求稍微修改一下矩阵维度就可以了,新修改的程序如下:

%输入信号
inputA=[1,2,3,101,102,103,4,5,6,7,8,9,10,11,410,420,430,440,450,12,13];
inputB=[21,22,410,420,430,440,23,24,25,26,27,28,29,30,31,32,33,34,101,102,103,35];
%自动按最大长度补齐
len=max(length(inputA),length(inputB));
A=[inputA,zeros(len-length(inputA))];
B=[inputB,zeros(len-length(inputB))];

%构建用于比较得二维矩阵
%注意此处A每行保持不变,B每行循环右移

A=ones(len,1)*A;

tempB=zeros(len,len);
tempB(1,:)=B;
for i= 1:len-1
temp0=circshift(B,[0 i]);
tempB(i+1,:)=temp0;
end

%寻找相等点
temp1=(A==tempB);
%寻找相等点与其左右两端是否连续
temp2=[temp1,zeros(len,2)]+[zeros(len,1),temp1,zeros(len,1)]+[zeros(len,2),temp1];
temp2=temp2(:,2:length(temp2)-1);
%去掉其中的0点干扰
temp3=temp1.*temp2;
%对连续的点置为1
temp3=(temp3>1);
%求得结果
result=A.*temp3;
%--------------------------------%
最后说一下该结果没有清除掉运算中的0,按自己的需求自己修改解决吧。

回答2:

两个数组同长吗?

同长解法(不同长看HELP文件)

for i=1:(length(a)-1)
if a(i)==b(i)
c(i)=a(i);
c(i+1)=a(i+1);
else
c(i)=0;
c(i+1)=0;
end
end

剩下的只需要根据0点拆分矩阵就可以了,方法很多,不再赘述