2015-05-26 49 views
5

Tôi xin lỗi vì định dạng và có vẻ như một câu hỏi rất dễ. Tôi mới để MATLAB và trao đổi stack này. Tôi đang cố gắng để tạo ra một ma trận kề từ một vài vectơ cột trong MATLAB. Thông tin đã được nhập từ tệp văn bản. Thông tin trông như thế này.Tạo một ma trận kề ma trận

X Y Z W 

aa bb 1 aa 
bb cc 2 bb 
cc dd 3 cc 

đâu cột XY là tên của các cột đỉnh. Z là trọng lượng. Cột XY có khoảng 30000 mục nhập, với sự lặp lại. Cột W là tất cả các đỉnh trong biểu đồ của tôi được sắp xếp theo thứ tự bảng chữ cái mà không lặp lại. Đầu ra sẽ giống như thế này cho dữ liệu mẫu.

aa bb cc dd 

aa 0 1 0 0 
bb 1 0 2 0 
cc 0 2 0 3 
dd 0 0 3 0 

Tôi biết cách tạo ma trận nếu các đỉnh là số. Nhưng tôi không thể tìm ra cách gán giá trị số cho các đỉnh trong cột W và làm cho mọi thứ vẫn khớp với nhau.

Mã này sẽ hoạt động nếu các giá trị trong tất cả các cột là số.

A = sparse([X; Y],[Y; X],[Z; Z]); 

Trường hợp X, YZ là các cột ở trên. Khi tôi thử điều này với tôi nhận được lỗi sau

'Undefined function 'sparse' for input arguments of type 'cell' 
+0

Bạn có thể chia sẻ mã mà bạn đã thành công để làm cho đến bây giờ hay không. –

+0

xin thêm đầu ra dự kiến ​​của bạn cho dữ liệu mẫu của bạn. –

+0

Định nghĩa của bạn không rõ ràng. X và Y là đỉnh? W cũng là "đỉnh", được sắp xếp theo thứ tự bảng chữ cái? X và Y của bạn là chữ cái? Các số dưới dạng chuỗi hoặc một số loại số nhận dạng? Nếu X và Y là số, thì làm thế nào W thậm chí có thể gặp vấn đề? Tuyên bố của bạn không sử dụng W. Nó là gì? Có lẽ một mẫu dữ liệu thực tế sẽ giúp ích cho bạn. – Peter

Trả lời

4

Bạn vẫn có thể sử dụng sparse nhưng bạn sẽ phải làm một chút công việc hơn. Đối với một điều, chúng tôi cần phải chuyển đổi các nhãn trong XY thành ID nguyên duy nhất. Hãy thử sử dụng unique trên các đầu vào kết hợp XY để bạn có thể nhận được các ID nguyên duy nhất được chia sẻ giữa cả hai.

Cụ thể, unique sẽ cung cấp cho bạn danh sách tất cả các mục nhập duy nhất của đầu vào (vì vậy, XY được kết hợp). Lý do tại sao chúng tôi kết hợp cả hai XY là do có một số mã thông báo trong X có thể không có trong Y và ngược lại. Việc làm ID này chỉ định trên đầu vào được kết hợp sẽ đảm bảo tính nhất quán. Cờ 'stable' có đó bởi vì unique thực tế là sắp xếp tất cả các mục nhập duy nhất theo mặc định. Nếu đầu vào là một mảng ô của chuỗi, mảng ô được sắp xếp theo thứ tự từ điển. Nếu bạn muốn duy trì thứ tự các mục duy nhất được bắt đầu bắt đầu từ đầu đến cuối mảng ô, bạn sử dụng cờ 'stable'.

Tiếp theo, những gì tôi sẽ sử dụng là associative array qua một số containers.Map ánh xạ một chuỗi thành một số nguyên duy nhất. Hãy suy nghĩ của một mảng kết hợp như một từ điển nơi đầu vào là một khóa và đầu ra là một giá trị được liên kết với khóa này. Ví dụ tốt nhất của một mảng kết hợp trong ngữ cảnh này sẽ là từ điển tiếng Anh. Chìa khóa trong trường hợp này là từ bạn muốn tra cứu, và giá trị là định nghĩa của từ này. Khóa là một chuỗi ký tự và đầu ra là một chuỗi ký tự khác.

Ở đây, những gì chúng tôi sẽ làm là làm cho đầu vào một chuỗi và đầu ra một số duy nhất. Đối với mỗi chuỗi duy nhất chúng tôi gặp phải với sự kết hợp của XY, chúng tôi sẽ chỉ định một ID duy nhất cho nó.Sau đó, chúng tôi có thể sử dụng XY làm đầu vào vào số containers.Map để nhận ID của chúng tôi, sau đó có thể được sử dụng làm đầu vào thành sparse.

Nếu không có thêm ado, đây là các mã:

%// Your example 
X = {'aa', 'bb', 'cc'}; 
Y = {'bb', 'cc', 'dd'}; 
Z = [1 2 3]; 

%// Call unique and get the unique entries 
chars = unique([X Y], 'stable'); 

%// Create containers.Map 
map = containers.Map(chars, 1:numel(chars)); 

%// Find the IDs for each of X and Y 
idX = cell2mat(values(map, X)).'; 
idY = cell2mat(values(map, Y)).'; 

%// Create sparse matrix 
A = sparse([idX; idY], [idY; idX], [Z; Z]); 

Thứ ba và thứ hai dòng cuối cùng của mã là một chút đặc biệt. Bạn cần sử dụng chức năng values để truy xuất các giá trị được cung cấp một mảng ô của các khóa. Chúng tôi có XY làm cả mảng ô và do đó đầu ra cũng là mảng ô của giá trị. Chúng tôi không muốn điều này là một mảng tế bào nhưng là một vector số thay vì nhập vào sparse, vì vậy đó là lý do tại sao chúng tôi sử dụng cell2mat để chuyển đổi lại cho chúng tôi. Khi chúng tôi cuối cùng đã truy xuất ID cho XY, chúng tôi đặt mã này vào sparse để hoàn thành ma trận.

Khi chúng tôi hiển thị phiên bản đầy đủ của A, chúng tôi nhận được:

>> full(A) 

ans = 

    0  1  0  0 
    1  0  2  0 
    0  2  0  3 
    0  0  3  0 

Tiểu Lưu ý

Tôi thấy rằng W là mảng di động trong những cái tên đỉnh sắp xếp và theo thứ tự chữ cái. Nếu trường hợp đó xảy ra, thì bạn không cần phải thực hiện bất kỳ cuộc gọi nào unique và bạn chỉ có thể sử dụng W làm đầu vào vào số containers.Map. Như vậy, hãy thực hiện việc này:

%// Create containers.Map 
map = containers.Map(W, 1:numel(W)); 

%// Find the IDs for each of X and Y 
idX = cell2mat(values(map, X)).'; 
idY = cell2mat(values(map, Y)).'; 

%// Create sparse matrix 
A = sparse([idX; idY], [idY; idX], [Z; Z]); 
+1

Đây là lời cảm ơn hoàn hảo. – TheNumber23

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