d3dxmatrixmultiply(离散型随机变量的联合分布率怎么算)

1. d3dxmatrixmultiply,离散型随机变量的联合分布率怎么算?

给定至少两个随机变量X,Y,…, 它们的联合概率分布(Joint probability distribution)指的是每一个随机变量的值落入特定范围或者离散点集合内的概率. 对于只有两个随机变量的情况, 称为二元分布(bivariate distribution).

联合概率分布可以使用联合累计分布函数(joint cumulative distribution function), 连续随机变量的联合概率密度函数(joint probability density function)或者离散变量的联合概率质量函数(joint probability mass function)来描述. 由此又衍生出两个概念: 边缘分布(marginal distribution)和条件概率分布(conditional probability distribution).

二. 离散变量的联合概率质量函数公式

公式:

是给定X=xX=x的Y=yY=y的条件概率.

而且有:

如果XX和YY相互独立:

如果XX和YY条件不独立(conditionally dependent):

P(X=x and Y=y)=P(X=x)⋅P(Y=y|X=x)P(X=x and Y=y)=P(X=x)·P(Y=y|X=x)

也可以使用联合累计分布函数的差分来计算:

联合累计分布函数定义是:

所以F(x,y)F(x,y)的导数(差分)就是P(X=x and Y=y)P(X=x and Y=y)

三. 使用Matlab计算离散2D联合分布

参考: Calculating a 2D joint probability distribution

离散2D联合分布可用于计算两张图片的互信息MI.

0. 定义两个离散的随机变量.

有N个点分布在边长为1的正方形区域内. 把正方形分为K1*K2的小矩形. 统计每个小矩形内的点的个数.

% Data

N = 1e5; % number of points

xy = rand(N, 2); % coordinates of points

xy(randi(2*N, 100, 1)) = 0; % add some points on one side

xy(randi(2*N, 100, 1)) = 1; % add some points on the other side

xy(randi(N, 100, 1), :) = 0; % add some points on one corner

xy(randi(N, 100, 1), :) = 1; % add some points on one corner

inds= unique(randi(N, 100, 1));

xy(inds, :) = repmat([0 1], numel(inds), 1); % add some points on one corner

inds= unique(randi(N, 100, 1));

xy(inds, :) = repmat([1 0], numel(inds), 1); % add some points on one corner

% Intervals for rectangles

K1 = ceil(sqrt(N/5)); % number of intervals along x

K2 = K1; % number of intervals along y

int_x = [0:(1 / K1):1]; % intervals along x

int_y = [0:(1 / K2):1]; % intervals along y

1

2

3

4

5

6

7

8

9

10

11

12

13

14

15

16

17

1

2

3

4

5

6

7

8

9

10

11

12

13

14

15

16

17

1. 从定义出发, 使用for循环:

tic

count_cells = zeros(K1, K2);

for k1 = 1:K1

inds1 = (xy(:, 1) >= int_x(k1)) & (xy(:, 1) < int_x(k1 + 1));

for k2 = 1:K2

inds2 = (xy(:, 2) >= int_y(k2)) & (xy(:, 2) < int_y(k2 + 1));

count_cells(k1, k2) = sum(inds1 .* inds2);% 布尔相乘得到交集点的个数

end

end

toc

% Elapsed time is 39.357691 seconds.

1

2

3

4

5

6

7

8

9

10

11

1

2

3

4

5

6

7

8

9

10

11

可见使用两重循环的计算时间非常长.

2. 使用hist3函数

N=hist3(X,'Edges',edges)是matlab中专门计算二元分布的函数.

edges是包含两个递增array的cell. 第一维分组edge1是edges{1}, 第二维分组edge2是edges{2}.

也就是:

edges1(i)<=X(k,1)<edges1(i+1)edges1(i)<=X(k,1)<edges1(i+1)

edges2(j)<=X(k,2)<edges2(j+1)edges2(j)<=X(k,2)<edges2(j+1)

正好落在edges1(i+1)edges1(i+1)或者edges2(j+1)edges2(j+1)上的点的个数放在N的最后一行或者最后一列.

hist3不统计edges范围外的部分.

N是一个二维矩阵, 统计的落到每个单元格内的点的个数.

tic

count_cells_hist = hist3(xy, 'Edges', {int_x int_y});

% 注意hist3得到的矩阵是K1+1*K2+1的, 所以把最后一行和一列去掉.

% 最后一行或一列表示的是 X(k,1)= edges{1}(end)或者X(k,2) = edges{2}(end)的点数

count_cells_hist(end, :) = []; count_cells_hist(:, end) = [];

toc

all(count_cells(:) == count_cells_hist(:))

% Elapsed time is 0.017995 seconds.

1

2

3

4

5

6

7

8

1

2

3

4

5

6

7

8

显然比用两重for循环快多了.

