# Vectorising a Meshgrid Coordinate Construction

8 ビュー (過去 30 日間)
ADSW121365 2020 年 9 月 2 日
コメント済み: ADSW121365 2020 年 9 月 3 日
I have three coordinate arrays (file attached) of size [M x 2], where M is the number of elements and the 2 represents different points in a 1D system. To find the 3D meshed coordinates upon which I perform calculations I use code of the form:
for ele = 1:size(X_co,1) %Loop Over Each Element
[X_cube,Y_cube,Z_cube] = meshgrid(X_co(ele,:),Y_co(ele,:),Z_co(ele,:)); %Construct Meshgrid of size [2x2x2] for an Element
X_save(:,:,:,element) = X_cube; %Save Coordinates
Y_save(:,:,:,element) = Y_cube;
Z_save(:,:,:,element) = Z_cube;
end
The solution then is of size [2x2x2xM]. My best attempt to vectorise this was:
[X_cube,Y_cube,Z_cube] = meshgrid(X_co,Y_co,Z_co);
X_save = reshape(X_cube,2,2,2,[]); Y_save = reshape(Y_cube,2,2,2,[]); Z_save = reshape(Z_cube,2,2,2,[]);
However this solution is of size [2x2x2x(M^3)] which, when plotting both solutions has many many many repeated points so doesn't actually work for my application.
Can this problem be vectorised, or is a for loop the best way to construct this coordinate array?
##### 3 件のコメント1 件の古いコメントを表示1 件の古いコメントを非表示
jessupj 2020 年 9 月 2 日
ndgrid is the way to go here i think. i think it can be done using meshgrid along with some resize + repmat statements.
ADSW121365 2020 年 9 月 2 日

This maybe niave implementation, but:
[XO,YO,ZO] = ndgrid(X_co,Y_co,Z_co)
seems to give the same solution as:
[X_cube,Y_cube,Z_cube] = meshgrid(X_co,Y_co,Z_co);
X_save = reshape(X_cube,2,2,2,[]); Y_save = reshape(Y_cube,2,2,2,[]); Z_save = reshape(Z_cube,2,2,2,[]);
which isn't what I'm looking for. Could you guys elaborate a little more please? (Some example arrays are attached to the main post)

サインインしてコメントする。

### 採用された回答

Bruno Luong 2020 年 9 月 2 日

One way
[~,nx] = size(X_co);
[~,ny] = size(Y_co);
[m,nz] = size(Z_co);
[NX,NY,NZ] = meshgrid(1:nx,1:ny,1:nz);
sz = [size(NX),m];
% if you know nx, ny, nz are 2 you can replace the 5 above commands by
% [NX,NY,NZ] = meshgrid(1:2);
% sz = [2,2,2,m];
X_save = X_co.';
Y_save = Y_co.';
Z_save = Z_co.';
X_save = reshape(X_save(NX,:),sz);
Y_save = reshape(Y_save(NY,:),sz);
Z_save = reshape(Z_save(NZ,:),sz);
##### 6 件のコメント4 件の古いコメントを表示4 件の古いコメントを非表示
Bruno Luong 2020 年 9 月 3 日
"So by properly allocate you mean initialise the arrays as zeros before the for loop starts?"
Yes intiialize the 3 zeros arrays with SZ from with my code.
ADSW121365 2020 年 9 月 3 日
Thanks, I was just checking my indexing wasn't the allocation issue.

サインインしてコメントする。

### カテゴリ

Help Center および File ExchangeGraphics Performance についてさらに検索

R2020a

### Community Treasure Hunt

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

Start Hunting!

Translated by