输出最高频率的函数

时间:2017-05-10 14:01:27

标签: matlab

该函数应该在数组中给出最高频率。例如,如果给定的向量是:

x = [1 2 3 4 4 3 3 3 2 2]

该函数应返回数字3,但它会给我语法错误。

function y = frequency(x)
count = 1;
tmpCount=0;
popular = x(1);
tmp = 0;
for i =1:length(x)
    tmp = x(i);
    tmpCount=0;
    for i=2:length(x)
        if (tmp == x(j))
            tempCount++;
        end
        if (tmpCount > count)
            popular = tmp;
            count = tmpCount;
        end
    end
    y=popular; 
end

4 个答案:

答案 0 :(得分:0)

您可以使用内置功能模式()

答案 1 :(得分:0)

不确定您是否正在寻找对您的问题或代码的特定修复的一般答案,但在前者的情况下,有一个名为mode的Matlab函数似乎可以做正是你所追求的,返回"数组中最常见的值"。

y=mode(x);

由于它不是内置函数,您可以在命令窗口中输入open mode,看看它是如何实现的。需要注意的一点是,他们不会使用任何for或while循环。在Matlab中尽可能避免使用这些内容。还要对所有if语句进行调整,这些语句可以概括函数(例如矩阵条目)并使其更加简单。

答案 2 :(得分:0)

最短的回答

使用mode功能。 n = mode(x)会返回x中的最高频率值,正如您对模式定义所期望的那样!

您的功能

您的函数有很多语法错误,其中大部分都已在问题评论中提及。关键点:

  • Matlab中的每个 end必须有if
  • 不能在嵌套循环中使用相同的循环变量(使用i)。
  • Matlab中不存在增量运算符++

您的功能也不考虑平局,其中不同的值具有相同的频率。那是另一个问题!

更正后的代码

有关详细信息,请参阅评论

function popular = frequency(x)
    count = -1;  % Start at -1, nothing been counted yet so at least first element will succeeed
    % Good not to use i or j, as they are the the imaginary constant sqrt(-1)
    % by default, instead use ii, jj
    for ii = 1:length(x) 
        tmp = x(ii);
        tmpCount=0;
        % Ensure nested loop variable is not also ii
        for jj = 1:length(x)
            % Start loop from 1st element, also check not counting itself (when ii=jj)
            if (tmp == x(jj) && ii ~= jj) 
                tmpCount = tmpCount + 1; % MATLAB doesn't support ++
            end
        end
        % Check if new highest freqency
        if (tmpCount > count)
            popular = tmp;
            count = tmpCount;
        end
    end
end

<强>用法

您在评论中说x未定义。您可能尝试在没有输入的情况下运行此功能...在命令窗口中,键入

x = [1 2 3 4 4 3 3 3 2 2];
frequency(x) % returns 3 as desired

<强>改进

在评论中你神秘地说你不能使用内置插件(如mode),但是如果你允许更多基本内容(sum )那么这是一个简化的版本:

function popular = frequency(x)
    count = -1;  % Start at -1, nothing been counted yet so at least first element will succeeed
    % Loop over elements
    for ii = 1:length(x)
        % Get the number of elements with the same value as x(ii)
       tmpCount = sum(x == x(ii));
       if tmpCount > count
           popular = x(ii);
           count = tmpCount;
       end
    end
end

答案 3 :(得分:-2)

也许这段代码将所有上述评论分组:

function y = frequency(x)
  count = 0;
  tmpCount=0;
  popular = x(1);
  tmp = 0;
  for ii =1:length(x)
      tmp = x(ii);
      tmpCount=0;
      for jj=1:length(x)
         if (tmp == x(jj))
            tempCount=tempCount+1;
         end
      end
      if (tmpCount > count)
         popular = tmp;
         count = tmpCount;
      end
   end
   y=popular;

end