1. 布尔函数怎么用
if函数
if(条件){} else{}
if条件里边的值为布尔型,无论条件里边有多少个条件,只要条件的取值为真,就执行if后边的程序体。
只要条件的取值为假,就执行else后边的程序体。
条件的值必须为布尔型。
2. 布尔函数什么时候学
Boolean(布尔)数据在C++中使用内置类型bool表示。bool类型的变量只可能有两个值true或false,在现实世界中它用于表示“是”或“否”、“高”或“低”等这种只有两个状态的事物再自然不过。例如用于表示检测某年是否润年的函数,其返回值类型显示只有两种情况“是”或“否”。
这样用一个bool型变量来表示该函数的返回值,看起来非常自然。而在C语言(C99之前,而且目前很多编译器没有完整实现C99)中没有内置boolean类型,只能使用宏、typedef、enum等手段模拟出bool类型来,如代码1-2使用enum模拟。
3. 布尔函数怎么用公式求导
给定至少两个随机变量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
也是非常快的.
4. 布尔函数怎么写
在数学中,布尔函数(Boolean function)描述如何基于对布尔输入的某种逻辑计算确定布尔值输出,它们在复杂性理论的问题和数字计算机的芯片设计中扮演基础角色。布尔函数的性质在密码学中扮演关键角色,特别是在对称密钥算法的设计中(参见S-box)。
5. 布尔函数怎么用图像表示
与-或式;与非-与非式;与或非式;或非-或非式;逻辑函数的几种表示方法◆布尔代数法按一定逻辑规律进行运算的代数.与普通代数不同,布尔代数中的变量是二元值的逻辑变量.◆真值表法采用一种表格来表示逻辑函数的运算关系,其中输入部分列出输入逻辑变量的所有可能组合,输出部分给出相应的输出逻辑变量值.◆逻辑图法采用规定的图形符号,来构成逻辑函数运算关系的网络图形.◆卡诺图法卡诺图是一种几何图形,可以用来表示和简化逻辑函数表达式.◆波形图法一种表示输入输出变量动态变化的图形,反映了函数值随时间变化的规律.◆点阵图法是早期可编程逻辑器件中直观描述逻辑函数的一种方法.◆硬件设计语言法法
6. excel布尔函数
在vba里,布尔值转为数字时,false会变为0,true则变为-1 这与excel的函数运算不同,自定义函数本质上也是vba代码生成的。 为了避免出现这种情况,可以将自定义函数的代码修改一下:
Function AddTwo(arg1 As Double, arg2 As Double) As Double If arg1 = True Then arg1 = 1 ElseIf arg1 = False Then arg1 = 0 End If If arg2 = True Then arg2 = 1 ElseIf arg2 = False Then arg2 = 0 End If AddTwo = arg1 + arg2 End Function
7. 布尔型函数调用
BOOL是布尔型变量,也就是逻辑型变量的定义符,类似于float、double等。bool为布尔型用作逻辑判断,bool取值false和true,是0和1的区别;false可以代表0,但true有很多种,并非只有1。
定义:bool xxxx;//xxxx为你定义的名字。
使用: xxxx可以复制,0为false,非0为true
xxxx可以用作判断,比如if(xxxx)while(xxxx)等,可以作为条件判断。
扩展资料
定义变量:
数据类型确定要存储在内存中的数据的类型,变量则是存储数据的基本单元 。变量就好比一个杯子,而数据类型就定义了这个杯子的大小和它能装载什么内容。
java是强类型语言,所有的变量都必须先声明才能使用,声明变量时必须指定变量存储信息的类型。变量的声明一般使用名值对的方式,包含变量名和变量值,通过变量名可以引用变量值,也可以修改变量名的值。
声明变量并同时赋予初值,我们称之为初始化。
我们可以在同一行同时声明多个同一类型的变量,这样可以简化我们的代码,提高可阅读性,具体格式如下: 数据类型 变量名, 变量名,变量名。
8. 布尔函数表达式
在编程中,布尔量指一个真或假状态。
通常它们分别用0,1或1,-1来表示,这和编程语言有关。具体来说当布尔量为真的时候表示一个表达式或判断成立,否则这个式子或判断不成立。你把它理解为成立或不成立就行了。
9. 布尔运算函数
逻辑函数是应用于通信工程等学科的函数。
逻辑函数,是一类返回值为逻辑值true或逻辑值false的函数。
true:代表判断后的结果是真的,正确的,也可以用1表示;
false:代表判断后的结果是假的,错误的,也可以用0表示。
逻辑函数有“最小项之和”及“最大项之积”两种标准形式。
逻辑函数表示方法:
1.布尔代数法
按一定逻辑规律进行运算的代数。与普通代数不同,布尔代数中的变量是二元值的逻辑变量。
2.真值表法
采用一种表格来表示逻辑函数的运算关系,其中输入部分列出输入逻辑变量的所有可能组合,输出部分给出相应的输出逻辑变量值。
3.逻辑图法
采用规定的图形符号,来构成逻辑函数运算关系的网络图形。
4.卡诺图法
卡诺图是一种几何图形,可以用来表示和简化逻辑函数表达式。
5.波形图法
一种表示输入输出变量动态变化的图形,反映了函数值随时间变化的规律。
6.点阵图法
是早期可编程逻辑器件中直观描述逻辑函数的一种方法。
7.硬件设计语言法
是采用计算机高级语言来描述逻辑函数并进行逻辑设计的一种方法,它应用于可编程逻辑器件中。目前采用最广泛的硬件设计语言有ABLE-HDL、VHDL等。
10. 布尔函数怎么用公式表示
1、与非门(英语: NAND gate )是数字逻辑中实现逻辑与非的逻辑门,功能见左侧真值表。若当输入均为高电平(1 ) ,则输出为低电平(0) ; 若输入中至少有一个为低电平(0) ,则输出为高电平(1 )。与非门是一种通用的逻辑门,因为任何布尔函数都能用与非门实现。
2、或非门(英语: NOR gate )是数字逻辑中实现逻辑或非的逻辑门,功能见右侧真值表。若输入均为低电平(0) ,则输出为高电平(1 ) ;若输入中至少有一个为高电平(1 ) , 则输出为低电平(0)。或非是逻辑或加逻辑非得到的结果。或非是一种具有函数完备性的运算,因此其他任何逻辑函数都能用或非门实现。
11. 什么是布尔函数
布尔型(bool)变量的值只有 真 (true) 和假 (false)。
布尔型变量可用于逻辑表达式,也就是“或”“与”“非”之类的逻辑运算和大于小于之类的关系运算,逻辑表达式运算结果为真或为假。
bool可用于定义函数类型为布尔型,函数里可以有 return TRUE; return FALSE 之类的语句。
布尔型运算结果常用于条件语句:if (逻辑表达式){如果是 true 执行这里;}else{如果是 false 执行这里;};
扩展资料
使用bool逻辑型变量的优点:
1、 提高程序的可读性
bool类型的变量只可能有两个值true或false,在没有统一的布尔类型在大型的工程项中特别是用到第三方程序库时,可能使用不同的手段模拟布尔类型以提交代码的可读性,这样会使得代码有些混乱,C语言中引入了bool内置类型,解决了代码的一致性问题。
2、提高程序的性能
bool在绝大多数编译器编译时都将其实现为1字节,即sizeof(bool)的值为1,加上其只有两个值的值域{true, false},是C语言中最小的数据类型了。
虽然char、unsigned char和signed char类型在C语言中没有特定的实现要求,但一般也实现为一个字节,这样看来与bool类型从内存空间的占用上并没有性能上的差异
- 相关评论
- 我要评论
-