加载中…
个人资料
  • 博客等级:
  • 博客积分:
  • 博客访问:
  • 关注人气:
  • 获赠金笔:0支
  • 赠出金笔:0支
  • 荣誉徽章:
正文 字体大小:

【转】用MATLAB求解一维矩阵中连续出现元素的个数

(2012-11-06 08:54:59)
标签:

教育

杂谈

问题要求

1:要找出矩阵中出现次数最多的那个数a
2:要得到这个数在矩阵中连续出现的次数,且把次数放在B矩阵中

在举一个例子
          C=[1   2 1 1 1   2 3 5 4   1 1 1 1 1   8 9    1 5   1 1 1]
那么得到的B=[1   0 3 0 0   0 0 0 0   5 0 0 0 0   0 0    1 0   3 0 0 ]
B矩阵中得数代表a连续出现的次数,0代表其他数

这是百度里一位朋友的问题,搞了好久,终于调试通了,给大家分享下,

1.%a=[6 6 6 2 6 6 3   6 6 6 2 5 3 6 1 6 5 6 6 6 6 ];
%function b=zhaoxu(a,c)

%c为要找的元素
function b=zhaoxu(a)
%a为要找的数组
[M,F]=mode(a);%找出数组a中出现次数最多的元素,值送M,出现的次数送F
k=0;%出现的次数
i=1;
b=zeros(1,length(a));
while i
%while(a(i)==c)%如果a(i)=要求的值,则判断出现的次数
    while(a(i)==M)%如果a(i)=要求的值,则判断出现的次数
        k=1;
        for j=(i+1):length(a)%判断出现的具体次数
            if (a(j)-a(i))~=0
               n=j;
                break;
            else
                k=k+1;
            end
        end
        b(i)=k;
       i=j;%将当前连续点出现次数结果的下标送i
        break;
    end
i=i+1;%指向下一个新单元继续判断
end

可能里面还有一些地方可以优化的,朋友们看到了帮忙指出来下。

2.设定一个新矩阵,A1=[];

用while或者for循环把不同的数罗列进去

再用for循环寻找每个A1元素对应次数放入A2里

max(A2)反求A1对应元素

for循环求对应等于a的元素的逻辑矩阵A3

0处分解A3为若干小矩阵

求各矩阵和

组合矩阵对应放入B中

完毕

n=length(A);
B=zeros(1,n);
i=1;
while i<=n
    for j=i+1:n
        if A(i)==A(j)
            B(i)=B(i)+1;
        else
            break
        end
    end
    i=j;
end
[val,index]=max(B);
a=A(index);
C=zeros(1,n);
i=1;
while i<=n
    if A(i)==a
        C(i)=C(i)+1;
        for j=i+1:n
            if A(j)==a
                C(i)=C(i)+1;
            else
                break;
            end
        end
        if j==n
            break;
        end
        i=j;
        continue ;
    else
        i=i+1;
    end
end

3.a=[1   2 1 1 1   2 3 5 4   1 1 1 1 1   8 9    1 5   1 1 1];
[M,F]=mode(a);%找出数组a中出现次数最多的元素,值送M,出现的次数送F
k=0;%出现的次数
i=1;
b=zeros(1,length(a));
while i
%while(a(i)==c)%如果a(i)=要求的值,则判断出现的次数
    while(a(i)==M)%如果a(i)=要求的值,则判断出现的次数
        k=1;
        for j=(i+1):length(a)%判断出现的具体次数
            if (a(j)-a(i))~=0
               n=j;
                break;
            else
                k=k+1;
            end
        end
        b(i)=k;
       i=j;%将当前连续点出现次数结果的下标送i
        break;
    end
i=i+1;%指向下一个新单元继续判断
end
b

2. 还有一种方式和调试结果

function r=hello(a)
if (~isvector(a))
error('a is not a vector');
r=[];
end
con=[];
num=[];

for n=1:length(a)
b=find(con==a(n));
if isempty(b)
con=[con,a(n)];
num=[num,1];
else
num(b)=num(b)+1;
end
end

[m,k]=max(num)
big=a(k)
flag=0;
last=[];

for n=length(a):-1:2
if (a(n)~=big)&(a(n-1)==big)
    last(n)=0;flag=0;
elseif (a(n)~=big)&(a(n-1)~=big)
     last(n)=0;flag=0;
elseif (a(n)==big)&(a(n-1)==big)
    last(n)=0;flag=flag+1;
elseif (a(n)==big)&(a(n-1)~=big)
    last(n)=flag+1;flag=0;
end
end

if a(1)==big
    last(1)=flag+1;
else
    last(1)=flag;
end

r=last;

%结束----------
%运行:
>> A=[1 6 6 2 6 6 8   6 6 6 2 5 3 6 1 6 5 6 6 6 6 ];
>> r=hello(A);
>> A=[1 6 6 2 6 6 8   6 6 6 2 5 3 6 1 6 5 6 6 6 6 ];
>> r=hello(A)

r =

Columns 1 through 11

                                   0

Columns 12 through 21

                                0

>> C=[1   2 1 1 1   2 3 5 4   1 1 1 1 1   8 9    1 5   1 1 1];
>> r=hello(C)

r =

Columns 1 through 11

                                   0

Columns 12 through 21

                                0

http://hiphotos.baidu.com/%EF%BF%BD%EF%BF%BD%D0%A6%EF%BF%BD%EF%BF%BD%EF%BF%BD%D0%A1%EF%BF%BD%EF%BF%BD/pic/item/45eb052739f8fe199822edca.jpg

0

阅读 收藏 喜欢 打印举报/Report
  

新浪BLOG意见反馈留言板 欢迎批评指正

新浪简介 | About Sina | 广告服务 | 联系我们 | 招聘信息 | 网站律师 | SINA English | 产品答疑

新浪公司 版权所有