Matlab 检测矩阵之间的值并应用校正
首先,标题可能不够清晰,对此表示抱歉(如果不使用解释,就无法决定什么是更好的标题)。让我用语言更好地解释 假设我有一个矩阵Matlab 检测矩阵之间的值并应用校正,matlab,matrix,Matlab,Matrix,首先,标题可能不够清晰,对此表示抱歉(如果不使用解释,就无法决定什么是更好的标题)。让我用语言更好地解释 假设我有一个矩阵 A=[ 0 0 0 0 0 -1 -1 -1 1 1 1 1 0 0 0 0 0 1 1 1 -1 -1 -1 0 0 0 0 0 0 0 0 0 0 1 1 1 -1 -1 -1 -1 0 0 0 0 0 -1 -1 -1 1 1 1 0 0 0 0 ] 我想这样做的是检测0和每行上的任何值之间的边界,并按附件对其进行分段。对于第1行,我有(0-1,10),(0-1,-
A=[
0 0 0 0 0 -1 -1 -1 1 1 1 1 0 0 0 0 0 1 1 1 -1 -1 -1 0 0 0 0 0
0 0 0 0 0 1 1 1 -1 -1 -1 -1 0 0 0 0 0 -1 -1 -1 1 1 1 0 0 0 0 ]
我想这样做的是检测0
和每行上的任何值之间的边界,并按附件对其进行分段。对于第1行,我有(0-1
,10)
,(0-1
,-1-0)
,因此,使用此信息,我希望根据边界的开头和结尾,将该边界中包含的所有值更正为正值或负值。例如,第一行将变成类似于:
[0 0 0 0 0 -1 -1 -1 -1 -1 -1 -1 0 0 0 0 0 1 1 1 1 1 1 0 0 0 0 0]
任何我能有效执行的想法,因为我要处理的矩阵非常大。提前谢谢你
编辑
随附的值不是必需的1。它可以是任何值范围
[-1]
以下是一种可能的解决方案:
% example matrix:
A=[
0 0 0 0 0 0.5 0.9 -1 0.1 0.3 1 1 0 0 0 0 0 0.9 -1 0.1 0.3 -1 -1 0 0 0 0 0;
0 0 0 0 0 0.1 0.3 1 -1 -1 -1 -1 0 0 0 0 0 -1 -1 -1 1 1 1 0 0 0 0 0 ];
[r,c]=find(A);
ind=sortrows([r c]);
steps=find(diff(ind(:,2))~=1);
steps=[[1; steps+1],[steps ;size(ind,1)]];
for k=1:size(steps,1)
A(ind(steps(k,1),1),ind(steps(k,1),2):ind(steps(k,2),2))=A(ind(steps(k,1),1),ind(steps(k,1),2))
end
% result matrix:
A=
0 0 0 0 0.5 0.5 0.5 0.5 0.5 0.5 0.5 0 0 0 0 0 0.9 0.9 0.9 0.9 0.9 0.9 0 0 0 0 0
0 0 0 0 0.1 0.1 0.1 0.1 0.1 0.1 0.1 0 0 0 0 0 -1 -1 -1 -1 -1 -1 0 0 0 0 0
编辑
由于新的repelem
,我带来了一个矢量化的解决方案。现在它在matixA
中使用连续索引,而不是行和列,因此我对A
进行了转置,以便通过矩阵的有趣序列具有连续索引:
A=A.';
B=find(A);
steps=diff([0;find(diff(B)>1) ;length(B)]);
vals=A(B([0 ;find(diff(B)>1)]+1));
A(A~=0)=repelem(vals,steps);
谢谢你的回答!如果我的值不是
1
,它可以是[0 1]
之间的任何值,该怎么办。有什么提示吗?但是每个内部序列的值都是相似的,就像问题中那样?我建议你用所有关于数据的信息编辑这个问题。不,他们不是。它可以是[0 0 0-0.1-0.3-1 0.3 0.5 0.7 0 0 0]
类似的东西。是的,使用循环内赋值行的左侧(在等号之前)。在执行赋值之前,它包含这些值。很高兴提供帮助。如果您或其他人需要,我添加了一个矢量化解决方案。