增加B行A(i)中的第i列

时间:2012-06-20 21:59:58

标签: matlab matrix vectorization

有没有更好的方法来进行for循环?

for i = find(A > 42)
    B(A(i), i) = B(A(i), i) + 1;
end

A是一个整数数组。 Bmax(A)×length(A)矩阵。

示例:

A = reshape(magic(3), 1, 9); %# 8 3 4 1 5 9 6 7 2
B = zeros(max(A), length(A));
for i = find(A > 3)
    B(A(i), i) = B(A(i), i) + 1;
end

B = [
    0     0     0     0     0     0     0     0     0
    0     0     0     0     0     0     0     0     0
    0     0     0     0     0     0     0     0     0
    0     0     1     0     0     0     0     0     0
    0     0     0     0     1     0     0     0     0
    0     0     0     0     0     0     1     0     0
    0     0     0     0     0     0     0     1     0
    1     0     0     0     0     0     0     0     0
    0     0     0     0     0     1     0     0     0
]

4 个答案:

答案 0 :(得分:1)

对于这种情况,我建议使用线性索引。使用sub2ind将行/列子指数转换为线性索引。

i = find(A > 3);
si = sub2ind(size(B),A(i),i);
B(si) = B(si) + 1;

如果您愿意,可以将其组合成单行,为清晰起见,我将其保留为多行。

答案 1 :(得分:1)

B = zeros(max(A), length(A)); 
inds = find(A > thresh);
B(sub2ind(size(B),A(inds),inds)) = 1;

答案 2 :(得分:1)

这是紧凑的,无环路的,它可以工作:

INDICES = A(:) + length(A)*[0:length(A)-1]';                          %#' 
INDICES(A<42) = [];
B(INDICES) = B(INDICES)+1;

答案 3 :(得分:1)

另一个解决方案(受this one启发):

idx = find(A>3);
B = full(sparse(A(idx), idx, 1, max(A), length(A)));