3. 使用矩阵二元操作bsxfun

C = bsxfun(fun,A,B)对A和B做逐个元素的二元操作, 操作由函数 fun指定.

返回的C中, 1表示满足条件, 0 表示不满足条件. 可用的fun有:

fun operation

@plus Plus

@minus Minus

@timesArray multiply

@rdivideRight array divide

@ldivideLeft array divide

@power Array power

@max Binary maximum

@min Binary minimum

@rem Remainder after division

@mod Modulus after division

@atan2 Four-quadrant inverse tangent; result in radians

@atan2d Four-quadrant inverse tangent; result in degrees

@hypot Square root of sum of squares

@eq Equal

@neNot equal

@ltLess than

@le Less than or equal to

@gt Greater than

@ge Greater than or equal to

@andElement-wise logical AND

@orElement-wise logical OR

@xorLogical exclusive OR

使用bsxfun的matlab代码:

%% bsxfun

tic

xcomps = single(bsxfun(@ge,xy(:,1),int_x));% 10000*143矩阵

ycomps = single(bsxfun(@ge,xy(:,2),int_y));% 10000*143矩阵

% 相当于求CDF

count_again = xcomps.' * ycomps; %' 143x143 = 143x1e5 * 1e5x143

% 差分后是142*142

count_again_fix = diff(diff(count_again')');

toc

% Elapsed time is 0.178316 seconds.

all(count_cells_hist(:) == count_again_fix(:))

1

2

3

4

5

6

7

8

9

10

11

1

2

3

4

5

6

7

8

9

10

11

bsxfun稍逊于hist3, 可以针对没有statistics toolbox的情况下使用.

4. 使用accumarray

A= accumarray(subs,val)使用subs的元素值作为索引. subs和val是一一对应的. 将subs中相同值对应的val值累加. 也就是说, subs中元素的位置决定了val哪些元素相加, subs中元素的值决定了累加值在输出中的位置. 看matlab help中示例:

Example 1

Create a 5-by-1 vector and sum values for repeated 1-D subscripts:

val = 101:105;

subs = [1; 2; 4; 2; 4];

A = accumarray(subs, val)

A =

101 % A(1) = val(1) = 101

206 % A(2) = val(2)+val(4) = 102+104 = 206

0 % A(3) = 0

208 % A(4) = val(3)+val(5) = 103+105 = 208

subs中元素值必须是正整数值. 所以在表示分组时, 可以把[0,1]区间变为[1,K1]区间. matlab代码:

%%%%% 第五种方法Using accumarray

% Another approach is to use accumarray to make the joint histogram after we bin the data.

% Starting with int_x, int_y, K1, xy, etc.:

tic

% take (0,1) data onto [1 K1], following A.Dondas approach for easy comparison

ii = floor(xy(:,1)*(K1-eps))+1;

ii(ii<1) = 1; ii(ii>K1) = K1;

jj = floor(xy(:,2)*(K1-eps))+1;

jj(jj<1) = 1; jj(jj>K1) = K1;

% create the histogram and normalize

H = accumarray([ii jj],ones(1,size(ii,1)));

PDF = H / size(xy,1); % for probabilities summing to 1

toc

% Elapsed time is 0.006356 seconds.

all(count_cells_hist(:) == count_again_fix(:))

1

2

3

4

5

6

7

8

9

10

11

12

13

14

15

16

1

2

3

4

5

6

7

8

9

10

11

12

13

14

15

16

ms级别! 真是快!

5. 使用mex编译

mex混合编程参考: 在Matlab中使用mex函数进行C/C++混合编程

#include "mex.h"

// http://stackoverflow.com/questions/19745917/calculating-a-2d-joint-probability-distribution

void mexFunction(int nlhs, mxArray *plhs[], int nrhs, const mxArray *prhs[])

{

unsigned long int hh, ctrl; /* counters */

unsigned long int N, m, n; /* size of matrices */

unsigned long int *xy; /* data */

unsigned long int *count_cells; /* joint frequencies */

/* matrices needed */

mxArray *count_cellsArray;

/* Now we need to get the data */

if (nrhs == 3) {

xy = (unsigned long int*) mxGetData(prhs[0]);

N = (unsigned long int) mxGetM(prhs[0]);//取矩阵的行数

m = (unsigned long int) mxGetScalar(prhs[1]);

n = (unsigned long int) mxGetScalar(prhs[2]);

}

/* Then build the matrices for the output */

count_cellsArray = mxCreateNumericMatrix(m + 1, n + 1, mxUINT32_CLASS, mxREAL);

count_cells = mxGetData(count_cellsArray);

plhs[0] = count_cellsArray;

hh = 0; /* counter for elements of xy */

/* for all points from 1 to N */

for(hh=0; hh<N; hh++) {

ctrl = (m + 1) * xy[N + hh] + xy[hh];

count_cells[ctrl] = count_cells[ctrl] + 1;

}

}

1

2

3

4

5

6

7

8

9

10

11

12

13

14

15

16

17

18

19

20

21

22

23

24

25

26

27

28

29

30

31

1

2

3

4

5

6

7

8

9

10

11

12

13

14

15

16

17

18

19

20

21

22

23

24

25

26

27

28

29

30

31

将代码保存为: joint_dist_points_2D.c. 在matlab cmd中运行:

mex joint_dist_points_2D.c

1

1

生成joint_dist_points_2D.mexw32文件.

matlab调用代码:

% Use mex function

tic

xy2 = uint32(floor(xy ./ repmat([1 / K1, 1 / K2], N, 1)));

count_cells = joint_dist_points_2D(xy2, uint32(K1), uint32(K2));

toc

% Elapsed time is 0.011696 seconds.

1

2

3

4

5

6

1

2

3

4

5

6

也是非常快的.

免责声明:本文作者:“游客”,版权归作者所有,观点仅代表作者本人。本站仅提供信息存储分享服务,不拥有所有权。信息贵在分享,如有侵权请联系ynstorm@foxmail.com,我们将在24小时内对侵权内容进行删除。
(71)
荣耀 magicvs(荣耀magicvs
上一篇 2023年12月02日
北桥芯片(主板上的南桥芯片和北桥芯片是干
下一篇 2023年12月02日

相关推荐

  • 吴裕泰茶叶价格(介绍老字号吴裕泰)

    吴裕泰茶庄始建于1887年(清光绪十三年),初名《吴裕泰茶栈》,创始人吴锡卿,安徽歙县昌溪村人,1930年去世。吴氏祖上几辈作茶叶生意,吴家有兄弟6个,吴锡卿排行第四,总管吴裕泰茶庄,以吴裕泰为依托,吴家先后在城里城外开了8家大小茶庄,后来发...

    2023年10月26日
  • 好看的翻盖手机(年轻人手机用带翻盖的手机壳好吗)

    直板机的简约在过去和现在都代表了普通人在审美上的一致,但有个国家却一直放不开翻盖机的情怀。也许你知道我说的是谁——是的!就是日本,日本在智能手机黄金发展时期依然在市面上有众多的翻盖机型可以供你选择。...

    2023年11月06日
  • caxa制造工程师(caxa怎么弄圆心)

    5.绘制圆时,选择圆心作为起点,并选择圆心到圆周上的一个点作为半径的终点,即可绘制出以该圆心为中心的圆。...

    2023年11月07日
  • 电冰箱压缩机(冰箱压缩机大小对制冷有什么影响)

    冰箱压缩机是制冷系统中最重要的组件之一,它的大小直接影响着制冷效果和能耗水平。下面是冰箱压缩机大小对制冷的影响:...

    2023年11月20日
  • receivebuffers(路由器信号不稳定或时有时无怎么办)

    7、第七:点击高级选项卡。802.11bPreamble选择longandshort的选项。...

    2023年11月21日
  • 三星n7000(三星7000)

    三星7000仅仅采用的是三星880处理器,这是一款三星八纳米的5G处理器,它的性能跑分仅仅只有三十来万分,性能不但不高,而且功耗也比较大。...

    2023年11月27日
  • c盘空间(电脑的C盘空间满了怎么办)

    5.使用磁盘清理工具,如Windows的“磁盘清理器”,来清理不必要的文件和数据。总之,当您的C盘空间不足时,采取上述措施将帮助您解决问题。但是,请务必先备份重要文件,以免不小心删除了重要文件。...

    2023年11月30日
  • 习酒窖藏(飞天迎宾红花郎十五习酒窖藏1988)

    喜欢白酒的朋友,收藏一些自己喜欢的好酒,不但将来可以切身体味时间的滋味,同时也是一种价值投资,但白酒的收藏可不是买几瓶酒往那一放就完事这么简单。也是有一定的学问的。...

    2023年11月30日
  • 三星 i8510(4800万像素的小米9会是机皇吗)

    机皇~感觉这个词已经越来越遥远了。为什么这么说呢,现在手机配置越来越高,处理器性能,系统优化都得到了加强跟巩固,而各家都有自己能独当一面的旗舰机型,如小米的MIX系列、华为的Mate系列,一加的全速旗舰、OPPO的Find系列等等,配置上可以...

    2023年12月04日
  • tplink路由器升级(Tp交换机版本如何升级)

    WDR5620的的WAN口和LAN口均升级到了千兆口。因此即使家中宽带网络的带宽高于100Mbps,路由器也不会成为瓶颈。支持穿墙能力强的2.4GHz频段和比前者抗干扰更强的5GHz频段,两个频段的最高速率分别为300Mbps和867Mbp...

    2023年12月05日
返回顶部