有没有更好的方法来进行for循环?
for i = find(A > 42)
B(A(i), i) = B(A(i), i) + 1;
end
A
是一个整数数组。 B
是max(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
]
答案 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)));