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

1 view (last 30 days)
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

Accepted Answer

Guillaume
Guillaume on 5 Sep 2018
Edited: Guillaume on 5 Sep 2018
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')

More Answers (1)

Stephen23
Stephen23 on 5 Sep 2018
Edited: Stephen23 on 5 Sep 2018
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 Comments
Stephen23
Stephen23 on 5 Sep 2018
Edited: Stephen23 on 5 Sep 2018
@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

Sign in to comment.

Products

Community Treasure Hunt

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

Start Hunting!