Remove the rows/columns with single values of a matrix

Hello,
I have a matrix quite big (A < 23 x 250000 >). I want to evaluate the first row A(1,:) and eliminate the columns where there are values only repeated once. The number in this first row is an integer and always is increasing.
Lets say:
B = [1 1 3 5 5 5 7 9 9
0.1 0.5 0.2 0.4 0.3 0.9 0.1 0.6 0.5]
The result should be:
B = [1 1 5 5 5 9 9
0.1 0.5 0.4 0.3 0.9 0.6 0.5]
I know how to do it with for and if statements but I think it won't be efficient because the size of the matrix.
Many thanks!

 Accepted Answer

This is the code I have and it works, but maybe it is not efficient:
for i = 2:length(A) - 1;
if A(1,i) ~= A(1,i-1) && A(1,i) ~= A(1,i+1)
A = A(:,[1:i-1 i+1:end]);
i = i - 1;
end
end

4 Comments

Reducing the size of A inside the loop will fail, when you still try to run the loop to length(A), which is computed once only and not adjusted dynamically.
Yes, I know that. But when it fails, the job is done.
How can adjust this value dinamically? I've tried using a variable which I assign the total length before, and when it gets into the if I ajust this variable, but It stills failing.
Probably using a while loop instead of a for.
Thanks for your comment!
Yes, finally I had to do it with the while expression to avoid the for fail. The rush isn't good ever.
finished = 0; i = 2;
while finished == 0
if A(1,i) ~= A(1,i-1) && A(1,i) ~= A(1,i+1)
simulation_data = simulation_data(:,[1:i-1 i+1:end]);
elseif i == length(A)-1
finished = 1;
else
i = i + 1;
end
end
Regards.
Collect the indices to be removed at first:
toDelete = false(size(A, 2));
for i = 2:size(A, 2) - 1
if A(1,i) ~= A(1,i-1) && A(1,i) ~= A(1,i+1)
toDelete(ii) = true;
end
end
A(:, toDelete) = [];

Sign in to comment.

More Answers (1)

A start:
B = [1 1 3 5 5 5 7 9 9
0.1 0.5 0.2 0.4 0.3 0.9 0.1 0.6 0.5];
[ uniqueB, ix ] = unique( B(1,:) );
sB = B(1,:);
sB( ix ) = [];
singleB = setdiff( uniqueB, sB );
[ ~, ixm ] = ismember( singleB, B(1,:) );
B( :, ixm ) = []
prints
B =
1.0000 1.0000 5.0000 5.0000 5.0000 9.0000 9.0000
0.1000 0.5000 0.4000 0.3000 0.9000 0.6000 0.5000
>>
your turn.
I'm wouldn't be surprise if the for-loop is faster :)

Categories

Find more on Loops and Conditional Statements in Help Center and File Exchange

Products

Community Treasure Hunt

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

Start Hunting!