Algorithm 将矩阵元素表示为向量的算法

Algorithm 将矩阵元素表示为向量的算法,algorithm,matlab,linear-algebra,numerical-methods,Algorithm,Matlab,Linear Algebra,Numerical Methods,问题陈述: 我有一个数组M,包含M行和n列。数组M中填充了非零元素 我还有一个向量t和n元素,还有一个向量omega 使用m元素 t的元素对应于矩阵M的列 omega的元素对应于矩阵M的行 算法目标: 将chi定义为向量t和omega的乘积。我需要获得一个一维向量a,其中a的每个元素都是chi的函数 chi的每个元素都是唯一的(即每个元素都是不同的) 使用数学符号,这可以表示为a(chi) 向量a的每个元素对应于M的一个或多个元素 Matlab代码: 下面是一个代码片段,显示了向量t和omega

问题陈述:

  • 我有一个数组
    M
    ,包含
    M
    行和
    n
    列。数组
    M
    中填充了非零元素

  • 我还有一个向量
    t
    n
    元素,还有一个向量
    omega
    使用
    m
    元素

  • t
    的元素对应于矩阵
    M
    的列

  • omega
    的元素对应于矩阵
    M
    的行

  • 算法目标:

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

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

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

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

    Matlab代码:

    下面是一个代码片段,显示了向量
    t
    omega
    是如何生成的。矩阵
    M
    是预先存在的

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

    这似乎是一种沿着恒定气的整合(如果这是正确的话)。

    参考资料:

    参考文献中未明确说明该算法。我只希望这个算法的描述方式能让人想起计算机科学教科书

    如图11.5所示,矩阵M为图11.5(a)。目标是找到将图11.5(a)转换为11.5(b)的算法

    该算法似乎是一种积分类型(可能是平均值?),沿着常数
    chi

    我觉得这就是您需要使用的matlab函数。如链接中所述:

    B=reformate(A,siz)
    返回一个n维数组,该数组的元素与A相同,但被重塑为
    siz
    ,这是一个表示重塑数组维度的向量

    也就是说,创建一个向量
    siz
    ,其中包含数字
    m*n
    ,并说
    a=restrape(p,siz)
    ,其中p是向量t和ω的乘积;或者说类似于
    A=重塑(t*ω,[m*n])
    。(我这里没有matlab,或者我会运行一个测试,看看我的产品是否正确。)注意,链接没有显示一个例子,在矩阵参数之后有一个数字(而不是几个)来
    restrape
    ,但我希望从描述中可以看出
    a=restrape(t*ω,m*n)
    可能也能工作。

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

    B=reformate(A,siz)
    返回一个n维数组,该数组的元素与A相同,但被重塑为
    siz
    ,这是一个表示重塑数组维度的向量


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

    您应该添加伪代码或指向要实现的算法的链接。据我所知,我开发了以下代码:

    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
    

    正如您所看到的,我还认为重塑()函数是解决问题的方法。我希望这段代码能有所帮助,

    您应该添加一个伪代码或一个指向要实现的算法的链接。据我所知,我开发了以下代码:

    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
    

    正如您所看到的,我还认为重塑()函数是解决问题的方法。我希望这段代码能有所帮助,

    基本思想是使用两个单独的循环。外循环位于
    chi
    变量值之上,而内循环位于
    i
    变量值之上。参考原始问题中的上图,
    i
    变量对应于x轴(时间),而
    j
    变量对应于y轴(频率)。假设
    chi
    i
    j
    变量可以采用任何实数,然后使用它们来查找与矩阵
    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 
    

    基本思想是使用两个独立的循环。外循环位于
    chi
    变量值之上,而内循环位于
    i
    变量值之上。参考原始问题中的上图,
    i
    变量对应于x轴(时间),而
    j
    变量对应于y轴(频率)。假设
    chi
    i
    j
    变量可以采用任何实数,然后使用它们来查找与矩阵
    M
    中的元素对应的振幅。积分只是
    M
    元素的平均值

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