Matlab向量乘以单元数组

3
我有一个向量x = [1 2 3]和一个3x3的单元格数组C,其中包含N x N矩阵。例如:C {1,1}是一个N x N矩阵。

我想要将xC 相乘,并得到一个大小为1x 3的单元格数组D

D{1,1} = x(1)C{1,1) + x(2)C{2,1} + x(3)C{3,1} 
D{1,2} = x(1)C{1,2) + x(2)C{2,2} + x(3)C{3,2} 
D{1,3} = x(1)C{1,3) + x(2)C{2,3} + x(3)C{3,3}

说实话,你的数据最好存储在矩阵中而不是单元数组中。 - Dennis Jaheruddin
2个回答

3

不要使用未展开的循环

对于一个长度为M=3的向量x和一个M*M的单元数组C,我们需要创建一个M*N*M的矩阵,其中第i列由单元格C{i,:}中的所有值组成。然后,您可以使用矩阵乘法和x.'来获得D中的值,并使用mat2cell将结果分解为一个新的单元数组。

Ct = C';
Dvals = reshape([Ct{:}],[],M)*x.';
D = mat2cell(reshape(Dvals,N,[]),N,N*ones(M,1))

测试数据:

N = 4; M = 3; x = 1:M;
C = mat2cell(rand(N*M,N*M),N*ones(M,1),N*ones(M,1));

注意:这需要每个子矩阵的大小相同,就像问题所描述的那样。

0

没有循环:

D = cell(1, 3);
D{1} = x(1) * C{1,1} + x(2) * C{2,1} + x(3) * C{3,1};
D{2} = x(1) * C{1,2} + x(2) * C{2,2} + x(3) * C{3,2};
D{3} = x(1) * C{1,3} + x(2) * C{2,3} + x(3) * C{3,3};

使用一个循环:

D = cell(1, 3);
for i=1:3
    D{i} = x(1) * C{1,i} + x(2) * C{2,i} + x(3) * C{3,i};
end

使用两个循环:

D = cell(1, 3);
for i=1:3
    D{i} = x(1) * C{1,i};
    for j=2:3
        D{i} = D{i} + x(j) * C{j,i};
    end
end

3
“no loops” 真的不能自动化计算,对吗? - Eitan T
好的,OP 没有要求自动化,是吗? ;) - Simon
1
在这种情况下,你可以手动计算每个数并输入结果,对吧?你应该知道得更好 :) - Eitan T

网页内容由stack overflow 提供, 点击上面的
可以查看英文原文,
原文链接