在Julia中导入一个Matlab矩阵

4

我得到了一个Matlab文件,应该包含一些矩阵。我在Matlab online上打开它,它看起来像一个Excel表格,每个单元格都有一个double类的变量,并被称为sparse double。如果我尝试打印这个文件,它会给我一个坐标列表,后面跟着数字1。例如:

(100,1)   1
(123,132) 1

我正在使用的矩阵只能有0和1作为元素,因此我假设所有其他坐标都为零。然而,我不知道如何将其显示为矩阵,或者以某种方式将其导入Julia作为数组。我对Matlab没有任何了解,而且我也不想在Matlab上工作,因为我的程序的其余部分都是用Julia编写的。 编辑:根据评论的建议,我只是把我用来尝试导入的代码留下来。在Matlab程序中,我有一个单变量的“cell”格式,大小为1x10,名为modmat。这些每个包含1 266 x 266 稀疏双精度矩阵,我可以通过modmat{1}modmat{2}等来访问。
Matlab:
writematrix(modmat{1},"Mat1.txt")

在Julia中:

> using DelimitedFiles
> M1 = open(readdlm,"Mat1.txt")

输出结果是一个266×1 矩阵{任意类型}:变量。

是的,在Matlab稀疏矩阵中未显示的条目为0。要显示完整的矩阵,请转换为full(如果矩阵不太大)。具体来说,在命令窗口中键入y = full(x),其中x是矩阵名称。要从Julia导入,将其保存为文本文件可能很方便;使用writematrix进行保存(除非Julia可以直接读取.mat文件,我不知道那种语言)。 - Luis Mendo
这似乎在Julia中给了我一个266x1的数组,但原始矩阵是一个266x266的矩阵。您能指点我一些资源,让我学习如何正确地做这件事吗? - newtothis
我不熟悉Julia,抱歉。也许有了解该语言的人可以帮忙。您是否检查过Matlab是否正确读取了保存的矩阵(readmatrix)?我建议您在问题中更新使用两种语言的代码。 - Luis Mendo
@LuisMendo,我已经按照您的建议编辑了问题。 - newtothis
1个回答

7

我推荐使用MAT.jl包安全、高效地读取mat文件。它似乎可以读取稀疏矩阵,甚至能够一次性读取整个单元数组。

为了完整起见(以及万一由于某些原因您无法执行上述操作),以下是如何读取包含格式化行的文件:

(100,1)   1
(123,132) 1

:

function readsparsemat(io::IO)
  linere = r"^\((\d+),(\d+)\) # coordinates
             \s+              # some number of spaces
             1$               # 1 at the end of the line
             "x               # extended regex complete

  matches = match.(linere, readlines(io))
  coords = [parse.(Int, (m[1], m[2])) for m in matches]

  sparse(first.(coords), last.(coords), true)
  
end

julia> readsparsemat(IOBuffer("(10,1)   1
       (12,13) 1
       ")) # test with an IOBuffer
12×13 SparseMatrixCSC{Bool, Int64} with 2 stored entries:
...

julia> open(readsparsemat, "matfilename") #actual usage

我知道MAT.jl包,但由于我没有本地安装Matlab,所以无法使用它。感谢您提供的替代方法。 - newtothis
@newtothis 首先,你能解释一下你所说的“我知道MAT.jl包,但由于我没有本地安装Matlab,所以无法使用它”是什么意思吗?MAT.jl不需要安装MATLAB就可以工作,并且是最简单的方法。你尝试过安装它吗?如果有,你遇到了什么问题? - Sundar R
当我最初发布这个问题时,我错误地认为需要本地安装Matlab才能使MAT.jl正常工作。因此,在您回答之前,我设法找到了一个解决方法。然而,我需要再次处理类似的文件,而我的方法并不高效。 - newtothis
我已经安装了 MAT.jl,正如我现在所提到的,我已经能够读取所需的 mat 文件,但由于它是这种复杂的格式,我想知道是否有一种方法可以访问单个切片。我查看了 MAT.jl 的 github 页面,但那并没有什么帮助,我也没怎么理解。 - newtothis
@newtothis 啊,我现在更好地理解了这个问题。你应该可以只使用 v[1]v[2] 等来获取单独的矩阵,但如果不行的话,你能否将其作为一个单独的问题提出来,以便我们深入了解细节?具体而言,是读取文件到变量中的代码以及在将结果分配给变量后变量的类型。 - Sundar R
显示剩余2条评论

网页内容由stack overflow 提供, 点击上面的
可以查看英文原文,
原文链接