【问题标题】:cellfun randperm downsampling: keep track of indexes (matlab)cellfun randperm 下采样:跟踪索引(matlab)
【发布时间】:2014-08-03 14:20:51
【问题描述】:

我有这个 sn-p 代码,根据其最短元素的长度对单元数组中的数据进行下采样。

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 值)。

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

【问题讨论】:

  • 你不能再运行另一个cellfun 匿名函数的命令吗:f=@(x) getfield(randperm(size(x,2)),{1:sizeShortest});
  • 我实际上也想过,但这不会给出不同的值 - 因为不同的 randperm 调用?
  • 每次调用前重置种子。这样,您就可以保证获得相同的索引。您可以在执行任何随机函数之前设置随机种子。这样,您在设置种子后生成的随机值是可重现的。使用rng 命令并将其设置为您希望的任何数字...例如10。运行cellfun 命令,然后重置种子回到10。运行第二个cellfun 命令。更多关于rng 的信息在这里:stackoverflow.com/a/11148581/3250829。我给你写一个答案。
  • 啊……好吧,我没想到/不知道。太好了,所以我可以接受你的回答!谢谢
  • 不客气!我刚刚添加了它:)

标签: matlab indexing cells


【解决方案1】:

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

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

本质上,您将运行cellfun 两次。一次用于获取数据,再次用于索引。但是,正如您在 cmets 中巧妙地指出的那样,随后运行 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 一样。您不必这样做,但我认为这是一种很好的做法!

祝你好运!

【讨论】:

    猜你喜欢
    • 1970-01-01
    • 1970-01-01
    • 1970-01-01
    • 1970-01-01
    • 2014-09-19
    • 1970-01-01
    • 2013-03-15
    • 2010-12-07
    • 1970-01-01
    相关资源
    最近更新 更多