2017-02-16 90 views
0

我试图将数据拆分为训练和测试集。数据X是150个数据点的150×4矩阵,每个具有4个特征。我这样做是为了创建一个索引向量随机选择100出150个数据点进行训练:具有索引向量的Matab索引矩阵行

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试图将这些值作为索引处理。相反,你要明确地投trainIndiceslogical矩阵,以便它可以被用来执行逻辑索引

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中的索引可以是linearlogical或它们的组合。线性索引是使用整数[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

@LuisMendo,我认为你是对的,他们不是完全分开的东西。我会修改答案并窃取您评论的一些部分! – MimSaad