我有这段代码,根据最短元素的长度从单元格数组中下采样数据。
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值)。
到目前为止,我无法找到答案......非常感谢任何帮助!
答案 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一样。你不必,但我认为这是一个很好的做法!