How to vectorize a loop over rows ?
Mostrar comentarios más antiguos
Hello !
I've got the following code for Kaggle's digit recognizer using KNN, somehow, I unable to replace the following for loop into a vectorized implementation.
The loop is used to loop an entire row from the test data matrix.
knn_mat = zeros(m_test,1);
for i = 1:m_test
fprintf('i is %d \n',i);
compare_mat = repmat(x_test(i,:),m_train,1);
distance_mat = sum(power((compare_mat - x_train),2),2);
[a,b] = min(distance_mat);
knn_mat(i) = y(b);
end
Thank You !
10 comentarios
Matz Johansson Bergström
el 19 de Jul. de 2014
The following variables are undefined
m_test = ? x_test = ? m_train = ? x_train = ? y = ?
Could you provide information so I can run the code?
Karan
el 19 de Jul. de 2014
Matz Johansson Bergström
el 19 de Jul. de 2014
Please upload train.csv and test.csv then we're in business ;-)
Karan
el 19 de Jul. de 2014
dpb
el 19 de Jul. de 2014
Any small test input case would suffice...
Karan
el 19 de Jul. de 2014
Matz Johansson Bergström
el 19 de Jul. de 2014
Editada: Matz Johansson Bergström
el 19 de Jul. de 2014
I registered before you uploaded and took a look. I read the description on Kaggle, you compare one character by accessing a row in x_test with every other character that are in the training set x_train. I was not able to vectorize the code, perhaps someone else here can.
For anyone else who might be interested in this (it's a contest in Kaggle), here is how you can visualize the first 10 characters from the training set:
for i=1:10;
image(reshape(x_train(i,:),28,28)');
pause(0.5);
end
Matz Johansson Bergström
el 19 de Jul. de 2014
I think that another type of approach or calling compiled code would be of better help. I'm thinking like storing x_train in a spatial data structure to be able to quickly find the closest neighbour of x_test in x_train.
Karan
el 19 de Jul. de 2014
Respuesta aceptada
Más respuestas (1)
Matz Johansson Bergström
el 20 de Jul. de 2014
0 votos
Jan: Nice. That was actually my first thought, but I only used it on x_test (regged and downloaded from Kaggle before Karan uploaded them) and then I only get 5-8% speedup, unfortunately.
Karan: So, no, as I mentioned earlier, compiled code is the way to go here, there is no simple way you can vectorize this code inside of Matlab.
If you wish to call compiled code from Matlab you can, as Jan states, use C-mex. I would write the code directly in C AND/OR process the data a little maybe? For more information about C-mex, see link to documentation.
1 comentario
Karan
el 20 de Jul. de 2014
Categorías
Más información sobre Get Started with MATLAB en Centro de ayuda y File Exchange.
Community Treasure Hunt
Find the treasures in MATLAB Central and discover how the community can help you!
Start Hunting!