【问题标题】:Vectorize this without using a loop在不使用循环的情况下对其进行矢量化
【发布时间】:2015-11-13 21:39:06
【问题描述】:

我正在尝试编写没有循环的 Tyler 鲁棒协方差估计:

这是我当前的实现:

  • x 是大小为 [nxb] 的样本向量
  • cov 是大小为 [bxb] 的协方差矩阵
  • oldCov 是前一次迭代的协方差矩阵。它也是一个 [bxb] 矩阵

这是当前的实现:

invCov = pinv(oldCov);
for i = 1:n
    cov = cov + x(i,:).'*x(i,:)/sum(x(i,:)*invCov.*x(i,:),2);
end

现在这是我的问题:

  1. 是否可以在没有循环的情况下对其进行矢量化?
  2. 我有兴趣尝试通过使用其他后处理技术来进一步提高估计的稳健性。为此,最好结果不是总和,而是一个大小为 [bxbxn] 的向量“covElements”,每个

    covElements(:,:,i) = x(i,:).'*x(i,:)/sum(x(i,:)*invCov.*x(i,:),2);

谢谢。

【问题讨论】:

  • 我认为您在invCov之前的代码中缺少转置
  • 其实 x(i,:) 的大小是 [1,b] 而 invCov 的大小是 [b,b] 这样代码就可以正常运行了。
  • 啊,是的,没有看到 invcov 之后的点——现在我知道你要做什么了

标签: matlab vectorization


【解决方案1】:

逐个向量化,这里有一个bsxfunned 解决方案-

%// Vectorize : "sum(x(i,:)*invCov.*x(i,:),2)"
parte1 = sum((x*invCov).*x,2);

%// Vectorize : "x(i,:)/sum(x(i,:)*invCov.*x(i,:),2)"
xp1 = bsxfun(@rdivide,x,parte1);

%// Get vectorized covElements and cov
covElements_out = bsxfun(@times,permute(xp1,[3 2 1]),permute(x,[2 3 1]));
cov_out = xp1.'*x;

【讨论】:

    猜你喜欢
    • 1970-01-01
    • 1970-01-01
    • 1970-01-01
    • 1970-01-01
    • 1970-01-01
    • 2013-11-15
    • 1970-01-01
    • 1970-01-01
    • 2018-08-27
    相关资源
    最近更新 更多