Matlab:从N ^ 2x3 csv制作NxN矩阵

时间:2017-01-15 00:37:35

标签: matlab csv matrix

我有一个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中执行此操作(使用脚本或在命令行中)

1 个答案:

答案 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);