我的代码在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
py
是1xC
行向量。 px
是一个包含C
个元素的数组,每个元素都是DxV
矩阵。 x
是Dx1
列向量,其值在[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矩阵,但是,我试过这个并且我已经足够了,我无法正常工作。
答案 0 :(得分:1)
我会根据你提供的信息给出一个镜头。我虽然没有时间信息。
px
设为3D矩阵DxVxC
(而不是1xC
2D矩阵的DxV
单元格数组px_new=px(:,x,:)
重新组织矩阵,将您感兴趣的值放入前两个维度的主对角线mask=eye(D,D);
)创建逻辑索引; repmat所以它是第三维C的大小。px_new
和reshape
,以便有C
列。prod
列,留下1xC
向量将此(元素方式)与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
此代码已在http://www.online-utility.org/math/math_calculator.jsp
进行了测试编辑:我最初采取了一些不必要的步骤。我已将其更新为更简洁。