该函数应该在数组中给出最高频率。例如,如果给定的向量是:
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
答案 0 :(得分:0)
您可以使用内置功能模式()
答案 1 :(得分:0)
不确定您是否正在寻找对您的问题或代码的特定修复的一般答案,但在前者的情况下,有一个名为mode
的Matlab函数似乎可以做正是你所追求的,返回"数组中最常见的值"。
y=mode(x);
由于它不是内置函数,您可以在命令窗口中输入open mode
,看看它是如何实现的。需要注意的一点是,他们不会使用任何for或while循环。在Matlab中尽可能避免使用这些内容。还要对所有if语句进行调整,这些语句可以概括函数(例如矩阵条目)并使其更加简单。
答案 2 :(得分:0)
最短的回答
使用mode
功能。 n = mode(x)
会返回x
中的最高频率值,正如您对模式定义所期望的那样!
您的功能
您的函数有很多语法错误,其中大部分都已在问题评论中提及。关键点:
end
必须有if
。i
)。++
。 您的功能也不考虑平局,其中不同的值具有相同的频率。那是另一个问题!
更正后的代码
有关详细信息,请参阅评论
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