1

问题陈述:

  1. M我有一个包含m行和n列的数组。数组M中填充了非零元素。

  2. 我还有一个t带有n元素的向量和一个omega 带有m元素的向量。

  3. 的元素t对应于矩阵的列M

  4. 的元素omega对应于矩阵的行M

算法目标:

定义chi为向量t和的乘积omega我需要获得一个一维向量a,其中的每个元素a都是 的函数chi

的每个元素chi都是唯一的(即每个元素都是不同的)。

使用数学符号,这可以表示为a(chi)

vector 的每个元素a对应于 的一个或多个元素M

Matlab代码:

这是一个代码片段,显示了向量tomega是如何生成的。该矩阵M是预先存在的。

[m,n] = size(M);
t = linspace(0,5,n);
omega = linspace(0,628,m);

概念图:

这似乎是一种沿着常数 chi 的整合(如果这是正确的词的话)。

图表

参考:

参考链接

该算法未在参考文献中明确说明。我只希望以一种让人联想到计算机科学教科书的方式来描述这个算法!

看图 11.5,矩阵 M 是图 11.5(a)。目标是找到一种算法将图 11.5(a) 转换为 11.5(b)。

看起来该算法是一种沿常数的积分(也许是平均?)chi

4

3 回答 3

2

在我看来,重塑是您需要使用的 matlab 函数。如链接中所述:

B = reshape(A,siz)返回一个 n 维数组,其元素与 A 相同,但重新整形为siz,一个表示重新整形数组维度的向量。

也就是说,创建一个siz包含数字的向量m*n,并说A = reshape(P,siz),其中 P 是向量 t 和 ω 的乘积;或者说类似A = reshape(t*ω,[m*n]). (我这里没有 matlab,或者会运行测试以查看我的产品是否正确。)请注意,该链接没有显示在矩阵参数后带有一个数字(而不是几个)的示例reshape,但我希望从描述中A = reshape(t*ω,m*n)也能奏效。

于 2012-10-15T20:29:19.917 回答
2

您应该添加一个伪代码或链接到您想要实现的算法。据我所知,无论如何我已经开发了以下代码:

M = [1 2 3 4; 5 6 7 8; 9 10 11 12]' % easy test M matrix
a = reshape(M, prod(size(M)), 1)    % convert M to vector 'a' with reshape command

[m,n] = size(M);                    % Your sample code
t = linspace(0,5,n);                % Your sample code
omega = linspace(0,628,m);          % Your sample code 

for i=1:length(t)
    for j=1:length(omega)           % Acces a(chi) in the desired order
        chi = length(omega)*(i-1)+j;
        t(i)                        % related t value
        omega(j)                    % related omega value
        a(chi)                      % related a(chi) value
    end
end

如您所见,我也认为 reshape() 函数是解决您的问题的方法。我希望这段代码有帮助,

于 2012-10-15T20:57:42.287 回答
0

基本思想是使用两个独立的循环。外循环在chi变量值之上,而内循环在i变量值之上。参考原题中的上图,i变量对应x轴(时间),j变量对应y轴(频率)。假设chiij变量可以取任何实数,然后使用双线性插值来找到与矩阵 中的元素对应的幅度M。积分只是对 的元素进行平均M

以下代码片段概述了使用从 2D 到 1D 的光谱塌陷将矩阵元素表示为向量的基本算法。我找不到任何参考,但它是一个适合我的解决方案。

% Amp = amplitude vector corresponding to Figure 11.5(b) in book reference
% M = matrix corresponding to the absolute value of the complex Gabor transform 
% matrix in Figure 11.5(a) in book reference
% Nchi = number of chi in chi vector
% prod = product of timestep and frequency step
% dt = time step
% domega = frequency step
% omega_max = maximum angular frequency
% i = time array element along x-axis
% j = frequency array element along y-axis
% current_i = current time array element in loop
% current_j = current frequency array element in loop
% Nchi = number of chi
% Nivar = number of i variables
% ivar = i variable vector

% calculate for chi = 0, which only occurs when
% t = 0 and omega = 0, at i = 1
av0 = mean( M(1,:) );           
av1 = mean( M(2:end,1) );       
av2 = mean( [av0 av1] );    
Amp(1) = av2;                  

% av_val holds the sum of all values that have been averaged
av_val_sum = 0;

% loop for rest of chi 
for ccnt = 2:Nchi                       % 2:Nchi

    av_val_sum = 0;                     % reset av_val_sum 
    current_chi = chi( ccnt );          % current value of chi

    % loop over i vector
    for icnt = 1:Nivar                  % 1:Nivar

        current_i = ivar( icnt );
        current_j = (current_chi / (prod * (current_i - 1))) + 1;
        current_t = dt * (current_i - 1);
        current_omega = domega * (current_j - 1);

        % values out of range
        if(current_omega > omega_max)
            continue;
        end

        % use bilinear interpolation to find an amplitude
        % at current_t and current_omega from matrix M
        % f_x_y is the bilinear interpolated amplitude

        % Insert bilinear interpolation code here

        % add to running sum
        av_val_sum = av_val_sum + f_x_y;
    end % icnt loop

        % compute the average over all i
        av = av_val_sum / Nivar;

        % assign the average to Amp
        Amp(ccnt) = av;

end % ccnt loop 
于 2012-10-16T17:36:01.103 回答