1

この Matlab コードのベクトル化を手伝ってくれる人はいますか? 具体的な問題は、ベクトル入力の合計関数とベッセル関数です。ありがとうございました!

N = 3;
rho_g = linspace(1e-3,1,N);
phi_g = linspace(0,2*pi,N);

n = 1:3;
tau = [1 2.*ones(1,length(n)-1)];
for ii = 1:length(rho_g)
    for jj = 1:length(phi_g)
        % Coordinates
        rho_o = rho_g(ii);
        phi_o = phi_g(jj);
        % factors
        fc = cos(n.*(phi_o-phi_s));
        fs = sin(n.*(phi_o-phi_s));

        Ez_t(ii,jj) = sum(tau.*besselj(n,k(3)*rho_s).*besselh(n,2,k(3)*rho_o).*fc);
    end
end
4

3 に答える 3

0

初期化 -

N = 3;
rho_g = linspace(1e-3,1,N);
phi_g = linspace(0,2*pi,N);

n = 1:3;
tau = [1 2.*ones(1,length(n)-1)];

ネストされたループ フォーム (コードからコピーし、比較のためにここに表示) -

for ii = 1:length(rho_g)
    for jj = 1:length(phi_g)
        % Coordinates
        rho_o = rho_g(ii);
        phi_o = phi_g(jj);
        % factors
        fc = cos(n.*(phi_o-phi_s));
        fs = sin(n.*(phi_o-phi_s));

        Ez_t(ii,jj) = sum(tau.*besselj(n,k(3)*rho_s).*besselh(n,2,k(3)*rho_o).*fc);
    end
end

ベクトル化されたソリューション -

%%// Term - 1
term1 = repmat(tau.*besselj(n,k(3)*rho_s),[N*N 1]);

%%// Term - 2
[n1,rho_g1] = meshgrid(n,rho_g);
term2_intm = besselh(n1,2,k(3)*rho_g1);
term2 = transpose(reshape(repmat(transpose(term2_intm),[N 1]),N,N*N));

%%// Term -3
angle1 = repmat(bsxfun(@times,bsxfun(@minus,phi_g,phi_s')',n),[N 1]);
fc = cos(angle1);

%%// Output
Ez_t = sum(term1.*term2.*fc,2);
Ez_t = transpose(reshape(Ez_t,N,N));

このベクトル化またはコードの簡素化に関する注意事項 –</p>

  1. 「fs」はスクリプト Ez_t の出力を変更しないため、現時点では削除できます。
  2. 出力は 'Ez_t' のようです。これには、コードに tau.*besselj(n,k(3)*rho_s)besselh(n,2,k(3)*rho_o)、およびfcの 3 つの基本用語が必要です。これらは、項 1、2、および 3 としてそれぞれベクトル化のために個別に計算されます。
  3. これら 3 つの項はすべて 1xN サイズのようです。したがって、私たちの目的は、これらの 3 つの項をループなしで計算することになります。ここで、2 つのループがそれぞれ N 回実行されるため、合計ループ数は NxN になります。したがって、これらの用語がネストされたループ内にある場合と比較して、そのような各用語には NxN 倍のデータが必要です。
  4. 3 つの項は「term1」、「term2」、および「fc」自体で表されるため、これが基本的にここで実行されるベクトル化の本質です。
于 2014-03-07T23:07:58.883 に答える