我可以避免 bsxfun 的双重 forcycle 吗?
Can I avoid double forcycle by 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
概率矩阵包含元素在0和1之间的行,每一行都是概率分布(经过normP归一化后)。概率矩阵的第一行用于生成向量 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函数。我很乐意提供帮助,谢谢。
迈克尔·鲁巴利克
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
这是使用 permute
-
完成矢量化的一种方法
P = squeeze(sum(bsxfun(@ge,permute(r,[1 3 2]),csm),2)).'
说明
1) 将 r
的 dim-2 推到 dim-3
位置,在 dim=2
处引入 singleton-dim
。因此,当与 csm
配对用于 bsxfun(@ge
操作时,我们将有一个 3D
数组作为输出,其 :
dim-1 : r, csm 's dim-1
dim-2 : csm's dim-2
dim-3 : r's dim-2
2) 原始操作具有迭代输出,其中 dim-2
仍然代表 csm's dim-2
和 sum-reduction
。因此,在我们的 3D 数组输出中,我们还需要沿 dim-2
进行求和归约。
3) 最后的步骤涉及 squeeze
-ing 和转置以对应于我们迭代保存输出的方式 P
.
我想知道是否可以使用双 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
概率矩阵包含元素在0和1之间的行,每一行都是概率分布(经过normP归一化后)。概率矩阵的第一行用于生成向量 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函数。我很乐意提供帮助,谢谢。
迈克尔·鲁巴利克
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
这是使用 permute
-
P = squeeze(sum(bsxfun(@ge,permute(r,[1 3 2]),csm),2)).'
说明
1) 将 r
的 dim-2 推到 dim-3
位置,在 dim=2
处引入 singleton-dim
。因此,当与 csm
配对用于 bsxfun(@ge
操作时,我们将有一个 3D
数组作为输出,其 :
dim-1 : r, csm 's dim-1
dim-2 : csm's dim-2
dim-3 : r's dim-2
2) 原始操作具有迭代输出,其中 dim-2
仍然代表 csm's dim-2
和 sum-reduction
。因此,在我们的 3D 数组输出中,我们还需要沿 dim-2
进行求和归约。
3) 最后的步骤涉及 squeeze
-ing 和转置以对应于我们迭代保存输出的方式 P
.