Re-write repeated values of a matrix using intermediate increased values

1 次查看(过去 30 天)
Hi all, I have some problems to rewrite a matrix with the values that I need. The following code do this:
  • Step0 = a matrix is created
  • Step1 = sort my matrix with ascend order
  • Step2 = create a mask with zeros
  • Step3 = here mask is rewrited with zeros just in repeated values positions
  • Step4 = create a matrix with repeated values changed by zeros.
  • Step5 = need to rewrite zero values with intermediate increased values (help me here !!)
%%step0: My matrix
A = [ 1 1 1 1 2 2 3 4 5 7 5;
3 3 6 5 4 1 5 7 8 9 1 ] ;
%%step1: sort my matrix ascend order
Asorted = sort(A,2);
%%step2: create a mask
Mask = zeros( size(Asorted,1),size(Asorted,2));
%%step3: Now Mask is rewrited with zeros in repeated values positons
for i = 1: size(Asorted,1)
[ C,ia,ic ] = unique( Asorted(i,:) );
Mask( i, ia ) = 1;
end
%%step4: vlaues are sorted with repeat val eliminated
AsortedWihtoutRepeat = Asorted.*Mask
% step5: Now we need to rewrite zero values with intermediate increased values
% RewritedMatrix = ??
Step4 results:
AsortedWihtoutRepeat =
1 0 0 0 2 0 3 4 5 0 7
1 0 3 0 4 5 0 6 7 8 9
Now I need to rewrite zeros by intermediate values, for example:
AsortedWihtoutRepeat(1,2) = value been value bigger than 1 and lower than 2. AsortedWihtoutRepeat(1,3) = value been value bigger than 1 and lower than 2.
And I need that position (1,2) and (1,3) will be increased values.
Step5 example:
RewritedMatrix =
1 1.1 1.5 1.7 2 2.5 3 4 5 6 7
1 2 3 3.5 4 5 5.5 6 7 8 9

采纳的回答

Guillaume
Guillaume 2018-9-5
编辑:Guillaume 2018-9-5
Another option is to use fillmissing with the 'linear' option (which under the hood does call interp1 similar to Stephen's answer). You can simplify your code to:
A = [ 1 1 1 1 2 2 3 4 5 7 5;
3 3 6 5 4 1 5 7 8 9 1 ] ;
%step 1:
Asorted = sort(A, 2);
%step 2, 3 and 4 combined:
Asorted([false(size(A, 1), 1), diff(Asorted, [], 2) == 0]) = NaN;
%step 5:
Afinal = fillmissing(Asorted', 'linear')' %has to transpose since fillmissing works on columns
Note that if you worked on columns rather than rows, the whole code would be simpler:
A = [ 1 1 1 1 2 2 3 4 5 7 5;
3 3 6 5 4 1 5 7 8 9 1 ]'; %transposed A
Asorted = sort(A);
Asorted([false(1, size(A, 2)); diff(A) == 0]) = NaN;
Afinal = fillmissing(Asorted, 'linear')

更多回答(1 个)

Stephen23
Stephen23 2018-9-5
编辑:Stephen23 2018-9-5
Just use interp1 on each row of your matrix:
>> vec = [1,0,0,0,2,0,3,4,5,0,7]; % one row of the matrix
>> idx = vec~=0;
>> out = interp1(find(idx),vec(idx),1:numel(vec))
out =
1.0000 1.2500 1.5000 1.7500 2.0000 2.5000 3.0000 4.0000 5.0000 6.0000 7.0000
Put that in a for loop and you can apply it to each matrix row.
  5 个评论
Stephen23
Stephen23 2018-9-5
编辑:Stephen23 2018-9-5
@Cesar Antonio Lopez Segura: somehow you have changed your algorithm. In your original question you gave this example matrix:
AsortedWihtoutRepeat =
1 0 0 0 2 0 3 4 5 0 7
1 0 3 0 4 5 0 6 7 8 9
But when I actually run your code I get this matrix:
AsortedWihtoutRepeat =
0 0 0 1 0 2 3 4 0 5 7
0 1 0 3 4 0 5 6 7 8 9
Given your different input arrangement, there is no reason to expect the same output.
Cesar Antonio Lopez Segura
Thank you very much.
I want to explain that my real matrix has 1600 rows and 32 colum.
For this reason I was looking for a general solution that works with my problem using a simplify example. The aim is manipulate the gen of a lot of chromosomes in a genetic algorithm and not a number response of interp1 is a problem in my case.
Best regards Cesar

请先登录,再进行评论。

产品

Community Treasure Hunt

Find the treasures in MATLAB Central and discover how the community can help you!

Start Hunting!

Translated by