2017-05-07 3 views
0

私は2D MATLAB行列を持っています。この行列は、その中心の列に対して対称です。この行列を中心柱の周りで回転させて、円柱対称のオブジェクトを表す3D行列を生成します。2D行列を中心の列または中心の行の周りで回転させて、MATLABで3D行列を作成する方法は?

同じ行列は、中央の行に対して対称である別の行列で行いたいことと同じです。 (今度は、3D行列を生成するために中心の行の周りを回転させたい)。私が念頭に置いていた何

リンクに与えられたアイデアを3Dに一般化することである。

How to create a 2D image by rotating 1D vector of numbers around its center element?

でも十分MATLABを知らない、それは私のためにとても単純な作業ではありません。

誰か助けてもらえますか?

答えて

0

私は3Dにaccepted answerを変更:

% generate symetric matrix 
A = zeros(11,31); 
A(4:8,10:22) = repmat([1:7 6:-1:1],[5 1]); 
% symmetric x axis 
n = floor(size(A,2)/2); 

% A vector of distance (measured in pixels) from the center of vector V to each element of V 
[r,y] = meshgrid([n:-1:0, 1:n],1:size(A,1)); 

% Now find the distance of each element of a square 2D matrix from it's centre. @(x,y)(sqrt(x.^2+y.^2)) is just the Euclidean distance function. 
ri = sqrt(bsxfun(@(x,y)x.^2+y.^2,r,permute(r,[1 3 2]))); 
yi = repmat(y,[1 1 size(A,2)]); 

% Now use those distance matrices to interpole V 
obj = interp2(r(:,1:n+1),y(:,1:n+1),A(:,1:n+1),ri,yi,'nearest'); 
obj(isnan(obj)) = 0; 

% show 
[xg,yg,zg] = meshgrid(1:size(obj,2),1:size(obj,1),1:size(obj,3)); 
scatter3(xg(:),yg(:),zg(:),10,obj(:)+1,'filled') 
axis equal 

UPDATEを - あなたはあなたが行うことができますinterp2を使用しない場合:

obj = interp1(r(1,1:n+1).',A(:,1:n+1).',ri(1,:,:),'nearest'); 
obj = permute(obj,[4,3,2,1]); 
obj(isnan(obj)) = 0; 

enter image description here

+0

をいただき、ありがとうございますあなたの答え ! interp2を使用せずにinterp1で問題を解決する方法があるかどうか尋ねたがっていますか? – user4861528

+0

'y'を省略し、' A'の行を 'interp1'でループすることができます:' row = 1:1:size(A、1); '' obj(行、:、:) = interp1(r (行、1:n + 1)、A(行、1:n + 1)、ri(行、:、:)、「最寄り」) – user2999345

+0

残念ながら申し訳ありませんが、大きな行列には長すぎます。別のオプションがありますか?多分行列の形や種類のものを使っていますか?ご協力ありがとうございました! – user4861528