Warning: file_get_contents(/data/phpspider/zhask/data//catemap/4/matlab/16.json): failed to open stream: No such file or directory in /data/phpspider/zhask/libs/function.php on line 167

Warning: Invalid argument supplied for foreach() in /data/phpspider/zhask/libs/tag.function.php on line 1116

Notice: Undefined index: in /data/phpspider/zhask/libs/function.php on line 180

Warning: array_chunk() expects parameter 1 to be array, null given in /data/phpspider/zhask/libs/function.php on line 181
Matlab 检测矩阵之间的值并应用校正_Matlab_Matrix - Fatal编程技术网

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
,我带来了一个矢量化的解决方案。现在它在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);

谢谢你的回答!如果我的值不是
1
,它可以是
[0 1]
之间的任何值,该怎么办。有什么提示吗?但是每个内部序列的值都是相似的,就像问题中那样?我建议你用所有关于数据的信息编辑这个问题。不,他们不是。它可以是
[0 0 0-0.1-0.3-1 0.3 0.5 0.7 0 0 0]
类似的东西。是的,使用循环内赋值行的左侧(在等号之前)。在执行赋值之前,它包含这些值。很高兴提供帮助。如果您或其他人需要,我添加了一个矢量化解决方案。