【问题标题】:How to re-create a matrix from indices and values froma text file in matlab如何从matlab中文本文件的索引和值重新创建矩阵
【发布时间】:2011-05-22 06:30:53
【问题描述】:

我希望在 matlab 中执行以下操作: -我有一个格式如下的文本文件:1 1 0.242 1 2 0.332 ... 75 74 0.485 75 75 0.726 - 第一列是矩阵的第 i 个索引的列表,第二列是矩阵的第 j 个索引,第三列是特定索引 (i,j) 处的值。简而言之,我有一个 75x75 矩阵,其值在文本文件中。 - 我希望读取这些数据并在 matlab 中重新创建矩阵,这样我就可以对其进行操作。 有什么建议吗?

【问题讨论】:

    标签: matlab file-io sparse-matrix


    【解决方案1】:

    您描述的是一个存储稀疏矩阵(元组格式)的文件。稀疏矩阵是大多数元素为 0 的矩阵,因此为了节省空间,您只存储非零元素。 Matlab 有一个内置的稀疏矩阵对象。您可以直接加载文件:

    >> load matrix.mtl;
    >> A = spconvert(matrix);
    

    见:http://bebop.cs.berkeley.edu/smc/formats/matlab.html

    您可能需要注意的另一件事是 sparse 函数,它采用三个向量并将它们转换为稀疏矩阵。

    稀疏矩阵可以转换为密集矩阵(即二维数组,这是大多数人说矩阵时的意思)使用full(A)

    【讨论】:

      【解决方案2】:

      要在 MATLAB 中重新创建完整的 75×75 矩阵,您可以首先使用函数 LOAD 加载文件:

      data = load('datafile.txt','-ascii');
      

      然后通过使用函数 SUB2IND 或您自己的简单计算将您的下标索引转换为 linear indices 来重新创建您的矩阵(不需要 for 循环):

      mat = zeros(75);  %# Initialize your matrix to zeroes
      mat(sub2ind([75 75],data(:,1),data(:,2))) = data(:,3);  %# Use SUB2IND...
      %# ... or...
      mat(75.*(data(:,2)-1)+data(:,1)) = data(:,3);  %# ... convert them yourself.
      

      【讨论】:

        【解决方案3】:

        这取决于您是希望以交互方式还是以编程方式进行。

        交互式:

        使用向导导入文本文件。你会得到一个 nx3 矩阵(比如说data)的值。然后使用一个简单的 for 循环将所有值放在正确的位置。

        A = zeros(75, 75);
        for idx = 1:size(data, 1)
            A(data(idx, 1), data(idx, 2)) = data(idx, 3);
        end
        

        以编程方式:

        例如使用textscan 以编程方式导入文件。然后按照上面的方法进行。

        【讨论】:

          【解决方案4】:

          假设您的文件名为“data.txt”并且它只包含您提到的格式化信息,我认为最好的方法是这样的示例代码:

          fid=fopen('data.txt','r');
          data=fscanf(fid,'%g',[3 Inf]);
          fclose(fid);
          [m n]=size(data);
          a=zeros(75,75);
          for i=1:n
              a(data(1,i),data(2,i))=data(3,i);
          end
          

          如果文件还包含其他信息,则应注意收集适当的行和数据。 作为您提供的少数样本的结果示例,数据矩阵将是

          data =
          1.0000    1.0000   75.0000   75.0000
          1.0000    2.0000   74.0000   75.0000
          0.2420    0.3320    0.4850    0.7260
          

          如果还有其他问题,请告诉我们。祝你好运;)

          【讨论】:

            猜你喜欢
            • 1970-01-01
            • 2013-11-18
            • 2011-01-06
            • 2018-11-11
            • 1970-01-01
            • 1970-01-01
            • 1970-01-01
            • 1970-01-01
            • 1970-01-01
            相关资源
            最近更新 更多