我在Matlab中写了以下问题来获取数字的前3位数。
设x为实数。
function [y]=mifl(x) % mifl=my float
s=num2str(x);
y=sscanf(s(1:4),'%f');
end
因此函数mifl返回数字的前3位数。 例如,
mifl(pi)=3.14
但是当我尝试将此函数应用于向量v的所有值时,我得到“索引超出矩阵维度”。我无法弄清楚为什么。
我用过
v=linspace(0.1, 99.9, 1000);
w=[]
for i=1:5
w(i)=mifl(v(i))
end
当我得到“指数超过矩阵维度”时。
最后,我想要的是,给定一个向量
v=linspace(0.1, 99.9, 1000);
获取向量
w=[mifl(0.1),...mifl(99.9)]
答案 0 :(得分:2)
原因是您在功能中指定了没有三位有效数字的数字。具体来说,请尝试从您的向量中0.1
。这没有3位数,所以你得到一个越界错误,因为你假设它。
因此,在您的函数中,检查字符串的长度并确保提取4个字符。如果没有,那就得到任何可用的东西:
function [y]=mifl(x) % mifl=my float
s=num2str(x);
m = min(numel(s), 4); %// Change
y=sscanf(s(1:m),'%f');
end
如果您尝试以上操作,您的代码现在应该可以使用。
我还建议您在填充数据之前预先分配数据。
具体做法是:
v=linspace(0.1, 99.9, 1000);
w=zeros(numel(v),1);
for i=1:numel(v)
w(i)=mifl(v(i));
end
w
被初始化为0的数组,与v
一样长,然后我们将遍历v
中的每个值并调用mifl
,然后将此结果存储在w
。
答案 1 :(得分:0)
您可以使用Matlabs rand
函数。
y = round(x,3,'significant');
这将返回向量x
中每个数字的前3位有效数字。这个代码也很容易被其他人理解,因为round是一个内置的Matlab函数,用于舍入。论证'significant'
应该足够清楚。这也适用于大于100的数字,这使它更通用。当然,如果它是你追求的3位有效数字,而不是数字的前三位数。在这种情况下,这将无效。数字1001将是1000而不是100,这是您的解决方案所给出的。