我试图将数据拆分为训练和测试集。数据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.
我在这里做错了什么?
答案 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中的索引可以是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
和