【问题标题】:Index exceeds matrix dimension when applied to an array of values应用于值数组时,索引超过矩阵维度
【发布时间】:2015-11-14 22:25:39
【问题描述】:

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

【问题讨论】:

  • 只是一个问题,你的意思是你想要返回前 3 位数字还是你的意思是你想要 3 位有效数字?这样输入 1234567 将返回 1230000。
  • 我只考虑 0.1 到 99.9 之间的数字(这些都是这个问题的所有可能值),所以我认为这个函数定义得很好。
  • 对不起,我没有批评的意思。如果听起来那样,我很抱歉。我的观点是,如果您想要 3 个有效数字,则有一个 Matlab 解决方案。看我的回答。
  • 哦,完全不用道歉。感谢您的回答。该程序将数字 x(例如 pi)返回为浮点数系统中的一个数字,该数字以 10 为底,精度为 3,指数介于 -1 和 1 之间(在示例 3.14 中)。对于超出该范围的数字,函数中有一条错误消息。
  • 另外我还需要考虑用chop四舍五入,比如2.347和2.341变成2.34。

标签: arrays matlab matrix


【解决方案1】:

你可以使用 Matlabs rand 函数。

y = round(x,3,'significant');

这将返回向量x 中每个数字的前 3 位有效数字。这段代码也很容易让其他人理解,因为 round 是一个内置的 Matlab 函数,用于舍入。论点'significant' 应该足够清楚。这也适用于大于 100 的数字,这使其更通用。当然,如果它是 3 个有效数字,而不是数字中的前三个数字。在这种情况下,这将不起作用。那么数字 1001 将是 1000 而不是 100,您的解决方案会给出。

【讨论】:

    【解决方案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被初始化为一个与v一样长的0的数组,然后我们将遍历v中的每个值并调用mifl,然后将这个结果存储到对应的位置w.

    【讨论】:

    • @Fawcett512 - 我很高兴。祝你好运!
    猜你喜欢
    • 2012-09-25
    • 1970-01-01
    • 1970-01-01
    • 1970-01-01
    • 1970-01-01
    • 1970-01-01
    • 1970-01-01
    相关资源
    最近更新 更多