应用于值数组时,索引超出矩阵维度

时间:2015-08-21 04:39:51

标签: arrays matlab matrix

我在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)]

2 个答案:

答案 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,这是您的解决方案所给出的。