bsxfun matlab element-by-element operation

本文详细介绍了MATLAB函数bsxfun的使用方法及其优势。通过示例对比了bsxfun与其他方法在外加运算中的表现,并展示了如何利用bsxfun进行高效的高斯核计算。

bsxfun是一个matlab自版本R2007a来就提供的一个函数,作用是”applies an element-by-element binary operation to arrays a and b, with singleton expansion enabled.”

举个例子。假设我们有一列向量和一行向量。

a = randn(3,1), b = randn(1,3)

a =
   -0.2453
   -0.2766
   -0.1913

b =
    0.6062    0.5655    0.9057

我们可以很简单的使用matlab的外乘c=a*b来得到c(i,j)=a(i)*b(j) . 但如果我们想用”外加”呢?既c(i,j)=a(i)+b(j) . 这时我们可以用c=bsxfun(@plus,a,b)来实现。

bsxfun的执行是这样的,如果a和b的大小相同,那么c=a+b. 但如果有某维不同,且a或b必须有一个在这一维的维数为1, 那么bsxfun就将少的这个虚拟的复制一些来使与多的维数一样。在我们这里,b的第一维只有1(只一行),所以bsxfun将b复制3次形成一个3×3的矩阵,同样也将a复制成3×3的矩阵。这个等价于c=repmat(a,1,3)+repmat(b,3,1)。这里

repmat(a,1,3)

ans =
   -0.2453   -0.2453   -0.2453
   -0.2766   -0.2766   -0.2766
   -0.1913   -0.1913   -0.1913

repmat是显式的复制,当然带来内存的消耗。而bsxfun是虚拟的复制,实际上通过for来实现,等效于for(i=1:3),for(j=1:3),c(i,j)=a(i)+b(j);end,end。但bsxfun不会有使用matlab的for所带来额外时间。实际验证下这三种方式

>> c = bsxfun(@plus,a,b)
c =
    0.3609    0.3202    0.6604
    0.3296    0.2889    0.6291
    0.4149    0.3742    0.7144

>> c = repmat(a,1,3)+repmat(b,3,1)
c =
    0.3609    0.3202    0.6604
    0.3296    0.2889    0.6291
    0.4149    0.3742    0.7144

>> for(i=1:3),for(j=1:3),c(i,j)=a(i)+b(j);end,end,c
c =
    0.3609    0.3202    0.6604
    0.3296    0.2889    0.6291
    0.4149    0.3742    0.7144

从计算时间上来说前两种实现差不多,远高于for的实现。但如果数据很大,第二种实现可能会有内存上的问题。所以bsxfun最好。

这里@plus是加法的函数数柄,相应的有减法@minus, 乘法@times, 左右除等,具体可见 doc bsxfun.

下面看一个更为实际的情况。假设我们有数据A和B, 每行是一个样本,每列是一个特征。我们要计算高斯核,既K(i,j)=\exp(-\|A(i,:)-B(j,:)\|^2/\beta . 当然可以用双重for实现(如果第一直觉是用三重for的话…)。

K1 = zeros(size(A,1),size(B,1));
for i = 1 : size(A,1)
    for j = 1 : size(B,1)
        K1(i,j) = exp(-sum((A(i,:)-B(j,:)).^2)/beta);
    end
end

使用2,000×1,000大小的A和B, 运行时间为88秒。

考虑下面向量化后的版本:

sA = (sum(A.^2, 2));
sB = (sum(B.^2, 2));
K2 = exp(bsxfun(@minus,bsxfun(@minus,2*A*B', sA), sB')/beta);

使用同样数据,运行时间仅0.85秒,加速超过100倍。

如要判断两者结果是不是一样,可以如下

assert(all(all(abs(K1-K2)<1e-12)))

C = bsxfun(fun,A,B) appliesthe element-by-element binary operation specified by the functionhandle fun to arrays A and B,with singleton expansion enabled. fun can be oneof the following built-in functions:

@plus

Plus

@minus

Minus

@times

Array multiply

@rdivide

Right array divide

@ldivide

Left array divide

@power

Array power

@max

Binary maximum

@min

Binary minimum

@rem

Remainder after division

@mod

Modulus after division

@atan2

Four quadrant inverse tangent

@hypot

Square root of sum of squares

@eq

Equal

@ne

Not equal

@lt

Less than

@le

Less than or equal to

@gt

Greater than

@ge

Greater than or equal to

@and

Element-wise logical AND

@or

Element-wise logical OR

@xor

Logical exclusive OR


### MATLAB 中 CR- Fully Connected) 是一种用于图像分割和其他计算机视觉任务的强大模型。该算法通过构建全连接条件随机场来改进传统条件随机场的效果,在处理自然场景中的复杂结构方面表现出色。 #### 条件随机场简介 条件随机场是一种概率图模型,广泛应用于序列标注等问题中。对于给定观测变量 \(X\) 和标签集 \(Y\) 的情况下,CRF 定义了一个因子图,其中节点对应于输入特征向量的位置,边则表示这些位置之间的依赖关系[^1]。 #### 全连接条件随场的特点 相比于传统的稀疏连接方式,CR-FC 将每一个像素与其他所有像素相连,形成密集网络。这种设计使得远距离的信息交互成为可能,从而提高了预测精度。然而,这也带来了计算上的挑战——求解最大后验估计变得非常困难。 为了应对这一难题,研究者们提出了多种高效的推断策略和技术优化手段: - **高斯滤波器**:利用快速傅里叶变换加速消息传递过程; - **平均场理论**:采用变分推理框架简化复杂的积分运算; - **L-BFGS 方法**:结合二阶导数信息加快参数学习速度; 以下是基于上述原理的一个简单 MATLAB 实现案例: ```matlab function alpha = crfc_inference(unary, pairwise) % unary: N-by-K matrix of unary potentials % pairwise: K-by-K matrix of pairwise potentials [N,K] = size(unary); % Initialize belief vector as uniform distribution over labels. beliefs = ones(N,K)/K; % Perform mean-field updates until convergence or max iterations reached. for iter=1:max_iter % Compute message passing using Gaussian filtering technique here... % Update beliefs based on received messages from neighbors. new_beliefs = exp(-unary ./ temperature + ... reshape(sum(beliefs * pairwise), [], 1)); % Normalize updated beliefs to ensure they sum up to one per pixel. Z = sum(new_beliefs, 2); %#ok<BSXFUN> beliefs = bsxfun(@rdivide, new_beliefs, Z); % Check stopping criterion... end end ``` 这段代码展示了如何在一个简单的设置下执行 CR-FC 推理。实际应用时还需要考虑更多细节,比如具体的高斯核函数形式以及更精细的消息更新机制等。
评论
成就一亿技术人!
拼手气红包6.0元
还能输入1000个字符
 
红包 添加红包
表情包 插入表情
 条评论被折叠 查看
添加红包

请填写红包祝福语或标题

红包个数最小为10个

红包金额最低5元

当前余额3.43前往充值 >
需支付:10.00
成就一亿技术人!
领取后你会自动成为博主和红包主的粉丝 规则
hope_wisdom
发出的红包
实付
使用余额支付
点击重新获取
扫码支付
钱包余额 0

抵扣说明:

1.余额是钱包充值的虚拟货币,按照1:1的比例进行支付金额的抵扣。
2.余额无法直接购买下载,可以购买VIP、付费专栏及课程。

余额充值