Filter löschen
Filter löschen

how can I get the max of the values between NaN's in an array

5 Ansichten (letzte 30 Tage)
I have an array like this one:
T = [NaN NaN; ...
1 3;
2 4;
5 6;
8 7;
NaN NaN;
NaN NaN;
4 5;
6 7;
NaN NaN;
NaN NaN;
1 2;
2 4;
5 6;
NaN NaN];
Now I'd like to add the columns of the values between the Nan's and get the max values of the sums. So the outcome in this case would be:
max = [15; 13; 11]
I tried this:
NaNloc=isnan(T);
ind=find(NaNloc(:,1));
for i=1:(length(ind)-1)
if ind(i+1)-ind(i) >1
patloc=[ind(i) ind((i+1))];
patarray=patloc(1):1:patloc(2);
for j=patarray(1):patarray(length(patarray))
a=T(j,:);
f=a(1)+a(2);
fsave(j-patloc(1)+1,:)=f;
end
max(fsave)
end
end
but I get the outcome: 15 15 11

Akzeptierte Antwort

Azzi Abdelmalek
Azzi Abdelmalek am 10 Jun. 2014
Bearbeitet: Azzi Abdelmalek am 10 Jun. 2014
T = [NaN NaN; 1 3; 2 4; 5 6; 8 7; NaN NaN; NaN NaN; 4 5; 6 7; NaN NaN; NaN NaN; 1 2; 2 4; 5 6; NaN NaN;4 5];
h=[1;isnan(T(:,1)) ;1]';
out=arrayfun(@(x,y) max(sum(T(x:y,:),2)),strfind(h,[1 0]),strfind(h,[0 1])-1)
  2 Kommentare
Matt J
Matt J am 10 Jun. 2014
I don't get the correct answer from this. I get,
15 13 11 9
Joanie
Joanie am 10 Jun. 2014
That's because Azzi added 4 5 at the end of T :)

Melden Sie sich an, um zu kommentieren.

Weitere Antworten (2)

Matt J
Matt J am 10 Jun. 2014
Bearbeitet: Matt J am 10 Jun. 2014
T=sum(T,2);
lims=reshape(find(isnan(T)),2,[]);
n=size(lims,2);
result=nan(1,n);
for i=1:n
result(i)=max(T(lims(1,i)+1:lims(2,i)-1));
end
  3 Kommentare
Matt J
Matt J am 10 Jun. 2014
I don't fully understand your original code, but here is how I would extract each individual block of T
if ~isnan(T(1))
T=[nan,nan;T];
end
if ~isnan(T(end))
T=[T;nan,nan];
end
nanloc=find(isnan(T(:,1)));
for i=1:length(nanloc)-1
a=nanloc(i);
b=nanloc(i+1);
if b-a==1,
continue;
else
a=a+1;b=b-1;
end
Tblock = T(a:b,:), %current block
end
Joanie
Joanie am 10 Jun. 2014
Thank you I can work with this!

Melden Sie sich an, um zu kommentieren.


Andrei Bobrov
Andrei Bobrov am 10 Jun. 2014
l = ~isnan(T(:,1));
k = [l(1);diff(l)] == 1;
ii = cumsum(k);
z = (1:size(T,1))';
out = accumarray(ii(l),z(l),[],@(x)max(sum(T(x,:),2)));

Kategorien

Mehr zu Loops and Conditional Statements finden Sie in Help Center und File Exchange

Tags

Community Treasure Hunt

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

Start Hunting!

Translated by