如何将保存为结构的矩阵转换为矩阵

How to convert a matrix saved as a struct to matrix

我从 https://sparse.tamu.edu/Embree/ifiss_mat 下载了一个矩阵,加载此文件后我注意到该矩阵存储为一个包含 3 个行索引、列索引和数据数组的结构。在这种特殊情况下,表示为包含 Problem.A.ir、Problem.A.jc、Problem.A.data.

的结构

我只习惯于将矩阵作为 Problem.A 随时可用,有没有办法将此结构转换为 'normal' 矩阵?

查看了您提供的 link 中的数据和描述,在我看来,这个特定的数据集遵循以下模式:

  • data 是非零位置的值
  • ir 是零基形式的行索引,对应于非零位置(与数据大小相同)
  • jc 是一个辅助向量,它以从零开始的形式告诉您行索引的一列何时停止,下一列在 ir 向量
  • 中开始

所以,例如ir 中的前 20 个条目是:

0  1  2  33  34  35  66  67  68  0  1  2  33  34  35  66  67  68  0  1

jc 中的前 3 个条目是:

0  9  18

这意味着在第一列中,假设索引为零,第 0 1 2 33 34 35 66 67 68 行(即 ir[0:8] 具有非零数据(分别取自 data[0:8])。

然后,在第二列中,第 0 1 2 33 34 35 66 67 68 行(即 ir[9:17])具有非零数据(分别取自 data[9:17]

然后你必须将所有这些都调整1,将其转换为matlab/octave支持的ONE-BASED-INDEXING。

处理完所有这些后,您将能够为数据集中的所有非零值(即3,599,932 条数据)。然后,您可以将这些 i、j 和 v 向量连同矩阵的维度(根据网站为 96,307 x 96,307)传递到 sparse,以创建您的稀疏矩阵。

遗憾的是,我认为没有特定的函数可以识别此格式并为您生成 matlab/octave 等效稀疏矩阵。您必须想出代码才能手动执行此操作。不过这不应该太难。


PS。请注意,问题结构中的许多其他字段实际上是文本,但出于某种原因,它被编码为 ascii 数字。要检索实际文本,您需要将其传递到 char,例如char(Problem.notes)