matlab – 三维对象的多维数组:如何向内化产品进行矢量化

In this question,我讨论了两个自定义函数,用于将3×3矩阵和3×1向量的数组相乘,保留了三维(矩阵)内积的结构,并使整个过程尽可能高效,快速.

我现在将这些函数推广到3×4矩阵和3×1向量的多维数组(NxN).以下是我编写的函数,它们使用for循环.

BlockScalar

该函数应该将(N×N矩阵)nv的ij元素(标量)乘以A(NxNx3x3矩阵)的ij元素(3×3矩阵).所以它基本上是一个标量乘积的多维版本.

function [B] = BlockScalar(nv,A)

    N=size(nv,1);
    B=zeros(N,N,3,3);

    for i=1:N
        for j=1:N 
            B(i,j,:,:)= nv(i,j).*A(i,j,:,:);
        end
    end

end

——– BlockScalar示例

输入:

N=2;
A = shiftdim( repmat( eye(3,3), 1, 1, N, N ), 2 );
nv=[1 2; 3 4];

输出:

BlockScalar(nv,A)

  
  ans(:,:,1,1)=

 1     2
 3     4

  
  ans(:,:,2,1)=

 0     0
 0     0

  
  ans(:,:,3,1)=

 0     0
 0     0

  
  ans(:,:,1,2)=

 0     0
 0     0

  
  ans(:,:,2,2)=

 1     2
 3     4

  
  ans(:,:,3,2)=

 0     0
 0     0

  
  ans(:,:,1,3)=

 0     0
 0     0

  
  ans(:,:,2,3)=

 0     0
 0     0

  
  ans(:,:,3,3)=

 1     2
 3     4

分块矩阵

第二个函数目前不起作用,因为我正在努力在A的第i个元素(它是一个3×3矩阵)和包含第i个元素的3个元素的列向量之间实现矩阵乘积A * u. ü.正如您可能很容易看到的,我希望这是3-D中矩阵*向量乘积的多维推广.

 function [B] = BlockMatrix(A,u)

    N = size(u,2);
    B = zeros(N,N,3);

  for i=1:N
     for j=1:N
             B(i,j,:)= reshape(reshape(A(i,j,:,:),[3,3])*reshape(u(i,j,:),[1 3]),size(u));
     end

 end

——- BlockMatrix示例

如果输入是广义单位矩阵(每个NxN元素是3×3单位矩阵),则NxN矩阵由3×1向量组成:

 N=2;   

 A = 4.*shiftdim( repmat( eye(3,3), 1, 1, N, N ), 2 );

 c = ones(2,2);
 V(1,1,:)=[1 2 3];
 u = c.*V;

期望的输出显然是具有V(NxN矩阵由3×1向量构成)的结构的对象,其中每个元素是重塑的矩阵乘积(A(i,j,:,:),[3 3])和重塑(V(i,j,:),[1 3]).那是:

i=1;j=1;
reshape(B(i,j,:),[3,1])


ans =

 4
 8
 12

对于任何我和j.

完整输出,完整性:

B(:,:,1) =

060014

B(:,:,2) =

060015

B(:,:,3) =

060016

问题

我很难(0)让BlockMatrix工作; (1)找到一种正确的矢量化方法,(2)我甚至不确定矢量化版本会更快.

任何帮助回答上述问题都将非常感激.

最佳答案 对于第一个功能:

B = bsxfun(@times, A, nv);

对于第二个:

B = sum(bsxfun(@times, A, reshape(u, [size(u,1) size(u,2) 1 size(u,3)])), 4);
点赞