Matlab:将函数应用于向量

时间:2016-09-16 16:02:41

标签: matlab function loops vectorization

我有这个恼人的问题 -

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

而不是使用以下代码

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的每个元素

谢谢!

2 个答案:

答案 0 :(得分:0)

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

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

请注意,对于for循环,没有预期的性能优势。

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

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

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

答案 1 :(得分:0)

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

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

  1. 0 [一次无法重复]
  2. 1/6 [第一和第二卷相同的1/6]
  3. 5/18 [第一次滚动和第二次滚动不同的5/6次机会,第三次滚动的概率为2/6]
  4. 5/18 [前3轮不同的4/6 * 5/6几率,第4轮比赛的3/6次机会]
  5. 5/27 [前4卷不同的3/6 * 4/6 * 5/6几率,第5卷的4/6几率]
  6. 25/324 [前5轮不同的2/6 * 3/6 * 4/6 * 5/6几率,第6轮比赛的5/6几率] 25/324
  7. 5/324 [前6卷不同的1/6 * 2/6 * 3/6 * 4/6 * 5/6几率,第7卷相配的1/1几率]
  8. 所以,我们有一个概率矩阵:

    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);