3

0I have on matrix-

A=[1 2 2 3 5 5;
   1 5 5 8 8 7;
   2 9 9 3 3 5];

行列から、与えられた行列「A」の各行にゼロ以外の要素がいくつあるか、1がいくつ、2がいくつ、3がいくつあるかを数える必要があります。これらについて、次のようなコードを1つ書きました。

    [Ar Ac]=size(A);

    for j=1:Ar 
        for k=1:Ac
            count(:,j)=nnz(A(j,:));
            d(:,j)=sum(A(j,:)== 1); 
            e(:,j)=sum(A(j,:)==2);  
            f(:,j)=sum(A(j,:)==3);          
    end
end

しかし、私はループを使用してこれらを記述する必要があります。つまり、ここでは手動で sum(A(j,:)== 1),sum(A(j,:)== 2) および sum(A(j,:)== を使用します3) しかし、sum(A(j,:)== 1:3) しか書けず、すべての値を別の行に格納できるオプションはありますか。つまり、結果は次のようになります-

b=[1 2 1;
   1 0 0;
   0 1 2];

Matlab の専門家は貴重な提案を必要としています

4

6 に答える 6

8

ヒストグラムの数を探しているようです:

U = unique(A);
counts = histc(A', U)';
b = counts(:, ismember(U, [1 2 3]));

%// Input matrix and vector of values to count
A = [1 2 2 3 5 5; 1 5 5 8 8 7; 2 9 9 3 3 5];
vals = [1 2 3];

%// Count values
U = unique(A);
counts = histc(A', U)';
b = counts(:, ismember(U, vals));

結果は次のとおりです。

b =
   1   2   1
   1   0   0
   0   1   2
于 2013-08-14T10:56:41.593 に答える
3

アスカーの要求に応じて、求める値を一般化します。

values = [ 1 2 3 ]; % or whichever values are sought
B = squeeze(sum(bsxfun(@(x,y) sum(x==y,2), A, shiftdim(values,-1)),2));
于 2013-08-14T10:56:49.107 に答える
1

私はこのようにします:

B = [arrayfun(@(i) find(A(i,:) == 1) , 1:3 , 'UniformOutput', false)',arrayfun(@(i) find(A(i,:) == 2) , 1:3 , 'UniformOutput', false)',arrayfun(@(i) find(A(i,:) == 3) , 1:3 , 'UniformOutput', false)'];

res = cellfun(@numel, B);
于 2013-08-14T10:51:19.193 に答える