我已经在this link下发布了一个类似的问题,但由于我对自己的表达不够清楚或我无法理解答案,因此无法奏效。但是,如果我已经使用R(R Studio)实现了我的项目,那么这个问题就更精确了。不幸的是,我已经意识到R Studio可以像Excel一样慢地计算我的泊松矩阵,这就是为什么我被迫使用Matlab实现项目的原因。
R中的代码:
a <- Table$ValueA
b <- Table1$ValueB
lapply(a,function(a) {lapply(b,function(b) {outer(dpois(0:20,a), dpois(0:20,b))})})
在Excel中的计算:
= POISSON(x;a;FALSE) * POISSON(x;b;FALSE)
,其中a和b是变量,所有输入值对都一个接一个地分配给它们。 X是一个从0到20的变量。因此,对于输入值对(a,b)的每条记录(位于两列中),我想创建一个基于上述Poisson计算的Matrix,其中X从0到20。
例如单元格(1,1)中矩阵的第一个结果基于以下计算:
= POISSON(0;a;FALSE) * POISSON(0;b;FALSE)
下图显示了Excel中的矩阵:
最后,我想对矩阵的三个部分求和,并在每列输入值记录的两列(包含输入值a和b)旁边显示这三个值:
1)的总和:从左上角到右下角的对角线2)总和:矩阵的upper rest3)总和:矩阵的[[lower rest
如果有任何人可以提供帮助,那就太好了,因为我真的希望使用Matlab来提高性能!方法1:需要统计信息工具箱如果具有统计信息工具箱,则可以使用Probability Distribution Objects。
通过下休息和上休息,我想你的意思是上下triangular matrices。这意味着使用diag
,diag
和triu
可以更轻松地进行“汇总”部分。 triu
这也可以通过方法2:需要统计信息工具箱
tril
功能实现。 tril
如果您根本不想使用任何工具箱,则可以基于方法3:不需要工具箱
% MATLAB R2019a
a = 1; % Rate for Poisson dist A
b = 2; % Rate for Poisson dist B
X = 0:20;
pd_a = makedist('Poisson',a);
pd_b = makedist('Poisson',b);
A = pdf(pd_a,X);
B = pdf(pd_b,X);
M = A(:)*B(:).';
% Sum stuff up
s1 = sum(diag(M));
s2 = sum(triu(M),'all');
s3 = sum(tril(M),'all');
和poispdf
对其进行硬编码而不会带来太多麻烦。 poispdf
以上方法只是利用以下事实:将列乘以一行(具有适当的长度)会生成矩阵。您可以使用以下代码进行验证。注意:技术含量低的方法
A2 = poisspdf(X,a);
B2 = poisspdf(X,b);
M2 = A2(:)*B2(:).';
很容易验证Poisson distribution到可接受的精度。