2017-02-16 3 views
0

私はトレーニングとテストセットにデータを分割しようとしています。データXは、150個のデータ点の150×4行列であり、それぞれ4つの特徴を有する。しかし、私はMatabインデックス行列のインデックスベクトルベクトル

X_train = X(trainIndices,:); 

:次に

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

私はtrainIndices == 1行を選択するためにこれをやってみました:私は、ランダムにトレーニングのために150個のデータポイントのうち100を選択するためのインデックスベクトルを作成するために、これをしませんでしたエラーが発生するSubscript indices must either be real positive integers or logicals.

私はここで間違っていますか?

+1

'trainIndices'は、いくつかのゼロを含み有効なインデックスではありません。 – Suever

答えて

3

trainIndicesはタイプdoubleであるため、MATLABは値をインデックスとして処理しようとしています。論理的なインデックスを実行するために使用することができるようにする代わりに、あなたは私が

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

X_train = X(trainIndices,:); 

それとも、既存のtrainIndicesを使用して

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

それをキャストすることができ、明示的にlogicalマトリックスとしてtrainIndicesをキャストしますたいと思いますlogicalアレイがdoubleアレイより少ないメモリを占有するため、最初のアプローチを推奨します。

+0

ありがとうございました。このテクニックを明確にするのに役立ちます。 – Austin

+0

私はhttp://stackoverflow.com/documentation/matlab/750/vectorization/9514/logical-masking#t=201702161856275395681にリンクしています。 –

2

MATLABのインデックスは、linearまたはlogicalまたはそれらの組み合わせのいずれかになります。線形索引付けは、整数番号[1,n](nはベクトル長)を使用するC/C++の通常の索引付けです。 論理インデックスにダブルベクトル(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

@ルイスメンド、私はあなたが正しいと思う、彼らは完全に別のものではない。私は答えを修正し、あなたのコメントのいくつかの部分を盗む! – MimSaad

関連する問題