1

この 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

4 に答える 4

1

この場合、線形インデックスを作成することをお勧めします。行/列のサブインデックスをsub2indを使用して線形インデックスに変換します。

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

必要に応じて、これを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 に答える