声振论坛

 找回密码
 我要加入

QQ登录

只需一步,快速开始

查看: 3379|回复: 9

[HHT] 请教accumarray()问题

[复制链接]
发表于 2008-9-15 18:43 | 显示全部楼层 |阅读模式

马上注册,结交更多好友,享用更多功能,让你轻松玩转社区。

您需要 登录 才可以下载或查看,没有账号?我要加入

x
请教高手:toimage函数中im是怎样构造的?我查了accumarray的help看到了一些例子可是还是不明白,请高手帮助解析一下,很急啊,这个不明白就怎么也画不出谱图,这个函数相关的参数indf,indt,sply,splx在ring程序注释我都看懂了,可是放到这里不知道什么意思啊,是不是我理解的有偏差,请求高手指点,万分感谢了,这个是什么意思,怎么重构的!

im = accumarray([indf(:),indt(:)],A(:),[sply,splx]);

[ 本帖最后由 zhangnan3509 于 2009-12-24 16:43 编辑 ]
回复
分享到:

使用道具 举报

发表于 2008-9-19 11:15 | 显示全部楼层

accumarray的用法

1.[indf(:),indt(:)]中每一行都有两个数。把这两个数当作横竖下标。
2.按顺序把A中的每一个数(一行一行来)放到im中,按照刚才那个下标放到里面去。也就是说这个数在im中的位置就是1中的下标。A中的每一个数对应[indf(:),indt(:)]中的每一行中的两个数,这两个数确定A中这个数在im中的位置。im中在[indf(:),indt(:)]里没有涉及到的坐标所对应的位置全部为零。如果有两个数对应同一个坐标,那么im中的这个位置存放这两个数的和。   
3.最后得到sply行、splx列的矩阵im。
4.这里的[sply,splx]必须大于或等于max([indf(:),indt(:)]).

评分

1

查看全部评分

发表于 2009-5-12 22:28 | 显示全部楼层
我刚才也看到了这个函数,一时难以弄明白,现在总算明白了!!
谢谢weiyuperfect!!!:lol :lol :lol :lol
发表于 2009-12-24 09:45 | 显示全部楼层

谢谢哈

看了2#的回复有收获,谢谢:@)
发表于 2010-4-21 16:09 | 显示全部楼层
这个程序要比楼主说的那个好理解吧?

function [im,tt] = toimage(A,f,t,splx,sply)

% [im,tt] = TOIMAGE(A,f,t,splx,sply) transforms a spectrum made
% of 1D functions (e.g., output of "spectreh") in an 2D
% image%
% inputs :   - A    : amplitudes of modes (1 mode per row of A)
%            - f    : instantaneous frequencies(瞬时频率)
%            - t    : time instants
%            - splx : number of columns of the output im (time
%            resolution).im的列数表示时间分辨率
%                     If different from length(t), works only for uniform
%                     sampling
%            - sply : number of rows of the output im (frequency
%            resolution
% outputs :  - im   : 2D image of the spectrum(2维频谱图)
%            - tt   : time instants in the image(在图中的截断时间)
%
% utilisation : [im,tt] = toimage(A,f);[im,tt] = toimage(A,f,t);[im,tt] = toimage(A,f,sply);
%              [im,tt] = toimage(A,f,splx,sply);[im,tt] = toimage(A,f,t,splx,sply);

DEFSPL = 400;%频率分辨率

if nargin < 3
  t = 1:size(A,2);%size(A,2)=length(x)-2,
  sply = DEFSPL;
  splx = length(t);
else
    if length(t) == 1%
        tp = t;
        t = 1:size(A,2);
        if nargin < 4
            sply = tp;
            splx = length(t);
        else
            if nargin > 4
                error('too many arguments')
            end
            sply = splx;%nargin= 4的情形
            splx = tp;
        end
    else%
        lt = length(t);
        if nargin < 5
          sply = splx;
          splx = lt;
        end

        if nargin < 4
          sply = DEFSPL;%一般情况下,利用[im,tt]=toimage(A,f)是都是默认的频率分辨率为400
          splx = lt;
        end
        
        if nargin > 5
            error('too many arguments')
        end
    end
end
   
%end

lt=length(t);

im=[];
im(splx,sply) = 0;

for i=1:size(f,1)%i是表示f矩阵的行数也就是具体为imf的个数
  for j = 1:lt
    ff=floor(f(i,j)*2*(sply-1))+1;
   
    if ff <= sply % in case f(i,j) > 0.5
        %如果f(i,j)介于0~0.5之间的话,那么就会满足ff <= sply
      im(floor(j*(splx-1)/lt)+1,ff)=im(floor(j*(splx-1)/lt)+1,ff)+A(i,j);
    end
  end  
end

for i = 1:splx
  tt(i) = mean(t(floor((i-1)*lt/(splx))+1:floor(i*lt/(splx))));
end

im=fliplr(im)';
发表于 2010-5-23 19:36 | 显示全部楼层

回复 沙发 weiyuperfect 的帖子

这里的[indf(:),indt(:)]行数是不一样的啊?
发表于 2010-12-2 16:35 | 显示全部楼层
看了差不多一下午关于accumarray的用法解释,怎么都没办法整理好怎样,原来早有高人做出如此详尽解释,感激不尽
发表于 2011-7-27 20:56 | 显示全部楼层
感谢高人指点!
发表于 2012-3-6 10:15 | 显示全部楼层
谢谢2楼的仁兄,也谢谢斑竹
发表于 2012-5-27 12:09 | 显示全部楼层
很有用的帖子!
您需要登录后才可以回帖 登录 | 我要加入

本版积分规则

QQ|小黑屋|Archiver|手机版|联系我们|声振论坛

GMT+8, 2024-7-7 19:43 , Processed in 0.058890 second(s), 22 queries , Gzip On.

Powered by Discuz! X3.4

Copyright © 2001-2021, Tencent Cloud.

快速回复 返回顶部 返回列表