【问题标题】:Multiplying complex matrices in Matlab在 Matlab 中将复杂矩阵相乘
【发布时间】:2015-03-24 12:10:58
【问题描述】:

我正在尝试将代码从 matlab 移植到 C。为了将此行转换为 C:

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

在哪里,

>>size(SOLS)

ans =

10     3

和:

>> size(E)

ans =

 9     4

SOLS 是复单矩阵,E 是实单矩阵,A 应该是大小为 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

【问题讨论】:

  • 您说您要将其从 Matlab 转换为 C。for 循环不在 C 中。您实际上想做什么?我看不到任何到 C 的转换。
  • 将 for 循环从 Matlab 转换为 C 是微不足道的。我想先在 Matlab 中测试它,然后在 C 中编写它
  • 您的问题并未说明您正在尝试这样做。您声明您正在尝试从 Matlab 转换为 C。您的问题说明了一件事,但您实际上正在尝试做另一件事,这使问题变得混乱。请记住,您必须以一种不熟悉您项目的人能够理解的方式编写。请看How To Ask

标签: matlab matrix


【解决方案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

【讨论】:

  • 您可以在内部循环之前保存分配 A=0,但是当您在 C 中完成所有操作时,您可以这样做...
猜你喜欢
  • 2021-12-04
  • 2017-08-25
  • 1970-01-01
  • 2013-07-07
  • 2012-01-31
  • 1970-01-01
  • 1970-01-01
  • 2021-06-09
  • 1970-01-01
相关资源
最近更新 更多