2015-03-24 4 views
-1

Я пытаюсь портировать код из MATLAB к C. Для того, чтобы преобразовать эту строку в C:Умножение комплексных матриц в Matlab

A = E*[SOLS' ; ones(1,10) ]; 

Где

>>size(SOLS) 

ANS =

10  3 

и:

>> size(E) 

ANS =

9  4 

SOLS представляет собой сложную единую матрицу и Е является реальным одна матрица и А должна быть сложной одна матрица размером 9x10.

я заменил A = E*[SOLS' ; ones(1,10) ]; с

for i=1:9 
    for j=1:10 
    A1(i,j)=E(i,1)*SOLS(j,1))+E(i,2)*SOLS(j,2))+E(i,3)*SOLS(j,3))+E(i,4); 
    end 
end 

Сложные результирующие матричные элементы имеют одинаковую действительную часть, как A, но другая мнимую часть.

>> real(A)=real(A1) 
imag(A) and `imag(A1)` are different. 

В чем причина этой разницы? Как правильно преобразовать команду matlab в C?

Ниже приведены примеры матриц:

E = 

    0.2248   0   0   0 
    -0.4487 -0.1632 -0.1955 0.6355 
    0.4379 -0.0651 -0.1032 -0.0754 
    -0.4008 0.3513 0.2707 -0.5936 
    -0.2294 -0.7853 -0.3290 -0.4648 
    0.0385 0.2623 -0.6363 -0.0978 
    -0.5716 0.0851 0.0943 0.0587 
    0.1160 -0.3911 0.5964 0.0947 
    0.0363 -0.0039 -0.0092 -0.0018 

и

SOLS = 

    1.0e+02 * 

    -0.2410 + 0.0000i 2.3741 + 0.0000i -0.0646 + 0.0000i 
    0.0000 + 0.0000i 0.0000 + 0.0000i -0.0113 - 0.0046i 
    0.0000 + 0.0000i 0.0000 + 0.0000i -0.0113 + 0.0046i 
    -0.0028 + 0.0000i -0.0114 + 0.0000i -0.0038 + 0.0000i 
    0.0000 + 0.0000i 0.0000 + 0.0000i -0.0024 - 0.0043i 
    0.0000 + 0.0000i 0.0000 + 0.0000i -0.0024 + 0.0043i 
    0.0000 + 0.0000i 0.0000 + 0.0000i -0.0007 - 0.0191i 
    0.0000 + 0.0000i 0.0000 + 0.0000i -0.0007 + 0.0191i 
    -0.0080 + 0.0000i 0.0064 + 0.0000i 0.0108 + 0.0000i 
    -0.7289 + 0.0000i 4.9347 + 0.0000i 0.3841 + 0.0000i 
+1

Вы сказали, что преобразуете его из Matlab в C. Цикл 'for' не находится на C. Что вы на самом деле пытаетесь сделать? Я не вижу никакого преобразования в C. – kkuilla

+0

Тривиально преобразовать для циклов из Matlab в C. Сначала я хочу протестировать его в Matlab, а затем записать его в C – Didon

+1

. В вашем вопросе не говорится, что это то, что вы пытаетесь делать. Вы заявляете, что пытаетесь преобразовать из Matlab в C. В вашем вопросе говорится одно, но вы на самом деле пытаетесь сделать другое, и это ставит вопрос в замешательство. Помните, что вы должны писать так, чтобы люди, не знакомые с вашим проектом, поняли это. См. [How To Ask] (http://stackoverflow.com/help/how-to-ask) – kkuilla

ответ

1

В MATLAB, SOLS' выполняет сложную операцию сопряженное транспонирование, то есть элемент {I, J} становится элементом {J, I }, и его значение преобразуется как a + 1i*b --> a -1i*b. Для того, чтобы сохранить фазу ваших комплексных значений использовать SOLS.' следующим образом:

A = E*[SOLS.' ; ones(1,10) ]; 

Кроме того, это, как вы хотите, чтобы выполнить цикл (перевод, конечно, соответствующий C):

for i=1:size(E,1) 
    for j=1:size(SOLS,1) 
     A1(i,j)=0; 
     for k = 1:size(SOLS,2) 
      A1(i,j)= A1(i,j) + E(i,k)*SOLS(j,k); 
     end 
     A1(i,j)= A1(i,j) + E(i,k+1); 
    end 
end 

Тогда

A1 - A 

ans = 

    0 0 0 0 0 0 0 0 0 0 
    0 0 0 0 0 0 0 0 0 0 
    0 0 0 0 0 0 0 0 0 0 
    0 0 0 0 0 0 0 0 0 0 
    0 0 0 0 0 0 0 0 0 0 
    0 0 0 0 0 0 0 0 0 0 
    0 0 0 0 0 0 0 0 0 0 
    0 0 0 0 0 0 0 0 0 0 
    0 0 0 0 0 0 0 0 0 0 
+0

@ Daphnée Я обновил ответ ... –

+0

Вы могли сохранить назначение A = 0 перед внутренним циклом, но вы можете делайте это, когда вы все это делаете на C ... –

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