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

时间:2021-04-28 09:55:59

标签: octave

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

我只习惯于将矩阵作为 Problem.A 随时可用,有没有办法从这个结构转换为“正常”矩阵?

1 个答案:

答案 0 :(得分:2)

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

  • 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 三元组数组在数据中)。然后,您可以将这些 i、j 和 v 向量以及矩阵的维度(根据网站为 96,307 x 96,307)传递到 sparse 中,以创建您的稀疏矩阵。

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


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