Дискретизация непрерывного математического уравнения - PullRequest
0 голосов
/ 14 мая 2019

Я хочу реализовать код, который перетасовывает информацию внутри куба размера (bs x bs x bs) так, чтобы каждый элемент внутри куба (x, y, z) отображался однозначно в (x_new, y_new, z ). Но код не работает должным образом.

enter image description here

Прикрепленное изображение является фактическим математическим определением кода, который я попытался дискретизировать и реализовать. Исходные математические уравнения работают на единичном кубе, тогда как у меня есть куб измерения bs. Может кто-нибудь взглянуть на мой код и намекнуть на предполагаемую ошибку?

n=bs;
NEWI=zeros(bs,bs,bs);
for row= 1:bs
    for col=1:bs 
        for height=1:bs
            if (     1<=row && row<=(n/2) && 1<=col && col<=(n/2) )
                x_new= 2*(row-1) + 1;
                y_new= 2*(col-1) + 1;
                 z=floor(0.25*(height-mod(height-1,2)))+1; 
             end
for 
for
for

Now this is just the first line implementation of the equation given in the figure. But as we see the coorepondence of points 
             (1,1,1) goes to (1,1,1)
              (1,1,2) goes to (1,1,1)
              (1,1,3) goes to  (1,1,1)
               (1,1,4) goes to (1,1,1)
which clearly is not a unique mapping, whereas the function claims of giving unique images for every (x,y,z). So my question is clearly there has to be some adjustments to discretize this map. Can somebody suggest

1 Ответ

0 голосов
/ 14 мая 2019

Некоторые ваши условия неясны:

  • Почему вы проверяете, если 1<=row, если строка всегда >=1?
  • Почему вы используете модуль?(как указано @Welbog)
  • ...

Но чтобы ответить на ваш вопрос, я рекомендую вам использовать логическое индексирование, а meshgrid сделает ваш код более читабельным,И вы сможете выполнять все операции в одной строке.

% size of your 3D cube
n = 5;
% With meshgrid we generate the 3D grid that we will use to create the logical index.
[x,y,z] = meshgrid(1:n,1:n,1:n);
% Create empty array
M = zeros(n,n,n);
%first condition
I      = x<(n/2) & y<(n/2);        %create a logical index according to the first condition
M(I)   = 2*x(I) + 2*y(I) + z(I)/4; %generate the associated value
%second condition
I      = ...
Добро пожаловать на сайт PullRequest, где вы можете задавать вопросы и получать ответы от других членов сообщества.
...