数据类型的问题:整数、双精度数、科学计数法和类型转换

25次浏览(过去30天)
我有一个整数元素的向量,大多数/所有的元素都是千位的。当我查看向量时,一些数字以正常格式显示(例如,5037),但一些数字以科学符号显示(例如4.2890e+03)。当我对变量调用isinteger()函数时,它返回false。我认为这可能是由于一些元素以科学计数法存储的方式,但我还没有找到任何方法,在网上查找,强制变量以正常格式保存所有元素。如果我对变量调用isinteger(round()),它仍然返回false。我也不能类型转换我的向量为eg。int16(我将在一分钟内得到)。
我需要整数值的原因是,其中一些值将用于索引数组。我用的是" S =稀疏(i,j,v,m,n,nz) 函数,值m,n,nz都来自我的变量。如果我尝试按原样运行它,其中所有的值实际上都是整数,但Matlab不能识别它们,我会得到错误消息
每个元素都应该是整数,但不管怎样都会抛出一个错误。这样你们就能看到变量是什么了,
N =数字(x);
Idx = 1:n;
X是整数值的二重向量,k是X中的一个特定元素。
稀疏的文档表明它不应该有问题,因为它说前两个项(i,j aka idx, x)可以是“ 数据类型: | | int8 | int16 | int32 | int64 | uint8 | uint16 | uint32 | uint64 | 逻辑 ,第三项(v aka 1)可以是“ 数据类型: | 逻辑 ,第4项和第5项(m,n即n,k)可以为 数据类型: 最后一项(nz又名n)可以是 数据类型:
根据文档,我不明白为什么它不接受我的值——它声称对每个输入项都支持类型“double”。万博1manbetx
如果我尝试将向量x转换为其他类型,比如int16,就会得到错误
尽管文件声称它接受" | | int8 | int16 | int32 | int64 | uint8 | uint16 | uint32 | uint64 | 逻辑
我该如何解决这个问题?有什么方法可以强制向量中的所有元素以正常格式保存,而不是科学符号?为什么当文档声称支持数据类型时,我得到一个关于输入类型的错误?万博1manbetx
3评论
詹姆斯Tursa"class=
詹姆斯Tursa 2020年4月30日
我再次请求,请向我们展示一个完整的小示例来演示问题,而不仅仅是代码片段。而不是代码的图片……张贴你的代码作为文本和格式与代码按钮。

登录评论。

接受的答案

Guillaume"class=
Guillaume 2020年4月30日
编辑:Guillaume 2020年4月30日
左= 100*round(左,2);
理论上,这确实可以得到整数。不幸的是,对于浮点(double),这并不总是可行的,您将得到非整数值。请看例子:
>> x = 1.127;
>> y = round(x, 2)%似乎是1.13。不是的!
y =
1.13
>> z = 100*y%似乎是113。不是的!
z =
113
>> z - 113它只差了一点点
ans =
-1.4210854715202 e-14
尽管从数学上讲,下面的情况是一样的,但它要安全得多:
左=圆(左* 100);%在舍入前进行乘法运算,然后舍入到最接近的整数
原因是有很多数字只有两个小数,比如1.13,不能存储为双位数。因此,matlab存储的不是1.13,而是最接近的可能的数字(大约1.12999999999999989342…),当然,当乘以100时,它不是确切的113,而是112.99999999999998579…(注意后面数字的变化)。
请注意,这并不依赖于matlab的版本,实际上适用于任何使用双重表示的代码,而不仅仅是matlab。

更多答案(3)

詹姆斯Tursa"class=
詹姆斯Tursa 2020年4月29日
编辑:詹姆斯Tursa 2020年4月29日
你混淆了整数“类型”和整数“值”。整数类型有int8, uint8,…int16 uint64。整数值1、2、3等。你可以在浮点类型(单或双)或整数类型(int8, uint16等)中存储整型“值”。
您还混淆了存储值和显示值。存储的整数值可以显示为整数格式,也可以显示为浮点格式。但是它在屏幕上的显示方式并不影响底层存储值。显示格式取决于值和您的显示设置。
对于您的特定问题,您需要向我们提供一个特定的示例,说明您认为您在何处为sparse()函数提供适当的输入(向我们展示它们),然后复制和粘贴整个错误消息以供我们查看。如果sparse()抱怨您的索引数组不是整数值,那么它们就不是整数值。稀疏矩阵的数据值需要是双的或逻辑的…不支持其他稀疏矩阵数据类型。万博1manbetx
如果您的所有输入都是double类型,并且索引数组只有正整数值,那么事情应该可以为您工作。
3评论
汉娜维"class=
汉娜维 2020年4月30日
左=(4 + 4 *兰德(2578、1075))。* randn(2578、1075)+ (rand(2578、1075)-0.5);
左= 100*round(左,2);% bin和scale
左=左- min(min(min(左))))+1;% shift为整数值
X = left(1,:);
Y = left(2,:);
N =数字(x);
X =重塑(X,1,n);
Y =重塑(Y,1,n);
L = min(min(x),min(y));
X = X -l+1;
Y = Y -l+1;
K = max(max(x),max(y));
Idx = 1:n;
Mx =稀疏(idx,x,1,n,k,n);
我已经手动检查了变量的值,以确认它们是整数值。
我真的不明白的是,为什么代码现在给我错误,因为它在过去已经工作了。我用它代替了第2行
左= 10*round(左,1);
代码完美地运行,没有任何问题。这是字面上唯一的变化,现在我得到了错误。

登录评论。


史蒂文的主"class=
史蒂文的主 2020年4月30日
你用的是哪个版本的MATLAB ?控件中指定下标(前两个输入)的能力 稀疏的 函数作为整数的数组 类型 添加了 R2020a版本
从您接收到的错误消息中,您在x中至少有一个元素不是整数 价值 .找出不是整数的元素 价值 :
Find (x ~= round(x))
4评论
Guillaume"class=
Guillaume 2020年4月30日
嗯,这很容易重现这个问题,例如:
Left = [1.127 2;0 0]
我已经在回答中解释了这个问题。

登录评论。


汉娜维"class=
汉娜维 2020年4月30日
最后,在将它传递给函数之前,我通过在多个不同的点上调用round()基本上使它工作(我仍然不确定为什么它不会工作,如果我只是对值调用一次?
3评论
詹姆斯Tursa"class=
詹姆斯Tursa 2020年5月1日
@Hannah:我并不想严厉,但这听起来好像你并没有真正了解你的问题,你只是给它贴上了绷带。如果你理解了这个问题,以及浮点计算在做什么,你就能够创建更好的代码,就像Guillaume建议的那样,避免在你的代码中到处喷洒round(),直到事情看起来正常为止……这一次。如果您花时间理解为什么在每个步骤中都会遇到问题,然后编写更好的代码以在第一时间避免这些问题,那就更好了。

登录评论。

社区寻宝

在MATLAB Central中找到宝藏,并发现社区如何帮助您!

开始狩猎!