在Matlab中是否有类似于R的负索引(negative indexing)的功能?

6
在R语言中,如果我们有一个向量和一个索引列表,我们可以使用负数索引来表示“除这些索引之外的所有元素”的概念。特别地,考虑以下R代码:
data = rnorm(100)
indices = sample(1:length(data), length(data)/2)
training_data = data[indices]
test_data = data[-indices]

在这段代码之后,sampled_data 包含了所有在 data 中索引不包含在 indices 中的元素。在Matlab中是否有相应的功能?

我尝试直接使用相同的语法(当然是使用 () 代替 []),但是它只是报错了。

Subscript indices must either be real positive integers or logicals.
2个回答

8

Matlab 不允许使用负数索引。你可以用以下方式来删除元素:

data2 = data;
data2(indices) = [];  % remove selected elements

当进行机器学习时,我更喜欢使用逻辑索引:

istest = randn(length(data), 1) < 0;   % random logicals: 50% 0's and 50% 1's
istrain = ~istest;
% Now operate on data(istest) and data(istrain).

2
我最终将索引数组转换为逻辑值(而不是直接生成逻辑数组),因为我仍然需要原始索引进行其他用途。
indices = datasample(1:length(data), length(data) / 2);
logical = false(length(data) ,1);
logical(indices) = true;
training_data = data(logical)
test_data = data(~logical)

这种生成逻辑数组的方式使得我更容易控制训练和测试样例的比例,至少对我来说是这样。但是,我仍然认为jez的解决方案非常有教育意义。

网页内容由stack overflow 提供, 点击上面的
可以查看英文原文,
原文链接