1

有没有更好的方法来做这个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
]
4

4 回答 4

1

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

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

如果需要,您可以将其组合成一条线,为了清楚起见,我将其保留为多条线。

于 2012-06-20T22:18:23.950 回答
1
B = zeros(max(A), length(A)); 
inds = find(A > thresh);
B(sub2ind(size(B),A(inds),inds)) = 1;
于 2012-06-20T22:18:46.180 回答
1

这是紧凑的,无环的,并且有效:

INDICES = A(:) + length(A)*[0:length(A)-1]';                          %#' 
INDICES(A<42) = [];
B(INDICES) = B(INDICES)+1;
于 2012-06-20T22:45:56.657 回答
1

另一种解决方案(受此启发):

idx = find(A>3);
B = full(sparse(A(idx), idx, 1, max(A), length(A)));
于 2012-06-21T05:52:55.850 回答