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
200_success
145k22 gold badges190 silver badges478 bronze badges
asked Dec 11, 2011 at 21:19
\$\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.

answered Dec 12, 2011 at 6:48
\$\endgroup\$

Your Answer

Draft saved
Draft discarded

Sign up or log in

Sign up using Google
Sign up using Email and Password

Post as a guest

Required, but never shown

Post as a guest

Required, but never shown

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

Start asking to get answers

Find the answer to your question by asking.

Ask question

Explore related questions

See similar questions with these tags.