替换两个值之间的矩阵值

时间:2017-11-21 07:03:18

标签: 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]

*表示可能被视为附件的值。如果公差为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 个答案:

答案 0 :(得分:0)

因为I've already answered half of this question,我将分两步完成。请注意,此处您的问题短语并非完全一般情况,因为您需要在此处仅放置1的位置处理具有一些连续非零的矩阵。这取决于您之前的问题和评论。

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

首先要做的步骤是在A的开头添加零,因为使用linear indexing完成所有操作并将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;

现在,第二步是用每个序列的第一个元素替换每个非零序列:

B=find(A);
A(A~=0)=repelem(A(B([0 ;find(diff(B)>1)]+1)),diff([0;find(diff(B)>1) ;length(B)]));

最后,我们可以将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 ];