How can I pass 2-D meshgridded var into a 3-D matrix?

I need to pass X and Y which are 2-D meshgridded matrices into c the 3-D matrix. where k is a constant and zv is a vector.
Here is my try:
for i = 1:M
c(:,:,i)=exp(1j*k/(2*zv(i))*(X2.^2+Y2.^2));
end
Thanks.

4 Comments

@Ezz El-din Abdullah: What is your question?
As shown from the title.
I would like to see what edits should I make on my provided code to get the problem solved because it produces this error:
Subscripted assignment dimension mismatch.
Show us the sizes of all of X2, Y2, c, and zv as well as the value of M as they are immediately before you enter the loop.
M is 250
X2 is 250x250
Y2 is 250x250
c is not defined before the loop but I want it to be 3D matrix (250x250x250)

Sign in to comment.

 Accepted Answer

Step 1: permute your vector so that it is along the 3rd dimension:
zv = permute(zv, [3 2 1]); %if zv is a column vector (M x 1)
%or
zv = permute(zv, [1 3 2]); %if zv is a row vector (1 x M)
Step 2: No need for loop, use memberwise operation + implicit expansion (if on R2016b or later):
c = exp(1j*k./(2*zv)) .* (X2.^2 + Y2.^2));
If on version < R2016b:
c = bsxfun(@times, exp(1j*k./(2*zv)), (X2.^2 + Y2.^2));

6 Comments

Thank you, but this will produce another error for the 2-D matrices X and Y:
Error using .*
Matrix dimensions must agree.
What is
size(zv) %after the permute
size(X2)
size(Y2)
and which version of matlab?
zv is 1x250 while after the permute it is 1x1x250 where M = 250
X2 is 250x250
Y2 is 250x250
I'm using R2016a
As I wrote,
If on version < R2016b:
c = bsxfun(@times, exp(1j*k./(2*zv)), (X2.^2 + Y2.^2)); %after the permute

Sign in to comment.

More Answers (0)

Categories

Find more on Loops and Conditional Statements in Help Center and File Exchange

Community Treasure Hunt

Find the treasures in MATLAB Central and discover how the community can help you!

Start Hunting!