How to compact an array with repeated data and NaNs?

Hi!
I have two vectors with measurement set points and an array with measurement values. The vectors and array contain repeated values and the array also contains NaNs. I would like to remove the repeated data and for the measurement set points where there are both a NaN and a value, I would like the value to remain.
For example, if the two vectors are called x and y and the array is called z.
x = [0 0.5 0.5 1 2]
y = [0 1 2 2 ]
z = [1 NaN 2 5 10; 7 3 3 NaN 2; 8 4 4 NaN NaN; 8 NaN 4 8 NaN]
I would like this to become
x = [0 0.5 1 2]
y = [0 1 2]
z = [1 2 5 10; 7 3 NaN 2; 8 4 8 NaN]
How do I do this in an easy way (I have quite a large array with data…)?
Thanks!

3 commentaires

James Tursa
James Tursa le 25 Mar 2015
Modifié(e) : James Tursa le 25 Mar 2015
So you want the unique values of x and y to remain, and then delete the corresponding column(s) and row(s) of z based on what got deleted from x and y, but do so in a way that replaces any NaN's with values if there was a non-NaN available for that spot?
Can we assume that x and y are sorted as in your example?
Konstantinos Sofos
Konstantinos Sofos le 25 Mar 2015
Modifié(e) : Konstantinos Sofos le 25 Mar 2015
And what will happen in the case that all the values of a row are NaN or the dimensions are not consistent? In your example with Z matrix the output of the last row has 2 times the 8....
Elin
Elin le 25 Mar 2015
Modifié(e) : Elin le 26 Mar 2015
James: That's exactly what I want to do. And, yes, you can assume that x any y are sorted.
Konstantinos: I have no measurement data where all elements in either a row or column is NaN and the dimensions are consistent, so that is not a problem. The reason the Z matrix has the value 8 two times in the last row is because both measurement set points (x = 0, y = 2) and (x = 1, y = 2) give the measurement value z = 8.

Connectez-vous pour commenter.

 Réponse acceptée

James Tursa
James Tursa le 25 Mar 2015
Modifié(e) : James Tursa le 25 Mar 2015
Brute force using loops (if there are different non-NaN values available for a particular spot, picks the max of them):
[m,n] = size(z);
for k=1:n-1
if( x(k) == x(k+1) )
z(:,k) = max(z(:,k:k+1),[],2);
end
end
for k=1:m-1
if( y(k) == y(k+1) )
z(k,:) = max(z(k:k+1,:),[],1);
end
end
[x,iax,~] = unique(x);
[y,iay,~] = unique(y);
z = z(iay,iax);

Plus de réponses (0)

Catégories

Community Treasure Hunt

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

Start Hunting!

Translated by