How to assign values to an array with broadcasting
26 visualizzazioni (ultimi 30 giorni)
Mostra commenti meno recenti
george veropoulos
il 13 Dic 2024 alle 5:49
Commentato: george veropoulos
il 13 Dic 2024 alle 20:03
hi in the code bwloe i recieve a message in
xi1 = x1(index_i);
xi2 = x2(index_i);
i receieve a warning
function [Is]=currentMoM()
%UNTITLED2 Summary of this function goes here
% Detailed explanation goes here
[f,N,ra,k0,Z0,lambda,gap_angle] = parameter();
gamma_const=1.781;
%Phi0=zeros(N);
e=exp(1);
dftm=(2.*gap_angle)/(N-1);
n=1:N;
Phi0=-gap_angle+(n-1).*dftm;
%for jj = 1:N
%Phi0(jj)=(jj-1).*dftm;
%end
x1 = Phi0(:); % Create a column vector of x1 values
x2 = x1 + dftm; % x2 values depend on x1
lmn=zeros(N,N);
gm = zeros(1,N);
zmn = zeros(N,N);
%opts = optimset('RelTol', 1e-6, 'AbsTol', 1e-6);
%vim = zeros(1,N);
%vsn = zeros(1,N);
coeif=(Z0.*k0./4).*ra.*dftm;
coeifn=(Z0./2).*sin(k0.*ra.*dftm./2);
B=(4./(Z0.*k0));
A=(gamma_const./2).*k0.*ra;
parfor idx = 1:N*N
% Convert linear index to subscripts
[index_i, index_j] = ind2sub([N, N], idx);
% Precompute integration bounds
xi1 = x1(index_i);
xi2 = x2(index_i);
xj1 = x1(index_j);
xj2 = x2(index_j);
if index_i == index_j
% Handle diagonal elements
funa = @(x, y) triangle_basisn(x, index_i) .* triangle_basisn(y, index_j) .* ...
ra .* (1 - 1i .* (2/pi).* (log(A) + log(abs(x - y + 1e-10))));
lmn(idx) = integral2(funa, xi1, xi2, xj1, xj2, 'RelTol', 1e-6, 'AbsTol', 1e-6);
else
% Handle off-diagonal elements
funb = @(x, y) triangle_basisn(x, index_i) .* triangle_basisn(y, index_j) .* ...
ra .* besselh(0, 2, k0 .* ra .* sqrt(2 - 2 .* cos(x - y)) +1e-9)
lmn(idx) = integral2(funb, xi1, xi2, xj1, xj2, 'RelTol', 1e-6, 'AbsTol', 1e-6);
end
% Assign to zmn
zmn(idx) = lmn(idx);
end
% Reshape the result back to a 2D matrix
lmn = reshape(lmn, [N, N]);
zmn = reshape(zmn, [N, N]);
% Compute gm vector
parfor index_i = 1:N
func = @(x) B .* triangle_basisn(x, index_i) .* Efieldin(x);
gm(index_i) = integral(func, x1(index_i), x2(index_i), 'RelTol', 1e-6, 'AbsTol', 1e-6);
end
% Solve linear system
Is = linsolve(zmn, gm');
end
0 Commenti
Risposte (1)
Walter Roberson
il 13 Dic 2024 alle 5:59
xi1 = x1(index_i);
xi2 = x2(index_i);
xj1 = x1(index_j);
xj2 = x2(index_j);
You access x1 and x2 at two different locations. If you were to only access each of them at one location and that one location could be calculated through simple arithmetic on the parfor variable, then hypothetically you could probably slice the variable. But as it is, indexing at two different locations and that location determined by non-trivial calculations on the parfor variable... the only option is for the arrays to be broadcast arrays.
5 Commenti
Walter Roberson
il 13 Dic 2024 alle 19:48
I do not understand why zmn(idx) = lmn(idx)
function [Is]=currentMoM()
%UNTITLED2 Summary of this function goes here
% Detailed explanation goes here
[f,N,ra,k0,Z0,lambda,gap_angle] = parameter();
gamma_const=1.781;
%Phi0=zeros(N);
e=exp(1);
dftm=(2.*gap_angle)/(N-1);
n=1:N;
Phi0=-gap_angle+(n-1).*dftm;
%for jj = 1:N
%Phi0(jj)=(jj-1).*dftm;
%end
x1 = Phi0(:); % Create a column vector of x1 values
x2 = x1 + dftm; % x2 values depend on x1
lmn=zeros(N,N);
gm = zeros(1,N);
zmn = zeros(N,N);
%opts = optimset('RelTol', 1e-6, 'AbsTol', 1e-6);
%vim = zeros(1,N);
%vsn = zeros(1,N);
coeif=(Z0.*k0./4).*ra.*dftm;
coeifn=(Z0./2).*sin(k0.*ra.*dftm./2);
B=(4./(Z0.*k0));
A=(gamma_const./2).*k0.*ra;
lmn = zeros(N,N);
for index_j = 1:N
xj1 = x1(index_j);
xj2 = x2(index_j);
lmn_i = zeros(N,1);
parfor index_i = 1:N
% Precompute integration bounds
xi1 = x1(index_i);
xi2 = x2(index_i);
if index_i == index_j
% Handle diagonal elements
funa = @(x, y) triangle_basisn(x, index_i) .* triangle_basisn(y, index_j) .* ...
ra .* (1 - 1i .* (2/pi).* (log(A) + log(abs(x - y + 1e-10))));
lmn_ii =
lmn_i(index_i) = integral2(funa, xi1, xi2, xj1, xj2, 'RelTol', 1e-6, 'AbsTol', 1e-6);
else
% Handle off-diagonal elements
funb = @(x, y) triangle_basisn(x, index_i) .* triangle_basisn(y, index_j) .* ...
ra .* besselh(0, 2, k0 .* ra .* sqrt(2 - 2 .* cos(x - y)) +1e-9)
lmn_ii = integral2(funb, xi1, xi2, xj1, xj2, 'RelTol', 1e-6, 'AbsTol', 1e-6);
end
lmn_i(index_i) = lmn_ii;
end
lmn(:,index_i) = lmn_i;
end
zmn = lmn;
% Compute gm vector
parfor index_i = 1:N
func = @(x) B .* triangle_basisn(x, index_i) .* Efieldin(x);
gm(index_i) = integral(func, x1(index_i), x2(index_i), 'RelTol', 1e-6, 'AbsTol', 1e-6);
end
% Solve linear system
Is = linsolve(zmn, gm');
end
Vedere anche
Categorie
Scopri di più su Matrix Indexing in Help Center e File Exchange
Community Treasure Hunt
Find the treasures in MATLAB Central and discover how the community can help you!
Start Hunting!