2015-08-03 18 views
5

Tôi đã ghi lại dữ liệu chứa một vectơ các chuỗi bit mà tôi muốn sắp xếp lại hiệu quả. Một giá trị trong vector dữ liệu có thể trông như thế này:Xáo trộn bit hiệu quả của vectơ số nhị phân

bit0, bit1, bit2, ... bit7 

Tôi muốn sắp xếp lại này bit chuỗi vào nề nếp này:

bit0, bit7, bit1, bit6, bit2, bit5, bit3, bit4 

Nếu tôi chỉ có một giá trị này sẽ làm việc độc đáo qua:

sum(uint32(bitset(0,1:8,bitget(uint32(X), [1 8 2 7 3 6 4 5])))) 

Thật không may bitet và bitget không có khả năng xử lý vectơ của chuỗi bit. Vì tôi có một tập dữ liệu khá lớn, tôi quan tâm đến các giải pháp hiệu quả.

Bất kỳ trợ giúp nào sẽ được đánh giá cao, cảm ơn!

+1

Bạn có thể cung cấp dữ liệu ví dụ đầu vào và đầu ra ở định dạng chính xác của bạn (bạn có thể biến nó thành một vector nhỏ của tiếng nói chỉ 3 mẫu) – Dan

Trả lời

3

dec2binbin2dec có thể xử lý vector, bạn có thể nhập tất cả các số cùng một lúc và hoán vị ma trận:

input=1:23; 
pattern = [1 8 2 7 3 6 4 5]; 
bit=dec2bin(input(:),numel(pattern)); 
if size(bit,2)>numel(pattern) 
    warning('input numbers to large for pattern, leading bits will be cut off') 
end 
output=bin2dec(bit(:,pattern)); 

nếu có, tôi sẽ sử dụng de2bibi2de để thay thế.

+2

Lưu ý rằng thứ tự bit với 'de2bi' là ngược lại với' dec2bin' –

1

Tôi không biết nếu tôi có thể nhận được câu hỏi sai, nhưng không phải là nó chỉ có thể giải quyết bằng cách lập chỉ mục gói vào cellfun?

%// example data 
BIN{1} = dec2bin(84,8) 
BIN{2} = dec2bin(42,8) 

%// pattern and reordering 
pattern = [1 8 2 7 3 6 4 5]; 
output = cellfun(@(x) x(pattern), BIN, 'uni', 0) 

Hoặc định dạng bạn nhập vào và đầu ra mong muốn là gì?


BIN = 

    '01010100' '00101010' 


output = 

    '00100110' '00011001' 
0

Cách hiệu quả nhất có thể là sử dụng bitgetbitset như bạn đã làm trong câu hỏi của mình, mặc dù bạn chỉ cần số nguyên 8 bit. Giả sử bạn có một uint8 mảng X trong đó mô tả dữ liệu được ghi của bạn (ví ví dụ dưới đây, X = uint8([169;5]), không có lý do đặc biệt Chúng tôi có thể kiểm tra các bit bằng cách tạo ra một chức năng ẩn danh hữu ích:.

>> dispbits = @(W) arrayfun(@(X) disp(bitget(X,1:8)),W) 
>> dispbits = 

@(W)arrayfun(@(X)disp(bitget(X,1:8)),W) 
>> dispbits(X) 
    1 0 0 1 0 1 0 1 

    1 0 1 0 0 0 0 0 

và giả sử bạn có một số mô hình pattern theo mà bạn muốn sắp xếp lại các bit lưu trữ trong vector này các số nguyên:

>> pattern 

pattern = 

    1  8  2  7  3  6  4  5 

bạn có thể sử dụng arrayfunfind để sắp xếp lại các bit theo pattern:

Y = arrayfun(@(X) uint8(sum(bitset(uint8(0),find(bitget(X,pattern))))), X) 

Y = 

    99 
    17 

Chúng tôi nhận được câu trả lời mong muốn được lưu trữ một cách hiệu quả trong một vector của 8 số nguyên bit:

>> class(Y) 

ans = 

uint8 

>> dispbits(Y) 
    1 1 0 0 0 1 1 0 

    1 0 0 0 1 0 0 0 
Các vấn đề liên quan