为什么稀疏非对角线数组的索引反转?

时间:2016-10-17 12:10:50

标签: matlab sparse-matrix

我有一个稀疏矩阵文件,其中包含820行。该文件的几行示例如下:

0   547 1

1   547 1

2   539 0.500000

2   540 0.500000

3   512 0.333333

3   515 0.333333

我想将这个稀疏矩阵文件导入Matlab。文件中包含的完整矩阵有1184行和相同数量的列。要将此文件转换为稀疏矩阵,我使用以下命令:

T = reshape(T,3,entries)';
    disp('Array is: ');
    A = (sparse(T(:,1)+1, T(:,2)+1, T(:,3), rows , cols));

首先,在向index添加+1之前,会显示一个错误,即:

  

" ???使用==>时出错稀疏索引到矩阵必须是正的。

这是由于Matlab从索引1开始,而不是从索引0开始。

添加+1后,问题得以解决。 但现在,我运行此代码

  A = (sparse(T(:,1)+1, T(:,2)+1, T(:,3), rows , cols));

对于对角矩阵,输出非常好,并且解决了正索引的问题。但是当我尝试使用非对角矩阵时,结果是它反转输出。我的意思是它不是让(1,500)= 3,67而是给我(500,1)= 3,67。为什么Matlab会这样做?

1 个答案:

答案 0 :(得分:3)

您可能正在关注行主要(例如,您的矩阵是在C中创建的),而MATLAB是列专业。要从一个转换为另一个,只需交换坐标!

A = (sparse(T(:,2)+1, T(:,1)+1, T(:,3), cols, rows));

它起作用的例子:

T=[0   547 1;

1   547 1;

2   539 0.500000;

2   540 0.500000;

3   512 0.333333;

3   515 0.333333];

% choosen randombly 4x600 because I dont have the full matrix.
% Just use rows and cols in your case
    A = sparse(T(:,1)+1, T(:,2)+1, T(:,3), 4 , 600); % this one is as in C
    B = sparse(T(:,2)+1, T(:,1)+1, T(:,3), 600 , 4); % this one is my suggestion

isequal(A',B) %the transpose of A is equal to B