matlab函数集锦PadSize函数
贴下 matlab源代码
function [pad_ul, pad_lr] = PadSize(offts,op_type)
if impty(offts)
pad_ul = zeros(1,2);
pad_lr = zeros(1,2);
el
num_dims = size(offts{1},2); //求出最⼤维数
for k = 2:length(offts)
num_dims = max(num_dims, size(offts{k},2));
end
for k = 1:length(offts) //建⽴⼤矩阵
offts{k} = [offts{k} zeros(size(offts{k},1),...
num_dims - size(offts{k},2))];
end
pad_ul = zeros(1,num_dims);
pad_lr = zeros(1,num_dims);
for k = 1:length(offts) //找出矩阵中的最⼩值
offts_k = offts{k};
if ~impty(offts_k)
pad_ul = pad_ul + max(0, -min(offts_k,[],1));
pad_lr = pad_lr + max(0, max(offts_k,[],1));
end
end
if strcmp(op_type,'erode')
% Swap
tmp = pad_ul;
pad_ul = pad_lr;
pad_lr = tmp;
end
end
输⼊:offts是 1*6 cell
<7x2 double> <5*2 double> <7x2 double> <5*2 double> <5*2 double> <5*2 double>
max(offts_k,[],1) offts_k是5*2的矩阵-
2 -2
-1 -1
0 0
1 1
2 2
细说MATLAB中的MAX函数
⼀:MAX函数的⼏种形式
(1)max(a) (2)max(a,b) (3)max(a,[],dim) (4)[C,I]=max(a) (5)[C,I]=max(a,[],dim)
⼆:举例说明函数意思
(1)max(a)
如果a是⼀个矩阵,⽐如a=[1,2,3;4,5,6],max(a)的意思就是找出矩阵每列的最⼤值, 本例中:max(a)=[4,5,6]
(2)max(a,b)
如果a和b都是⼤于1维的矩阵,那么要求a和b的⾏列的维数都要相等,函数的结果是⽐较a和b中每个元素的⼤⼩,⽐如:
a=[1,2,3;4,5,6] b=[4,5,6;7,8,3] max(a,b)=[4,5,6;7,8,6] 另外,如果a和b中⾄少有⼀个是常数,也是可以的。⽐如: a=
[1,2,3;4,5,6] b=3 c=5
max(a,b)=[3,3,3;4,5,6] 相信⼤家看了例⼦都明⽩了函数的意思了吧 max(b,c)=5
(3)max(a,[],dim)
这个函数的意思是针对于2维矩阵的,dim是英⽂字母dimension的缩写,意思是维数。 当dim=1时,⽐较的a矩阵的⾏,也就是和
max(a)的效果是⼀样的;当dim2时,⽐较的是a矩阵的⾏。下⾯举个例⼦:
a=[1,2,3;4,5,6] max(a)=max(a,[],1)=[4,5,6] ⽐较的第⼀⾏和第⼆⾏的值 max(a,[],2)=[3,6]
(4)[C,I]=max(a)
C表⽰的是矩阵a每列的最⼤值,I表⽰的是每个最⼤值对应的下标: 下⾯举例说明:
还是刚才那个例⼦:a=[1,2,3;4,5,6] [C,I]=max(a)
结果显⽰的是C=[4,5,6] I=[2,2,2] 返回的是最⼤值对应的⾏号。
(5)[C,I]=max(a,[],dim)
同理:如果dim=1时,其结果和[c,i]=max(a)是⼀样的。 当dim=2时,同样上⾯的矩阵a,我们运⾏⼀下:
[c,i]=max(a,[],2) 结果是:c=[3,6] i=[3,3] i返回的是矩阵a的列号。
ndims()函数
ndims(A)返回结果实际上等于length(size(A))。
通俗⼀点讲,数组维度就是数组具有的⽅向。⽐如普通的⼆维数组,数组具有⾏⽅向和列⽅向,就是说数组具有两个⽅向,是⼀个⼆维数组。MATLAB中还可以创建三维甚⾄更⾼维的数组。
对于空数组、标量和⼀维数组,MATLAB还是当作普通⼆维数组对待的,因此它们都⾄少具有两个维度(⾄少具有⾏和列的⽅向)。特别地,⽤空⽩⽅括号产⽣的空数组是当作⼆维数组对待的,但在⾼维数组中也有空数组的概念,这时候的空数组可以是只在任意⼀个维度上尺⼨等于零的数组,相应地,此时的空数组就具有多个维度了。
MATLAB中计算数组维度可以⽤函数ndims。
ndims(A)返回结果实际上等于length(size(A))。
【例3-13】数组维度。
解:输⼊命令后其运⾏结果如下:
>> B=2
B =
2
>> ndims(B)
ans =
2
>> c=1:5
c =
1 2 3 4 5
>> ndims(c)
ans =
2
通过例3-13可以看到,⼀般的⾮多维数组,在MATLAB中都是当作⼆维数组处理的。
function :填充图像或填充数组
u:
B = padarray(A,padsize,padval,direction)
A为输⼊图像,B为填充后的图像,padsize给出了给出了填充的⾏数和列数,通常⽤[r c]来表⽰。padval和direction分别表⽰填充⽅法和⽅向。它们的具体值和描述如下:
padval:'symmetric'表⽰图像⼤⼩通过围绕边界进⾏镜像反射来扩展;
'replicate'表⽰图像⼤⼩通过复制外边界中的值来扩展;
'circular'图像⼤⼩通过将图像看成是⼀个⼆维周期函数的⼀个周期来进⾏扩展。
direction:'pre'表⽰在每⼀维的第⼀个元素前填充;
'post'表⽰在每⼀维的最后⼀个元素后填充;
'both'表⽰在每⼀维的第⼀个元素前和最后⼀个元素后填充,此项为默认值。
若参量中不包括direction,则默认值为'both'。若参量中不包含padval,则默认⽤零来填充。若参量中不包括任何参数,则默认填充为零且⽅向为'both'。在计算结束时,图像会被修剪成原始⼤⼩。
[a, method, padSize, padVal, direction] = ParInputs(varargin{:});
if impty(a),% treat empty matrix similar for any method
if strcmp(direction,'both')
sizeB = size(a) + 2*padSize;
el
sizeB = size(a) + padSize;
end
b = mkconstarray(class(a), padVal, sizeB);
el
switch method
ca 'constant'
b = ConstantPad(a, padSize, padVal, direction);//作⽤是:
ca 'circular'
b = CircularPad(a, padSize, direction);
ca 'symmetric'
b = SymmetricPad(a, padSize, direction);
ca 'replicate'
b = ReplicatePad(a, padSize, direction);
end
end
if (islogical(a))
b = logical(b);
end
function b = ConstantPad(a, padSize, padVal, direction)
numDims = numel(padSize);
% Form index vectors to subsasgn input array into output array. % Also compute the size of the output array.
idx = cell(1,numDims);
sizeB = zeros(1,numDims);
for k = 1:numDims
M = size(a,k);
switch direction
ca 'pre'
idx{k} = (1:M) + padSize(k);
sizeB(k) = M + padSize(k);
ca 'post'
idx{k} = 1:M;
sizeB(k) = M + padSize(k);
ca 'both'
idx{k} = (1:M) + padSize(k);
sizeB(k) = M + 2*padSize(k);
end
end
% Initialize output array with the padding value. Make sure the % output array is the same type as the input.
b = mkconstarray(class(a), padVal, sizeB);
b(idx{:}) = a;