2015-06-01 7 views
-3

Результирующие индексы преобразованных данных светового поля: ub, vb, sb, tb. Каждый из них зависит от переменных u, v, s, t.Как реализовать эту функцию в одной строке в MATLAB

Извините за то, что неясно, позвольте мне упомянуть, что я пытаюсь преобразовать 4D-набор данных через какую-то матрицу. В приведенном ниже коде M просто матрица трехмерного преобразования.

f=0.1; 
n = 11; 
[u,v,s,t] = ndgrid([1:Size(3)],[1:Size(4)],[1:Size(1)],[1:Size(2)]); 
alpha = M(3,1)*s+M(3,2)*t+M(3,3)*nf; 
beta1 = M(1,1)*u+M(1,2)*v+M(1,4); 
beta2 = M(2,1)*u+M(2,2)*v+M(2,4); 
C = M(3,1)*u+M(3,2)*v+M(3,4); 
D1 = M(1,1)*s+M(1,2)*t+M(1,3)*nf; 
D2 = M(2,1)*s+M(2,2)*t+M(2,3)*nf; 
ub = -D1.*C./alpha+beta1; 
vb = -D2.*C./alpha+beta2; 
sb = nf*D1./alpha; 
tb = nf*D2./alpha; 
for s = 1:Size(1) 
    for t = 1:Size(2) 
     for u = 1:Size(3) 
      for v = 1:Size(4)    
       newLF(sb(u,v,s,t),tb(u,v,s,t),ub(u,v,s,t),vb(u,v,s,t)) = LF2(s,t,u,v); 
      end; 
     end; 
    end; 
end; 

Теперь, так как UB, VB, SB и ТБ в зависимости от U, V, S, T, следовательно, это не возможно, чтобы назначить его как newLF = LF2;

Теперь вопрос заключается в том, как минимизировать эти циклы для одной линии.

+3

Немного неясно, пытаетесь ли вы ['переставить'] (http://www.mathworks.com/help/matlab/ref/permute.html)? 'newLF = перестановка (LF2, [3 4 1 2]);'? – Shai

+3

Объясните словами, что вы пытаетесь достичь с помощью своей функции и каковы ее входы. – gire

+0

Также укажите небольшой набор значений выборки и ожидаемый результат, чтобы мы знали, находимся ли мы на правильном пути. В противном случае вы просто тратите время. – kkuilla

ответ

5

Ответ

newLF = LF2; 

Значение, что код не делает ничего, но скопировать LF2 в newLF.

Чтобы проверить, что я прав, просто дайте код, выполняемый с некоторой случайной матрицей LF2, а затем оценить

all(newLF(:) == LF2(:)) 

, и вы увидите, что всегда имеет значение «истина».


Прежде всего, ваше использование sb, tb, ub, vb является излишним. Вы индексируетесь в сетку, но это просто воспроизводит индексы. Линия

newLF(sb(u,v,s,t),tb(u,v,s,t),ub(u,v,s,t),vb(u,v,s,t)) = LF2(s,t,u,v); 

эквивалентно линии

newLF(s,t,u,v) = LF2(s,t,u,v); 

Это, конечно, только поэлементно копирование.

впечатления перестановки отмеченного Shai задается линией

[ub,vb,sb,tb] = ndgrid([1:Size(3)],[1:Size(4)],[1:Size(1)],[1:Size(2)]); 

, который выглядит, как вы готовитесь к перестановке размеров (1, 2) с размерами (3,4). Однако вы используете эту сетку индексов в форме sb, tb, ub, vb, присваивая значение от s, t, u, v, поэтому перестановка фактически не выполняется.


Предполагая, что вы на самом деле сделать хочет сделать эту перестановку размеров, правильный код будет

for s = 1:Size(1) 
    for t = 1:Size(2) 
     for u = 1:Size(3) 
      for v = 1:Size(4) 
       newLF(u,v,s,t) = LF2(s,t,u,v); 
      end; 
     end; 
    end; 
end; 

В этом случае Шай был бы прав, соответствующий один-лайнер

newLF = permute(LF2, [3 4 1 2]); 
+1

Я думаю, что вы на победителя ... Я запускал его со случайными данными, и я получил тот же ответ, то есть 'newLF == LF2'. – kkuilla

+0

Извините за неясность, позвольте мне упомянуть, что я пытаюсь преобразовать 4D-набор данных через какую-то матрицу. –

+0

f = 0,1; n = 11; [u, v, s, t] = ndgrid ([1: Размер (3)], [1: Размер (4)], [1: Размер (1)], [1: Размер (2)]); alpha = M (3,1) * s + M (3,2) * t + M (3,3) * n * f; beta1 = M (1,1) * u + M (1,2) * v + M (1,4); beta2 = M (2,1) * u + M (2,2) * v + M (2,4); C = M (3,1) * u + M (3,2) * v + M (3,4); D1 = M (1,1) * s + M (1,2) * t + M (1,3) * n * f; D2 = M (2,1) * s + M (2,2) * t + M (2,3) * n * f; ub = -D1. * C./alpha + beta1; vb = -D2. * C./alpha + beta2; sb = n * f * D1./Alpha; tb = n * f * D2./Alpha; для s = 1: Размер (1) для t = 1: Размер (2) для u = 1: Размер (3) для v = 1: Размер (4) newLF (sb (u, v, s, t) , tb (u, v, s, t), ub (u, v, s, t), vb (u, v, s, t)) = LF2 (s, t, u, v); конец; конец, конец; –

Смежные вопросы