fgsunny 发表于 2008-9-15 18:43

请教accumarray()问题

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

im = accumarray(,A(:),);

[ 本帖最后由 zhangnan3509 于 2009-12-24 16:43 编辑 ]

weiyuperfect 发表于 2008-9-19 11:15

accumarray的用法

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

abc198478 发表于 2009-5-12 22:28

我刚才也看到了这个函数,一时难以弄明白,现在总算明白了!!
谢谢weiyuperfect!!!:lol :lol :lol :lol

juegenfen 发表于 2009-12-24 09:45

谢谢哈

看了2#的回复有收获,谢谢:@)

cboboc 发表于 2010-4-21 16:09

这个程序要比楼主说的那个好理解吧?

function = toimage(A,f,t,splx,sply)

% = 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 : = toimage(A,f); = toimage(A,f,t); = toimage(A,f,sply);
%             = toimage(A,f,splx,sply); = 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;%一般情况下,利用=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)';

cboboc 发表于 2010-5-23 19:36

回复 沙发 weiyuperfect 的帖子

这里的行数是不一样的啊?

bearkingfang 发表于 2010-12-2 16:35

看了差不多一下午关于accumarray的用法解释,怎么都没办法整理好怎样,原来早有高人做出如此详尽解释,感激不尽

ttxs5000 发表于 2011-7-27 20:56

感谢高人指点!

rencs1 发表于 2012-3-6 10:15

{:{39}:}谢谢2楼的仁兄,也谢谢斑竹

rogen 发表于 2012-5-27 12:09

很有用的帖子!
页: [1]
查看完整版本: 请教accumarray()问题