Matlab 在两个值之间替换矩阵值

Matlab 在两个值之间替换矩阵值,matlab,matrix,Matlab,Matrix,我尝试替换在可接受公差范围/两个值之间的距离(非零)内两个值之间的每行值。例如: A=[0 0 0 0 1 *0 *0 *0 *0 *0 -1 *0 *0 *0 *0 *0 *0 *0 *0 *0 *0 *0 *0 *0 *0 *0 -1 *0 *0 *0 1 0 0 0; 0 0 1 *0 *0 *0 *0 *0 *0 *0 -1 *0 *0 *0 *0 *0 *0 *0 *0 *0 *0 *0 *0 *0 *0 *0 -1 *0 *0 *0 1 0 0 0] *表示作为机柜考虑的可能值。公

我尝试替换在可接受公差范围/两个值之间的距离(非零)内两个值之间的每行值。例如:

A=[0 0 0 0 1 *0 *0 *0 *0 *0 -1 *0 *0 *0 *0 *0 *0 *0 *0 *0 *0 *0 *0 *0 *0 *0 -1 *0 *0 *0 1 0 0 0;
0 0 1 *0 *0 *0 *0 *0 *0 *0 -1 *0 *0 *0 *0 *0 *0 *0 *0 *0 *0 *0 *0 *0 *0 *0 -1 *0 *0 *0 1 0 0 0]
*
表示作为机柜考虑的可能值。公差为6(例如),内部值将替换为第一个边界值:

A_replaced=[0 0 0 0 1 *1 *1 *1 *1 *1 1 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 -1 *-1 *-1 *-1 -1 0 0 0;
0 0 1 0 0 0 0 0 0 0 -1 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 -1 *-1 *-1 *-1 -1 0 0 0]
如您所见,由于两个边界之间的距离不超过6(小于公差),因此可以视为封闭的所有对象都将替换为第一个边界值(包括末端闭合值)。对于大尺寸的矩阵,有没有矢量化的方法?提前谢谢

因为,我将分两步来做。请注意,这里的问题不是完全一般的情况,因为您需要在此处仅放置
1
的位置使用一些连续的非零来处理矩阵。这取决于您之前的问题和评论

因此,第一步是找到长度在公差范围内的所有零序列,并用
1
替换它们。第二步是前面的问题-用序列的起始值替换所有非零

第一步是在
A
的开头添加零,因为使用
A
并将其视为一个长向量非常方便,但我们不希望捕获跨列的零序列。我们可以去掉末尾的零

A=[
0 0 0 0 0 0.5 0.9 -1 0.1 0.3 1 1 0 0 0 0.9 -1 0.1 0 0 0 0 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 0 0 1 1 1 0 0 0 0 0 ];

tol=6;
A=[zeros(size(A,1),tol), A];    % add zeros at beginning of each row
A=A.';                           % working on transposed A let us index continuously the sequences


zero_starts=strfind([A(1)==0; A(:)~=0].',[1 0]).';  % indices where `0` sequences starts
zero_starts(end)=[];                                % last sequance is not enclosed   
zero_length=diff([0; find(diff(find(~A))>1)]);      % length of each of these zero-sequences
zero_tol=find(zero_length<=tol);                    % zero-sequences that shorter than tolerance
zero_tol(strfind(diff([0; zero_tol].')-1>0,[1 0])+1)=[]; % remove each second of continuous zero-seqeunces

% replace all short zero-seqeunces with `1`
sl=arrayfun(@(x)0:x-1, zero_length(zero_tol),'uni',0);
A(repelem(zero_starts(zero_tol),zero_length(zero_tol))+cat(2,sl{:}).')=1;
最后,我们可以将
A
倒回到它的形状和大小-

A=A(tol+1:end,:).'

A=[
0 0 0 0 0 0.5 0.5 0.5 0.5 0.5 0.5 0.5 0.5 0.5 0.5 0.5 0.5 0.5 0 0 0 0 0.3 -1 -1 0 0 0 0 0;
0 0 0 0 0 0.1 0.1 0.1 0.1 0.1 0.1 0.1 0.1 0.1 0.1 0.1 0.1 0.1 0.1 0.1 0 0 1 1 1 0 0 0 0 0 ];

此项的预期输出是什么:
[1 0 0 0-1 0 0 0-1]
抱歉,忘了提及这一点。输出将是
[1 1 0 0-1]
。第二部分被忽略,如果矩阵扩展为
[1 0 0 0-1 0 0-1 0 0-1 0 0 0 0 0 0 0 0 0 1]
非零值只能是1或-1,或者也可以是其他值,则最后一个
-1
将被视为另一个机柜的初始边界?例如,
[0 0 3 0-1 0-1.7 0]
可以是一个输入吗?它可以是任何非零值,不需要1或-1
A=A(tol+1:end,:).'

A=[
0 0 0 0 0 0.5 0.5 0.5 0.5 0.5 0.5 0.5 0.5 0.5 0.5 0.5 0.5 0.5 0 0 0 0 0.3 -1 -1 0 0 0 0 0;
0 0 0 0 0 0.1 0.1 0.1 0.1 0.1 0.1 0.1 0.1 0.1 0.1 0.1 0.1 0.1 0.1 0.1 0 0 1 1 1 0 0 0 0 0 ];