2017-02-16 10 views
0

Я пытаюсь разбить данные на набор для обучения и тестирования. Данные X представляют собой матрицу 150x4 с 150 точками данных с четырьмя функциями. Я сделал это, чтобы создать вектор индекса для случайного выбора 100 из 150 точек данных для обучения:Матричные строки индексирования матрицы с индексом

trainIndices = zeros(length(X),1); 
trainIndices(randperm(150,100)) = 1 

Затем я попытался сделать это, чтобы выбрать строки, где trainIndices == 1:

X_train = X(trainIndices,:); 

Но я получение ошибки Subscript indices must either be real positive integers or logicals.

Что я здесь делаю неправильно?

+1

'trainIndices' включает в себя некоторые нули которые не являются допустимыми индексами. – Suever

ответ

3

С trainIndices имеет тип double, MATLAB пытается обрабатывать значения как индексы. Вместо этого, вы хотите явно бросить trainIndices как logical матрицы так, что он может быть использован для выполнения логической Индексации

trainIndices = false(length(X),1); 
trainIndices(randperm(150,100)) = true; 

X_train = X(trainIndices,:); 

Или вы можете использовать свой существующий trainIndices и бросили его

X_train = X(logical(trainIndices),:); 

Я бы рекомендуется использовать первый подход, так как массив logical займет меньше памяти, чем массив double.

+0

Спасибо, что сработавший ответ примет этот ответ, как только он разрешит – Austin

+0

. Я бы связался с http://stackoverflow.com/documentation/matlab/750/vectorization/9514/logical-masking#t=201702161856275395681, чтобы помочь прояснить эту технику. –

2

Индексирование в MATLAB может быть либо linear, либо logical или их комбинацией. Линейная индексация - это регулярное индексирование как C/C++ с использованием целых чисел [1,n] (с n - длина вектора). Здесь вы попытались использовать двойной вектор (trainIndices) для логической индексации, и поскольку нет элемента с индексом 0, MATLAB выдает ошибку. Поставленная задача решается с помощью следующего логического преобразования:

X_train = X(trainIndices>0,:); 

Для получения дополнительной информации об индексации вы можете увидеть:

http://matlabtricks.com/post-23/tutorial-on-matrix-indexing-in-matlab

и

Linear indexing, logical indexing, and all that

+0

@ LuisMendo, я думаю, вы правы, они не совсем разные вещи. Я изменю ответ и украду некоторые части вашего комментария! – MimSaad