ethrbunny
ethrbunny

Reputation: 10479

Matlab: Optimize this?

Im v new to matlab. Have been tasked with speeding up a procedure. Im sure there is a better way to do the following statements:

for i = 2:length(WallId)
     if WallId(i) ~= WallId(i-1)
        ReducedWallId = [ReducedWallId;WallId(i)];
        ReducedWallTime = [ReducedWallTime;WallTime(i)];
        GroupCount = [GroupCount;tempCount];
        tempCount = 1;
    else
        tempCount = tempCount +1;
    end
end

I can preallocate the various vars to 'length(WallId)' but what do I do with the extra after its done? Do I care?

Upvotes: 2

Views: 133

Answers (2)

Nzbuu
Nzbuu

Reputation: 5251

idx = find([true diff(WallId) ~= 0]);
ReducedWallId = WallId(idx);
ReducedWallTime = WallTime(idx);
GroupCount = diff([idx numel(WallId)+1]);

Assuming what you want is a summary of the unique data in WallId and WallTime, then you should make sure that WallId is sorted first. You can re-organise WallTime to match, as follows:

[WallId, ind] = sort(WallId);
WallTime = WallTime(ind);

Also, you'll only get the right answer if WallTime matches whenever WallId does.

Upvotes: 3

thias
thias

Reputation: 2450

Use vectorization.

ReducedWallId=WallId(find(diff(WallId)~=0));

and similarly for ReducedWallTime.

The explicit for-loops are extremely slow. Using vector-operations speeds everything up considerably. This is a general theme in optimizing MATLAB code and is covered in detail in various documents found in the web.

Upvotes: 2

Related Questions