我可以通过bsxfun避免双重forcycle吗?

时间:2016-03-22 11:37:15

标签: matlab vectorization bsxfun

我想知道,是否可以使用双bsxfun或类似的东西。我有这段代码:

N = 5;
prob = [0.1 0.2 0 0.1; 0 0 0.05 0.1; 0.2 0.2 0 0.1];
r = rand(size(prob,1),N);

P = zeros(N, size(prob,1));
csm = cumsum(normP([zeros(size(prob,1),1),prob]),2);

for i = 1:N
 P(i,:) = sum(bsxfun(@ge,r(:,i),csm),2);
end

Prob矩阵包含元素在0和1之间的行,每行是概率分布(在由normP完成归一化之后)。第一行prob矩阵用于生成向量P的第一个元素(值1,2或4),第二行用于第二个元素(值3或4),依此类推。

e.g.: P =

       2     4     2
       4     4     1
       2     4     2
       2     4     4
       2     3     1

我已经为一个向量P生成了元素,但是我需要生成几个(N)向量。必须有办法避免for循环。

在附件中,有normP功能。我很乐意帮助你,谢谢你。

Michal Roubalik

P.S。 normP代码在这里:

function nP = normP(P)
%
% Probability matrix normalization to hold sum of rows be equal to one
% i.e. sum(nP,2) = ones(N,1)
%
% No dependencies
srowP = sum(P,2);
good  = srowP>0;
bad   = ~good;
nP    = zeros(size(P));

% good case
if any(good)
    nP(good,:) = bsxfun(@rdivide, P(good,:), srowP(good));
end
% bad case
if any(bad)
    nP(bad,:) = nan(size(P(bad,:)));
end

1 个答案:

答案 0 :(得分:4)

以下是使用permute -

完成矢量化的一种方法
r

<强>解释

1)将dim-3的dim-2推到singleton-dim位置,dim=2位于csm。因此,当与bsxfun(@ge 3D操作配对时,我们会将dim-1 : r, csm 's dim-1 dim-2 : csm's dim-2 dim-3 : r's dim-2 数组作为输出,其中:

dim-2

2)原始操作具有迭代输出,csm's dim-2仍然表示sum-reductiondim-2。因此,在我们的3D数组输出中,我们还需要沿squeeze求和。

3)最后的步骤涉及P - 转置和转置,以对应我们迭代保存输出{{1}}的方式。