无需循环即可快速创建单元阵列或3D-Matrix

时间:2016-08-25 11:29:07

标签: arrays matlab vectorization

我有一个列向量和一个行向量。

http://mysite.ru/#!/order/

我希望将a = [1;2;3] b = [10 20 30 40 50 60 70 80 90] 切换为b[10 20 30][40 50 60]并创建一个单元格数组C 这样

[70 80 90]

没有for循环。如何在MATLAB中实现?

我也希望有

C{1} = a*[10 20 30]
C{2} = a*[40 50 60]
C{3} = a*[70 80 90]

这样

a = [1;2;3]
b = [10 20 30 40 50 60 70 80 90 100 110 120]

P.S。如果这不可能,如何创建一个3维数组D

C{1} = a*[10 20 30]
C{2} = a*[40 50 60]
C{3} = a*[70 80 90]
C{4} = a*[100 110 120]

没有for循环?

我也希望有

D(:,:,1) = a*[10 20 30]
D(:,:,2) = a*[40 50 60]
D(:,:,3) = a*[70 80 90]

这样

a = [1;2;3]
b = [10 20 30 40 50 60 70 80 90 100 110 120]

2 个答案:

答案 0 :(得分:1)

性能方面,3D矩阵肯定是超越单元阵列的更好选择!首先,您可以使用permutea转换为第3维和reshape以获得所需的矩阵基本形状(根据您的实际情况进行编辑)。最后,您需要bsxfun来执行实际的乘法。

n = 3;
a = [1;2;3]
b = [10 20 30 40 50 60 70 80 90 100 110 120]

%// permuting a to 3rd dimension
A = permute(a,[2,3,1])
%// reshaping b
B = reshape(b.', [], n)

%// multiplication and forming of 3D-array
out = bsxfun(@mtimes,B,A)
out(:,:,1) =

    10    50    90
    20    60   100
    30    70   110
    40    80   120


out(:,:,2) =

    20   100   180
    40   120   200
    60   140   220
    80   160   240


out(:,:,3) =

    30   150   270
    60   180   300
    90   210   330
   120   240   360

替代解决方案,取决于解释:

%// reshaping and permuting b
B = permute(reshape(b.', n, []),[3,1,2])

%// multiplication and forming of 3D-array
out = bsxfun(@mtimes,B,a)
out(:,:,1) =

    10    20    30
    20    40    60
    30    60    90


out(:,:,2) =

    40    50    60
    80   100   120
   120   150   180


out(:,:,3) =

    70    80    90
   140   160   180
   210   240   270


out(:,:,4) =

   100   110   120
   200   220   240
   300   330   360

答案 1 :(得分:0)

the other answer中所述,使用3个维度肯定会给您带来更好的表现。然而,由于问题是关于细胞,我将提供一些技巧如何使用细胞来处理它。

a = [1;2;3]; % userdata
b = [10 20 30 40 50 60 70 80 90,100,110,120]; % userdata
B = reshape(b,length(b)/3,3).'; % reshape b to 3-by-3 matrix and transpose
carr = mat2cell(B,[1,1,1],3); % split each row to a cell
res = cellfun(@(x) mtimes(a,x) ,carr, 'un',0); % for every cell multiplicate with a

所以更喜欢3D矩阵,但如果你想要细胞,就是它。

修改

对于包含b-by-3矩阵的任意数量的单元格,可以使用以下内容。

a = [1;2;3];
b = [10 20 30 40 50 60 70 80 90,100,110,120];
ncells = length(b)/3;
B = reshape(b,3,ncells).';
carr = mat2cell(B,ones(1,ncells),3);
res = cellfun(@(x) mtimes(a,x) ,carr, 'un',0);
res{:}

建议您使用debugger逐步执行代码并调查reshapemat2cell的工作原理。这样就可以根据需要自定义此代码。