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

cellfun randperm下采样:跟踪索引(matlab),matlab,indexing,cells,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); 我还想跟踪保存在dummy中的数据元素的索引(基本上是randperm调用中的1:sizeShortest值)

我有一段代码,根据单元格数组最短元素的长度对数据进行下采样

sizeShortest = min(cellfun('size', data, 2));
f=@(x)(x(:,sort(getfield(randperm(size(x,2)),{1:sizeShortest}))));
dummy = cellfun(f, data, 'UniformOutput', false);
我还想跟踪保存在dummy中的数据元素的索引(基本上是randperm调用中的1:sizeShortest值)


到目前为止我还没有找到答案…非常感谢您的帮助

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

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一样。你不必这么做,但我认为这是很好的练习


祝你好运

您不能运行另一个
cellfun
命令,其中匿名函数是:
f=@(x)getfield(randperm(size(x,2)),{1:sizeShortest})?我实际上也考虑过这个问题,但这不会因为不同的randperm调用而给出不同的值吗?在每次调用之前重置种子。这样你就可以保证得到相同的指数。可以在执行任何随机函数之前设置随机种子。这样,设置种子后生成的随机值是可复制的。使用
rng
命令并将其设置为您想要的任何数字。。。大概10个。运行
cellfun
命令,然后将种子重置回10。运行第二个
cellfun
命令。有关rng的更多信息,请参见:。我会给你写一个答案的。啊……好吧,我没想过/不知道。那太好了,所以我可以接受你的回答!谢谢,不客气!我刚刚加了一句:)