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 X
và Y
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 X
và Y
để 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, X
và Y
được kết hợp). Lý do tại sao chúng tôi kết hợp cả hai X
và Y
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 X
và Y
, 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 X
và Y
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ó X
và Y
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 X
và Y
, 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]);
Bạn có thể chia sẻ mã mà bạn đã thành công để làm cho đến bây giờ hay không. –
xin thêm đầu ra dự kiến của bạn cho dữ liệu mẫu của bạn. –
Đị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