行向量+列向量
>>> x = [1, 2, 3]
>>> y = x'
>>> x+y
ans =
2 3 4
3 4 5
4 5 6
这里matlab也会对不同size的矩阵之间进行broadcast操作:
x size == 1 * 3
y size == 3 * 1
result size == 3 * 3
对x在列的方向多复制二行,对y在行的方向多复制两列
1, 2, 3 1, 1, 1, 2, 3, 4
1, 2, 3 + 2, 2, 2, = 3, 4, 5
1, 2, 3 3, 3, 3 4, 5, 6
*与.*
在仿真标准高斯函数时:
x = -5:.01:5;
plot(x, gauss(x))
也就是需要gauss()
函数接受向量类数据:
function [y] = gauss(x)
y = 1/sqrt(2*pi)*exp(-x*x/2)
运行第一段代码会提示如下错误:
错误使用 *
内部矩阵维度必须一致。
x
是向量类型,也即是一种特殊的矩阵,乘法运算要符合矩阵运算规则,在matlab中对*
和.*
有着严格的区分。前者*
要符合矩阵乘法的运算,也即左操作数的列==右操作数的行,后者是按位相乘运算(element-wise),元素的个数相等即可。
显然此时的gauss()
函数可做如下的修改:
function [y] = gauss(x)
y = 1/sqrt(2*pi)*exp(-x.*x/2)
x=-5:.01:5;
plot(x, gauss(x))
创建图像块矩阵
创建图像块组成的矩阵,逐点遍历其 r×r 邻域时,为后续处理的方便(matlab环境下的接口往往以列的方式实现),应以列序优先,按列遍历。
I = imread('./lena.png');
[m, n] = size(I);
r = 5; sz = floor(r/2);
I_pad = padarray(I, [sz, sz], 'symmetric', 'both');
% 镜像填充,避免边缘的影响
P = zeros(m*n, r^2);
idx = 1;
for j = (sz+1):(n+sz),
for i = (sz+1):(n+sz),
t = I_pad(i-sz:i+sz, j-sz:j+sz);
t = t(:)';
P(idx, :) = t;
idx = idx+1;
end
end