我有一个csv文件形式的相似性矩阵,有三列。前两列包含要比较的元素的ID,第三列包含相似性得分:
5 5 1
5 4 0.873012914
5 3 0.817896388
5 2 0.801996649
5 1 0.765290669
5 10 0.770606211
5 39 0.683117659
...
我想将其转换为NxN矩阵,如下所示:
5 4 ...
5 1 0.873013
4 0.873013 1
3 0.817896388 ...
2 0.801996649
1 0.765290669
...
我可以在python中使用(使用DictWriter),但我正在尝试学习matlab,我觉得有一种方法可以在matlab中做到这一点,这可能更容易。如何在matlab中执行此操作(使用脚本或在命令行中)
答案 0 :(得分:1)
您可以使用csvread
来读取文件(如果它实际上是以您显示的方式进行制表符分区,则应使用dlmread
),然后您可以使用sub2ind
进行转换前两列成为线性索引,然后使用这些列将第三列放入请求的矩阵中。
M = csvread('filename.csv');
% Make a matrix of all zeros to start
output = zeros(max(M(:,1)));
% Fill in the pairings
output(sub2ind(size(output), M(:,1), M(:,2))) = M(:,3);
如果你想要以完全格式(左上角有5个)的输出显示,你会想要翻转一下
output = flipud(fliplr(output));
另一种选择是使用sparse
填充前两列的矩阵。
M = csvread('filename.csv');
output = full(sparse(M(:,1), M(:,2), M(:,3)));
<强>更新强>
由于您没有所有 ID值介于1到65之间,并且您希望在第一行和第一列中包含ID,因此您需要执行以下操作。< / p>
% Determine the unique IDs and get the rows and columns for each ID in
% the first two columns
[unique_ids, ~, rows] = unique(M(:,1));
[~, ~, cols] = unique(M(:,2));
% Initialize the output matrix
output = zeros(numel(unique_ids) + 1);
% Create the row and column labels of IDs
output(2:end,1) = unique_ids;
output(1,2:end) = unique_ids;
% Fill in the rest
output(sub2ind(size(output), rows + 1, cols + 1)) = M(:,3);