user3557054
user3557054

Reputation: 219

Tracking changes in a cell in Matlab

I have a cell with 3 different columns. The first is a simple ranking, the second is a code composed by X elements and the third is a code composed by Y elements that usually is the same for a certain combination of numbers in column two. So if in column two you have the number 345, it is likely that in column three you will always have 798. The thing is that sometimes it changes. So what I have, for instance, is:

1 453 4789

1 56 229

1 453 1246 %here the corresponding code has changed

2 43 31

2 453 1246 %here the code did not change

3 56 31 %here the corresponding code has changed (it was 229 previously)

What I want to have at the end is a new cell with three columns, only descriminating the cases in which a change in the code of the third column (correspondent to the code form the second column) was observed. For instance, in this simple example I would get:

1 453 1246

3 56 31

Upvotes: 1

Views: 143

Answers (2)

user2379410
user2379410

Reputation:

If you have your data in a matrix A you can use sorting:

[~, I] = sort(A(:,2));
B = A(I,:);

code_diff = logical(diff(B(:, 2)));
value_diff = logical(diff(B(:, 3)));
value_diff(code_diff) = false;

rows = sort(I([false; value_diff]));
ans = A(rows, :);

If the "codes" in the second column are all smallish integers, another possibility is to use a lookup table:

n = size(A, 1);
m = max(A(:, 2));

mask = false(n, 1);
lookup = inf(m, 1);

for i = 1:n
    code = A(i,2);
    if isinf(lookup(code))
        lookup(code) = A(i,3);
    elseif lookup(code) ~= A(i,3)
        mask(i) = true;
        lookup(code) = A(i,3);
    end
end

ans = A(mask, :);

Upvotes: 2

Rafael Monteiro
Rafael Monteiro

Reputation: 4549

Assuming the values are in a matrix, this is a possible solution:

CJ2 = [1 453 4789
     1 56  229
     1 453 1246
     2 43  31
     2 453 1246
     3 56  31];

changes = zeros(size(CJ2));
nChanges = 0;
for i = 2:size(CJ2,1)
    pos = find(CJ2(1:i-1,2) == CJ2(i,2), 1, 'last');
    if ~isempty(pos) && CJ2(pos,3) ~= CJ2(i,3)
        nChanges = nChanges + 1;
        changes(nChanges, :) = CJ2(i,:);
    end
end
changes = changes(1:nChanges, :);

changes

Results:

>> changes

changes = 

       1         453        1246
       3          56          31

Upvotes: 0

Related Questions