我有这个恼人的问题 -
我想要做的是创建一个线条向量,它将在每个元素中包含函数内部函数的结果而不使用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的每个元素
谢谢!
答案 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,我们在每次投掷中首次重复的机会是:
所以,我们有一个概率矩阵:
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);