2010-02-26 109 views
5

Tôi tự hỏi liệu có một cách hiệu quả trong MATLAB để tạo ra tất cả các vectơ có độ dài cố định với các phần tử từ một tập hợp hữu hạn hay không.Tạo vectơ trong MATLAB

Ví dụ: làm thế nào tôi có thể xây dựng tất cả các vectơ có chiều dài 5 chỉ với 0 hoặc 1 làm phần tử?

Trả lời

3

không hoàn toàn là những gì bạn cần, nhưng permv tạo ra hoán vị vectơ. Nếu bạn không tìm thấy giải pháp chính xác, bạn có thể điều chỉnh hoán vị vector.

permv

+0

Cảm ơn! Tôi nghĩ rằng đây là chính xác những gì tôi cần. –

+0

@Kiran: Hãy nhớ rằng trước tiên bạn phải chọn một vector gồm 5 phần tử của số nguyên tố và số 0 để bắt đầu, sau đó PERMS sẽ cung cấp cho bạn mọi hoán vị về điều đó. – gnovice

+0

Cảm ơn lời khuyên, gnovice. Điều này làm cho mã của tôi nhanh hơn nhiều so với trước đó và điều đó thực sự tốt. –

1

mới trả lời:

Bạn có thể đẩy nhanh tiến độ giải pháp DEC2BINsuggested by AB (với sự trợ giúp của woodchips) bằng cách thay vì sử dụng các chức năng BITGET. Có hai cách để tiếp cận điều này. Là người đầu tiên sử dụng REPMAT chức năng để làm cho đầu vào tương đương về kích thước (cả 32-by-5 ​​ma trận):

allCombos = bitget(repmat((0:31)',1,5),repmat(5:-1:1,32,1)); 

Và thứ hai chỉ đơn giản gọi BITGET một lần cho mỗi bit cá nhân bạn muốn nhận được:

vec = (0:31)'; 
allCombos = [bitget(vec,5) bitget(vec,4) bitget(vec,3) ... 
      bitget(vec,2) bitget(vec,1)]; 

Và đây là một số timings mẫu:

 Method  | Average Time 
-----------------+------------------ 
    DEC2BIN  | 0.000788 s 
    BITGET+REPMAT | 0.000727 s 
    BITGET x5  | 0.000045 s 

Như bạn có thể thấy, trải BITGET rất nhanh.


Cũ câu trả lời: (cho hậu thế)

Nếu bạn đang muốn xây dựng một ma trận của mỗi thể vector của zero và những người mà có chiều dài 5, đây sẽ là một trong những cách để làm điều đó bằng cách sử dụng chức năng PERMSUNIQUE (kể từ PERMS tạo hàng lặp đi lặp lại):

allCombos = [0 0 0 0 0; 
      unique(perms([0 0 0 0 1]),'rows'); ... 
      unique(perms([0 0 0 1 1]),'rows'); ... 
      unique(perms([0 0 1 1 1]),'rows'); ... 
      unique(perms([0 1 1 1 1]),'rows'); ... 
      1 1 1 1 1]; 
10

cách thích hợp để xây dựng tất cả các vectơ có chiều dài 5 chỉ có 0 hoặc 1 là các phần tử là

a = dec2bin(0:31,5) - '0'; 

Tôi hy vọng bạn sẽ thấy lý do.

+0

+1 Câu trả lời hay. Hạn chế duy nhất có thể là DEC2BIN có thể * đau đớn * chậm. – gnovice

+1

@gnovice: Bạn đã bắt tôi đi và xem nguồn DEC2BIN. Có, nó có lẽ không phải là rất hiệu quả - nhưng nó rất dễ thương! Cảm ơn. – AVB

+3

Thay vì lặp, hãy sử dụng để không lặp. >> tic, a = 0 (10,1024), cho x = 0: 1023, a (:, x + 1) = str2num (dec2bin (x, 10) '); kết thúc, toc Thời gian đã qua là 0.105492 giây. >> tic, a = dec2bin (0: 1023) - '0'; toc Thời gian đã trôi qua là 0,000868 giây. –

3

MathWorks' FileExchange là bạn của bạn:

Vì vậy, sử dụng chức năng đầu tiên, nó dễ dàng như:

VChooseKRO([0 1], 5) 

Bạn thậm chí có thể làm cho nó làm việc cho một mảng di động của dây là tập hữu hạn:

C = {'a' 'b' 'c' 'd'}; 
C(VChooseKRO(1:numel(C), 2)) 
Các vấn đề liên quan