【问题标题】:MATLAB - sparse to dense matrixMATLAB - 稀疏到密集矩阵
【发布时间】:2017-01-08 05:27:36
【问题描述】:

我在代码生成的数据文件中有一个稀疏矩阵(不是MATLAB)。数据文件由四列组成。前两列是矩阵项的实部和虚部,第三和第四列分别是对应的行和列索引。

我使用以下脚本将其转换为Matlab 中的密集矩阵。

tic
dataA = load('sparse_LHS.dat');
toc
% Initialise matrix
tic
Nr = 15; Nz = 15; Neq = 5;
A (Nr*Nz*Neq,Nr*Nz*Neq) = 0;
toc

tic
lA = length(dataA)
rowA = dataA(:,3); colA = dataA(:,4);
toc

tic
for i = 1:lA
    A(rowA(i), colA(i)) = complex(dataA(i,1), dataA(i,2));
end
toc

然而,这个 scipt 非常慢(for 循环是罪魁祸首)。

经过的时间是 0.599023 秒。

经过的时间是 0.001978 秒。

经过的时间是 0.000406 秒。

经过的时间是 275.462138 秒。

matlab 有什么快速的方法吗?

这是我目前尝试过的:

parfor - 这给了我

有效索引在 parfor 循环中受到限制

我厌倦了将for 循环改写成这样:

A(rowA(:),colA(:)) = complex(dataA(:,1), dataA(:,2));

我得到一个错误

下标分配维度不匹配。

【问题讨论】:

    标签: matlab sparse-matrix


    【解决方案1】:

    您最后一次尝试不起作用的原因是 Matlab 无法获取列和行的下标列表,并匹配它们以按顺序分配元素。相反,它从列表中生成所有行和列的组合 - 这就是它的外观:

    dataA = magic(4)
    dataA =
        16     2     3    13
         5    11    10     8
         9     7     6    12
         4    14    15     1
    
    dataA([1,2],[1,4]) =
    
        16    13
         5     8
    

    所以我们得到了 4 个元素([1,1],[1,4],[2,1],[2,4])而不是 2 个([1,1][2,4])。

    为了在列表中使用下标,您需要将它们转换为linear indexing,一种简单的方法是使用函数sub2ind

    使用此功能,您可以编写以下代码一次完成所有操作:

    % Initialise matrix
    Nr = 15; Nz = 15; Neq = 5;
    A(Nr*Nz*Neq,Nr*Nz*Neq) = 0;
    % Place all complex values from dataA(:,1:2) in to A by the subscripts in dataA(:,3:4):
    A(sub2ind(size(A),dataA(:,3),dataA(:,4))) = complex(dataA(:,1), dataA(:,2));
    

    sub2ind 不是那么快的函数(但它会比你的循环快得多),所以如果你有很多数据,你可能想自己计算线性索引:

    rowA = dataA(:,3);
    colA = dataA(:,4);
    % compute the linear index:
    ind = (colA-1)*size(A,1)+rowA;
     % Place all complex values from dataA(:,1:2) in to A by the the index 'ind':
    A(ind) = complex(dataA(:,1), dataA(:,2));
    

    附注:

    如果您使用的是 Matlab R2015b 或更高版本:

    A = zeros(Nr*Nz*Neq,Nr*Nz*Neq);
    

    quicker 比:

    A(Nr*Nz*Neq,Nr*Nz*Neq) = 0;
    

    【讨论】:

    • 您能解释一下ind = (colA-1)*size(A,1)+rowA; 的作用吗?我无法理解这一点。
    • 我明白了。 in.mathworks.com/help/matlab/math/…。非常感谢 。你为我节省了很多时间!
    猜你喜欢
    • 2016-06-25
    • 2019-09-02
    • 2012-06-20
    • 2022-08-18
    • 2014-03-06
    • 2013-04-11
    • 1970-01-01
    • 1970-01-01
    • 2021-02-23
    相关资源
    最近更新 更多