1

問題の声明:

  1. 行と列の配列Mがあります。配列はゼロ以外の要素で埋められます。 mnM

  2. 要素を含むベクトルtと、 要素を含むベクトルもあります。nomegam

  3. の要素はt、行列の列に対応しますM

  4. の要素はomega、行列の行に対応しますM

アルゴリズムの目標:

ベクトルとchiの乗算として定義します。 の各要素がの関数である1Dベクトルを取得する必要があります。tomegaaachi

の各要素chiは一意です(つまり、すべての要素が異なります)。

数学表記を使用すると、これは次のように表すことができます。a(chi)

ベクトルの各要素は、の1aつまたは複数の要素に対応し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です。

4

3 に答える 3

2

reshapeはあなたが使用する必要のあるmatlab関数であるように私には思えます。リンクに記載されているように:

B = reshape(A,siz)Aと同じ要素を持つが、再形成されたn次元配列を返しますsiz。これは、再形成された配列の次元を表すベクトルです。

つまりsiz、数値m*nを含むベクトルを作成し、と言いますA = reshape(P,siz)。ここで、Pはベクトルtとωの積です。またはおそらくのようなことを言うA = reshape(t*ω,[m*n])。(ここにはmatlabがないか、テストを実行して、製品が正しい方法であるかどうかを確認します。)注:リンクには、マトリックスパラメーターの後に1つの数字(複数ではなく)が付いた例は示されていません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

基本的な考え方は、2つの別々のループを使用することです。外側のループは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 
于 2012-10-16T17:36:01.103 に答える