【问题标题】:Matlab: Apply a function to a vectorMatlab:将函数应用于向量
【发布时间】:2016-09-16 16:02:40
【问题描述】:

我遇到了这个烦人的问题-

我想要做的是创建一个线向量,它将在不使用循环的情况下将函数内部函数的结果包含在每个元素中

而不是使用下面的代码

function [ vec_L ] = VecL( N )
%%this function receives an integer number N and returns a vector of N CalcL results  

vec_L = ones(1,N);
for i=1:N
vec_L(i) = CalcL( FairDice(5000) );
end

我需要一个矢量化版本来给出相同的结果 其中 CalcL( FairDice(5000) ) 是函数内部的函数,我需要每次将结果应用于 vec_L 的每个元素

谢谢!

【问题讨论】:

标签: matlab function loops vectorization


【解决方案1】:

从上面的 cmets 中,您试图找出两次投掷相同的骰子需要投掷多少次。

对于 FairDice 的单次运行,我们在每次投掷中发生第一次重复的机会是:

  1. 0 [一次投掷不能重复]
  2. 1/6 [第一轮和第二轮相同的概率为 1/6]
  3. 5/18 [第一卷和第二卷不同的概率为 5/6,第三卷为其中之一的概率为 2/6]
  4. 5/18 [4/6 * 5/6 几率前 3 次掷骰不同,3/6 几率第四次掷骰匹配]
  5. 5/27 [3/6 * 4/6 * 5/6 几率前 4 次掷骰不同,4/6 几率匹配第五次掷骰]
  6. 25/324 [2/6 * 3/6 * 4/6 * 5/6 几率前 5 次掷骰不同,5/6 几率匹配第六次掷骰] 25/324
  7. 5/324 [1/6 * 2/6 * 3/6 * 4/6 * 5/6 几率前 6 次掷骰不同,1/1 几率第 7 次掷骰匹配]

所以,我们有一个概率矩阵:

probMat = [0 1/6 5/18 5/18 5/27 25/324 5/324];

因此,我们可以通过简单地根据概率总和测试随机数来进行与您所做的完全相同的模拟:

randMat = rand(N,1);
[junk, vec_L] = max((cumsumprobMat>randMat),[],2);

编辑:您可以使用加权概率的另一种方法是 randSample 函数:

vec_L = randSample(7, N, true, probMat);

【讨论】:

  • 这是理论上的解决方案,是的,但实际上我需要更接近它,​​那就是使用我构建的功能。我从一开始的问题是如何消除“for”的使用,因为在处理非常大的数字时它是无用的,而且因为我确实相信 matlab 就是对这类问题采取矢量化方法。感谢您的宝贵时间帮助!
  • 我不同意 'for' 在处理非常大的数字时没有用;这里矢量化的改进将小于调用 FairDice(7) 而不是 FairDice(5000) 的改进。
【解决方案2】:

您可以使用arrayfun 为每个输入调用函数但是这不是真正矢量化,它只是删除了for 循环。

vec_L = arrayfun(@()CalcL(FairDice(5000)), 1:N)

请记住,与 for 循环相比,没有预期的性能优势

您应该尝试对 FairDice 本身进行矢量化,这样您就可以调用它一次并将其传递给一个数组,而不是调用 FairDice N 次。

根据您问题的上下文,所有这些似乎都可以替换为

vec_L = randi([1 6], 1, N)

【讨论】:

  • 如果我再解释一下上下文可能会更有效: 1) FairDice(k) 抛出一个公平的骰子 k 次,并返回一个向量,每个元素代表我们哪个数字 1-6每次抛出都收到 2) CalcL(k) 将接收来自 FairDice 的结果向量,并将返回我们收到相似数字 1-6 的第一次(抛出)的数字,例如我扔了 4 次并得到 1, 3,1,2 所以它将返回索引 3。所以我需要 vec_L 的每个元素来容纳 2 个函数的不同结果。再次感谢!
  • @RomanAndreevitchBiriukov 所以你想找到一个数字第一次第二次出现的位置吗?
  • 没错,我需要在 vec_L 的每个元素上运行它,基本上每次都会得到不同的结果,并从中制作一个向量
  • 那你为什么要把它运行到 FairDice(5000) 上呢?您只需要 FairDice(7) 即可保证重复
猜你喜欢
  • 1970-01-01
  • 2013-03-30
  • 2012-01-25
  • 1970-01-01
  • 1970-01-01
  • 1970-01-01
  • 1970-01-01
  • 1970-01-01
  • 1970-01-01
相关资源
最近更新 更多