Jac*_*ack 1 arrays matlab matrix cell-array
我有两个单元格数组,名为countryname和export.
只有一列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.
您需要做的第一件事是建立从国家/地区名称到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.
| 归档时间: |
|
| 查看次数: |
87 次 |
| 最近记录: |