【问题标题】:Matab indexing matrix rows with index vectorMatlab索引矩阵行与索引向量
【发布时间】:2017-02-16 18:35:18
【问题描述】:

我正在尝试将数据拆分为训练和测试集。数据 X 是一个 150x4 矩阵,由 150 个数据点组成,每个数据点有 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.

我在这里做错了什么?

【问题讨论】:

  • trainIndices 包含一些无效索引的零。

标签: matlab matrix indexing


【解决方案1】:

由于trainIndicesdouble 类型,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 数组少。

【讨论】:

【解决方案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

【讨论】:

  • @LuisMendo,我认为你是对的,它们不是完全独立的东西。我会修改答案并窃取您的部分评论!