4

2 進数の大きな配列があり、配列の 1 つの次元に対してビットごとの OR を実行したい:

X = [ 192, 96,  96,  2,  3
       12, 12, 128, 49, 14
       ....
    ];
union_of_bits_on_dim2 = [
       bitor(X(:,1), bitor(X(:,2), bitor(X(:,3), ... )))
    ];
ans = 
    [ 227
      191 
      ... ]

これを行う簡単な方法はありますか?私は実際にn次元配列に取り組んでいます。試してみbi2deましたが、配列が平坦化されるため、添え字が複雑になります。

matlabに機能があれば簡単にできたのですが、foldないと思います。


OK @Divakar は実行可能なコードを求めたので、ここで明確にするために、2D 配列で機能する可能性のある長いバージョンがあります。

function U=union_of_bits_on_dim2(X)
U=zeros(size(X,1),1);
for i=1:size(X,2)
  U=bitor(U,X(:,i));
end

ループせずに実行できますか?bitorもちろん、任意の数の引数を取ることができることを望んでいました。それなら、でできたはずmat2cellです。

4

2 に答える 2

2

1 つのベクトル化されたアプローチ -

[m,n] =  size(X)  %// Get size of input array
bd = dec2bin(X)-'0' %// Get binary digits

%// Get cumulative "OR-ed" version with ANY(..,1)
cum_or = reshape(any(permute(reshape(bd,m,n,[]),[2 3 1]),1),8,[]) 

%// Finally convert to decimals
U = 2.^(7: -1:0)*cum_or
于 2015-02-26T16:37:28.750 に答える
1

それを自動的に行う機能を知りません。ただし、関心のあるディメンションをループできます。

function result = bitor2d(A)
    result = A(1,:);
    for i=2:size(A,1)
        result = bitor(result,A(i,:));
    end
end

配列が 2 次元を超える場合は、2 次元のみになるように準備する必要があります。

function result = bitornd(A,whichdimension)
    B = shiftdim(A,whichdimension-1); % change dimensions order
    s = size(B);
    B = reshape(B,s(1),[]);  % back to the original shape
    result = bitor2d(B);
    s(1) = 1;
    result = reshape(result,s); % back to the original shape
    result = shiftdim(result,1-whichdimension); % back to the original dimension order
end
于 2015-02-26T16:37:00.693 に答える