两个稀疏矩阵的乘法算法

时间:2014-07-16 18:43:12

标签: arrays matlab matrix sparse-matrix matrix-multiplication

我在Matlab工作,我将稀疏矩阵存储为具有字段的结构数组:行,列和数据。因此,对于两个矩阵,我将为每个非零条目提供一组数组(行,列,数据)。

我正在尝试编写一个有效的程序,以这种形式乘以两个稀疏矩阵,但是遇到了一些困难。

然而,这个问题是数组中有重复的条目,当我真的想添加它们时。

非常感谢任何帮助。

1 个答案:

答案 0 :(得分:2)

首先,您可以使用ismember取消使用forloops,如下所示:

[lia,locb] = ismember([a.column],[b.row]);
loca = find(lia);

这将为您提供localocb,它们分别是答案矩阵的行和列索引。您可以按如下方式确定最终数组中的目标条目:

[dest,~,i] = unique([loca',locb'],'rows');
dest_row = num2cell(dest(:,1));
dest_col = num2cell(dest(:,2));

这里我们使用基于行的唯一排序来确保我们不在最终矩阵中重复条目。 i索引数组是从初始数据(可能有重复数据)到最终数据(没有重复数据)的映射。然后,您可以使用accumarray

根据这些索引对数据求和
dest_data = num2cell(accumarray(i,[a(loca).data].*[b(locb).data]));

我们将每个转换为单元格数组,以便更容易地形成最终矩阵,您很快就会看到。假设你还没有,你应该预先分配最终的矩阵:

len = size(dest,1); % number of unique entries in the final matrix
c = repmat(struct('row',[],'column',[],'data',[]),len,1);

我们现在可以在最终矩阵中设置值:

[c.row] = dest_row{:};
[c.column] = dest_col{:};
[c.data] = dest_data{:};