具有索引向量的Matab索引矩阵行

时间:2017-02-16 18:35:18

标签: matlab matrix indexing

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

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.

我在这里做错了什么?

2 个答案:

答案 0 :(得分: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数组少。

答案 1 :(得分: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