矢量化一个短循环,使Octave匹配Matlab速度

时间:2012-03-14 00:09:13

标签: matlab octave

我的代码在Octave中运行约0.003s,在Matlab运行约0.0007。由于Octave没有JIT编译,我想Matlab正在做我应该做的幕后优化。

numerators = zeros(1, 64);
for c = 1 : C
  numerators(c) = py(c) * prod(diag(px{c}(:, x)));
end

py1xC行向量。 px是一个包含C个元素的数组,每个元素都是DxV矩阵。 xDx1列向量,其值在[1-V]上是离散的。

prod(diag(...))奇怪是一种向所有px{c}(d, x(d))乘以d的矢量化方式:

p = 1;
for d = 1 : D
  p *= px{c}(d, x(d))
endfor

cellfun可能会奏效,但我对陷入争论的细节感到困惑。 (如果可以完成,只需这样说,我就会弄明白自己的意思)。另一个选择可能是为px使用3-D矩阵,但是,我试过这个并且我已经足够了,我无法正常工作。

1 个答案:

答案 0 :(得分:1)

我会根据你提供的信息给出一个镜头。我虽然没有时间信息。

  1. px设为3D矩阵DxVxC(而不是1xC 2D矩阵的DxV单元格数组
  2. px_new=px(:,x,:)重新组织矩阵,将您感兴趣的值放入前两个维度的主对角线
  3. 使用对角线(mask=eye(D,D);)创建逻辑索引; repmat所以它是第三维C的大小。
  4. 转化为px_newreshape,以便有C列。
  5. prod列,留下1xC向量
  6. 将此(元素方式)与py相乘以获得输出

    px = nan(3,4,5);    %# create test 3D matrix  
    px(:, :, 1) = [1 2 3 4; 4 5 6 4; 7 8 9 4]; 
    px(:,:,2)=px(:,:,1)*1.5;  
    px(:,:,3)=px(:,:,2)*1.5;  
    px(:,:,4)=px(:,:,3)*1.5;      
    px(:,:,5)=px(:,:,4)*1.5;  
    x = [4 2 3];            %# 1xD vector discrete on 1-V  
    px_new=px(:,x,:);       %# reorganize into DxDxC  
    
    idx=logical(repmat(eye(size(pd_new,1))),[1,1,size(pd_new,3)])); %# logical index  
    P = prod(reshape(pd_new(idx),[],size(pd_new,3))); %#P is now 1xC vector
    
  7. 此代码已在http://www.online-utility.org/math/math_calculator.jsp

    进行了测试

    编辑:我最初采取了一些不必要的步骤。我已将其更新为更简洁。