【问题标题】:How to accelerate this matlab function如何加速这个matlab函数
【发布时间】:2015-11-14 06:43:32
【问题描述】:

我有一个函数可以在向量 x[m,n] 上执行 HodgesLehmann 稳健均值。 n为数据的批次索引,m为样本数。

function HLe = HodgesLehmann(x)

% Obtain dimensions
[m,n] = size(x);

% Create xi and xj values with the i <= j restriction enforced
q = logical(triu(ones(m,m),0));
i = uint32((1:m)'*ones(1,m));
xi = x(i(q),:);
j = uint32(ones(m,1)*(1:m));
xj = x(j(q),:);

% Calculate pairwise means (Walsh averages)
W = (xi+xj)./2;

% Calculate ordinary median of Walsh averages
HLe = median(W);

我正在寻找一种方法来加速这个函数,它不能很好地适应大尺寸的 x。任何加速这一过程的方式也是受欢迎的。

非常感谢。

【问题讨论】:

  • 次要建议:而不是做例如uint32((1:m)'*ones(1,m)),可以create the array directly as uint32 type跳过浮点数的转换,例如ones(1,m,'uint32')
  • 我尝试了你的建议,但它要么不起作用,要么我不完全理解你的建议。问题是 matlab 抱怨整数类不完全支持矩阵乘法 (MTIMES)。
  • 抱歉,忘记了整数类的 MTIMES 支持。您可以忽略该建议。

标签: matlab vectorization


【解决方案1】:

this solution 的启发,这是一个可能的(未经性能测试)改进 -

%// Calculate pairwise means (Walsh averages)
[I,J] = find(bsxfun(@le,[1:m]',[1:m])); %//'
W = (x(J,:) + x(I,:))./2;

%// Calculate ordinary median of Walsh averages
HLe = median(W);

【讨论】:

  • 这提高了性能,但非常轻微。有没有其他推荐的方法?
  • @user2324712 是的,我刚刚进行了测试,似乎并没有提供太大的改进,这对我来说真的有点出乎意料。
  • @user2324712 让我问你 - 你正在使用多少系统 RAM,x 的数据大小是多少?
  • 在我的笔记本电脑上,我目前大约有 8 个演出。 x 通常大小为 m ~ 数千和 n ~ 50,000。我目前无法以全尺寸运行它,而是通过 for 循环对其进行批处理。但最终这是我想要达到的尺寸。我可以使用更好的硬件,您会推荐更好的 cpu 或 GPU 实现吗?
  • @user2324712 我在分析器中检查了@Divakar 的版本和使用meshgrid 的变体:[jj,ii] = meshgrid(uint32(1:m)); [I,J] = find(jj &gt;= ii);bsxfun 可能更快,但至少在我的情况下,大部分时间实际上都花在了 median 函数上,这是一个内置的 MATLAB 函数。
猜你喜欢
  • 2021-10-31
  • 2016-03-12
  • 1970-01-01
  • 1970-01-01
  • 2021-12-26
  • 1970-01-01
  • 2021-01-28
  • 2018-10-24
  • 2017-05-22
相关资源
最近更新 更多