Два для циклов (вложенные), вычислительные матрицы Matlab - PullRequest
0 голосов
/ 01 марта 2012

мой текущий код ниже.

У меня есть два набора данных phi и theta 18x30, и у меня есть цикл for, работающий от 1 до 30, которые являются 30 столбцами моих данных.Каждый из этих отдельных столбцов создаст для меня матрицу «B».Матрица «B» создается после прохождения 18 строк каждого столбца.

Проблема, с которой я столкнулся, заключается в том, что мне нужно умножить все полученные матрицы 'B' для каждой из 18 строк друг на друга, чтобы получить окончательную матрицу для каждого из 30 столбцов, поэтому яустановил A (:,:, i) = eye (2), чтобы моя первая матрица умножалась на A. Но я не хочу хранить A или B для каждого цикла, вместо этого я хочу, чтобы это было в первом циклеиз i моя матрица B умножит единичную матрицу A. Затем эта матрица A умножит следующую матрицу B ... с результатом каждого умножения, которое будет перенесено на следующую матрицу B, которая будет вычислена, поэтому умножения будут выполненыкак программа зацикливается.Вот почему у меня есть строка:

A(:,:,i) = A.*B;

, но, похоже, она не работает.Я получаю сообщение об ошибке, в котором говорится, что размеры должны совпадать.

В конце программы я хочу получить доступ к каждой из 30 матриц с помощью такой команды: A (:,:, 3), дляНапример, чтобы получить мою матрицу 2x2 для 3-го столбца.

Надеюсь, это было достаточно ясно!

theta = dlmread('theta.dat');
phi = dlmread('phi.dat');

ne = 1.7;
no = 1.5;
d = 0.000001;
w = 0.000000555;

for i = 1:30
        A(:,:,i) = eye(2);

for j = 1:18    

    nx =((cos(theta(j,i)).^2)/(no^2) + ((sin(theta(j,i)).^2)/(ne^2))).^(-1/2);
    D = (2*pi*(nx-no)*d)/w;

    x = ((cos(phi(j,i))).^2).*exp((-1i.*D)/2) + ((sin(phi(j,i))).^2).*exp((1i.*D)/2);
    y = 1i*(sin(D/2)).*sin(2*phi(j,i));
    z = ((cos(phi(j,i))).^2).*exp((1i.*D/2) + ((sin(phi(j,i))).^2).*exp((-1i.*D)/2));

    B = [x y;y z];
    A(:,:,i) = A.*B;

end

end

1 Ответ

1 голос
/ 01 марта 2012

B - матрица 2x2. Чтобы A.*B работал, A также должно быть 2x2. Но A в вашей программе трехмерный.

Из описания вашей проблемы, я думаю, вы хотите

A(:,:,i) = A(:,:,i)*B;  % Edited now that I see this happens 18 times on the same i

(Обратите внимание, я также заменил поэлементное умножение .* на умножение матрицы *, потому что это то, что вам нужно.)


Но я предлагаю

A = eye(2);

и

A = A*B;

и сохраните его в конце как

results(:,:,i) = A;
...