MATLAB中的单元格数组操作---创建关系矩阵

Jac*_*ack 1 arrays matlab matrix cell-array

我有两个单元格数组,名为countrynameexport.

只有一列countryname,这是国家名称的代码:

USA  
CHN  
ABW
Run Code Online (Sandbox Code Playgroud)

有两列export:

USA ABW  
USA CHN  
CHN USA  
ABW USA  
Run Code Online (Sandbox Code Playgroud)

一对中的每对(X,Y)export表示"国家X与国家Y有关系".大小countryname已简化为3.如何在MATLAB中实现以下功能?

创建一个3乘3的平方(通常n乘n,其中n是大小countryname)矩阵M这样

M(i,j)=1如果国家我与国家j有关系,
M(i,j)=0否则.

国家/地区名称被重新标记为正整数countryname.

ray*_*ica 5

您需要做的第一件事是建立从国家/地区名称到1到3的整数值的映射.您可以使用containers.Map输入为字符串且输出为整数的位置.因此,我们将分配'USA'给1,'CHN'到2和'ABW'3.假设您已经像上面提到的那样初始化了单元格数组:

countryname = {'USA', 'CHN', 'ABW'};
export = {'USA', 'ABW'; 'USA', 'CHN'; 'CHN', 'USA'; 'ABW', 'USA'};
Run Code Online (Sandbox Code Playgroud)

...你会创建一个containers.Map像这样:

map = containers.Map(countryname, 1:numel(countryname));
Run Code Online (Sandbox Code Playgroud)

完成后,只需将国家/地区名称映射为整数,即可使用该values功能帮助您完成此操作.但是,将返回的是单个元素的单元格数组.我们需要解压缩单元格数组,以便您可以使用cell2mat它.因此,我们现在可以创建一个4 x 2索引矩阵,其中每个单元格元素都转换为数值:

ind = cell2mat(values(map, export));
Run Code Online (Sandbox Code Playgroud)

我们得到:

>> ind

ind =

     1     3
     1     2
     2     1
     3     1
Run Code Online (Sandbox Code Playgroud)

现在我们有了这个,您可以使用sparse为您创建最终矩阵,其中第一列用作行位置,第二列用作列位置.这些位置将告诉您最终矩阵中的非零值.但是,这将是一个稀疏矩阵,因此您需要将矩阵转换full为最终得到一个数值矩阵.

M = full(sparse(ind(:,1), ind(:,2), 1));
Run Code Online (Sandbox Code Playgroud)

我们得到:

>> M

M =

     0     1     1
     1     0     0
     1     0     0
Run Code Online (Sandbox Code Playgroud)

作为更方便的表示,您可以创建一个table以显示最终矩阵.使用矩阵转换M为表格array2table,我们可以将行名称和列名称添加为国家/地区名称:

>> T = array2table(M, 'RowNames', countryname, 'VariableNames', countryname)

T = 

           USA    CHN    ABW
           ___    ___    ___

    USA    0      1      1  
    CHN    1      0      0  
    ABW    1      0      0 
Run Code Online (Sandbox Code Playgroud)

请注意,上面的代码创建了tableMATLAB R2013b及以上版本的唯一功能.如果这不是您所需要的,只需坚持使用原始数值矩阵M.