1
\$\begingroup\$

Is there a way to reduce the computation time in this program that eliminates the columns of a matrix A if for a given column the element of line 4 is equal to the element in row 5:

k=1;
for i=1:4000
   if A(4,i) ~= A(5,i)
      B(:,k)=A(:,i);
      k=k+1;
   end
end
\$\endgroup\$

1 Answer 1

4
\$\begingroup\$

In general, you speed up Matlab programs by computing whole vectors or matrices at once, rather than writing loops. In this case, you can generate a "logical" vector that contains 1 in each column where the corresponding column in A has different values in rows 4 and 5, and 0 in the other columns:

selected_columns = A(4, :) ~= A(5, :);

Then you want to collect all the rows of A, in the columns where the two rows are different:

B = A(:, selected_columns);

I tested the idea in Octave, since I don't actually have Matlab:

octave-3.4.0:7> A = [1, 1, 2, 2, 3, 4, 5;1, 2, 3, 2, 1, 4, 5]
A =

   1   1   2   2   3   4   5
   1   2   3   2   1   4   5

octave-3.4.0:8> selected_columns = A(1, :) ~= A(2, :)
selected_columns =

   0   1   1   0   1   0   0

octave-3.4.0:9> B = A(:, selected_columns)
B =

   1   2   3
   2   3   1

This isn't exactly equivalent to your original code, but it's probably closer to what you meant anyway. Specifically, if A has more than 4000 columns, my code will include the extra ones, while yours will drop them. My code also doesn't care about the initial value of B, while yours can include extra columns from B that weren't in A. Similarly, your code can fail if A is narrower than 4000 columns, or if B is too narrow to hold all the unequal columns from A.

\$\endgroup\$

Your Answer

By clicking “Post Your Answer”, you agree to our terms of service and acknowledge you have read our privacy policy.

Not the answer you're looking for? Browse other questions tagged or ask your own question.