cellfun randperm下采样:跟踪索引(matlab)

时间:2014-06-13 05:27:19

标签: matlab indexing cells

我有这段代码,根据最短元素的长度从单元格数组中下采样数据。

sizeShortest = min(cellfun('size', data, 2));
f=@(x)(x(:,sort(getfield(randperm(size(x,2)),{1:sizeShortest}))));
dummy = cellfun(f, data, 'UniformOutput', false);

我还想跟踪虚拟中保存的数据元素的索引(基本上是来自randperm调用的1:sizeShortest值)。

到目前为止,我无法找到答案......非常感谢任何帮助!

1 个答案:

答案 0 :(得分:0)

从我们的评论中,您可以简单地获取索引数组的代码并获取索引:

f=@(x) sort(getfield(randperm(size(x,2)),{1:sizeShortest}));
indices = cellfun(f, data, 'UniformOutput', false);

实质上,你要运行cellfun两次。一旦获取数据,再一次获取索引。但是,正如您在评论中巧妙陈述的那样,随后运行randperm将生成一个新的数字序列。在调用下一个randperm调用之前,您可以通过重置随机生成器种子来“欺骗”。这样做的是,一旦重置种子,您生成的随机数应该是可重现的。您可以通过rng功能执行此操作。这接受任何将充当种子的整数。设置完成后,任何随机生成函数生成的数字都将遵循依赖于此种子的规定格式。

举个例子:

rng(10)
C = randperm(10)

这给出了:

C =

 2    10     9     7     6     5     3     4     8     1

如果再次运行这两个语句,您将获得存储在C 中的相同序列。因此,将随机数生成器设置为您想要的任何整数。运行第一个cellfun命令...然后,重置为相同的种子并运行第二个cellfun命令。

现在要让这个真正动态,你首先要选择随机种子。存储此号码以便稍后使用,以便您可以将同一种子用于cellfun次呼叫。您可以轮询当天的当前时间,并使用秒来为您提供自定义种子。

换句话说:

c = clock;
seedNum = c(5);  %// c(5) is the number of seconds in the minute you're currently on.
rng(seedNum);
%// Do your first set of commands here...
rng(seedNum);
%// Do your second set of commands here...

如果要在完成后将其重置为默认值,可以调用rng('default');这样做会重置随机数生成,就像重新启动MATLAB一样。你不必,但我认为这是一个很好的做法!

祝你好运!