2

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

(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”。但是,如果它们不是标量,问题就不那么容易了。我想知道是否有一种简单的方法(类似于“conv”)在 MATLAB 中使用矩阵执行此操作:给定A_i并且B_i我想知道C_i?当然,在一般意义上,我喜欢这个(任何次数的单变量矩阵多项式),并且非常希望避免使用符号工具箱。

4

2 回答 2

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

于 2013-08-14T19:47:27.217 回答
0

很简单,使用我在文件交换中找到的sympoly工具箱。(这是否避免了符号 TB,同时使用我自己的符号 TB 使答案无效?只有您可以决定。)我将举一个例子,矩阵是相当非创造性地构建的。

sympoly y

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

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

(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
于 2013-08-14T21:57:17.697 回答