Warning: file_get_contents(/data/phpspider/zhask/data//catemap/4/matlab/15.json): failed to open stream: No such file or directory in /data/phpspider/zhask/libs/function.php on line 167

Warning: Invalid argument supplied for foreach() in /data/phpspider/zhask/libs/tag.function.php on line 1116

Notice: Undefined index: in /data/phpspider/zhask/libs/function.php on line 180

Warning: array_chunk() expects parameter 1 to be array, null given in /data/phpspider/zhask/libs/function.php on line 181
Matlab 三维对象的多维数组:如何向量化内积_Matlab_Matrix_Multidimensional Array_Vectorization - Fatal编程技术网

Matlab 三维对象的多维数组:如何向量化内积

Matlab 三维对象的多维数组:如何向量化内积,matlab,matrix,multidimensional-array,vectorization,Matlab,Matrix,Multidimensional Array,Vectorization,,我讨论了两个自定义函数,用于将3x3矩阵和3x1向量的数组相乘,从而保留了三维(矩阵)内积的结构,并使整个过程尽可能快速高效地计算 现在,我将这些函数推广到3x4矩阵和3x1向量的多维数组(NxN)。下面是我编写的函数,它们利用for循环 块标量 此函数应将(NxN矩阵)nv的ij元素(标量)乘以(nx3x3矩阵)的ij元素(3x3矩阵)。所以它本质上是一个矩阵与一个标量乘积的多维形式 function [B] = BlockScalar(nv,A) N=size(nv,1);

,我讨论了两个自定义函数,用于将3x3矩阵和3x1向量的数组相乘,从而保留了三维(矩阵)内积的结构,并使整个过程尽可能快速高效地计算

现在,我将这些函数推广到3x4矩阵和3x1向量的多维数组(NxN)。下面是我编写的函数,它们利用for循环

块标量

此函数应将(NxN矩阵)nv的ij元素(标量)乘以(nx3x3矩阵)的ij元素(3x3矩阵)。所以它本质上是一个矩阵与一个标量乘积的多维形式

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
--------块标量示例

投入:

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

块标量(nv,A)

ans(:,:,1,1)=

ans(:,:,2,1)=

ans(:,:,3,1)=

ans(:,:,1,2)=

ans(:,:,2,2)=

ans(:,:,3,2)=

ans(:,:,1,3)=

ans(:,:,2,3)=

ans(:,:,3,3)=

区块矩阵

第二个函数目前不起作用,因为我正在努力实现
A
的第ij个元素(是3x3矩阵)和包含
u
的第ij个元素的3个分量的列向量之间的矩阵积
A*u
。正如你们很容易看到的,我希望这是三维矩阵*向量积的多维推广

 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
-------块矩阵示例

如果输入是广义单位矩阵(NxN元素,每个元素都是3x3单位矩阵)和由3x1向量构成的NxN矩阵:

 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(由3x1向量构成的NxN矩阵)结构的对象,其中每个元素是
整形(A(i,j,:,:,,,[3])
整形(V(i,j,:,,[13])
的矩阵积。即:

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


ans =

 4
 8
 12
对于任何
i
j

完整输出,完整性:

B(:,:,1)=

B(:,:,2)=

B(:,:,3)=

问题

我努力(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);

评论不用于扩展讨论;这段对话已经结束。
 0     0
 0     0
 0     0
 0     0
 0     0
 0     0
 1     2
 3     4
 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
 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;
i=1;j=1;
reshape(B(i,j,:),[3,1])


ans =

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