2010-03-24 58 views
10

Tôi có một mảng các đối tượng trong MATLAB và tôi đã gọi là nhà thầu của họ trong một vòng lặp:Làm thế nào để preallocate một mảng của lớp trong MATLAB?

antsNumber = 5; 
for counter = 1: antsNumber 
    ant(counter) = TAnt(source, target); 
end 

MATLAB cảnh báo tôi sử dụng preallocation để tăng tốc độ quá trình này. Tôi biết những lợi ích của preallocation nhưng tôi không biết làm thế nào để làm điều đó cho các đối tượng.

+1

câu hỏi có liên quan chặt chẽ: http://stackoverflow.com/questions/591495/matlab-preallocate-a-non -numeric-vector – gnovice

Trả lời

5

Các liên kết sau đây có thể giúp đỡ:

http://www.mathworks.com/help/techdoc/matlab_oop/brd4btr.html#brd4nrh
Web archive of dead link

New link:
http://de.mathworks.com/help/matlab/matlab_oop/creating-object-arrays.html

+0

Cảm ơn, nó rất hữu ích. Tôi đã thêm ant = TAnt.empty (antsNumber, 0) và nó hoạt động! –

+0

Theo liên kết, câu trả lời là ant = TAnt.empty (antsNumber, 0) –

+7

@Kamran: Giải pháp của bạn sử dụng phương thức 'empty' của một đối tượng có thể hoạt động theo ý nghĩa khiến MATLAB ngừng la hét với bạn về preallocation, nhưng nó không thực sự preallocation vì nó vẫn là một mảng * trống *. Lưu ý câu lệnh này trong tài liệu Waleed được liên kết đến, dưới tiêu đề "Gán giá trị cho một mảng rỗng": "Nếu bạn gán một giá trị thuộc tính, MATLAB gọi hàm tạo SimpleClass để tăng mảng tới kích thước yêu cầu." Lưu ý từ ** grow **, chỉ ra rằng mảng thay đổi kích thước khi được gán cho, đó là những gì preallocation có nghĩa là để tránh. – gnovice

0

Cảnh báo nó cho là thừa, trừ khi bạn đang làm công cụ tính toán nặng, tôi sẽ bỏ qua nó.

Lý do tại sao nó cho bạn lỗi, là bởi vì nó phải tìm không gian mới. Nói, tôi cung cấp cho bạn một danh sách bảy đối tượng, và tôi nói với bạn rằng bạn cần phải đặt chúng tất cả trong một hàng, sau đó tôi đi, và cung cấp cho bạn một vài điều bạn cần phải đặt ở đâu đó. Sau đó tôi cung cấp cho bạn một đối tượng thứ tám và cho bạn biết để đặt nó ngay sau khi thứ bảy. Bởi vì bạn có đồ vật thứ 8, bạn phải di chuyển nó ra khỏi đường, hoặc bạn phải di chuyển tất cả bảy vật thể. Matlab, đang nói với bạn rằng sẽ nhanh hơn nếu bạn nói trước rằng bạn muốn đặt 5 thứ trong đó, thay vì chỉ cho từng thứ một, phải tìm kiếm một điểm mới mỗi lần. Bạn có thể làm điều đó bằng cách thêm dòng này vào đầu mã của bạn:

ant = [1:5]; 

Ngoài ra còn có các cách khác để thực hiện việc này.

+0

Hoàn toàn sai. MATLAB lỗi: Chuyển đổi để tăng gấp đôi từ TAnt là không thể. –

5

Dưới đây là một vài lựa chọn, trong đó yêu cầu bạn thiết kế các nhà xây dựng lớp học cho TAnt để nó có thể xử lý một no input argument case:

  • Bạn có thể tạo một đối tượng mặc định TAnt (bằng cách gọi các nhà xây dựng với không có đối số đầu vào) và nhân rộng nó với REPMAT để khởi tạo mảng của bạn trước khi bước vào bạn cho vòng lặp:

    ant = repmat(TAnt(),1,5); %# Replicate the default object 
    

    Sau đó, bạn có thể lặp qua mảng, ghi đè lên mỗi DEFA đối tượng ult với một đối tượng mới.

  • Nếu TAnt đối tượng của bạn đều được khởi tạo với cùng một dữ liệu, và họ không bắt nguồn từ handle class, bạn có thể tạo 1 đối tượng và sử dụng REPMAT để sao chép nó:

    ant = repmat(TAnt(source,target),1,5); %# Replicate the object 
    

    chí này cho phép bạn tránh lặp hoàn toàn.

  • Nếu TAntđược bắt nguồn từ handle class, tùy chọn đầu tiên ở trên sẽ làm việc tốt nhưng tùy chọn thứ hai sẽ không bởi vì nó sẽ cung cấp cho bạn 5 bản sao của tay cầm cho cùng một đối tượng như trái ngược với 5 tay cầm cho các đối tượng riêng biệt.

+0

nó hầu như hoạt động nhưng trước đó nó phải được sửa đổi thành ant = repmat (TAnt (nguồn, đích), 0,5) –

+0

@Kamran: Điều đó sẽ cho bạn một mảng trống (0-by-5). Đối với preallocation, bạn thực sự muốn tạo một mảng mặc định của * cùng kích thước * như những gì bạn sẽ kết thúc với (1-by-5). – gnovice

+0

Có vẻ như vậy nhưng "(0,5)" hoạt động! khi tôi cố gắng sử dụng (1,5) nó gây ra lỗi. –

0

Không chắc nếu tôi nhận đúng vấn đề của bạn, nhưng nếu bạn muốn khởi tạo một mảng của lớp tự định nghĩa của bạn "Tant", ở đây là làm thế nào tôi sẽ làm điều đó

  1. Đối với nhà xây dựng Tant của phương pháp, đưa cái gì đó như:

function obj = TAnt(source, target) 
 
     if nargin > 0 
 
       obj.mySource = source; 
 
       obj.myTarget = target; 
 
     else 
 
       obj.mySource = defaultValue; 
 
       obj.myTarget = defaultValue; 
 
     end 
 
    end

Sau đó, để khởi tạo/pre cấp phát một mảng vỡ nợ Tant đối tượng,

ants(1,n) = TAnt(); % n is the length of your ants array

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