首先,标题可能不够清楚,对不起(如果不使用解释,无法确定什么是更好的标题)。让我用语言更好地解释。
假设我有一个矩阵
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
,1 0)
,(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 1]
。
答案 0 :(得分: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
,我带了一个矢量化解决方案。现在它适用于matix A
中的连续索引,而不是行和列,因此我转换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);