在MATLAB中乘以矩阵多项式

时间:2013-08-14 18:54:01

标签: matlab matrix

我正在尝试执行以下类型的矩阵多项式乘法:

(A_1+A_2*y)*(B_1+B_2*y+B_3*y^2)

其中y是变量,所有A_i都是相同大小的常量矩阵,所有B_i都是相同大小的常量矩阵,并且表格的矩阵乘法A_i*B_i是有道理的。矩阵A_iB_i是已知的,并由用户指定。

正式的乘法应该导致C_1+C_2*y+C_3*y^2+C_4*y^3,我想知道C_i。在MATLAB中,如果A_iB_i是标量,则可以使用'conv'。但是,如果它们不是标量,问题就不那么容易了。我想知道在MATLAB中用矩阵做一个简单的方法(类似于'conv'):给定A_iB_i我想知道C_i ?当然,我在一般意义上喜欢这个(任何程度的单变量矩阵多项式),并且非常希望避免使用符号工具箱。

2 个答案:

答案 0 :(得分:1)

这可能不是最佳解决方案,但您可以为矩阵重新实现conv,例如:

function C = convMat(A,B)
    nA = size(A,3);
    nB = size(B,3);
    n = nA + nB - 1;
    C = zeros([size(A,1),size(B,2),n]);
    for k = 1:n
        for j = max(1,k+1-nB):min(k,nA)
            C(:,:,k) = C(:,:,k) + A(:,:,j)*B(:,:,k-j+1);
        end
    end

为了您的兴趣:另一个(更糟糕的?)实施:

function C = convMat2(A,B)
    n = size(A,3) + size(B,3) - 1;
    C = zeros([size(A,1),size(B,2),n]);
    for mA = 1:size(A,1)
        for mB = 1:size(B,2)
            for l = 1:size(A,2) % = size(B,1)
                vA = A(mA,l,:);
                vA = vA(:);
                vB = B(l,mB,:);
                vB = vB(:);
                C(mA,mB,:) = C(mA,mB,:) + reshape(conv(vA,vB),[1,1,n]);
            end
        end
    end

测试:

% matrix example
A(:,:,1) = rand(3,3); % A1
A(:,:,2) = rand(3,3); % A2
B(:,:,1) = rand(3,4); % B1
B(:,:,2) = rand(3,4); % B2
B(:,:,3) = rand(3,4); % B3

C1 = convMat(A,B);
C2 = convMat2(A,B);

% test
x = rand(1,1);
(A(:,:,1) + A(:,:,2)*x) * (B(:,:,1) + B(:,:,2)*x + B(:,:,3)*x^2)
C1(:,:,1) + C1(:,:,2)*x + C1(:,:,3)*x^2 + C1(:,:,4)*x^3
C2(:,:,1) + C2(:,:,2)*x + C2(:,:,3)*x^2 + C2(:,:,4)*x^3

我确信可以优化convMat

答案 1 :(得分:0)

使用我在文件交换中找到的sympoly工具箱很简单。 (事实上​​,这可以避免象征性结核病,而使用我自己的同情结核病会使答案无效吗?只有你可以决定。)我将举例说明,矩阵是非创造性的。

sympoly y

A_1 = rand(2);
A_2 = rand(2);
B_1 = rand(2);
B_2 = rand(2);
B_3 = rand(2);

结果是符号多项式元素的2x2矩阵,因为加法,乘法和矩阵乘法都是为同义类定义的。

(A_1+A_2*y)*(B_1+B_2*y+B_3*y^2)
ans =
Sympoly array has size = [2  2]

Sympoly array element [1  1]
    0.88896 + 0.88074*y + 0.87653*y^2 + 0.33102*y^3
Sympoly array element [2  1]
    0.87079 + 1.2145*y + 1.0628*y^2 + 0.69004*y^3
Sympoly array element [1  2]
    0.64143 + 0.78816*y + 0.67242*y^2 + 0.2091*y^3
Sympoly array element [2  2]
    0.64582 + 1.0162*y + 0.78167*y^2 + 0.4313*y^3