如何将索引的双数值转换为整数,以便在MATLAB中创建稀疏矩阵?
我正在使用MATLAB加载一个文本文件,我想用它制作一个稀疏矩阵。文本文件中的列引用行索引,为如何将索引的双数值转换为整数,以便在MATLAB中创建稀疏矩阵?,matlab,matrix,integer,double,Matlab,Matrix,Integer,Double,我正在使用MATLAB加载一个文本文件,我想用它制作一个稀疏矩阵。文本文件中的列引用行索引,为double类型。我需要它们是整数,以便能够将它们用作行和列的索引。我尝试使用uint8、int32和int64将它们转换为整数,以使用它们构建稀疏矩阵,如下所示: ???输入的未定义函数或方法“稀疏” “int64”类型的参数。 ==>在5处建立网络时出错 图形=稀疏(int64(listedges(:,1))、int64(listedges(:,2))、一(size(listedges,1),1))
double
类型。我需要它们是整数,以便能够将它们用作行和列的索引。我尝试使用uint8
、int32
和int64
将它们转换为整数,以使用它们构建稀疏矩阵,如下所示:
???输入的未定义函数或方法“稀疏”
“int64”类型的参数。
==>在5处建立网络时出错
图形=稀疏(int64(listedges(:,1))、int64(listedges(:,2))、一(size(listedges,1),1))
如何将加载为双精度的文本文件条目转换为
sparse
函数使用?无需任何转换,保留索引double
:
r = round(listedges);
graph = sparse(r(:, 1), r(:, 2), ones(size(listedges, 1), 1));
有两个原因可以解释为什么要转换为
int
:第一,因为您有数据类型限制。
第二,您的输入可能包含分数,不适合用作整数 如果由于第一个原因需要转换,则无需:默认情况下,Matlab使用
double
类型,并且通常将double
视为int(例如,当用作索引时)
然而,如果你想因为第二个原因(数字可能是小数)而转换成整数,那么你应该使用
round()
,ceil()
或floor()
-任何最适合你的理由。还有另一个很好的理由(实际上是最主要的理由…)为什么要将任何结构(数组、矩阵等)的索引转换为int
如果您使用Matlab以外的任何语言编程,您都会熟悉如何节省内存空间,尤其是大型结构。能够用索引而不是double来处理此类结构中的元素是关键
Matlab的一个主要问题是无法以这种方式更精细地控制多维结构的大小。有稀疏矩阵解,但这些解在许多情况下并不足够。单元阵列将在访问时保留数据类型,但是单元阵列中每个元素的存储在存储方面都非常浪费(封装在单元中的单个uint8有113字节)。当我这样做时,我会得到错误
???使用==>稀疏索引到矩阵时出错必须是整数。错误==>make_network at 6 graph=sparse(listedges(:,1),listedges(:,2),one(size(listedges,1),1))代码>@Vass那么这可能是因为listedges不是一个整数。我已经修改了答案。谢谢,但我仍然得到错误:???使用==>稀疏索引到矩阵时出错必须是整数。错误==>make_network at 8 graph=sparse(r(:,1),r(:,2),one(size(listedges,1),1))代码>我做了'class(cel(col1(:))ans=double'和class(round(col1(:))ans=double)
来构造一个稀疏矩阵,matlab希望索引是double类型的整数。因此,您可以调用sparse(round(listedges(:,1)),round(listedges(:,2)),1)使用double
sI仍然会得到错误???使用==>稀疏索引到矩阵时出错必须是整数。错误==>make_network at 9 graph=sparse(round(listedges(:,1)),round(listedges(:,2)),1)
是否可能listedges
的元素小于1?当round
ed为零或负时?K>>min(listedges(:,1))ans=1k>>min(listedges(:,2))ans=1
的元素,我也怀疑没有比1更低的元素。