2013-04-24 43 views

Trả lời

81

x(end+1) = newElem mạnh hơn một chút.

x = [x newElem] sẽ chỉ hoạt động nếu x là hàng vectơ, nếu đó là vector cột x = [x; newElem] nên được sử dụng. Tuy nhiên, x(end+1) = newElem, hoạt động cho cả vectơ hàng và cột.

Nói chung, các vectơ phát triển cần tránh. Nếu bạn làm điều này rất nhiều, nó có thể làm cho mã của bạn bị thu hẹp. Hãy suy nghĩ về nó: phát triển một mảng liên quan đến phân bổ không gian mới, sao chép tất cả mọi thứ, thêm các yếu tố mới, và làm sạch các mess cũ ... Khá lãng phí thời gian nếu bạn biết kích thước chính xác trước :)

+3

Cũng đối với phương thức thứ hai, 'x' phải được khởi tạo trước tiên! – Dan

+1

@RodyOldenhuis, không sao cả! Tôi đã làm như vậy, có lẽ cùng một lúc. @Dan, đó là sự thật, nhưng như câu hỏi được đề cập "có một vectơ' x' (có kích thước 'n')", tôi giả định 'n' là khác 0 và vectơ đang được khởi tạo :) – ThijsW

+0

Có đó là sự thật – Dan

26

Chỉ cần thêm vào câu trả lời @ ThijsW, có là một lợi thế tốc độ đáng kể cho phương pháp đầu tiên so với phương pháp nối:

big = 1e5; 
tic; 
x = rand(big,1); 
toc 

x = zeros(big,1); 
tic; 
for ii = 1:big 
    x(ii) = rand; 
end 
toc 

x = []; 
tic; 
for ii = 1:big 
    x(end+1) = rand; 
end; 
toc 

x = []; 
tic; 
for ii = 1:big 
    x = [x rand]; 
end; 
toc 

    Elapsed time is 0.004611 seconds. 
    Elapsed time is 0.016448 seconds. 
    Elapsed time is 0.034107 seconds. 
    Elapsed time is 12.341434 seconds. 

tôi đã những lần chạy trong 2012b tuy nhiên khi tôi chạy cùng mã trên cùng một máy tính trong matlab 2010a tôi nhận được

Elapsed time is 0.003044 seconds. 
Elapsed time is 0.009947 seconds. 
Elapsed time is 12.013875 seconds. 
Elapsed time is 12.165593 seconds. 

Vì vậy, tôi đoán tốc độ lợi thế chỉ áp dụng cho các phiên bản mới hơn của Matlab

+0

+1, Được chỉnh sửa để thêm rõ ràng là tốt. Tôi sẽ kiểm tra lại trên một CPU "thực" (tôi đang ở trên điều này không đáng tin cậy không tốt APU bây giờ ...) –

+0

Có, tất cả tốt hơn bây giờ :) –

+0

@Dan, cùng với tôi, tôi nhận được 0,028 cho Tùy chọn thứ 3 và 8.909 cho – ThijsW

4

Như đã đề cập trước đó, việc sử dụng x(end+1) = newElem có lợi thế là nó cho phép bạn ghép nối vectơ của bạn với vô hướng, bất kể vector của bạn có được hoán đổi hay không. Do đó, nó là mạnh mẽ hơn cho việc thêm vô hướng.

Tuy nhiên, điều không nên quên là x = [x newElem] cũng sẽ hoạt động khi bạn cố gắng thêm nhiều phần tử cùng một lúc. Hơn nữa, điều này tổng quát hơn một chút tự nhiên đối với trường hợp bạn muốn ghép các ma trận. M = [M M1 M2 M3]


Tất cả trong tất cả, nếu bạn muốn có một giải pháp cho phép bạn nối hiện tại của bạn vector x với newElem có thể có hoặc có thể không phải là một đại lượng vô hướng, điều này sẽ làm các trick:

x(end+(1:numel(newElem)))=newElem 
+1

Tôi nghĩ ví dụ cuối cùng của bạn nên là: x (kết thúc + 1: kết thúc + chiều dài (newElem)) = newElem – Digna

+0

@Digna Cảm ơn bạn đã tìm lỗi, tôi đã cập nhật câu trả lời cho khắc phục sự cố. –

+1

Với Matlab2011b của tôi, cũng có một cải tiến tốc độ (~ 50x) quyết liệt trên vectơ nối với phương pháp này so với phương pháp a = [a b]. – JaBe

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