【问题标题】:Octave/Matlab - Are all elements in the vector the same? [duplicate]Octave/Matlab - 向量中的所有元素都相同吗? [复制]
【发布时间】:2015-05-03 12:10:54
【问题描述】:

我需要一种方法来测试向量中的所有元素是否相同

在我的脚本中,我从一个空向量和一个将元素附加到向量的函数开始。我事先不知道该功能会给我带来什么价值。每次迭代我都会迭代并将一个元素附加到向量中。只要添加的每个新元素与之前的元素相同,迭代就应该继续进行。一旦函数返回不同的值,while 循环就应该中断。

基本上,我需要做的是测试向量中的所有元素是否相同,一般来说,因为函数返回不同的值。我试过使用 strcmp,但是,它给了我一个关于尺寸不匹配的错误。

提前致谢! V.Vocor

【问题讨论】:

  • 如果你在一个循环中这样做,检查新的数字是否等于最后一个就足够了。所有之前的都已经检查过是否相等。

标签: matlab octave


【解决方案1】:

有很多方法可以测试向量或数组x 是否包含严格 相等的元素。这里有几个。请注意,(:) 仅在处理多维数组时才是必需的;对于向量,您可以删除它:

  • all(x(1)==x(:))
  • max(x(:))==min(x(:))
  • all(diff(x(:)))==0
  • numel(unique(x(:)))==1

如果xdouble 数据类型,最好允许一些容差,例如tol = 1e-6。那么:

  • all(abs(x(1)-x(:))<=tol)
  • max(x(:))-min(x(:))<=tol

【讨论】:

  • 这么多替代品..不错+1 :)
  • 我猜你在第五个写错了。不应该是all(abs(x(1)-x(:)) <= tol) ??
  • @SanthanSalai 谢谢!已更正
  • 我还有一个疑问,在使用容差时,将所有值与x(1) 进行比较可能不合适?因为拿这个例子来说,最大允许公差是0.5。那么如果向量是X = [1 1.4 0.6],那么最大差异变为0.8,而条件仍然可能评估为true
  • max(x(:))==min(x(:))max(x(:))-min(x(:))<=tol 不会检测到 NaN 的存在。不是那在问题描述中...... :-)
【解决方案2】:

如果您在每次迭代时迭代并向向量追加一个值,并且如果您在追加的值与之前的所有值不同时中断 for 循环,那么一旦返回值与以前的。

因此,与向量上的最后一个元素(而不是整个向量)进行比较,它的效率要高得多。更好的是,由于附加到向量的末尾是一项非常昂贵的操作(它需要将整个向量复制到内存中),所以删除向量并在内存中只保留一个标量元素。像这样:

n = uint32 (0);
current = init_value;
while (current == foo ())
  n++;
endwhile

【讨论】:

    猜你喜欢
    • 1970-01-01
    • 2013-04-17
    • 1970-01-01
    • 1970-01-01
    • 1970-01-01
    • 1970-01-01
    • 1970-01-01
    • 1970-01-01
    • 1970-01-01
    相关资源
    最近更新 更多